Kleine Anfängerfrage zu einem Timer

Gast #153719
Lesenswert?
• ▲
▼
Hallo,

ich habe einen AVR 162 mit externem Quarz, Timer1 (16Bit) läuft mit dem
Laden eines Wertes als 1-Sekunden-Timer mit Interrupt bei Überlauf.

Soweit geht auch alles, nur wenn ich im Hauptprogramm den Timerwert
auslese (TCNT1L & TCNT1H), so wird die Interruptroutine immer gleich 2
mal aufgerufen.

Was mache ich dabei falsch? Wie kann ich den Timerwert im Hauptprogramm
auslesen?

Hardy
Gast #153723
Lesenswert?
• ▲
▼
Hallo,

ich dachte es ist egal wie ich den Timer auslese (Sprache).
Als Anlage das aufs kleinste reduzierte Programm die Ausgabe erfolgt

ohne das auslesen des Timers so:

0102030405060708*
090A0B0C0D0E0F10*
11121314151617*
18191A1B1C1D1E*
1F202122232425*
262728292A2B2C*
2D2E2F303132*
33343536373839*
3A3B3C3D3E3F40*
41424344454647*

mit auslesen des Timers sieht es so aus:

0102030405060708*
09*
0A*
0B*
0C*
0D*
0E*
*
0F101112131415*
*
161718191A1B1C*
1D*
*
1E1F2021222324*
*
25262728292A*
2B*
2C*
2D*
2E*
*

zwischen den beiden Varianten sind nur die Zeilen:
                in R24, TCNT1L
                in R24, TCNT1H
verschieden.

Hardy
Angehängte Dateien:
Gast #153725
Lesenswert?
• ▲
▼
Lies Dir mal im Datenblatt "Accessing 16-bit Registers" durch, dann
sollte der Fehler klar werden.

2 Tips:

Zum Relaod des Timers nimmt man besser die Compare-Funktion, dazu wurde
sie extra gemacht.

Hier macht es nichts aus, aber elendig lange dauernde Ausgaben auf die
UART (oder ein LCD) sollte man tunlichst nicht in Interrupts machen.

In Deinem Fall ist zwar 1s Zeit zwischen den Interruts, aber das wird
bei größeren Programmen nicht so bleiben.


Peter
Gast #153726
Lesenswert?
• ▲
▼
Hallo Marcus G. & Peter Dannegger,

@Marcus
>Versuchs mal mit nem rjmp anstelle von jmp.

ein rjmp ist ein Wort lang, ein jmp ist aber ein 2-Wort-Behehl.
Der 162er hat die Interruptvettoren im 2-Wort Abstand.

> Und warum machst extra ein Label "return reti"?

Damit die Übersichtlichkeit bei den Interruptvetoren erhalten bleibt.

> Kannst ja auch gleich anstelle von "jmp return" ein "reti"
machen.

Es geht auch gleich ein ein 'reti' und 'nop', das gefällt mir aber
nicht.

@Peter

> Lies Dir mal im Datenblatt "Accessing 16-bit Registers" durch ...

Habe ich gemacht. Vielen Dank für diesen Hinweis.
Es funktioniert jetzt alles wie so soll.

Hardy

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.