mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR: Exakter Timer-IRQ möglich


Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

da ich etwas penibel bin, möchte ich die ISR EXAKT zu einem bestimmten 
Ereignis ausführen lassen.

Die ISR (Timer1-OVF / ATmega8) wird ja 3(?) Takte nach Beendigung des 
aktuellen Assembler-Befehls ausgeführt. Nun hat so ein Teil ja auch 
manchmal mehr als 1 Takt, die ISR wird also nicht exakt X Takte später 
ausgeführt, sondern mal X+1 oder X+2 Takte.

Frage:
Wie krieg ich innerhalb der ISR eine Synchronisierung hin?

Versucht habe ich es mit:
  in  r18, TCNT1L
Resync:
  in  r19, TCNT1L
  cp  r18, r19
  breq  ReSync

Das beißt sich aber leider, da 'breq' selbst 2 Takte braucht.

Gibt es da eine andere Möglichkeit?

Grüße,
Freakazoid

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo, CTC mode

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die ISR (Timer1-OVF / ATmega8) wird ja 3(?) Takte nach Beendigung des
> aktuellen Assembler-Befehls ausgeführt.

Nein. 4 Takte nach dem aktuellen Assembler-Befehl wird in die 
Interrupt-Vektor-Tabelle gesprungen (außer wenn der AVR schäft, dann 
dauert's länger). Dann folgt dort in der Regel ein rjmp, der nochmal 2 
Takte braucht.

> Nun hat so ein Teil ja auch manchmal mehr als 1 Takt, die ISR wird also
> nicht exakt X Takte später ausgeführt, sondern mal X+1 oder X+2 Takte.

So ist es. Die längsten Befehle brauchen 4 Zyklen (z.B. RET). Wenn also 
gerade ein RET mit seinem ersten Zyklus angefangen hat, verzögert sich 
die Ausführung der ISR zusätzlich um 3 Zyklen.

> Wie krieg ich innerhalb der ISR eine Synchronisierung hin?

Mir ist kein Weg bekannt, sowas hinzubekommen. Wenn du zyklengenau einen 
Port toggeln willst, geht das nur mit Output Compare.

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm. Theoretisch wüßte ich schon einen Weg. Aber ich hatte oben vergessen 
anzugeben daß der Prescaler aktiviert ist und ich dessen Stand bei 
Eintritt in die ISR nicht kenne.
Timerstand alleine könnte ich ja auslesen und Differenzen bilden (und 
diese dann mit Warteschleifen 'normalisieren').

Muß ich wohl mit bis zu 3 'Geistertaken' leben ....

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.