Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przerwania - reagowanie na wciśnięcie przycisku na klawiaturze matrycowej 4x4

09 Lis 2018 00:35 411 6
  • Poziom 2  
    Dzień dobry.
    We wstępie odrazu zaznaczę, że używam zestawu ZL3AVR z mikrokontrolerem ATmega32. Chciałem napisać program w assemblerze, który będzie zliczał wciśnięcia określonego przycisku w dowolnym rejestrze i będzie wyświetlał liczbę wciśnięć binarnie na diodach (czyli przykładowo jeśli wcisnąłem przycisk 7 razy to mają świecić się trzy diody z prawej strony). Wiem, że wciśnięcie przycisku może powodować kilka sygnałów przez co pojedyncze kliknięcie będzie zaliczone jako kilkukrotne, ale na tą chwilę załóżmy, że takie coś nie ma miejsca. Nie mam aktualnie możliwości sprawdzenia działania tego programu poza emulatorem na Atmel studio i jest to mój pierwszy program z wykorzystaniem przerwań, więc mam kilka banalnych pytań.
    1) Czy żeby na JP13 pojawił się stan niski to koniecznie muszę ustawić linie kolumn jako wyjścia i ustawić na nich stan niski?
    2) Jeśli na JP13 pojawi się stan niski to wystarczy połączyć to złącze ze złączem PD2 i ustawić na nim stan wysoki przez: sbi PORTD,2 żeby następowało przerwanie na linii INT0?
    Dodatkowo poniżej wstawiam schemat połączeń oraz kod, w którym zapewne znajdą się błędy.

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod


    Przerwania - reagowanie na wciśnięcie przycisku na klawiaturze matrycowej 4x4

    Będę wdzięczny za każdą uwagę.
    Pozdrawiam.
  • Poziom 39  
    Podłączyłeś tylko jeden wiersz i jedną kolumnę, więc możesz odczytać co najwyżej jeden przycisk.
  • Poziom 2  
    excray napisał:
    Podłączyłeś tylko jeden wiersz i jedną kolumnę, więc możesz odczytać co najwyżej jeden przycisk.

    Tak tak, dokładnie o to mi chodziło. Kwestia jest taka, że nie wiem czy w przypadku wciśnięcia tego przycisku wystąpi stan niski na złączu JP13.
  • Poziom 39  
    W zasadzie nie potrzebujesz JP13. To chyba taki ukłon w stronę 8051 z dwoma przerwaniami zewnętrznymi. AVRy mają przerwania PCINT na prawie wszystkich pinach i w momencie jak wciśniesz przycisk i tak możesz wywołać przerwanie. Niemniej w ogóle nie powinieneś robić tego na przerwaniach zewnętrznych (poza wyjątkową sytuacją gdy wprowadzasz uC w głębokie uśpienie) tylko cyklicznie sprawdzać stan klawiatury w przerwaniu od licznika.
  • Poziom 23  
    excray napisał:
    W zasadzie nie potrzebujesz JP13. To chyba taki ukłon w stronę 8051 z dwoma przerwaniami zewnętrznymi. AVRy mają przerwania PCINT na prawie wszystkich pinach i w momencie jak wciśniesz przycisk i tak możesz wywołać przerwanie.

    Kolega trochę za bardzo uogólnia, nie wszystkie AVRy mają PCINTy na pinach, dodatkowo autor korzysta z Atmega32, który to w ogólne takowych nie posiada.
  • Poziom 39  
    Rzeczywiście, Atmega32 nie ma PCINT. Niemniej jak wspomniałem takie skanowanie lepiej jest zrealizować w oparciu o cykliczny odczyt. Wyklikałem poniższy kod ale nie gwarantuję, że jest on na 100% poprawny bo:
    - dawno nie pisałem w asemblerze
    - nie mam jak sprawdzić jego poprawności
    Idea jest taka, że w przerwaniu od przepełnienia T0 sprawdzamy klawiaturę i jeśli coś zostanie wykryte to zmienna key przyjmie wartość >0. Kod jest dość uproszczony bo ma przekazać ideę czytania klawiatury a nie stanowić gotowiec.
    Kod: avrasm
    Zaloguj się, aby zobaczyć kod
  • Moderator Mikrokontrolery Projektowanie
    @janne_ahonen Takiej obsługi nie robi się na przerwaniach IO, tylko na timerze. Skoro to kalwiatura matrycowa to i tak trzeba przemiatać rzędy i kolumny, więc prościej i lepiej to zrobić np. przerwaniu timera. To przy okazji załatwia sprawe debouncingu. Przemiatanie natet tak wolne jak 100 razy na sekundę i tak jest wystarczające.