Forum: Mikrocontroller und Digitale Elektronik Timer Overflow Problem


von sammy (Gast)


Lesenswert?

Ich moechte das ein Timer immer beim Overflow das Register r25
hochzaehlt, es funktioniert aber aus mir unerklaerlichen Gruenden
nicht. Hier ein AUsschnitt aus meinem Sourcecode:


.include "tn15def.inc"
.def counter = r25

.ORG 0x00
rjmp main            ; Reset Handler
reti
reti
reti
rjmp Timer      ; Timer0 Overflow Handler




Timer:
  INC counter
  reti

main:

  ldi r16, RAMEND    ;Stackpointer initialisieren
  out SPL, r16

  ldi counter, 0x00
  ldi    r16, (1<<TOV0)
  out    TIFR, r16

  ldi r16, 0b00000101
        out TCCR0, r16
  ldi r16, -0xc3
  out TCNT0, r16
  ldi r16, 0b00000010
        out TIMSK, r16
  sei
....

von Conlost (Gast)


Lesenswert?

Hallo,

Was kommt hinter "sei"?

Ich hab da mal eine Endlosschleife eingefügt und im Studio getestet,
dann läuft es.

Gruß,
Arno

von Dieter B (Gast)


Lesenswert?

Hallo

Ist die Interrupt Tabelle nicht falsch.

Timer0 Overflow liegt doch auf Adresse 05 beim Tiny5, dann müsste doch
noch ein reti rein oben.

MFG
Dieter

von Conlost (Gast)


Lesenswert?

Stimmt, da fehlt ein reti.

von sammy (Gast)


Lesenswert?

nach dem sei kommt das normale program, das endlos durchlaeuft...

von sammy (Gast)


Lesenswert?

bei mir gehts immer noch nicht..
wenn ich TIFR->TOV0 manuell setze, springt er korrekt in die Interrupt
Routine und zaehlt hoch, aber automatisch zaehlt er nicht hoch.... :-/

von Conlost (Gast)


Lesenswert?

Wenn das Programm immer wieder über "main" läuft, wird der Timer
immer wieder neu gestartet.
Dadurch kann er dann keinen Interrupt auslösen.

von sammy (Gast)


Lesenswert?

im main gibt es hinter der Initialisierung (Timer, Interrupts...) eine
Sprungmarke, zu der er immer wieder springt, also die Initialisierung
des Timers usw. sollte er nur einmal machen

von Dieter B (Gast)


Lesenswert?

Hallo Sammy

Im Simulator läuft das bei mir ohne Probleme.

Du weißt, das du einen Vorteiler von 1024 eingestellt hast. Dann dauert
es halt, bis der Interrupt kommt im Simulator.

Diese 2 Zeilen machen keinen Sinn, da das Flag vom Interrupt gesetzt
wird und in der Interrupt Routine wieder gelöscht wird.

ldi    r16, (1<<TOV0)
out    TIFR, r16

Wieso lädst du TCNT0 am Anfang mit 61 ??  Der erste Int. kommt dann bei
49,92 ms, die anderen dann bei 65,54 ms.  ( bei 4 MHz ) . Ist das so
gewollt. Ansonsten mußt du TCNT0 auch in der Interrupt Routine wieder
neu laden.


MFG
Dieter

von Dieter B (Gast)


Lesenswert?

Hier mein Test Programm


.include "tn15def.inc"
.def counter = r25

.ORG 0x00
rjmp main            ; Reset Handler
reti
reti
reti
reti
rjmp Timer      ; Timer0 Overflow Handler

Timer:
  INC counter
  reti

main:

  ldi r16, RAMEND    ;Stackpointer initialisieren
  out SPL, r16

  ldi counter, 0x00
  ldi r16, 0b00000101
  out TCCR0, r16
  ldi r16, -0xc3
  out TCNT0, r16
  ldi r16, 0b00000010
  out TIMSK, r16
  sei

loop:

rjmp loop

MFG
Dieter

von sammy (Gast)


Lesenswert?

ich habe jetzt mal deinen Quelltext benutzt....
das macht auch nicht das, was ich erwarten wuerde.
Er springt bei mir auch nicht in die Interruptroutine und das
hochzaehlen von Counter (r25) macht er somit auch nicht.
Oder geht das im AVR Studio nicht zu simulieren???
ratlos

von Dieter B (Gast)


Lesenswert?

Hallo

Klar kann man das simulieren.

Dauert halt nur sehr lange, wenn mann das im Einzelschritt macht. TCNT0
wird ja nur alle 1024 Takte um eins erhöht. Bis der Interrupt kommt
dauert es ja 256 * 1024 Takte.

Mein Tip. Setze den Cursor auf die Zeile inc counter, drücke dann F9 zu
 setzen eines Breakpoint. Dann drückst du F5 und das Progamm läuft und
bleibt bei inc counter stehen.

Dann kannst du unter Processor schön sehen, wieviele Takte und wie
lange das dauert. ( Cycle Counter, Stop Watch) Kann man auch per
Doppelklick wieder löschen die Werte.

MFG
Dieter

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.