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.
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
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)
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.
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
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.
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
Also löte ich mal sicherheitshalber einen 4,7kOhm Widerstand von Int0 nach Vcc. Kann ja nicht schaden!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.