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.
Die LED blinkt zwar stabil im 1,5-Sekundentakt - auf Tastendruck passiert aber gar nichtsCode:$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 ReturnDie 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