Forum: Mikrocontroller und Digitale Elektronik An einem Interrupt-Eingang beide Flanken erkennen?


von Dietrich Arndt (Gast)


Lesenswert?

Hallo,

Habe das Problem, daß ich Länge eines Impulses (bis 20ms) messen
möchte.. Im Moment mache ich es so:

Warten bis High , dann Timer starten. Warten bis Low , Timer stopen,
den Timerwert  ablesen , fertig.
Nun aber das Problem, daß das Programm in dieser Routine immer hängt,
bis der Impuls auf Low geht... Das ist bei 20ms etwas ungünstig!
Ich möchte das jetzt irgendwie eleganter lösen. Per Interrupteingang?
Nur kann ich da nur eine Flanke definieren..Wie kann ich die andere
erkennen? Oder gibt es da was anderes?

mfg

von johnny.m (Gast)


Lesenswert?

Wieder mal: Was für ein Controller ist das? Ohne die Information kann
hier keiner helfen!

von Dietrich Arndt (Gast)


Lesenswert?

Ups, vergesse immer, daß es nicht nur AVR's gibt.. :(

Atmega8 , schreibe mit Bascom. INT1 ist noch frei.

von Sebba (Gast)


Lesenswert?

Nabend!

Schau dir das Datenblatt nochmal kurz an
und erklär mir dann nochmal kurz wozu
man den 2. Modus verwenden könnte
(ISC11 = 0; ISC10 = 1)

Bis bald

von johnny.m (Gast)


Lesenswert?

Der ATMega hat ne Input Capture Einheit. Damit sollte es gehen, wenn
Timer 1 frei ist. Ist eigentlich die übliche Methode. Ansonsten sind
die Interrupts umschaltbar (pos., neg. Flanke, beides oder Low Level).

von Dietrich Arndt (Gast)


Lesenswert?

Danke an alle!

Bin noch grün, was AVR's angeht. Habe mich auf die Bascom
-Beschreibung verlassen. Und da gibt es nur Config INTx  (LOW LEVEL,
FALLING ,RISING)

von johnny.m (Gast)


Lesenswert?

Selbst mit den Parametern gehts. Musst nur in der ersten ISR den Level
umschalten. Der nächste kommt dann auf die jeweils andere Flanke.

Aber wie gesagt, Längen von Signalen erfassen geht am elegantesten mit
Input Capture.

Gruß

johnny

von Hannes L. (hannes)


Lesenswert?

> Der ATMega hat ne Input Capture Einheit. Damit sollte es gehen,
> wenn Timer 1 frei ist.

Timer 1 muss dazu nicht frei sein. Das geht auch, wenn Timer 1 nebenbei
noch für OC1A und OC1B verwendet wird. Man muss nur darauf achten, dass
niemand den Timerstand manipuliert.

Man setzt also bei ICP den Timer nicht auf 0, sondern merkt sich den
"Zeitstempel" der letzten Abfrage und subtrahiert diesen vom
aktuellen Zeitstempel.

Bei OC1x addiert man das Intervall zum nächsten Interrupt zum aktuellen
OCR1x-Register dazu.

Somit kann Timer 1 gleichzeitig zwei hochgenaue Interrupt-Folgen
erzeugen und einen Impuls hochgenau ausmessen.

Falls deine Programmiersprache das nicht nutzen kann, solltest du über
eine andere Programmiersprache nachdenken.

...

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.