www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kleine Anfängerfrage zu einem Timer


Autor: Hardy Flor (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehlt da nicht in Zeile 33 ein "-" ?


Peter

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So böse bin doch sonst nur ich ...

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das riecht trotzdem nach nicht initialisiertem Stackpointer.

...

Autor: Hardy Flor (Gast)
Datum:
Angehängte Dateien:

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

Autor: Marcus G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal mit nem rjmp anstelle von jmp. Und warum machst extra ein
Label "return reti"? Kannst ja auch gleich anstelle von "jmp
return" ein "reti" machen.

Autor: peter dannegger (Gast)
Datum:

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

Autor: Hardy Flor (Gast)
Datum:

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

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.