www.mikrocontroller.net

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


Autor: Pierre Reymann (pierreone)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Denis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lese mal im tutorial nach was ein stackpointer ist

Autor: Stefan M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Pierre Reymann (pierreone)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pierre Reymann (pierreone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weder noch. TOIE0 muss es heissen. Steht auch oben.

Autor: Pierre Reymann (pierreone)
Datum:

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

Pierre

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einer weniger, der mit unlesbaren Konstanten hantiert :-).
Dafür kommen aber bald min. 2 neue...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.