Forum: Mikrocontroller und Digitale Elektronik Warum geht Sprung nach Timer0- Interupt ins Nirgendwo?


von Pierre R. (pierreone)


Angehängte Dateien:

Lesenswert?

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

von Denis (Gast)


Lesenswert?

lese mal im tutorial nach was ein stackpointer ist

von Stefan M. (Gast)


Lesenswert?

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)

von Pierre R. (pierreone)


Angehängte Dateien:

Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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)

von Rolf Magnus (Gast)


Lesenswert?

> 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

von Pierre R. (pierreone)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

weder noch. TOIE0 muss es heissen. Steht auch oben.

von Pierre R. (pierreone)


Lesenswert?

Das wahr der Tippfehlerteufel. Aber das mit den Bits werde ich mir
annehmen. Nochmals an alle Helfer einen herzlichen Dank.

Pierre

von crazy horse (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.