Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek 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

janne_ahonen 09 Lis 2018 00:35 252 6
  • #1 09 Lis 2018 00:35
    janne_ahonen
    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.

    0 6
  • #2 09 Lis 2018 10:50
    excray
    Poziom 39  

    Podłączyłeś tylko jeden wiersz i jedną kolumnę, więc możesz odczytać co najwyżej jeden przycisk.

    0
  • #3 09 Lis 2018 10:55
    janne_ahonen
    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.

    0
  • #4 09 Lis 2018 11:45
    excray
    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.

    0
  • #5 09 Lis 2018 13:11
    simw
    Poziom 18  

    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.

    0
  • #6 10 Lis 2018 00:23
    excray
    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

    0
  • #7 10 Lis 2018 12:21
    tmf
    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.

    0
  Szukaj w 5mln produktów