Skocz do zawartości

[Bascom] Atmega16 + klawiatura PS/2


mopsiok

Pomocna odpowiedź

Witam, może od razu przejdę do sedna - potrzebuję pobrać dane wysłane przez klawiaturę protokołem PS/2. Przeczytałem ten artykuł: http://edap.pl/artykuly/avr-i-klawiatura-ps2 i chciałbym zrobić coś takiego w Bascomie pod Atmegę16. Napotkałem jednak pewien problem. Spłodziłem taki oto kod:

$regfile = "m16def.dat"
$crystal = 7372800

'konfiguracja portow
Config Porta = Output                                       'LCD
Config Portd = Input                                        'dane z klawiatury
Portd.1 = 1


'konfiguracja wyswietlacza LCD
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , Rs = Porta.4 , E = Porta.5
Config Lcd = 16 * 2
Cursor Off
Cls

'konfiguracja przerwania (impulsy CLK)
Config Int0 = Falling
On Int0 Czytaj
Enable Int0
Enable Interrupts

'petla glowna programu
Do
Loop
End


Czytaj:
  Lcd Pind.1 
  Return

Kod działa poprawnie kiedy zamiast CLK z klawiatury (PIND.2, dokładniej to INT0) podepnę zwykły wyłącznik dwupozycyjny, który przełącza się między +5V a 0V, a zamiast szyny danych (PIND.1) wyłącznik łączący wejście mikroprocka z masą. Czyli przy zwarciu wejścia INT0 do masy następuje wypisanie kolejnego stanu na PIND.1. Inna sprawa to to, że odczyt występuje 2 razy na opadnięcie jednego zbocza - chociaż to akurat jest pewnie wywołane przez drgania styków.

Jednak, kiedy podepnę klawiaturę (między CLK i danymi są rezystorki 4.4k do +5V), a kod zamienię na ten:

$regfile = "m16def.dat"
$crystal = 7372800

'konfiguracja portow
Config Porta = Output                                       'LCD
Config Portd = Input                                        'dane z klawiatury
Portd.1 = 1


'konfiguracja wyswietlacza LCD
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , Rs = Porta.4 , E = Porta.5
Config Lcd = 16 * 2
Cursor Off
Cls

'konfiguracja przerwania (impulsy CLK)
Config Int0 = Falling
On Int0 Czytaj
Enable Int0
Enable Interrupts

Dim S As Byte , X As Byte
S = 0
X = 0

'petla glowna programu
Do
Loop
End


Czytaj:
  If S = 1 Then
     Incr X
     Lcd Pind.1
     'jesli przeczytano 10 bitow, to zakoncz odczyt
     If X = 10 Then
        S = 0
        X = 0
        Cls
     End If
  End If

  If Pind.1 = 0 Then S = 1                                 'jesli pierwszy bit = 0 to od nastepnego rozpocznij odczyt
  Return

...to dzieją się jakieś dziwne cuda. Mianowicie na LCD pierwszy bit to 0 (dla większości klawiszy), a reszta to same 1. Na dodatek nie wyświetla się ich 10, tylko jakoś tak dziwnie - najpierw 2 lub 4, a następne wyświetlą się dopiero po ponownym wciśnięciu przycisku. I tak zazwyczaj muszę wcisnąć go 3 razy żeby odebrać 10 bitów, które i tak są jak wyjęte nie powiem skąd 😅.

I tutaj moje pytanie do bardziej doświadczonych - co to za ustrojstwo? Czy może być do wina klawiatury? Jeśli to coś pomoże to dodam, że nie jest to standardowa z 6-pinowym gniazdem (ma ich tylko 5 - chyba ma trochę latek) i po włączeniu zasilania diody sygnalizacyjne włączają się na chwilkę (ze 300 ms) a później gasną na stałe, no chyba że włączę któregoś z locków na stałe.

//edit

Dobra, posiedziałem nad tym i doszedłem do wniosku że jest to po części wina tego, że za każdym zboczem opadającym wysyłam znak na LCD - a to trwa za długo. Posiedzę na tym jeszcze, wprawdzie znalazłem na necie kod do odbierania znaków (oparty nie na GETATKBD, tylko normalnie na odczycie stanów na CLK i DATA), ale on działa nieco... nieprzerwaniowo 😋.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.