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
Das riecht trotzdem nach nicht initialisiertem Stackpointer. ...
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.