problem z transmisją przez PS/2 (avr)

Jan 18, 2004 2 Replies

Witam



Sprawa wygląda tak: układ ma naśladować klawiaturę i wysyłać do komputera różne dane przez PS/2. Mam sobie AVRka (2313), 4MHz, 33pF, coś przeciwzakłuceniowego i na sztywno podłączone 2 porty I/O jeden z CLK a drugi z DATA na PS/2. Zasilanie też bioręz PSa.



No i teraz jest tak: ładny opis protokołu znalazłem na

formatting link
piszę sobie programik w ASM i wyraźnie widać, że te części programu, które nie komunikują się z kompem działają poprawnie. Do kompa (próbnie) wysyłam sobie kody 30 i 158 (naciśnięcie i zwolnienie klawisza litery 'a'), a ten nic nie widzi :(



Jak by ktoś miał trochę czasu i chęci, to wklejam kawałek kodu od wysyłania. będę baardzo wdzięczny za pomoc, bo już nie mam do tego siły...



Pozdrawiam Antoni Gerc



;dane do wysłania w rejestrze 'data' send: sbis PORTD, clkp rcall receive ;na razie czeka az CLK będzie w stanie wysokim sbi DDRD, datap ;przełączenie linii danych w tryb wyjście ;bit startu (0): cbi PORTD, datap rcall pulsed ;impuls zegarowy ;bity danych: clr temp ;liczba jedynek w bajcie clr temp2 pbds: ;petla bitow do wyslania sbrc data, 0 rjmp bis ;bit is set cbi PORTD, datap rjmp bdone bis: sbi PORTD, datap inc temp ;zwiększenie liczby jedynek bdone: lsr data ;logical shift right rcall pulsed ;impuls zegarowy inc temp2 cpi temp2, 8 brlo pbds ; ;bit parzystosci (gdy liczba jedynej jest nieparzysta, to 0): sbrs temp, 0 ;skocz jeśli liczba jedynek jest nieparzysta rjmp pbis ;parity bit is set cbi PORTD, datap rjmp bdone2 pbis: sbi PORTD, datap bdone2:rcall pulsed ;impuls zegarowy ;bit stopu (jedynka): sbi PORTD, datap rcall pulsed ;impuls zegarowy cbi DDRD, datap ;przełączenie linii danych w tryb wejścia ret


;procedura generująca impuls zegarowy. Wywoływana po ustaleniu ;na linii danych stanu do wysłania pulsed: sbi DDRD, clkp ;przełączenie linii zegarowej w tryb wyjścia rcall wait20 cbi PORTD, clkp ;zbocze zegarowe rcall wait20 rcall wait20 sbi PORTD, clkp rcall wait20 cbi DDRD, clkp ;przełączenie linii zegarowej w tryb wejścia ret


;odbiera bajt przesylany z komputera: receive: cbi PORTD, 6 ;zgaszenie diody sbi PORTD, 6 ;zgaszenie diody sbis PORTD, clkp rjmp receive ret



;procedura opóźniająca dla potrzeb opóźnienia zegara ;80 instrukcji = 20 mikrosekund wait20: push temp ldi temp, spd1 ;pozycja startowa (bylo 215) wnext: inc temp ;zwiększ licznik brvc wnext ;jeśli niema przepełnienia kontynuuj pop temp ret ;jeśli jest przepełnienie zakończ


no to udalo mi sie zrobic blad przed samym wyslaniem: oczywiscie mov a nie ldi (ldi bylo przy stalej ;/ )

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required