INT0 flanken erkennung

OP #747937
Lesenswert?

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.
OP #747940
Lesenswert?

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.
Gast #747958
Lesenswert?

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

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
Gast #748023
Lesenswert?

>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

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