www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik INT0 flanken erkennung


Autor: Peter Schmit (z3ky)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Peter Schmit (z3ky)
Datum:

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

Autor: Peter Schmit (z3ky)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das MCUCR ist dafür zuständig, Datenblatt Seite 68ff.

Autor: Oliver (Gast)
Datum:

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

Autor: Peter Schmit (z3ky)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

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

Autor: David Madl (md2k7)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Peter Schmit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für eure antworten! jetzt komm ich mit sicherheit weiter

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.