Interrupt Handling

Gast #432057
Lesenswert?

Wie verhält sich eigentlich der ATmega8, wenn bei der Abarbeitung einer 
ISR unter BASCOM plötzlich nochmal der gleiche Interrupt auftritt?

Wird diese dann sofort unterbrochen und noch mal aufgerufen oder erst 
komplett abgearbeitet und dann noch mal aufgerufen? Oder werden einfach 
externe Interrupts ignoriert (disabled), wenn das Programm gerade eine 
ISR abarbeitet?

Es geht hierbei um den INT0. Ich zähle eine Variable um 1 hoch bei 
steigender Taktflanke. Manchmal wird die Variable aber blöderweise um 2 
erhöht, was nicht passieren soll. Ich muss also irgendwie das Ganze 
entprellen. Habe gedacht, dass ich einfach die Interrupts in der ISR 
kurzzeitig disable???

Bitte helft mir.
Gast #432664
Lesenswert?

Gut, die Interrupts werden also schon gesperrt, wenn ich in der 
ISR-Routine bin.
Wenn ich jetzt das schnelle auftreten des INT0 hintereinander 
softwaremäßig unterbinden möchte, könnte ich doch einfach eine WAIT 
100ms Zeile in den INT0-Handler schreiben? (Da ich weiß, dass nach 
ungefähr dieser Zeit wieder ein stabiles Signal am INT0-Port anliegt)

Gibt es noch eine andere Möglichkeit, softwareseitig das mehrmalige 
Auslösen eines INT0 zu blockieren?

--stabil ---- schwankungen von High/Low -----  stabil --------
           -- (ca. 50-100ms)
Gast #432672
Lesenswert?

Super Idee, Warteschleifen in einer Interrupt-Service-Routine 
(ISR)unterzubringen.
Interrupts benutzt man in der Regel, um sofort auf ein Ereignis zu 
reagieren. In deinem Fall klingt es danach, dass mal wieder jemand einen 
Taster an einen Interruptpin gehängt hat, und ihn nun entprellen muß.
Sinnvoller ist es, in der ISR die Interruptfreigabe zu löschen, ein Flag 
zu setzen und einen timer zu starten.
Das Flag zeigt der Hauptschleife an, dass der Interrupt aufgetreten ist 
(die Hauptschliefe wartet die ganze Zeit auf solche Flags...).
Sobald der Timer ein Interrupt ausgelöst hat, wird der INT wieder 
freiggeben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren