Ich mach die Servosignal Auswertung auch gerne mal mit dem INT0.
Der Trick dabei ist, im Interrupt das Sensing von steigende Flanke auf fallende Flanke um zu konfigurieren.
Und in einem zweiten Schritt wieder umgekehrt.
Du initialisierst also erstmal den Interupt 0 auf steigende Flanke und startest dann die Hauptschleife.
Ein Timer zum messen der Impulslänge muss auch noch gestartet werden, braucht aber prinzipiell keinen Interrupt - Ich nehm da meistens einen 16 Bit Timer mit einem Prescaler von 8.
Tritt nun der steigende Interrupt auf wird in der Interrupt Routine das TCNT Register des Timers ausgelesen und in einer volatile Variable abgespeichert.
Jetzt wird dann auch das Sensing auf fallende Flanke umgestellt.
Kommt nun die fallende Flanke wird der INT0 wieder aufgerufen.
Es wird wieder der TCNT ausgelesen und der vorher abgespeicherte Wert der Variable abgezogen.
Das Ergebnis wird nun in einer weiteren volatile Variable abgespeichert und gibt das Maß der Impulslänge an.
( Bei 8MHZ und Prescaler 8 in µs, Bei 16MHz µs*2, also halbe µs Schritte ).
Nun das sensing wieder auf steigende Flanke umstellen für den nächsten Impuls.
Man kann auch noch eine weitere Variable als FLAG setzen, damit das Hauptprogramm weiß, das ein neuer Impuls eingetroffen ist.
Man muß lediglich darauf aufpassen, das bei einer maximalen Impulslänge der Timer nicht überläuft - Das kann aber eigentlich nur passieren, wenn man die Pausen auswertet.
Ich weiß - Das Ganze geht auch mit Pin Change.
Das INT0 Verfahren funktioniert aber auch mit Controllern die keinen Pin Change Interrupt haben.
Eine weitere Möglichkeit wäre noch der Input Capture Interrupt eines Timers, wenn man noch zusätzliche Eingänge braucht.
Das Verfahren ist aber prinzipiell immer gleich, mal die steigende, dann die fallende Flanke des Signals auszuwerten.
Lesezeichen