Ich habe noch ein Problem:
Ich muss einen Timer-Interrupt unter bestimmten Umständen zwischendurch "erzwingen", d.h. zwischen zwei Überläufen. Der Grundrhythmus darf sich dabei aber nicht verschieben. Im Datenblatt habe ich gelesen, dass man dazu nur das Overflow-Flag setzen muss, und schon soll der Interrupt ausgeführt werden (vorausgesetzt, der spezielle und die Interrupts im allgemeinen sind freigegeben).
Um das zu probieren, habe ich mal folgenden Code geschrieben: Timer1 toggelt eine LED alle ca. 1,5 Sekunden. Ein Taster löst INT0 aus, in dessen ISR das Overflow-Flag von Timer1 (TIFR.2) gesetzt wird.
Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 128
$swstack = 128
$framesize = 160
Ddrb.0 = 1 'LED-Ausgang
Portd.2 = 1 'PullUp
Config Timer1 = Timer , Prescale = 1024
Timer1 = 64000 'Überlauf alle ca. 1,5 Sek.
On Timer1 Isr_timer1
Enable Timer1
Config Int0 = Falling 'Taste gegen Masse
On Int0 Isr_int0
Enable Int0
Enable Interrupts
Do
Loop
Isr_timer1:
Toggle Portb.0
Timer1 = 64000
Return
Isr_int0: 'Tastendruck:
Waitms 10 'Prellen abwarten (ich weiß - schlechter Stil...)
Tifr.2 = 0 'Timer1-Overflow-Flag setzen
Return
Die LED blinkt zwar stabil im 1,5-Sekundentakt - auf Tastendruck passiert aber gar nichts
Die INT0-ISR wird dabei korrekt angesprungen (ich habe in der ISR versuchsweise mal eine andere LED toggeln lassen - das geschieht bei jedem Tastendruck einwandfrei).
Was mach´ ich falsch???
Lesezeichen