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, Was kommt hinter "sei"? Ich hab da mal eine Endlosschleife eingefügt und im Studio getestet, dann läuft es. Gruß, Arno
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.... :-/
Wenn das Programm immer wieder über "main" läuft, wird der Timer immer wieder neu gestartet. Dadurch kann er dann keinen Interrupt auslösen.
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
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.