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.

Klawiatura -> PS/2 -> AVR ATmega8 - problem z komunika

Defozo 23 Gru 2010 22:00 7580 3
  • #1 23 Gru 2010 22:00
    Defozo
    Poziom 17  

    Witam, zrobiłem układ według tego schematu:
    Klawiatura -> PS/2 -> AVR ATmega8 - problem z komunika

    I napisałem taki program: Link

    Code:
    #define F_CPU 1000000
    
    #include <avr/io.h>
    #include <util/delay.h> 

    int main(void)
    {
       while(!(bit_is_clear(PIND, PD2))) {} //wykrywanie bitu startu?
       while(!(bit_is_clear(PIND, PD6))) {}
       while((bit_is_clear(PIND, PD2))) {}
       while((bit_is_clear(PIND, PD6))) {}
       DDRB = 0xFF;
       PORTB = 0xFF;
    }

    Albo ten: Link

    Jeśli dobrze rozumiem komunikację PS/2 to na porcie B powinno być wysokie napięcie gdy kliknę jakikolwiek przycisk na klawiaturze.
    A tak się nie dzieje. Dlaczego?

    Być może powyższy kod jest zły, ponieważ jestem już tym trochę zdesperowany, testowałem już 2 biblioteki do obsługi PS/2 i na żadnej nie udało mi się tego uruchomić.

    Może ktoś z was ma jakiś przykładowy program typu "kliknij 'a' to zapali się dioda Num Locka"?

    Proszę o pomoc,
    Defozo

    0 3
  • #2 26 Gru 2010 23:24
    Driver-
    Poziom 38  

    Defozo napisał:
    Jeśli dobrze rozumiem komunikację PS/2 to na porcie B powinno być wysokie napięcie gdy kliknę jakikolwiek przycisk na klawiaturze.
    A tak się nie dzieje. Dlaczego?
    PS/2 to nazwa zarówno złącza jak i protokołu komunikacyjnego. Klawiatura jest urządzeniem, którego złącze PS/2 jest dwukierunkowe, to znaczy że z i do kontrolera klawiatury można wysyłać dane. µP jest zawsze urządzeniem nadrzędnym a kontroler klawiatury sprawdza stan na linii CLK. Jeśli jest na niej stan wysoki "H" (min. przez 50µs) to µP jest wolny (oczekuje na transmisję) i klawiatura może wysłać dane. µP może zawsze przerwać transmisję przez wyzerowanie CLK, stan niski CLK oznacza dla kontrolera klawiatury że µP jest zajęty (robi coś innego) wtedy kontroler klawiatury magazynuje dane i wysyła je przy najbliższej okazji kiedy µP jest wolny (stan "H"na CLK). Proces odczytu/zapisu danych jest synchroniczny tzn. że każdemu stanowi L na CLK odpowiada jeden stanów (L/H) bitu danych. Transmisja rozpoczyna się w momencie kiedy na CLK wystąpi pierwszy stan "L" przebiegu zegarowego i na DATA bit START (zawsze "L"). Transmisję do µP kończy bit STOP (zawsze "H").
    Schemat przykładowego połączenia AVR - keyboard
    Klawiatura -> PS/2 -> AVR ATmega8 - problem z komunika
    Jak widzisz klawiatura ma już oporniki podciągające, wiec nie trzeba ich dodawać na płytce µP. Oczywiście linia CLK może być podłączona do dowolnego pinu portu, nie musi być koniecznie podłączona do portu INT0/1 i tak samo linia DATA. Np. linia CLK może być podłączona do portu PD0, a linia DATA - PD1. Wtedy INT możesz wykorzystać do innego celu.

    Defozo napisał:
    Być może powyższy kod jest zły, ponieważ jestem już tym trochę zdesperowany, testowałem już 2 biblioteki do obsługi PS/2 i na żadnej nie udało mi się tego uruchomić.
    Możliwe że nie dodałeś którejś z tych bibliotek
    Code:
    #include <pgmspace.h>
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "io8515.h"
    #include "serial.h"
    #include "gpr.h"
    #include "kb.h"

    Najpierw wyznaczasz porty µP i ustawiasz je w rejestrach jako wejścia bez wewnętrznych oporników podciągających. Dopiero możesz odczytywać dane synchronicznie, pamiętając że to klawiatura taktuje linię CLK przy wysyłaniu danych. Dane powinny być odczytywane, dopiero kiedy takt na linii zegara CLK jest już w stanie niskim.
    11 bitowa ramka wygląda tak:
    Klawiatura -> PS/2 -> AVR ATmega8 - problem z komunika





    Defozo napisał:
    Może ktoś z was ma jakiś przykładowy program typu "kliknij 'a' to zapali się dioda Num Locka"?
    Aby wysłać coś do klawiatury po odczytaniu z niej jakiegoś znaku najpierw przełączasz linie CLK na wyjście, które musi być ustawione na poziom wysoki "H" następnie z µP wysyłasz do niej na linii CLK stan niski tzw. sygnał "Request-to-send" po którym klawiatura przechodzi na odczyt, ale zanim wyślesz dane z µP musi na CLK i DATA upłynąć 100µs. Po tym czasie możesz dopiero zacząć wysłać dane z µP również w sposób synchroniczny, ale należy pamiętać że to klawiatura zawsze taktuje linię CLK, wiec po Request-to-send ponownie trzeba przełączyć port µP na linii CLK jako wejście. Po tym przełączasz linie DATA µP jako wyjście i wysyłasz dane w scancode. Każdy bit danych z µP musi być taktowany z linii CLK. Po wysłaniu do klawiatury ostatniego bitu "STOP" musisz przełączyć port DATA ponownie jako wejście µP, ponieważ kontroler klawiatury, jeśli poprawnie odbierze dane, wysyła bit potwierdzenia prawidłowego przyjęcia danych tzw. bit ACK.
    Cały proces wygląda tak.
    Klawiatura -> PS/2 -> AVR ATmega8 - problem z komunika
    W necie można znaleźć biblioteki z zaimplementowanymi funkcjami obsługi klawiatury w tym z konwerterami scancodes/ASCII. A nawet całe programy na AVR.

    0
  • #3 27 Gru 2010 21:29
    Defozo
    Poziom 17  

    Driver- napisał:
    W necie można znaleźć biblioteki z zaimplementowanymi funkcjami obsługi klawiatury w tym z konwerterami scancodes/ASCII. A nawet całe programy na AVR.

    Mógłbyś zapodać linka (szczególnie do tych całych programów)?

    Biblioteki jakie ja znalazłem:
    Link (2 biblioteki od dołu)
    Link (na dole strony)

    0