hallo, arbeite mit einem atmega16. mein int0 reagiert auf zustandswechsel. ist es möglich in der isr zu erkennen bei welcher flanke der int ausgelöst wurde?
Wenn das Signal nicht zu stark prellt, dann sollte das kein Problem sein.
Lasse doch den Interrupt auf bestimmte Flanken triggern. In der ISR schaltest Du dann das Bit für die Flankenerkennung jeweils um. Anhand des gesetzen oder gelöschten Bits weißt Du, welche Flanke ausgelöst hat.
und wie? gibt es vielleicht ein register oder so in dem dies gespeichert wird? hab im datenblatt leider nichts gefunden. kann aber sein dass ich es einfach überlesen hab. oder wäre es möglich in der isr den auslösezeitpunkt zu ändern? sprich, in einer isr die durch eine steigende flanke ausgelöst wurde einzustellen, dass der nächste int auf eine fallende flanke reagieren soll.
Travel Rec. wrote: > Lasse doch den Interrupt auf bestimmte Flanken triggern. In der ISR > schaltest Du dann das Bit für die Flankenerkennung jeweils um. Anhand > des gesetzen oder gelöschten Bits weißt Du, welche Flanke ausgelöst hat. ok das beantwortet dann meine frage ;) war mir nur nicht sicher, ob die registeränderung auch nach der isr bestehen bleibt und nicht wieder von den alten, gesichten registern überschrieben wird.
Du kannst auch als allererstes in der ISR einfach nachsehen, ob der PIN low oder high ist, dann kennst du die Flanke. Sollten der Eingang bis dahin schon wieder gewechselt haben, funktionieren auch alle anderen hier genannten Vorschläge nicht. Dann hast du ein ernsthaftes Problem. Oliver
also kann ich die register doch nicht aus der isr ändern. hm ja pegel auslesen wäre ne möglichkeit...
>also kann ich die register doch nicht aus der isr ändern.
Doch natürlich. Warum auch nicht? Nicht verwirren lassen!
Peter Schmit wrote: > also kann ich die register doch nicht aus der isr ändern. hm ja pegel > auslesen wäre ne möglichkeit... Natürlich kannst du die Register aus der ISR ändern. Du musst halt schauen, dass sonst in deinem Programm kein Zugriff auf dasselbe Bit erfolgt, wenn der Interrupt aktiv ist. Eventuell je nach benutzter Programmiersprache auch mal anschaun was für ein Assembler Code beim Zugriff aus dem normalen Programm erzeugt wird. Der Zugriff muss atomar erfolgen, freundlicherweise gibts dazu den asm-Befehl sbi/cbi. Ansonsten vorher mit cli Interrupts abschalten und nachher wieder einschalten. Gruß David
>war mir nur nicht sicher, ob die registeränderung auch nach der isr >bestehen bleibt und nicht wieder von den alten, gesichten registern >überschrieben wird. Keines der Control- oder Statusregister wird jemals automatisch bei Interrupts "gesichert" und danach "zurückgeschrieben", weder hardwaremässig vom Micro selbst, noch von irgendeinem Compiler (der kennt die gar nicht als "Register"). Da kann nichts passieren. Und Zugriff hast du immer, egal, ob aus ISR oder Hauptprogramm. Die Lösung für dein Problem hängt davon ab, wie schnell die Flanken aufeinanderfolgen, ob alle Flanken erkannt werden müssen, oder welche verloren gehen dürfen, ob das Signal prellt oder nicht, usw. Prellt nichts, und sind die Flanke immer zeitlich weiter auseinander, als deine ISR benötigt, dann schau einfach auf den Pegel des Signals. Wenn nicht, musst du sowieso tiefer in die Problematik einsteigen. Oliver
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.