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
....
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
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.... :-/
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
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
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
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
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