Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Projekt: klawiatura 51 na przerwaniach

Akane 24 Sep 2003 14:07 2748 13
Altium Designer Computer Controls
  • #1
    Akane
    Level 27  
    [ autorepeat samopowtarzanie keys klawiatura klawisze ]

    Piszę tego posta aby rozwikłać problemy z projektowaniem obsługi klawiatury. Program jest przeznaczony dla zwykłych mikrokontrolerów '51, jest odporny na drgania styków klawiszy i ma funkcję samopowtarzania : wciśnięcie klawisza powoduje natychmiastową reakcję programu. Aby klawisz został wczytany poraz drugi, należy go przytrzymać około pół sekundy, a dalsze odczyty klawisza następują co ok. 60ms - jest to przydatne np. w programie który zwiększa jakiś licznik w zależności od wciśniętego klawisza.
    Właściwy program zaczyna się od etykiety Keys_reppeater
    W kodzie jest przykład z diodą LED która się zaświeca na chwilkę po każdej aktywności klawiatury; nic nie stoi na przeszkodzie aby podmienić czasy opóźnień, częstotliwości czytania klawiatury (tu 50Hz)
    Code:
    repeat   equ    8         ; bajt zmniejszany o 1 po kazdym wykryciu wcisniecia klawisza
    
    keyboard equ    9         ; bajt z kodem klawisza (255 - nie wcisnięty)
    faza     equ    0         ; bit informujący czy klawisz jest wcisnięty; jesli nie, to faza = 0
    keys_delay_1 equ  20      ; czas w 1/50s przez jaki musi byc wcisnięty klawisz aby zostal wczytany ponownie
    keys_delay_2 equ  3       ; czas w 1/50s pomiedzy kolejnymi odczytami klawisza
    przeladowanie equ 178     ; 50 Hz:  256-(Xtal/3072/50)   gdzie Xtal=12MHz  3072=256*12  a 50 bo 50Hz (okolo)
    keys          equ p3.0
    ;===================================================
    ; przykladzik:  do testow mozna nie podlaczac diod do p1, wystarczy zwierac do masy piny p1 (klawiszami)
            org     0
            mov     sp,#33
    LED     equ     p3.7
            sjmp    T0init

            org     11                ; obsługa przerwania T0  50Hz
            push    psw
            push    acc
            acall   Keys_reppeater
            pop     acc
            pop     psw
            reti
           
    T0init:   mov   tmod,#1         ; inicjacja przerwanm
            mov     keyboard,#255   ; zapobiega wczytaniu klawisza po RESET
            setb   tr0
            setb   et0      ; odblokowanie
            setb   ea      ; przerwan

    loop:   mov     a,keyboard      ; zawsze tak
            mov     keyboard,#255   ; czytac klawiature
            inc     a
            jz      loop            ; koniec gdy klawisz nie wcisniety
            clr     LED
            mov     r1,#50
    wait:   djnz    r0,wait
            djnz    r1,wait
            setb    LED
            sjmp    loop
    ;===================================================
    Keys_reppeater:
            mov   th0,#przeladowanie        ; przeladowanie licznika
            mov   keyboard,p1    ; zapamietanie stanu portu p1
            mov   p1,#255
            clr   keys           ; odblokowanie klawiszy
            mov   a,p1           ; i odczyt klawiatury
            setb   keys           ; zablokowanie klawiszy
            mov   p1,keyboard    ; przywrocenie p1 do poprzedniego stanu

            cjne   a,#255,nacisk  ; klawisz wcisnięty?
            clr   faza           ; nie: przywrucenie stanu poczstkowego 
            mov   repeat,#1
    intend: mov     keyboard,#255
            ret
    nacisk:
            mov     keyboard,a
            dec   repeat
            mov   a,repeat
            jnz   intend           ; kociec gdy licznik 'repeat' nie wyzerował sie
            jb   faza,intda1            ; sprawdzenie czy klawisz teraz wcisnięty
            setb    faza
            mov   repeat,#keys_delay_1 ; pierwsze opoznienie (dlugie)
            ret
    intda1:   mov   repeat,#keys_delay_2 ; drugie opoznienie (krotkie)
            ret


    A oto sposób podłączenia klawiatury. Na tym samym porcie co moduł LCD- podłączyłem klawiaturę, nie zauważyłem żadnych przekłamań transmisji do wyświetlacza podczas działania obsługi klawiatury (kilka mikrosekund zmian na lini danych LCD nic nie przekłamie, bo LCD ma na wejściu filtry RC i jest powolne):
    [img:34f3ccf9e8]http://www.republika.pl/sapero/elektronika/Klawiatura%20'51.gif[/img:34f3ccf9e8]
  • Altium Designer Computer Controls
  • #2
    Eagle
    Level 24  
    cytat :
    "
    A oto sposób podłączenia klawiatury. Na tym samym porcie co moduł LCD- podłączyłem klawiaturę, nie zauważyłem żadnych przekłamań transmisji do wyświetlacza podczas działania obsługi klawiatury (kilka mikrosekund zmian na lini danych LCD nic nie przekłamie, bo LCD ma na wejściu filtry RC i jest powolne): "


    Nie chcę się wymądrzać ale LCD nie jest wole. Czas strobowania 1 uS a to uważam że dostatecznie szybko !!!
    Po drugie klawiatura i LCD nie zakłucaja się powniewaz klawiatra ma swoją noge "uaktywnenia" (2) (p3.0) a wyświetlacz swoją (9) do strobowania.
    Poza tym jeśli LCD miał by filtry RC na wejściu to zgoda napewno był by strasznie wolny ;) . Ponieważ dąży się do tego aby wejścia miały jak najmniejszą wartośc pojemności i największą wartośc rezystancji ( impedancji) dzięki czemu zyskuje się na prędkości.

    UWAGA : nie napisałem tego postu aby umniejszyć twoja wiedzę, poprostu się z nią nie zgadzam ;) .

    Pozdrawiam Eagle
  • #3
    elektryk
    Level 42  
    Akane wrote:
    A oto sposób podłączenia klawiatury. Na tym samym porcie co moduł LCD- podłączyłem klawiaturę, nie zauważyłem żadnych przekłamań transmisji do wyświetlacza podczas działania obsługi klawiatury (kilka mikrosekund zmian na lini danych LCD nic nie przekłamie, bo LCD ma na wejściu filtry RC i jest powolne):
    Nawet można klawiature strobować sygnałem E od LCD (tylko trzeba sobie wybrać "dobry" poziom. Osobiście sprawdzane na PIC ale mój pomysł potwierdził kolega na klasycznej 51.
  • Altium Designer Computer Controls
  • #4
    rav.k
    Level 14  
    Cześć,
    Właściwie to z czym masz problem bo nie bardzo rozumiem. Według mnie nie powinieneś podłączać i klawiatury i LCD pod te same linie ponieważ o ile możesz określić sztywno czas przesyłania danych do LCD o tyle nie możesz określić chwili naciśnięcia klawisza co może zafałszować danąprzesyłaną do LCD. W przedstawionym przez ciebie schemacie zastosowałeś najgorszy sposób wykorzystania linii portów uP. Klawiaturę powinieneś zrobić na 6-ciu liniach 9 klawiszy co już daje parę linii do przodu po drugie procek znajdujący się w LCD pozwala na komunikację przez 4 linie danych a nie 8 a jeżeli już korzystasz z 8-miu to zastosuj zapis i odczyt LCD jako obsługę zewnętrznej pamięci RAM i masz wszystko uproszczone do granic możliwości. Jeżeli masz jakieś pytanka to rav.k(malpa)inetia.pl - wal śmiało, parę ładnych spędziłem z rodzinką '51 więc w miarę możliwości pomogę.
  • #5
    elektryk
    Level 42  
    rav.k wrote:
    Właściwie to z czym masz problem bo nie bardzo rozumiem. Według mnie nie powinieneś podłączać i klawiatury i LCD pod te same linie ponieważ o ile możesz określić sztywno czas przesyłania danych do LCD o tyle nie możesz określić chwili naciśnięcia klawisza co może zafałszować danąprzesyłaną do LCD
    Po to są tam diody. Jeśli na pinie 2 procka jest stan wysoki to naciśniecie klawiszy nie wpływa na linie danych do LCD.
  • #6
    rav.k
    Level 14  
    Przepraszam, nie zastanowiłem się nad tymi diodami. Nie zmienia to i tak faktu że można wykorzystać linie lepiej a sam post jest dla mnie nie czytelny.
  • #7
    rav.k
    Level 14  
    Chodziło mi oczywiście o odseparowanie LCD od klawiatury przy danej liczbie linii, bo za takim rozwiązaniem się zawsze skłaniam. Uważam że 2w1 sprawdza się tylko w szamponach.
  • #8
    Akane
    Level 27  
    To jeszcze raz ja. Widzę, że toczy się ostra wymiana poglądów więc postanowiłem nieco sprostać. Jak wynika z tematu postu - jest to projekt programu a nie sposobu podłączenia klawiatury. Jeden z czytelników napisał coś o strobowaniu - chyba miał na myśli moduł LCD z telefonu, bo w 'naszych' modułach dane są zatrzaskiwane opadającym zboczem linii E wyświetlacza. Drugi kolega napisał że źle podłączyłem LCD do procesora. Oświadczam, że nie lubię komplikować programu tylko dlatego, że ktoś w EP napisał że właśnie tryb czterobitowy jest najoszczędniejszy. Może i jest, ale ja mam to głęboko gdzieś, a tryb ośmiobitowy jest bardzo dobry bo umożliwia podłączenie bardzo dużej ilości układów dodatkowych do procesora.

    Wydawałoby się że można tak podłączyć 7*8 klawiszy; w żeczywistości można użyć 7+8 linii do strobowania klawiatury (port P1 i P3) i tyleżsamo klawiszy: mamy do dyspozycji 13*13 klawiszy (od każdego portu procesora podłaczamy jedną diodę... a zresztą zaraz naskrobię coś, jeśli będą zainteresowani)
  • #9
    elektryk
    Level 42  
    Akane wrote:
    Jeden z czytelników napisał coś o strobowaniu - chyba miał na myśli moduł LCD z telefonu, bo w 'naszych' modułach dane są zatrzaskiwane opadającym zboczem linii E wyświetlacza.
    Mam na myśli dokładnie moduły hd44870. Możesz aktywować klawisze stanem lini E i będzie to działać tak samo jak w Twoim układzie. To jest poprostu kolejna metoda na zaoszczędzenie linii. Ja rozumiem że niektórzy koledzy są oburzeni taki "metodami" ale w ten sposób można urzyć tańszego/mniejszego procesora a dodatkowo bardzo dobrze świadczy o kreatywności projektanta. Taka reguła moim zdaniem obowiązuje w układach gdzie nie ma wyodrębnionej magistrali danych/adresów.
  • #10
    Akane
    Level 27  
    Pewnie że można, tylko że bez dodatkowego filtru RC przy samym module LCD się nie obejdzie. Przecież linia E w stanie H jest stanem spoczynkowym dla hd44870, więc nie widzę problemu aby jej też użyć do strobowania klawiszy.

    Różni ludzie oglądają nasze projekty, więc nie komplikujmy zbytnio tego co wystawiamy na publiczny widok

    apropos PCF 8574 - taniej kupić procesor '51 i zaimplementować w nim funkcje pcf'a aniżeli kupować gotowy i dwukrotnie droższy pcf - można zyskać 5-6 dodatkowych portów I/O

    rav.k - jeżeli nie wiesz o co mi chodzi, to uruchom dowolny edytor tekstu, wciśnij klawisz np: A i zobacz w jaki sposób Twój komputer pisze literę. Nie rusza odrazu z kopyta tylko dopiero jak przytrzymasz klawisz jakieś pół sekundy. (tak działa mikrosterownik w klawiaturze a nie komputer)
  • #11
    Tdv
    Level 34  
    rav.k wrote:
    Cześć,
    Właściwie to z czym masz problem bo nie bardzo rozumiem. Według mnie nie powinieneś podłączać i klawiatury i LCD pod te same linie ponieważ o ile możesz określić sztywno czas przesyłania danych do LCD o tyle nie możesz określić chwili naciśnięcia klawisza co może zafałszować danąprzesyłaną do LCD. W przedstawionym przez ciebie schemacie zastosowałeś najgorszy sposób wykorzystania linii portów uP...



    To znaczy, że wszystkie PC, Mac'i SUN'y IBM'y i cała reszta komputerów to szmelc bo też stosują magistrale do kilku (całkiem licznych kilku) urządzeń - a w sumie pomysł kolegi sprowadza się do zrobienia swego rodzaju magistrali. Jeżli ktoś potrzebuje 8 klaiwszy i LCD to rozwiązanie jest bardzo dobre moim zdaniem. Co do oszczędności portów to chyba liczyć nie potrafisz:
    6 pinów na klawiaturę (matryca 3x3),
    7 pinów na LCD (4 dane i 3 sterujące),
    Razem: 13;
    Rozwiązanie powyżej:
    8 pinów na magistralę danych,
    1 pin do sterowania klawiatury
    3 piny do sterowania LCD
    Razem: 12;
    Jeżeli by wykorzystać pomysł elektryka i klawiaturę sterować sygnałe ENABLE z LCD (stan nieaktywny dla LCD) to potrzebujesz 11 pinów.
  • #12
    Akane
    Level 27  
    Zauważ, że tylko jeden pin jest zablokowany (zarezerwowany) dla klawiatury (ewentualnie dla LCD jako Enable); reszta pinów może być dalej używana do podłączeń dalszych użądzeń.

    Nikt też nie zauważył, że wykożystując klawiaturę matrycową na trzech liniach procesora, można podłączyć 9 przycisków! Ale używając połączeń matrycowycy nie można zabardzo podłączać do zużytych pinów innych użądzeń, więc matryca odpada w bardzo rozbudowanych układach.

    Oto projekt matrycy: 3 linie - 9 klawiszy
    Projekt: klawiatura 51 na przerwaniach

    Działa to tak: po ustawieniu stanu L na linii A (B=C=1) wciścięcie pierwszego klawisza zeruje linię B, drugiego klawisza- linię C, a trzeciego linie B i C... i tak podobnie do dwuch pozostałych.
    Oczywiście matryca czteroliniowa umożliwia podłączenie 16 przycisków

    A jeśli chodzi o oszczędność to można też tak:
    Projekt: klawiatura 51 na przerwaniach
  • #13
    s_ice
    Level 14  
    Witam.
    Czy przypadkiem na 4 liniach nie da się obsłużyć 28 przycisków (a nie 16) ?
    Wystawiając stan L na kolejnych liniach można odczytać z trzech pozostałych kody 001,010,011,100,101,110,111 czyli siedem klawiszy są 4 linie więc 4x7=28 klawiszy, kod 000 to nic nie wciśnięte. Czy mam rację ,a może się mylę? Pytam bo właśnie robię sobie klawiaturke do komputera pokładowego 4x4 z tymi diodami i zauważyłem ,że zostały mi niewykorzystane kombinacje. Chcę zaprojektować sobie płytkę dlatego szukam potwierdzenia do tego ,abym nie zepsuł sobie płytki.
  • #14
    Akane
    Level 27  
    :) dokładnie

    1 linia odpada bo zawsze jedna z linii musi być "strobem"
    mamy 3 linie - i 8 możliwych kombinacji na nich. Jedna kombinacja odpada bo oznacza brak wciśniętego klawisza. Mnożymy ilość kombinacji przez ilość linii i mamy liczbę klawiszy :)

    czyli 4 linie * 7 kombinacji dla (4-1) pozostałych

    LOL dla pięciu linii mamy 5* (2^4 -1) = 75 klawiszy :)

    max klawiszy = n * (2^(n-1) -1) gdzie n to liczba linii

    przykład dla czterech linii
    kwadracikami zastąpiłem diody skierowane ku górze, złączone katodami
    Projekt: klawiatura 51 na przerwaniach