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.

AT89S8253 - Bezpieczna klawiatura 4x4 pod portem P0

qrnick 29 Sty 2013 23:18 2862 13
  • #1 29 Sty 2013 23:18
    qrnick
    Poziom 9  

    Po raz pierwszy konstruuje urzadzenie na mikrokontrolerze. Miałem już problem z portem P0 który nie chciał współpracować poprawnie z wyświetlaczem więc przerzucilem LCD na inny port. Chciałbym jednak wykorzystac PO do podłączenia klawiatury matrycowej 4x4. Znalazłem taki schemat (kółko to miejsce połączenia w momencie naciśnięcia, nie miałem czasu rysować przycisków):

    AT89S8253 - Bezpieczna klawiatura 4x4 pod portem P0

    Idea obsługi klawiatury jest taka:

    - Linie wierszy pracują jako wejścia.
    - Na liniach wierszy ustalamy stan wysoki za pomocą
    rezystorów podciągających (P0 nie posiada wewnętrznych).
    - Linie kolumn pracują jako wyjścia.
    - Na liniach kolumn ustalamy stan wysoki
    - cyklicznie zmieniamy stan jednej z linii kolumn na niski.
    - Jeśli wciśnięty zostanie klawisz, to stan niski z jego kolumny
    przenosi się na jego wiersz.
    - Prąd płynie od plusa zasilania (Vcc) przez rezystor
    podciągający, styki klawisza, diodę, wyjście kolumny do masy.

    - Diody zabezpieczają przed zwarciem linii kolumn, gdy wciśnie
    się równocześnie klawisze w różnych kolumnach.

    Co jednak jeśli naciśnięte zostaną klawisze z dwóch różnych wierszy? Czy przedstawiony wcześniej układ przy tym sposobie przeszukiwania będzie również na to odporny?
    Czy nie należałoby raczej zabezpieczyć również linii wierszy diodami?

    0 13
  • #2 29 Sty 2013 23:31
    netotron
    Poziom 26  

    Czy nie lepiej zamiast diod dać rezystory?

    0
  • #3 29 Sty 2013 23:42
    BlueDraco
    Specjalista - Mikrokontrolery

    A przed czym miałbyś zabezpieczać wejścia wierszy?

    Diody kolumn też byłyby zbędne, gdybyś sterował kolumnami tylko na zero i trzeci stan, bez sterowania w stan 1.

    0
  • #4 29 Sty 2013 23:54
    qrnick
    Poziom 9  

    Nie wiem. Diody wydają sie być bezpieczne. Wyobrażam sobie sytuację że np. pierwsz kolumna podczas skanowania przez uP ma wystawione 0 gdy pozostale kolumny mają jeden a ja trzymam wciśnięte obydwa klawisze '*' i '#' wtdey zwieram kolumnę pierwszą i trzecią ale wtedy jedna z diod jest w stanie zaporowym i zwarcie wyeliminowane. Jednak skoro wiersze pracuja jako wejścia to istnieje moment że poziom niski z kolumny pierwszej zostanie przepisany na linie wiersza zwartego przycisku wtedy już wiersze nie mają wszytskie stanu wysokiego i jeślibym trzymał palcami klawisze '*', '#' i '7' to wtedy juz samo trzymanie '*' i '7' zewrze wiersz czwarty (w stanie L) z wierszem 3 (w stranie H) i co wtedy się stanie? Nie chcialbym uszkodzić linii proceora.
    Czy po prostu najzwyczajniej wartość będzie przpisana.

    Innaczej zadam pytanie czy obecność tych rezystorów podciagających załatwia sprawę poprawnego przyjmowania 0 lub 1 przez wszystkie linie portu P0?

    Układ klaiwszy mógłby być taki żeby było wiadomo o czym pisze:

    1 2 3 A
    4 5 6 B
    7 8 9 C
    * 0 # D

    Dodano po 5 [minuty]:

    BlueDraco napisał:


    Diody kolumn też byłyby zbędne, gdybyś sterował kolumnami tylko na zero i trzeci stan, bez sterowania w stan 1.


    Co znaczy "trzeci stan"?

    0
  • #5 30 Sty 2013 00:03
    tadzik85
    Poziom 38  

    Można też zastosować inne sterowanie. wszystkie kolumny wysterować stanem niskim, a potem zamienić kolumny z wierszami, jak to proponuje atmel.

    0
  • #6 30 Sty 2013 00:10
    qrnick
    Poziom 9  

    Na razie napisałem tylko program na skanowanie klawiszy wedlug opisanej wcześniej metody. Jednak przede wszystkim chcialbym wiedzieć jak ma wyglądać dobrze zabezpieczona klawiatura. Sposób sterowania to sprawa drugorzędna ale dzięki za podpowiedź poszukam też co producent sugeruje. Niemniej jednak chciałbym aby ktoś podpowiedział mi, ktoś kto ma już jakieś doświadzenie konstrukcyjne czy taki układ jezt bezpieczny (najlepiej bez względu na sposoby programowego skanowania klawiatur nawet jakby linie portów przyjmowały losowy stan a ja w sposób lsowy naciskał przyciski to czy jest możliwość uszkodzenia linii). Wolalbym by układ był sprzetowo głupotoodporny na głupotę programisty. Pomyłki się zdarzają :/

    0
  • #7 30 Sty 2013 09:50
    BlueDraco
    Specjalista - Mikrokontrolery

    Trzeci stan oznacza, że jedna kolumna ma wystawione zero logiczne, a pozostałe nie mają wystawione nic, czyli np. są ustawione jako wejścia (w 51 mamy porty pseudodwukierunkowe, które w ogóle nie wymuszają trwale jedynki). Wtedy nie grozi żadne zwarcie wyjść, więc diody są zbędne, bo nie mają przed czym zabezpieczać.

    Powtórzę: nie ma wtedy żadnej możliwości uszkodzenia wyjść, więc zabezpieczenia (np. diodami) są zbędne. Można też w taki sposób skanować klawiaturę dwukierunkowo - istotne jest to, że nigdy nie sterujesz żadnego wyjścia w stan wysoki, a stan wysoki wejścia jest osiągany przy użyciu rezystorów podciągających (często wbudowanych w procesor, tak, jak w większości portów 51).

    0
  • #8 30 Sty 2013 16:31
    qrnick
    Poziom 9  

    Ok ale dla tej metody którą opisywałem, diody powinny zostać tak? Nie upieram się że to najlepsza metoda. Nie wiem za bardzo jak te sposoby które opisujecie zaimplementować programowo. Napisalem tą swoj ą wersje (przyjąłem że znak ASCII klawisza wysyłam na P1 potem tam będzei port danych LCD ale chciałem przedstawić tylko ten fragment dotyczący klawiatury):

    Code:


    START:
    MOV P0,#0FFH
    MOV R4,#0
    SETB P0.7
    CLR P0.4
    LCALL SKANUJ_KOLUMNE
    SETB P0.4
    CLR P0.5
    LCALL SKANUJ_KOLUMNE
    SETB P0.5
    CLR P0.6
    LCALL SKANUJ_KOLUMNE
    SETB P0.6
    CLR P0.7
    LCALL SKANUJ_KOLUMNE
    LJMP START

        SKANUJ_KOLUMNE:
            JNB P0.0,ZNALEZIONO
            INC R4
            JNB P0.1,ZNALEZIONO
            INC R4
            JNB P0.2,ZNALEZIONO
            INC R4
            JNB P0.3,ZNALEZIONO
            INC R4
            LJMP NIE_ZNALEZIONO
           
        ZNALEZIONO:
            CLR A
            MOV DPTR,#0
            MOV DPTR,#ZNAKI
            MOV A,R4
            MOVC A,@A+DPTR
            MOV P1,A
        NIE_ZNALEZIONO:
            RET
    LJMP START
       


    ZNAKI:                     
    DB 31h, 34h, 37h, 2Ah   
    DB 32h, 35h, 38h, 30h   
    DB 33h, 36h, 39h, 23h
    DB 41h, 42h, 43h, 44h 

    END


    Jak myślicie ten program co napisałem i układ z obrazka pasują? Mogę to spokojnie tak zmontować i uruchomić?

    0
  • #9 30 Sty 2013 18:13
    BlueDraco
    Specjalista - Mikrokontrolery

    Tak, jak mi to chodziło po głowie - Port 0 jako port nie ma możliwości sterowania "wgórę", więc diody są całkowicie zbędne - nawet gdybyś chciał, nie da się tam zrobić zwarcia.

    Program z grubsza zadziała, ale docelowo nie będziesz skanował w pętli głównej, tylko w przerwaniu timera, po jednej kolumnie zapewne.

    Niepotrzebnie używasz LCALL i LJMP, wymuszając najdłuższy format instrukcji. W niektórych asemblerach można napisać CALL lub JMP. W innych, o ile skok nie jest na drugi koniec pamięci, możesz użyć instrukcji ACALL i AJMP.

    0
  • #10 30 Sty 2013 22:29
    qrnick
    Poziom 9  

    Uruchomiłem (z diodami :]) ale problem podstawowy to drgania styków po prostu jak wcisne raz np. 5 to mam cały wyświetlacz w piątkach. Czytałem że można zrobić opóźnienie i jeszcze raz sprawdzić.

    Faktycznie asembler obługuje rozkaz CALL i mogę go używać w RIDE-7 tam zanalazłem że jest MA51 assembler chociaż M to może oznacza że to makroasembler.

    Cytat:
    ale docelowo nie będziesz skanował w pętli głównej, tylko w przerwaniu timera, po jednej kolumnie zapewne.

    Właśnie miałem na myśli wykorzystywać przerwanie ale zewnętrzne np. INT1. Przez bramkę czterowejściową AND której wejścia połączyłbym z liniami wierszy. Jak nacisnę klawisz to na którymś z wierszy pojawi się 0 tym samym wyjście brami przejdzie w stan niski i spowoduje zgłoszenie przerwania. Sam jeszcze nie wiem do końca. Jak będę miał działające w pełni to zamieszcze kod i zamkne temat.

    0
  • #11 30 Sty 2013 23:36
    BlueDraco
    Specjalista - Mikrokontrolery

    żadne drga nia styków - przecież w Twoim kodzie nie ma testu zwolnienia klawisza.

    Zasdnicz prcesor jest po to, żeby już nie czepiać do niego bramek. Sprzętu więCej już nie potrzeba, diody wyrzuć, o bramce zapomnij - zrób uczciwe skanowanie w przerwaniu timera i już. I tak nie da się tego zrobić bez jakiejś bazy czasu, m.in. właśnie z powodu drgań styków.

    0
  • #12 31 Sty 2013 11:40
    qrnick
    Poziom 9  

    To już nie wiem jak to w końcu zrobić. To musiałbym testować czy klawisz zwolniono po tym jak naciśnięto i dopiero zwolnienie powodowałoby że program pobrałby znak do wyświetlenia? Druga sprawa to uczciwe skanowanie w przerwaniu timera. Co to właściwie oznacza. Jakby ten timer miał pracować i w jakim momencie w związku z jakim zdarzeniem generować przerwanie? Chciałbym też zaznaczyć ta klawiatrura to tylko część skłądowa timer w procesorsze będzie pracował bo ma generoać przebieg PWM dla układu L293D i już takie coś uruchamiałem ale na sekwencyjych 4 klawiszach ale to już inna historia.

    0
  • #13 31 Sty 2013 14:13
    BlueDraco
    Specjalista - Mikrokontrolery

    Informację o wciśnięciu generujesz po wykryciu wciśnięcia - inaczej wkurzysz użytkownika. Potem zanim wykryjesz następne wciśnięcie czekasz, aż klawisze zostaną zwolnione. Mi.in. dlatego należy to robić w przerwaniu timera. Jeden timer na ogół wystarczy do wszystkiego.

    0
  • #14 31 Sty 2013 17:30
    qrnick
    Poziom 9  

    Dobra bez diod też działa jak zwieram co się da to nie widać jakichś negatywnych efektów. Dodałem opóźnienie i sprawdzenie czy klawisz jest zwolniony do swojej wersji programu. Dzięki za pomoc przynajmniej będzie wiecej miejsca na płytce PCB.

    Temat uważam za zamkniety.

    0
  Szukaj w 5mln produktów