logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Bascom] Jak podłączyć klawiaturę AT PS/2 do Atmega8 w Bascom? Konfiguracja i kod

Labis 05 Maj 2010 09:47 3089 14
REKLAMA
  • #1 8037223
    Labis
    Poziom 10  
    Posty: 7
    Witam serdecznie. Jako dość początkujący programista w Bascomie, szukam pomocy dotyczącej połączenia klawiatury komputerowej AT PS/2 pod Atmege8. Ogólnie posłużyłem się gotowym rozwiązaniem jakie znalazłem w książce m.wiazani:

    
    ...
    Config Keyboard = Pinb.6 , Data = Pinb.7 , Keydata = Keydata   
    ...
    Kod_kl = Getatkbd()   
    ...
    Keydata:
    
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
    Data &H5E , 0 , 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 ,
    Data 115 , 97 , 119 , 50 , 0 , 0 , 99 , 120 , 100 , 101 , 52,
    Data 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0 , 0 , 110,
    Data 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55,
    Data 56 , 0 , 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45
    Data 108 , 48 , 112 , 43 , 0 , 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0,
    Data 0 , 13 , 0 , 0 , 92 , 0 , 0 , 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0,
    Data 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 48 , 44 , 50 , 53 , 54 , 56,
    Data 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
    Data 0 , 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65,
    Data 87 , 34 , 0 , 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86,
    Data 70 , 84 , 82 , 37 , 0 , 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0,
    Data 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0 , 0 , 59 , 75 , 73 , 79,
    Data 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0 , 0 , 0 , 0,
    Data 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0 , 0 , 62,
    Data 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0 , 48,
    Data 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    


    Wykorzystując te porady, oraz to co znalazłem w Helpie Bascoma mogłem linie CLK i DATA klawiatury podpiąć pod dowolne piny atmegi. W moim przypadku były to PINB.6 i PINB.7

    Program niestety nie działa poprawnie, tzn jest reakcja na klawisz, natomiast dane są bardzo błędnie przesyłane - efektem jest wyświetlanie rożnych liter, rzadko poprawnych.

    Moje pytanie jest takie - czy ta procedura Getatkbd() w ogóle działa poprawnie, czy też ja o czymś zapomniałem, i w końcu czy jest faktycznie mało ważne do jakich pinów podpina się linie klawiatury.

    Przeglądając fora i inne 'nazwijmy to gotowe rozwiązania' zauważyłem że stosuje się również metodę połączenia klawiatury pod piny portu D INT0, ale niestety nie mam takiego doświadczenia jak poprawnie napisać program w oparciu o te przerwania by klawiatura działała poprawnie.
  • REKLAMA
  • #2 8037241
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Pytanie istotne. Cy błąd jest zawsze ten sam dla tego samego klawisza?
  • REKLAMA
  • #3 8037876
    Labis
    Poziom 10  
    Posty: 7
    Po prostu problem polega na tym, że gdy przykładowo wciskam na klawiaturze 'a' to na wyświetlaczu pojawia się jakiś inny 'losowy' znak. Wciskając kilka razy jedną literę za jakimś razem wyświetli poprawnie, no ale nie o to przecież chodzi. Z innymi klawiszami jest tak samo. Jednym słowem, źle przechwytuje dane z klawiatury. Czy może mieć na to wpływ to z jakich pinów korzystam?
  • #4 8038206
    Freddy
    Poziom 43  
    Posty: 19997
    Pomógł: 1394
    Ocena: 2821
    Spróbuj zastosować procedurę z helpa Bascoma.
  • #5 8038231
    ksarim
    Poziom 15  
    Posty: 168
    Pomógł: 17
    Ocena: 8
    Labis napisał:
    Czy może mieć na to wpływ to z jakich pinów korzystam?

    Na pewno ma. Moim zdaniem nie da się poprawnie obsłużyć klawiatury bez wykorzystania przerwań. Nie mam pojęcia jak jest to obsługiwane w BASCOMIE ale wiem jak działa klawiatura. W takt zmian sygnału CLK są przesyłane dane DATA. Całość sprowadza się do sprawdzania stanu na pinie do którego podłączony jest sygnał DATA podczas pojawienia się zbocza narastającego na CLK.
  • #6 8038239
    Freddy
    Poziom 43  
    Posty: 19997
    Pomógł: 1394
    Ocena: 2821
    ksarim napisał:
    Labis napisał:
    Czy może mieć na to wpływ to z jakich pinów korzystam?

    Na pewno ma. Moim zdaniem nie da się poprawnie obsłużyć klawiatury bez wykorzystania przerwań. Nie mam pojęcia jak jest to obsługiwane w BASCOMIE ale wiem jak działa klawiatura. W takt zmian sygnału CLK są przesyłane dane DATA. Całość sprowadza się do sprawdzania stanu na pinie do którego podłączony jest sygnał DATA podczas pojawienia się zbocza narastającego na CLK.

    W helpie jest właśnie jak to zrobic bez przerwań !
    Cytat:
    The application note from Atmel works in interrupt mode. For BASCOM we rewrote the code so that no interrupt is needed/used.
  • #7 8038805
    Labis
    Poziom 10  
    Posty: 7
    To mi sprawia wrażenie jakby były jakieś zakłócenia. Ogólnie stosuję właśnie ten program bez użycia przerwań. Klawiatura jest podłączona wg schematu z helpa i równocześnie ze strony m.wiazania. Natomiast zastanawiam się jak to jest, że gdy załączam układ, na klawiaturze migną lampki i się dalej nie palą, odłączając linie napięcia klawiatury i wciskając klawisz efekt jest ten sam co z załączonym napięciem - czyli tez coś wyświetla ale niepoprawnie.
  • #8 8039463
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    A podłączyłeś oporniki od tych pinów do + zasilania?
    Chyba 2.4k.
  • REKLAMA
  • #9 8043464
    Labis
    Poziom 10  
    Posty: 7
    Jeżeli chodzi o elektryczne sprawy, to układ jest poprawnie podłączony. Powiem tak: funkcja Getatkbd() działa bardzo dobrze. Problem błędnych znaków wynika z następującego faktu: w całym programie pracuję na przerwaniach i timerze0:

    
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Przerwanie
    Enable Timer0
    Enable Interrupts
    


    Ponieważ timer0 pracuje cały czas, powoduje bliżej mi nie znane błędy zliczeniowe w czasie oczekiwania na reakcje klawiatury. Chwilowo zrobiłem to tak:

    
    Stop Timer0
    Kod_kl = Getatkbd()
    Start Timer0
    


    W ten sposób na moim ekranie wyświetla się poprawnie znak, jednakże program jest zawarty w pętli więc czekając na wciśnięcie kolejnego klawisza, timer0 zatrzymuje się i nie widzę wyświetlanych znaków dopóki nie nacisnę kolejnego klawisza. Rozwiązanie to jest beznadziejne, czy mógłby ktoś zaproponować coś innego, najlepiej takie rozwiązanie, które umożliwi zebranie wszystkich znaków wprowadzonych w postaci jednej zmiennej typu string o długości np 16 znaków. Chwilowo mogę zarządzać tylko jednym znakiem który przesuwam robiąc miejsce na kolejny.
  • #10 8043861
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    To zależy co robisz w przerwaniach.
    Wysyłanie znaku z klawiatury zajmuje ok. 4ms.
    W przerwaniach obsługuję odbiór i nadawanie znaków przez uart i odczyt z ADC- i nic się jakoś nie psuje.
    Być może- jeszcze.
    Ale co ile Twój Timer0 generuje przerwanie- nie wiadomo- bo nie podałeś częstotliwości.
    I ile czasu zajmuje obsługa przerwania- też nie wiadomo.
    P.S.
    W helpie jest też obsługa klawiatury w przerwaniach i obsługa w postaci funkcji Getatkbrow- nie oczekującej na wciśnięcie klawisza i zwracającej "surowe" dane.
    Ale jeszcze tego nie sprawdzałem.
  • #11 8044118
    Freddy
    Poziom 43  
    Posty: 19997
    Pomógł: 1394
    Ocena: 2821
    Kombinujecie jak koń pod górę. W helpie Bascoma jest przykład jak obsłużyć klawiaturę bez przerwań i działa bez zarzutu, sprawdzałem.
  • #12 8044415
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    No pewnie że jest w helpie- to jest ta podstawowa zasada getatkbd.
    Ale jak wejdziesz w przerwania gdzie dasz wait- a oczekiwanie na kod klawisza nie wyłącza przerwań- to będą błędy.
    Podobnie będzie gdy przerwanie od Timera będzie np. co 100us- a nie wiadomo co ile jest- co ile Autor daje.
  • REKLAMA
  • #13 8045251
    Labis
    Poziom 10  
    Posty: 7
    Jeżeli chodzi o użyte parametry, to:

    
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Keyboard = Pinb.6 , Data = Pinb.7 , Keydata = Keydata
    Config Portd = Output
    Config Pinb.1 = Output
    
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Przerwanie
    Start Timer0
    Enable Interrupts
    Enable Timer0
    
    Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 0
    


    Ogólnie, już sobie zdałem sprawę, że będzie mi bardzo trudno obsługiwać przerwania i jednocześnie korzystać z funkcji getatkdb().

    Chciałbym w tym momencie zapytać się o inną rzecz: mianowicie wykorzystuję program z helpa, pracuję na atmedze8 gdzie wszystkie piny portu D (więc i TXD i RXD) są zajęte przez wyprowadzenia na układ. w momencie kiedy korzystam z $serialinput = Kbdinput, wspomniane porty PD0 i PD1, przestają działać. Czy jest jakaś możliwość by dalej działały jako wyjścia?
  • #14 8045927
    Labis
    Poziom 10  
    Posty: 7
    ------------------------

    Mam jeszcze takie pytanie do użytkownika janbernat bo z tego co wyczytałem w innym temacie: https://www.elektroda.pl/rtvforum/topic1647144.html miał podobny problem - mianowicie czy udało się utworzyć pętlę z użyciem Getatkbd(), bo jak można doczytać z helpa, funkcja ta oczekuje na wciśnięcie znaku, więc jak zatrzymam przerwania to nie ruszą ponownie, dopóki nie nacisnę dowolnego klawisza. W temacie użytkownik stworzył coś takiego:

    
    ...
    Do
    
      Kod_kl = Getatkbd()         'odczytanie danej z klawiatury
       If Kod_kl <> 0 Then
         Gosub Klawiatura
         Printbin 144;            '144
       End If
    
       Toggle Portb.2
    
    Loop 
    ...
    


    Więc moje pytanie jest bardzo ważne - czy ta pętla działa, czy też mogę zapomnieć o wykorzystaniu tej 'fajnej' funkcji i uciekać w stronę przerwań zewnętrznych na INT0 ?
  • #15 8046629
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Pętla oczywiście "stoi" i czeka na naciśnięcie klawisza.
    Tak że na razie nie udało mi się wsadzić tej funkcji w przerwanie.
    Ponieważ cała reszta programu jest w przerwaniach to na razie mi to nie przeszkadza.
    A z pomysłu z helpa też nie mogę skorzystać bo też potrzebuję UART-a.
    Spróbuję jeszcze z Getatkbdrow().
    Ale oczywiście to że pętla "stoi i czeka" nie blokuje przerwań- wszystkie są obsługiwane.
    P.S.0
    Przerwanie od Timera wywołujesz co 16ms.
    Naciśnięcie klawisza powoduje że klawiatura wysyła swoje sygnały przez ok.4ms.
    W zasadzie w dwóch częściach- 1ms sygnał data niski i po ok.2ms kod klawisza.
    Można by sprawdzić czy przy przerwaniach od Timera np. co 0.256ms to przerwanie nie zakłóca obsługi klawiatury.
    P.S.1
    Funkcja Getatkbdraw() jest taką samą porażką jak Getatkbd().
    Czeka na naciśnięcie klawisza.
    I wcale nie zwraca wartości 0 przy braku naciśnięcia.
    Tak samo jak Getatkbd().
    Po prostu nic nie zwraca- jak w C void()
    Tak że sądzę że w helpie piszą "pobożne życzenia"- a nie prawdę.
    P.S.2
    I nie zatrzymuj przerwań.
    P.S.3
    I nie sugeruj się tym że mam gwiazdkę- chyba jako "pomocny".
    I tym że tyle razy "pomógł".
    Jestem tak samo głupi jak Ty- albo jeszcze głupszy.
    To znaczy tylko że jak wydaje mi się że coś wiem- to piszę.
    Czasem tylko "wydaje mi się".

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem podłączenia klawiatury AT PS/2 do mikrokontrolera Atmega8 w języku Bascom. Użytkownik zgłosił, że klawiatura nieprawidłowo interpretuje naciśnięcia klawiszy, co objawia się wyświetlaniem losowych znaków. W odpowiedziach zasugerowano, że problem może wynikać z braku użycia przerwań oraz niewłaściwego podłączenia pinów. Użytkownik próbował różnych konfiguracji, w tym użycia funkcji Getatkbd() oraz Timer0, jednak napotkał trudności w synchronizacji przerwań. Wskazano na konieczność stosowania oporników oraz na możliwość obsługi klawiatury bez przerwań, co zostało potwierdzone przez innych uczestników dyskusji. Użytkownik poszukiwał również sposobu na zbieranie danych z klawiatury w formie zmiennej typu string.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA