hallo ich habe eine routine für den AVR 8515 geschrieben. die interuptroutine wird bei erreichen des timer1 overflow angesprungen.
leider macht die routine nicht das was sie soll.
in der routine wird ein register(count) hochgezählt welches bei erreichen gewisser werte den port b ein und ausschaltet. bei erreichen des maxwertes wird das register wieder auf 0 gesetzt und die schleife beginnt von vorne.
dir routine funktioniert in einem testprogramm innerhalb einer endlosschleife wunderbar nur im interrupthandler nicht.
Hallo,
ich habe was gefunden und zwar in der interruptroutine machst Du rcalls :
rcall schreibe_bit
rcall loeschebit.....
in den obengenannten routinen sehe ich aber keine rets
also bleiben die Adressen die bei dem Sprung mit rcall auf dem stack geschrieben gerden
auch drin,
damit holst Du dir mit pop am Ende der Routine völlig falsche Werte rein,
ich denke es kommt auch irgenwann dazu daß der ram überläuft.
Ich hoffe daß ich Dein Programm nicht zu schnell überflogen habe, und daß ich damit recht habe.
Gruß Sebastian
hallo sebastian, danke für deine hilfe. ich habe das behoben. leider funktioniert die routine noch immer nicht. es ist wahrscheinlich ein fehler in der logischen abfolge. ich habe die procedur in einem testprogramm getestet und sie funktionierte, nur im timerhander macht sie nicht was sie soll.
Kein Problem,
Wenn ich solche Probleme habe, gehe ich volgendermaßen vor:
Alles in der Interruptroutine auskomentieren, und nur eine LED toggeln lassen,
also wenn Interrupt ausgelöst wird , prüfen, ob LED an, wenn ja dann ausschalten, und andersherum, ist die einfachste Möglichkeit sowas zu debuggen...
Wenn Deine LED dann am blinken ist, kannst Du Dir sicher sein, daß die Routine richtig angesprungen wird, und daß der Fehler woanders zu suchen ist.
wie Christian oben schon beschrieben hat, rufst Du die die Funktionen SchreibeBit und LoescheBit über Calls auf, aber diese Funktionen werden nicht über eine Return-Anweisung wieder verlassen, sondern Du springst mit einem rjmp wieder zurück. Deshalb bleibt die Rücksprungadresse auf dem Stack und beim reti am Ende der Interruptroutine wird zu einer falschen Adresse gesprungen. Irgendwann wird dann der Stack überlaufen.
Abhilfe: entweder, den Code für die Funktionen SchreibeBit und LoescheBit gliech an den Stellen einbauen, an denen sie gebraucht werden (ist ja nur eine Instruktion, da lohnt sich kein Unterprogrammaufruf); oder an das Ende der Funktionen kein rjmp, sondern einen ret einsetzen.
Lesezeichen