Forum: Mikrocontroller und Digitale Elektronik INT0 flanken erkennung


von Peter S. (z3ky)


Lesenswert?

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?

von Johannes M. (johnny-m)


Lesenswert?

Wenn das Signal nicht zu stark prellt, dann sollte das kein Problem 
sein.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Peter S. (z3ky)


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.

von Peter S. (z3ky)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das MCUCR ist dafür zuständig, Datenblatt Seite 68ff.

von Oliver (Gast)


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

von Peter S. (z3ky)


Lesenswert?

also kann ich die register doch nicht aus der isr ändern. hm ja pegel 
auslesen wäre ne möglichkeit...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>also kann ich die register doch nicht aus der isr ändern.

Doch natürlich. Warum auch nicht? Nicht verwirren lassen!

von David M. (md2k7)


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

von Oliver (Gast)


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

von Peter Schmit (Gast)


Lesenswert?

danke für eure antworten! jetzt komm ich mit sicherheit weiter

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.