Hallo, ich beschäftige mich seit 4 Tagen mit den ATMega16 und dem AVR-Studio. Ich möchte mich mit den Interrupts und den dem Timer0 beschäftigen und habe in Anlehnung an einige Beispiele (auch aus diesem Forum) ein kleines Programm geschrieben. Leider macht es nicht ganz das was ich möchte. Bis zum Überlauf des Timers und setzen des Timer0-Interrupts ist alles OK. Danach sollte er eigentlich zum Label "Zeitum" springen, springen tut er auch noch, nur landen tut er irgend wo anders. Laut Disassembler, landet er je nach Änderung im Code, mal weiter vorne oder hinten oder irgendwo weit außerhalb des Codes im SRAM. Warum? Ich weiß nicht mehr weiter, bitte helft mir. Pierre
lese mal im tutorial nach was ein stackpointer ist
Stackpointer initialisieren vergessen :) ldi temp, LOW(RAMEND) out SPL, tmp ldi tmp, HIGH(RAMEND) out SPH, tmp muss gleich nach start ausgeführt werden (sozusagen als allererstes)
So wie ich das verstanden habe, brauche ich ihn nur, wenn ich Irgendetwas sichern möchte. Ich hatte früher auch schon einen Stack eingerichtet (siehe Anhang), das Resultat bleibt das Gleiche, erlandet hinter dem Label "Zeitum". Pierre
eigentlich habe ich mir fest vorgenommen, mich durch diese Biitadressierung nicht mehr durchzuwurschteln... LDI tmp, 0b00000010 ;timer0 int enable OUT timsk,tmp da kann man sich jetzt durchs Datenblatt wurschteln, um zur 1 die passeende Bitstelle zu suchen :-( Und siehe da: du gibst den OCIE0 frei. Weniger fehleranfällig und einfacher lesbar geht das so: ldi temp, (1<<TOIE0)
> So wie ich das verstanden habe, brauche ich ihn nur, wenn ich > Irgendetwas sichern möchte. Genau, so wie es z.B. Interrupts tun, damit sie wissen, wohin nach der ISR zurückgesprungen werden muß. > Ich hatte früher auch schon einen Stack eingerichtet (siehe > Anhang), das Resultat bleibt das Gleiche, erlandet > hinter dem Label "Zeitum". LDI tmp, 0b00000010 ;timer0 int enable OUT timsk,tmp Damit schaltest du nicht den Timer-Overflow-Interrupt ein, sondern den Output-Compare-Interrupt, für den du keinen Handler definiert hast. Hier sieht man wieder, warum es gut ist, Namen statt Bitkolonnen zu verwenden. LDI tmp, (1 << TOV0) OUT timsk, tmp
Danke, der Stackpointer & das falsche BIT im TIMSK wahren das Problem. Aber warum LDI tmp, (1 << TOV0) müsste es nicht LDI tmp, (1 << TOIEC) heißen? Pierre
weder noch. TOIE0 muss es heissen. Steht auch oben.
Das wahr der Tippfehlerteufel. Aber das mit den Bits werde ich mir annehmen. Nochmals an alle Helfer einen herzlichen Dank. Pierre
Einer weniger, der mit unlesbaren Konstanten hantiert :-). Dafür kommen aber bald min. 2 neue...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.