HI
Habe nun alles mit Hilfe eurer Antworten nochmal überarbeitet. Jetzt funktioniert es!
SUPER! Danke für eure Hilfe
Gruß
Lichti01
HI
Habe nun alles mit Hilfe eurer Antworten nochmal überarbeitet. Jetzt funktioniert es!
SUPER! Danke für eure Hilfe
Gruß
Lichti01
Was war der Fehler?
MfG Hannes
HI
Ich denke, dass der ausschlaggebende Punkt war, dass ich den Timer nicht gestartet habe.
Außerdem habe ich den INT0 rausgenommen sowie den Timer auf initial Zustand gelassen.
Der Timer war schon gestartet. Den hast du gestartet indem du CS00 und CS01 gesetzt hast. Ich vermute das sich das Programm ins Nirvana verabschiedet hat weil du den Int0 Interrupt konfiguriert hast, aber nicht in die ISR gesprungen bist.
MfG Hannes
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