-tomas-
24.02.2006, 11:28
Problem: Config Int0 = Falling
Ich habe das Problem, dass Bascom 1.11.8.1 beim MEGA32 nach der Abarbeitung der Interruptroutine (Falling) diese noch ein zweites Mal aufruft, obwohl zu diesem Zeitpunkt keine Flanke mehr anliegt.
Das passiert nur bei Int0 = Falling. Bei Config Int0 = LOW LEVEL läuft alles wie erwartet.
Beispiel:
Ich habe den Code mal stark eingedampft. An Pina.0 sitzt eine LED.
$regfile = "m32def.dat" 'bascom 1.11.8.1
$crystal = 8000000
Config Pina.0 = Output 'LED 1
On Int0 Int0_int
Enable Int0
Config Int0 = Falling
Enable Interrupts
Do
Waitms 100
Loop
End
'The Interrupt Handler For The Int0 Interrupt
Int0_int:
Porta.0 = 1
Waitms 500 '0,5sec LED 1 = ON
Porta.0 = 0
Waitms 250
Return
Es ist D.2 (INT0)=High (externer Pullup).
Wird jetzt der Pegel mit einer prellenden Taste kurz (z.B. 100ms) auf LOW gebracht, wird die 750ms andauernde Interrupt-Routine 2x aufgerufen. D.h. die LED blinkt zweimal Der zweite Interrupt wird ausgelöst, obwohl definitiv keine Flanke anliegt. Ich habe mit einem Oszi nachgemessen.
Waitms xx im Interrupt-Handler dient nur der Verdeutlichung. Daran liegt es nicht. Ich habe auch im Interrupt-Handler alle Varianten von Disable/Enable Interrupt getestet... die LED blinkt immer zweimal.
Das dient hier nur der Verdeutlichung meines Problemes. In meinem Beispiel geht es um eine Software UART, bei der ich INKEY(#2) mit INT0 verknüpft habe.
Ich habe das Problem, dass Bascom 1.11.8.1 beim MEGA32 nach der Abarbeitung der Interruptroutine (Falling) diese noch ein zweites Mal aufruft, obwohl zu diesem Zeitpunkt keine Flanke mehr anliegt.
Das passiert nur bei Int0 = Falling. Bei Config Int0 = LOW LEVEL läuft alles wie erwartet.
Beispiel:
Ich habe den Code mal stark eingedampft. An Pina.0 sitzt eine LED.
$regfile = "m32def.dat" 'bascom 1.11.8.1
$crystal = 8000000
Config Pina.0 = Output 'LED 1
On Int0 Int0_int
Enable Int0
Config Int0 = Falling
Enable Interrupts
Do
Waitms 100
Loop
End
'The Interrupt Handler For The Int0 Interrupt
Int0_int:
Porta.0 = 1
Waitms 500 '0,5sec LED 1 = ON
Porta.0 = 0
Waitms 250
Return
Es ist D.2 (INT0)=High (externer Pullup).
Wird jetzt der Pegel mit einer prellenden Taste kurz (z.B. 100ms) auf LOW gebracht, wird die 750ms andauernde Interrupt-Routine 2x aufgerufen. D.h. die LED blinkt zweimal Der zweite Interrupt wird ausgelöst, obwohl definitiv keine Flanke anliegt. Ich habe mit einem Oszi nachgemessen.
Waitms xx im Interrupt-Handler dient nur der Verdeutlichung. Daran liegt es nicht. Ich habe auch im Interrupt-Handler alle Varianten von Disable/Enable Interrupt getestet... die LED blinkt immer zweimal.
Das dient hier nur der Verdeutlichung meines Problemes. In meinem Beispiel geht es um eine Software UART, bei der ich INKEY(#2) mit INT0 verknüpft habe.