Forum: Mikrocontroller und Digitale Elektronik Interrupt Handling


von Dieter Harms (Gast)


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.

von Michael U. (Gast)


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

von Dieter Harms (Gast)


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)

von inoffizieller WM-Rahul (Gast)


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.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Sonst benutzt man "debounce" für Entprell-Aktivitäten.

von Ralf Bode (Gast)


Lesenswert?

Also konkret geht es nicht um einen Taster, sondern um einen 
Reflexkoppler wie z.B. den CNY70.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

wenn die Flanken wirklich schnell hintereinander kommen kann ein simples 
Löschen des Interrupt-Flag am Ende der ISR helfen. So wird ein evtl. 
noch anstehender Interrupt gelöscht. Ansonsten -> Entprellen mit einer 
der zig bekannten Varianten.

Matthias

von Ralf Bode (Gast)


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.

von Johannes A. (Gast)


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

von Ralf Bode (Gast)


Lesenswert?

Also löte ich mal sicherheitshalber einen 4,7kOhm Widerstand von Int0 
nach Vcc. Kann ja nicht schaden!

von Christof Rieger (Gast)


Lesenswert?

Du kanst auch den Pin-Eigenen Pullup aktivieren. Sind aber ca. 100kOhm.

von Dieter Harms (Gast)


Lesenswert?

Und wie mache ich das unter Bascom konkret?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.