Zkouším komunikaci s PS2 klávesnicí, bohužel se mi nějak nedaří…
Program jsem zkoušel v simulátoru, a chová se naprosto předvídaně, žádné problémy. Nalil jsem program do megy32, a jakmile nějak zvenčí spustím INT0 (ať už ručně kusem drátku nebo když něco leze z klávesnice) tak se procesor resetuje. Otázkou je, jestli je chyba v programu, nebo v procesoru. Zaboha na to nemůžu přijít.
Ještě to zkusím předělat na INT1, a pak už fakt nevim
Zde je program:
.NOLIST
.INCLUDE "m8def.inc"
.LIST
;******************************************************************************
; Test PS2 klavesnice
;
; Co prijde z klavesnice se odesle po UARTU v hexadec. tvaru
;
; 115200-8N1
;
; Baudrate = 115200bps
; Xtal = 11.0592MHz
;
; PS2: CLK = PD2 (INT0)
; DATA = PB0
;
;******************************************************************************
.equ XTAL = 11059200
.equ BAUDRATE = 115200
.equ UBRR = XTAL/16/BAUDRATE-1
;***************************** INTERRUPT VECTORS ************************************
.CSEG
.ORG 0x000
rjmp Start
.ORG 0x002
rjmp INT0_handler
.ORG 0x030
;******************************* OBSLUHA PRERUSENI **********************************
INT0_handler: push R16
in R16, SREG
push R16
inc R19 ;zvetsit pocitadlo bitu
cpi R19, 1 ;jestli je to startbit, tak preskocit
breq INT0_E
cpi R19, 10 ;jestli jsou to datove bity, tak zaRORovat do R20
brlo smyc1
brne INT0_E ;Jestli to uz datove bity nejsou, ale je to paritni bit, zpracovat data
rcall Data_Valid ;zpracovani dat
rjmp INT0_E ;skok na konec
smyc1: nop ;zacatek RORovani dat :)
nop
nop
clc ;Kopie: PB0 -> C
sbic PORTB, PORTB0
sec
ror R20 ;RORuj! (prvni se posila LSB, takze ROR)
INT0_E: cpi R19, 11 ;pokud je to stopvit, vynuluj citac bitu
brne skok
clr R19
skok: pop R16 ;obnovit
out SREG, R16
pop R16
reti
;********************************* HLAVNI PROGRAM ***********************************
Start: ldi R16, low(RAMEND) ;Nastaveni stacku
out SPL, R16
ldi R16, high(RAMEND)
out SPH, R16
;INICIALIZACE UARTU 115200-8N1
ldi R16, 0b00100000 ;U2X=0
out UCSRA, R16
ldi R16, 0b00011000 ;Transmitter and receiver enable
out UCSRB, R16
ldi R16, 0b10000110 ;ASYNchronous mode, parity None, 1 stopbit, 8 databits,
out UCSRC, R16
ldi R16, low(UBRR)
out UBRRL, R16
ldi R16, high(UBRR)
out UBRRH, R16
;Odeslani pozdravu
ldi ZL, low(Zprava*2)
ldi ZH, high(Zprava*2)
smycka1: lpm R16, Z+
cpi R16, 0xFE ;Ukoncovaci znak zpravy je 0xFE
breq konecsm1
rcall UART_SendChar
rjmp smycka1
konecsm1:
ldi R16, 0b00000010 ;INT0 reagujici na falling-edge
out MCUCR, R16
ldi R16, 0b01000000 ;INT0 enable
out GICR, R16
clr R19 ;Pocitadlo bitu
clr R20 ;prijaty datovy byte z klavesnice
cbi DDRB, PORTB0 ;pin PB0 vstup s pullup-em
sbi PORTB, PORTB0
cbi DDRD, PORTD2 ;pin PD2 vstup s pullup-em
sbi PORTD, PORTD2
sei ;global interrupt enable
rjmp PC ;tady si skakej dokolecka, a cekej na INT0
;************************ SUBRUTINY **************************
;Odešle znak po UARTU
UART_sendChar: sbis UCSRA, UDRE ;Počkáme na prázdný UDR
rjmp UART_sendChar
out UDR, R16 ;Odeslani znaku
ret
;odesle po UARTu obsah registru, hexadecimalne
;ve tvaru jako "ABh"
UART_SendByte: push R16
andi R16, 0b11110000
swap R16
cpi R16, 0x0A
brlo mensi1
ldi R17, 55
rjmp vetsi1
mensi1: ldi R17, 48
vetsi1: add R16, R17
rcall UART_SendChar
pop R16
andi R16, 0b00001111
cpi R16, 0x0A
brlo mensi2
ldi R17, 55
rjmp vetsi2
mensi2: ldi R17, 48
vetsi2: add R16, R17
rcall UART_SendChar
ldi R16, 'h'
rcall UART_SendChar
ret
;Posle ziskana data po uartu
Data_Valid: mov R16, R20
rcall UART_SendByte
ldi R16, ','
rcall UART_SendChar
ret
Zprava:
.db "Tester PS/2 Klavesnic",13
.db "by Jan Sixta (c) 01.02.2009",13
.db "jan.16@seznam.cz http://jan16.czela.net/",13,0xFE
Dik moc všem, že se mi na program podívají!