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


von Hardy Flor (Gast)


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

von Peter D. (peda)


Lesenswert?

Fehlt da nicht in Zeile 33 ein "-" ?


Peter

von Rufus T. Firefly (Gast)


Lesenswert?

So böse bin doch sonst nur ich ...

von ...HanneS... (Gast)


Lesenswert?

Das riecht trotzdem nach nicht initialisiertem Stackpointer.

...

von Hardy Flor (Gast)


Angehängte Dateien:

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

von Marcus G. (Gast)


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.

von peter dannegger (Gast)


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

von Hardy Flor (Gast)


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

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.