www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Overflow Problem


Autor: sammy (Gast)
Datum:

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

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Was kommt hinter "sei"?

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

Gruß,
Arno

Autor: Dieter B (Gast)
Datum:

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

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, da fehlt ein reti.

Autor: sammy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nach dem sei kommt das normale program, das endlos durchlaeuft...

Autor: sammy (Gast)
Datum:

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

Autor: Conlost (Gast)
Datum:

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

Autor: sammy (Gast)
Datum:

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

Autor: Dieter B (Gast)
Datum:

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

Autor: Dieter B (Gast)
Datum:

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

Autor: sammy (Gast)
Datum:

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

Autor: Dieter B (Gast)
Datum:

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

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.