Nicht ganz.Außerdem ist der Overflow Interrupt während der Abarbeitung der ISR abgeschaltet und wird auch beim Verlassen nicht nachgeholt. Zumindest ist so das Verhalten im Simulator, in Hardware könnte es anders aussehen.
Es wird das Overflow Interrupt Flag gesetzt und nach der Abarbeitung sofort wieder die Interrupt Routine ausgeführt.
Ist das Flag bereits gesetzt und es tritt ein weiterer Overflow Interrupt auf wird dieser nicht registriert. Der eine bestehende aber trotzdem ausgeführt.
Ein Ausweg aus deiner Misere wäre die Interrupt Routine mit inline Assembler auszustatten und die Bascom Registerrettung für diese Interruptroutine abzuschalten.
Die benötigten Register, sowie das Status Register SREG musst Du dann aber per Hand auf den Stack schieben und hinterher wieder herunterholen.
Das sollte in 16Taktzyklen erledigt sein.
Beispiel:
PUSH r16
IN r16,SREG
PUSH r16
sbis PORTD,0 ;Ist der Port ein ?
RJMP SET ;Der Port war 0 es wird nach SET gesprungen
cbi PORTD,0 ;Der Port wird abgeschaltet
RJMP END ; Zum Ende der Routine springen
SET:
sbi PORTD.0 ;Der Port wird eingeschaltet
END:
POP r16
OUT SREG,r16
POP r16
; ENDE
Damit wird das Regiser R16 und das SREG gesichert und wären für Deinen Interruptroutine nutzbar.
Probier den Code mal aus, er toggelt den PortD.0 wenn ich da keinen Denkfehler reingebastel habe.
Die Registersicherung von Bascom solltest Du aber für dieses kleine Programm abschalten. Die Routine sollte dann ca. 10x so schnell laufen wie dein Bascom Pedant.
Wenn bei der Routine das SREG nicht geändert wird - Guck mal in die Code Tabelle - könnte man sich die r16 und SREG Sicherung auch noch sparen, dann gehts noch schneller.
Lesezeichen