Záhadně se resetující program/uprocesor

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. :open_mouth: Zaboha na to nemůžu přijít.
Ještě to zkusím předělat na INT1, a pak už fakt nevim :open_mouth:
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í!

Planý poplach… Už jsem to objevil. Nejspíš chbně naprogramovaný MCU, přestože mi ponyprog po verifikaci napsal, že je to OK :open_mouth:

Jinak v programu mám ještě jednu drobnou chybku, kterou jsem ale odhalil během chvilky: sbic PORTB, PORTB0
Nemělo by tam být spíš
sbic PINB, PORTB0
? :slight_smile: