BASCOM-AVR licznik góra/dół z debounce, ATmega8, LCD 16x2, kod źródłowy

Pytanie

KOD źródłowy napisany w bascom licznik liczący góra dół z wykorzystaniem polecenia debounce

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Poniżej znajdziesz kompletny, gotowy do kompilacji kod w BASCOM‑AVR dla licznika góra/dół z użyciem polecenia DEBOUNCE (eliminacja drgań styków).
  • Przykład przewiduje trzy przyciski: UP (PB0), DOWN (PB1), RESET (PB2); wewnętrzne pull‑upy są aktywne; wynik jest pokazywany na LCD 16×2 i/lub wysyłany po UART.

Bezpośrednia odpowiedź na pytanie Szczegółowa analiza problemu

  • Kluczowe aspekty:
    • DEBOUNCE w BASCOM testuje wskazany pin, odczekuje zaprogramowany czas (Config Debounce = … ms) i ponownie weryfikuje stan; jeśli nadal spełniony, wykonuje pojedynczy skok do etykiety (z opcją Sub – powrót przez Return).
    • Z punktu widzenia użytkownika, jedno fizyczne naciśnięcie powoduje dokładnie jedno wywołanie procedury, aż do puszczenia klawisza (wewnętrzny mechanizm „no branch before”).
    • Wejścia są skonfigurowane z wewnętrznymi rezystorami podciągającymi, przyciski zwierają do masy (logika aktywna „0”).
    • Kod zawiera ograniczenia i zawijanie (wrap) wartości licznika w zakresie CNT_MIN…CNT_MAX.

Kod – wariant z LCD 16×2 i UART (ATmega8, 8 MHz)

'=============================================================
' Licznik GÓRA/DÓŁ z DEBOUNCE (BASCOM-AVR)
' MCU: ATmega8 (łatwo przenieść na ATmega16/328P zmieniając $regfile)
' Taktowanie: 8 MHz (wewnętrzny RC)
' Klawisze: UP=PB0, DOWN=PB1, RESET=PB2 (aktywne niskim poziomem)
' LCD: 16x2 na PD (HD44780), UART: 9600 bps (podgląd wartości)
'=============================================================
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
'--- Konfiguracja LCD (jeśli nie używasz LCD, pozostaw – program i tak działa) ---
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
'--- Wejścia klawiszy: logika aktywna 0, wewnętrzne pull-up ---
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Input
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
'--- Eliminacja drgań styków (ms) ---
Config Debounce = 30
'--- Zakres licznika i zmienne ---
Const Cnt_min As Integer = -9999
Const Cnt_max As Integer =  9999
Dim Cnt As Integer
'--- Inicjalizacja interfejsów użytkownika ---
Cnt = 0
Cls
Cursor Off
Lcd "Licznik gora/dol"
Lowerline
Lcd "Wartosc: 0"
Print "Start, CNT=" ; Cnt
'=============================================================
' PETLA GLOWNA
'=============================================================
Do
   ' Uwaga: używamy PINx.y (odczyt stanu wejścia), nie PORTx.y
   Debounce Pinb.0 , 0 , Key_up_sub    , Sub
   Debounce Pinb.1 , 0 , Key_down_sub  , Sub
   Debounce Pinb.2 , 0 , Key_reset_sub , Sub
   ' Miejsce na pozostałą logikę programu...
   Waitms 5
Loop
End
'=============================================================
' PODPROGRAMY
'=============================================================
Key_up_sub:
   If Cnt < Cnt_max Then
      Incr Cnt
   Else
      Cnt = Cnt_min                  ' zawijanie po przekroczeniu górnej granicy
   End If
   Gosub Update
Return
Key_down_sub:
   If Cnt > Cnt_min Then
      Decr Cnt
   Else
      Cnt = Cnt_max                  ' zawijanie po przekroczeniu dolnej granicy
   End If
   Gosub Update
Return
Key_reset_sub:
   Cnt = 0
   Gosub Update
Return
Update:
   Home
   Lcd "Licznik:       "
   Lowerline
   Lcd "Wartosc: " ; Cnt ; "     "   ' kilka spacji czyszczą stary ogon cyfr
   Print "CNT=" ; Cnt
Return
  • Dlaczego to działa stabilnie:
    • DEBOUNCE wnosi krótką, lokalną zwłokę tylko wtedy, gdy wykryje potencjalne naciśnięcie; w typowej pętli jest to praktycznie bezkosztowe.
    • Mechanizm wewnętrzny zapobiega wielokrotnym skokom, dopóki przycisk nie wróci do stanu nieaktywnego.

Wariant „jedna zmiana na jedno naciśnięcie” (wymuszone oczekiwanie na puszczenie klawisza) – zwykle zbędny, bo DEBOUNCE już to zapewnia, ale bywa przydatny przy niestandardowym okablowaniu:

Key_up_sub:
   If Cnt < Cnt_max Then Incr Cnt Else Cnt = Cnt_min
   Gosub Update
   Bitwait Pinb.0 , Set      ' czekaj aż klawisz zostanie puszczony (blokujące)
Return

Aktualne informacje i trendy

  • W nowych projektach dąży się do:
    • sprzętowego kształtowania sygnału (RC + wejście ze Schmittem) jako uzupełnienia filtracji programowej;
    • separacji logiki klawiatury (skanowanie w przerwaniu od timera) od pętli głównej, gdy aplikacja ma wymagania czasu rzeczywistego;
    • integracji z licznikami/enkoderami (np. wejścia INT0/INT1 dla enkodera obrotowego z filtracją programową zamiast DEBOUNCE w pętli).

Wspierające wyjaśnienia i detale

  • Pin vs Port:
    • Config Pinb.0 = Input – ustawia kierunek (DDR).
    • Portb.0 = 1 – aktywuje pull‑up.
    • Debounce używa odczytu Pinb.0 (rejestr PIN), nigdy Portb.0.
  • Czas Config Debounce:
    • Typowe drgania styków trwają 5–20 ms; 25–30 ms jest bezpieczne. Zmniejszaj, gdy potrzebna szybka reakcja.
  • Pamięć i stan:
    • Każde wywołanie DEBOUNCE utrzymuje wewnętrzny stan, aby nie generować kolejnych skoków do czasu zwolnienia klawisza.

Aspekty etyczne i prawne

  • Bezpieczeństwo: przy pracy z układami docelowymi zasilanymi z innych domen (np. maszyny, automotive) zapewnij filtrację EMI, ESD i poprawne separacje galwaniczne. W projektach komercyjnych uwzględnij wymagane normy (np. EMC).

Praktyczne wskazówki

  • Sprzęt:
    • prowadź masę klawiszy krótkimi ścieżkami, dodaj kondensator 100 nF blisko VCC–GND MCU;
    • dla bardzo „brzęczących” przycisków dodaj szeregowo 100–330 Ω z pinem (ogranicza prądy przy błędnej konfiguracji).
  • Oprogramowanie:
    • w projektach wrażliwych czasowo przenieś obsługę klawiszy do przerwania od timera (np. co 1 ms – skanowanie i algorytm „stable/changed”).
    • jeżeli nie chcesz zawijania, zamień sekcje na „saturację”:
      • If Cnt < Cnt_max Then Incr Cnt
      • If Cnt > Cnt_min Then Decr Cnt

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • DEBOUNCE wprowadza krótką zwłokę tylko przy „kandydacie” na naciśnięcie; jeśli pętla wykonuje obliczenia wymagające ścisłej deterministyczności, rozważ metodę z przerwaniem od timera lub wejściami INTx.
  • Przy bardzo długich przyciskach/okablowaniu mogą wystąpić zakłócenia – wtedy filtr RC lub transoptor pomoże.

Sugestie dalszych badań

  • Dokumentacja BASCOM‑AVR (hasła: DEBOUNCE, CONFIG DEBOUNCE, PIN/PORT/DDR).
  • Wzorce obsługi klawiatury matrycowej i enkoderów w BASCOM (przerwania INT0/INT1, filtracja stanów).
  • Porównanie metod: sprzętowe RC + Schmitt vs. czysto programowe DEBOUNCE.

Krótkie podsumowanie

  • Otrzymujesz kompletny licznik góra/dół w BASCOM‑AVR z poprawną obsługą przycisków przez DEBOUNCE, wewnętrznymi pull‑upami i prezentacją na LCD/UART.
  • Rozwiązanie jest stabilne, proste i łatwe do rozbudowy (zmiana zakresu, tryb saturacji vs. zawijanie, przeniesienie do przerwań, obsługa enkodera). Jeśli chcesz, przygotuję wersję pod konkretny MCU i przypisanie pinów, albo wariant z wyświetlaczem 7‑segmentowym.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (2min)...