mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt Handling


Autor: Dieter Harms (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter Harms (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sonst benutzt man "debounce" für Entprell-Aktivitäten.

Autor: Ralf Bode (Gast)
Datum:

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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf Bode (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf Bode (Gast)
Datum:

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

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kanst auch den Pin-Eigenen Pullup aktivieren. Sind aber ca. 100kOhm.

Autor: Dieter Harms (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie mache ich das unter Bascom konkret?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.