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 #432060
Lesenswert?

Hallo,

der AVR verhält sich wie im Datenblatt beschrieben: er sperrte die IRQs 
beim Aufruf einer IRQ und gibt sie beim RETI wieder frei.

Was BASCOM macht, sollte im BASCOM-Handbuch stehen...
Ich denke aber, es wird es genauso halten.

Gruß aus Berlin
Michael
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.
Gast #433039
Lesenswert?

Ich werde das die Tage ausprobieren und mich wieder melden...

Wenn ich den INT0 Eingang des ATmega8 verwende, bekommt dieser 
eigentlich noch einen Pull-Up-Widerstand? Zurzeit gehe ich nämlich 
direkt vom Ausgang eines OPV auf INT0, was mir nicht wirklich als 
definiert erscheint.
Gast #433057
Lesenswert?

Also wenn es ein OPV ist, ist ein Pullup normalerweise unnötig, weil im 
OPV eingebaut (Transistor nach Plus). Etwas anderes ist es mit einem 
Komparator, der normalerweise keinen eingebauten Pullup hat.

Ausnahmen bestätigen beide Regeln...

Gruß Johannes

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