Also erstmal ein wenig zu der RJMP-Instruction. Der ganze Befehl verbraucht 2 Byte Speicher. 1Byte für den Befehl, 1 Byte für den Parameter k also die Addresse die angesprungen werden soll. Deswegen solltest du die Interrupt-Vektoren mit einem RJMP-Statement auf ein Label festsetzen, welches unmittelbar unter der Vektoren-Tabelle steht. (Das hat eigentlich nur Geschwindigkeitsrelevante Gründe - der JMP-Befehl nimmt ein Wort als Parameter) Deswegen hab ich die Routine für den externen Interrupt mal direkt unter die Tabelle geschrieben.Code:.include "m8def.inc" .def temp = r16 rjmp reset ; Reset Handler ;rjmp interrupt0 ; IRQ0 Handler ;andere Interrupt-Vektoren ;reti ;----------Interruptprozedur-------------- interrupt0: com r17 out PORTC, r17 reti ;---------------------------------------- reset: ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse out SPL, temp ldi temp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse out SPH, temp ldi r16, 0xFF out DDRC, r16 ; Port C output ldi r17, 0x00 out PORTC, r17 ; Port C LEDs an ;-----------externer Interrupt enablen-------------- ldi r16, 1<<int0 out GICR, r16 ldi r16, 1<<ISC01 out MCUCR, r16 sei ;global interrupt enable rjmp main ;<---- ;---------------------------------------------------- main: loop: rjmp loop
Das einzige, was ich sonst noch geändert habe, ist das Einfügen eines RJMP-Befehls auf das Main-Label.
So hier mal eine Erklärung zum Thema Interrupts:
Der Reset-Handler wird immer dann ausgeführt, wenn ein Hardware-Reset am Controller selbst bzw. am Reset-Pin durchgeführt wird. Das gilt quasi als Reset des Controllers, was durch einen Abfall der Spannungsversorgung passiert sein könnte, oder eben durch das gewollte betätigen eines Schalters. Über den Interrupt-Vektor wird die Reset-Routine aufgerufen, der Stack und und der Port initialisiert. Anschließend wir dann via rjmp main, die Main-Routine aufgerufen, dort fängt dein Programmfluss an.
Der Mikrocontroller kann eingentlich nicht kaputt sein. Versuchs mal so wie oben. Es kann daran liegen, das es nicht funktioniert hat, dass direkt nach dem Reset in die interrupt0-Routine weitergeganen wurde, wo dann per reti der saubere Ablauf zerhackt wurde.
Hier müssen noch die anderen Interrupt-Vektoren eingefügt werden, die habe ich vorhin entfernt.;andere Interrupt-Vektoren
Falls es nicht klappt, dann machs nocheinmal so wie vorher ohne das interrupt0 label.







Zitieren
Lesezeichen