logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom AVR: Jak poprawnie zliczać naciśnięcia przycisku na AT90S2313?

robusta 01 Lis 2003 22:54 2947 11
REKLAMA
  • #1 383242
    robusta
    Poziom 15  
    Posty: 189
    Ocena: 1
    Witam,
    męczę się z programikiem mającym zliczyć ilość naciśnięć
    przycisku. Mikrostyk po przyciśnięciu łączy masę na PortD.2
    w avr'rze at90s2313. Kombinuję i rezultaty mam mizerne.
    W pierwszym programiku wykorzystałem przerwanie ale nie
    liczy mi naciśnięć tylko przy jednokrotnym naduszeniu guzika
    zliczy z 5 impulsów a jak się guzik przytrzyma to cyferki lecą...
    W programiku drugim pojawia się tylko w drugiej linijce cyfra 1
    i nic więcej nie robi.
    Proszę Was o pomoc - co spieprzyłem? gdzie robię błędy?
    Pozdrawiam
    Przemo



    $crystal = 4000000
    Dim Count As Integer
    Config Lcd = 16 * 2
    Config Lcdbus = 4
    Config Lcdmode = Port
    Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 ,
    Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
    On Int0 Int0_int
    Do
    Enable Interrupts
    Enable Int0
    Set Portd.2
    Loop
    End
    Int0_int:
    Disable Interrupts
    Disable Int0
    Incr Count
    Cls
    Lcd "Liczba impulsow:"
    Lowerline
    Lcd Count
    Return



    $crystal = 4000000
    Dim A As Integer
    Ddrd.2 = 0
    Config Lcd = 16 * 2
    Config Lcdbus = 4
    Config Lcdmode = Port
    Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 ,
    Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
    A = 0
    Do
    If Pind.2 = 0 Then
    Incr A
    Cls
    Lcd "Liczba impulsow:"
    Lowerline
    Lcd a
    End If
    Loop
  • REKLAMA
  • #2 383264
    euromatic
    Poziom 21  
    Posty: 422
    Pomógł: 17
    Ocena: 14
    wprowadź w programie zmienną bit która po wejsciu do przerwania uzależni zliczanie od swej wartosci.
    inaczej:
    dodaj warunek który musi być spełniony aby zliczyć nacisniecia
    if guzik nacisniety and zmienna = 0 then incr ilosc nacisniec : zmienna=1: end if


    dalej w programie:
    if guzik puszczony and zmienna = 1 then zmienna =0
    to proste
    trzeba tylko pomyslec i napisać na 100 róznych sposobów
    zacznij uzywać AND
    Jeżeli ma to liczyć przyciskanie przycisku to przykład ten załatwia ci całą sprawę, łącznie z drganiami styków.
    można na przykład tak:


    $crystal = 4000000
    Dim A As Integer
    Config Lcd = 16 * 2
    Dim Zmienna As Bit

    Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
    zmienna=0
    A = 0



    Do
    If Pind.2 = 0 And Zmienna = 0 Then : Zmienna = 1 : Incr A : End If
    If Pind.2 = 1 And Zmienna = 1 Then : Zmienna = 0 : End If




    cls
    Lcd "Liczba impulsow:"
    Lowerline
    Lcd a
    Waitms 50
    Loop




    jest to przepisane w minutke i nie wiem czy dalsza część twojego programu to zaakceptuje , ma wady , lcd będzie migotać , jest na to rada,
    zliczy nacisniecie nie częściej jak co 50 ms
    bo jak usuniesz waitms 50 to nic nie zobaczysz
    druga wersja będzie pewnie lepsza:


    $crystal = 4000000
    Dim A As Integer
    Config Lcd = 16 * 2
    Dim Zmienna As Bit
    Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Zmienna = 0
    A = 0
    Cls
    Lcd "Liczba impulsow:"
    Lowerline
    Lcd a


    Do
    If Pind.2 = 0 And Zmienna = 0 Then
    Zmienna = 1
    Incr A
    Cls
    Lcd "Liczba impulsow:"
    Lowerline
    Lcd a
    End If
    If Pind.2 = 1 And Zmienna = 1 Then : Waitms 10 : Zmienna = 0 : End If
    Loop
    End
  • REKLAMA
  • #3 383300
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    jesli masz przerwania i przy przytrzymaniu przycicku program cały czas zlicza to masz prawdopodobnie przerwanie ustawione "poziomem" zmien odpowiedni bit w rejestrach specjalnych, tak aby przerwanie było ustawine zboczem. pozatym, przydał by sie jakis obwodzik RC na tym właczniku, ewentualnie "szmit", ale najlepiej zrobić to programowo
  • #4 383394
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    a moze wykorzystac timer/counter do zliczania impulsow zewnetrznych? chyba po to jest.

    dla 2313:

    do TCCR0 zaladuj 0b00000110 dla opadajacego zbocza a 0b00000111 dla narastajacego zbocza. wtedy licznik bedzie zliczal impulsy z wejscia T0 czyli PD4 czyli pin 8.

    licznik T0 jest 8-bit czyli 256 zliczen, wiec jak potrzebujesz pojemnosc 65536 (16-bit) musisz analogicznie zaprogramowac licznik T1, ktory zlicza z PD5 (pin 9).

    PS. bascom sucks.
  • #5 383460
    robusta
    Poziom 15  
    Posty: 189
    Ocena: 1
    wielkie dzięki! będę próbował - najgorsza jest myśl, że sprawa nie jest trudna a rozwiązanie czai się z boku i się śmieje :)
    Pozdrawiam
    Przemo
  • REKLAMA
  • #6 383877
    ucy74
    Poziom 20  
    Posty: 539
    Pomógł: 22
    Ocena: 10
    Ja bym tu dał Debounce, bo tak to nie wiadomo czy to drgają naduszane styki, czy to już kolejne naduszenie. I dalej, niech się zmienna powiększa za każdym naduszeniem. Poco przerwania?
  • REKLAMA
  • #7 384820
    robusta
    Poziom 15  
    Posty: 189
    Ocena: 1
    jeszcze raz dzięki, programik już działa - faktycznie, że przerwania bez sensu w takim przypadku - zastosowałem się głównie do rad euromatica o zamianie zmiennej typu byte i jest ok. drgania styku wogóle nie występują.
    Pozdrawiam
    Przemo
  • #8 5196739
    msnake
    Poziom 12  
    Posty: 22
    Ocena: 10
    witam
    to jest licznik od 0 do 100
    jak zrobić by w drugiej linii wyświetlacza
    wyświetlić ilość setek

    'Program obsługi wbudowanego w mikrokontroler
    '10-bitowego przetwornika A/C

    $regfile = "m8def.dat" 'Procek ATMEGA8

    $crystal = 1000000 '1MHz - Kwarc 1MHz

    Dim A As Integer
    Config Lcd = 16 * 2
    Dim Zmienna As Bit


    Config Lcdpin = Pin , Db4 = Portb.6 , Db5 = Portb.7 , Db6 = Portd.5 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.0
    Zmienna = 0
    A = 0
    Cls




    Do
    If Pinc.0 = 0 And Zmienna = 0 Then
    Zmienna = 1
    Incr A
    Cls

    Lcd "L "
    If A = 100 Then A = 0
    Lcd A


    End If
    If Pinc.0 = 1 And Zmienna = 1 Then : Zmienna = 0 : End If

    Loop
    End
  • #9 5196948
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    Gdy A osiąga 100 inkrementuj inną zmienną i wyświetl ją w drugiej linii.
  • #10 5196964
    euromatic
    Poziom 21  
    Posty: 422
    Pomógł: 17
    Ocena: 14
    $regfile = "m8def.dat" 'Procek ATMEGA8

    $crystal = 1000000 '1MHz - Kwarc 1MHz

    Dim A As Integer
    Config Lcd = 16 * 2
    Dim Zmienna As Bit
    Dim Setki As Integer


    Config Lcdpin = Pin , Db4 = Portb.6 , Db5 = Portb.7 , Db6 = Portd.5 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.0
    Zmienna = 0
    A = 0
    Setki = 0
    Cls

    Locate 1 , 1
    Lcd "L " ; A
    Locate 2 , 1
    Lcd "x100 " ; Setki


    Do
    If Pinc.0 = 0 And Zmienna = 0 Then
    Zmienna = 1
    Incr A
    Cls
    Locate 1 , 1
    Lcd "L " ; A
    Locate 2 , 1
    Lcd "x100 " ; Setki
    End If



    If A = 100 Then
    A = 0
    Incr Setki
    End If







    If Pinc.0 = 1 And Zmienna = 1 Then : Zmienna = 0 : End If

    Loop
    End
  • #12 5197372
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    msnake->załóż nowy temat , a nie odkurzaj starych.


    Zamykam

