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
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.
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.
;andere Interrupt-Vektoren
Hier müssen noch die anderen Interrupt-Vektoren eingefügt werden, die habe ich vorhin entfernt.
Falls es nicht klappt, dann machs nocheinmal so wie vorher ohne das interrupt0 label.
Lesezeichen