Hi Alex,
Ich vermute fast, daß schlicht *zwei* Interrupts kurz hintereinander generiert werden, könnte das sein ?
Ja, könnte sein, zumal ich in deinem Code
das Setzen des eigentlichen Timerregisters vermisse.
bei mir sieht das so aus:
Code:
Ausschnitt aus einem Programm für ATTiny15L
.DEF mp = R16
.DEF timeval = R12
init: ...
ldi mp,0-30 ;0- weil der timer vorwärts zählt
mov timeval,mp ;timerwert (ca. 25 us)
ldi mp,1 ;timer0 Vorteiler auf 1
out tccr0,mp ;timer0 control
ldi mp,2 ;timer0 int enable
out timsk,mp ;timer int mask
out tcnt0,timeval ;timer setzen
...
;Timer0 interrupthandler
Timer0Int:
out tcnt0,timeval ;timer wieder setzen
...
reti
Das timerregister tcnt0 zählt vorwärts (!) bis zum Überlauf,
der dann den Interrupt auslöst.
In der Interruptroutine muss dann sofort das Timerregister
wieder besetzt werden, damit das Timing stimmt.
Aber eigentlich müsste es bei dir auch funktionieren,
da müsste das Timeregister eben einmal "ganz rum" zählen.
Deshalb hab ich das bisher nicht erwähnt.
Aber probier halt mal...
Gruß Jan
Lesezeichen