PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interupthandler, Phänomen verstehe ich nicht...



Raphael
23.07.2010, 15:24
Hallo,
ich habe ein kleines Programm geschrieben, in welchem ich den Timer1-Interupt verwende. Ich lasse schlicht und einfach eine LED am PortD blinken(ca. 1Hz).

Wenn ich den Anfang meines Programmes folgendermaßen ausführe, funktioniert das Programm nicht:


.include "m8def.inc"
.def ver = r20
.def ver1 = r21
.def ver2 = r22
.def zaehler= r19
.def zaehler1=r23
.org 0x0000
rjmp main
.org INT0addr ; External Interrupt0 Vector Address
reti
.org INT1addr ; External Interrupt1 Vector Address
reti
.org OC2addr ; Output Compare2 Interrupt Vector Address
reti
.org OVF2addr ; Overflow2 Interrupt Vector Address
reti
.org ICP1addr ; Input Capture1 Interrupt Vector Address
reti
.org OC1Aaddr ; Output Compare1A Interrupt Vector Address
reti
.org OC1Baddr ; Output Compare1B Interrupt Vector Address
reti
.org OVF1addr ; Overflow1 Interrupt Vector Address
rjmp timer0_overflow
.org OVF0addr ; Overflow0 Interrupt Vector Address
reti
.org SPIaddr ; SPI Interrupt Vector Address
reti
.org URXCaddr ; USART Receive Complete Interrupt Vector Address
reti
.org UDREaddr ; USART Data Register Empty Interrupt Vector Address
reti
.org UTXCaddr ; USART Transmit Complete Interrupt Vector Address
reti
.org ADCCaddr ; ADC Interrupt Vector Address
reti
.org ERDYaddr ; EEPROM Interrupt Vector Address
reti
.org ACIaddr ; Analog Comparator Interrupt Vector Address
reti
.org TWIaddr ; Irq. vector address for Two-Wire Interface
reti
.org INT_VECTORS_SIZE
main:


Wenn ich den Anfang so schreibe....ohne viel drumherum, funktioniert die "Blinkfunktion" super:



.include "m8def.inc"
.def ver = r20
.def ver1 = r21
.def ver2 = r22
.def zaehler= r19
.def zaehler1=r23
.org 0x0000
rjmp main ; Reset Handler
.org OVF1addr ; Overflow1 Interrupt Vector Address
rjmp timer0_overflow ; Timer Overflow Handler


Ich verstehe absolut nicht woran das liegt. Hat jemand eine Idee? Vielen Dank schonmal


Code-Tags verwenden ! (PicNick, Mod)

PicNick
23.07.2010, 17:11
Irgendein anderer ORG überschreibt dir deinen Vector.
Am besten im m8def.inc mal die Offsets einzeln checken
Oder im Debugger (compilation-listing) die Vec-Table kontrollieren.

Raphael
26.07.2010, 09:30
Hallo,
ah ja, ich habe den Fehler gefunden. Danke.

PicNick
26.07.2010, 09:52
Komm, verrat's uns. Wir woll'n ja auch was lernen

Raphael
27.07.2010, 08:12
Hi,
das Problem war, dass ich einen anderen Interupt (Output Compare1A) ausgelöst habe. Wenn ich jetzt eine vollständige Interupttabelle habe, springt er eben zu diesem Interupt, welches ich eigentlich nicht haben wollte.
Hatte ich eine unvollständige Tabelle, dann ist der Code von 0x0006 nach 0x0008 weitergeloffen und hat dann doch noch meine instruktion rjmp interupthandler erreicht...

Viele Grüße
Raphael

PicNick
27.07.2010, 09:30
Tricky.

Merci, vielmals.