Podsumowanie tematu

✨ Dyskusja dotyczy problemu poprawnego zliczania naciśnięć przycisku podłączonego do mikrokontrolera AT90S2313 w Bascom AVR. Głównym problemem było wielokrotne zliczanie impulsów przy pojedynczym naciśnięciu spowodowane drganiami styków oraz przerwaniami wyzwalanymi poziomem zamiast zboczem sygnału. Zaproponowano rozwiązanie programowe polegające na zastosowaniu zmiennej bitowej do detekcji stanu przycisku i eliminacji wielokrotnego zliczania podczas przytrzymania przycisku (tzw. debounce programowy). Alternatywnie zasugerowano wykorzystanie timerów/liczników sprzętowych do zliczania impulsów zewnętrznych oraz ewentualne zastosowanie filtrów RC lub układów Schmitta do eliminacji drgań styków. Wskazano, że przerwania w tym przypadku mogą być nieoptymalne, a lepsze efekty daje pętla główna z kontrolą stanu przycisku. Przykładowy kod w Bascom AVR pokazuje implementację zmiennej bitowej do kontroli stanu przycisku i inkrementacji licznika tylko przy przejściu z wysokiego na niski stan na wejściu. Dodatkowo w dyskusji pojawił się przykład rozszerzenia licznika do wartości powyżej 100 z wyświetlaniem setek na LCD, z wykorzystaniem mikrokontrolera ATmega8.
REKLAMA