Hatte ich auch schon geschrieben.Zitat:
Timer1 ist ja dadurch schon belegt, wie kann ich dann die Eingangsimpulse mit einer anständigen Auflösung messen??
Da das Zählregister des Timers 1 ( TCNT1 ) durch diese Methode der Impulserzeugung nie neu beschrieben wird, kann man durch eine Interruptroutine ( ICP, INT0, INT1, INT2 ) den Wert dieses TCNT1 Registers auslesen.
Bei der steigendan Flanke, also am Anfang eines Impulses wird das TCNT1 Register ausgelesen und dieser Wert in einer Variable zwischengespeichert. Im gleichen Programmteil wird das Interrupt Sensing auf fallende Flanke umgestellt.
Geht dann das Singal wieder von H->L wird dieser Interrupt also erneut getriggert. In dieser Interruptroutine wird dann aber ein anderer Teil angesprochen. Das kann man über ein Flag machen, oder die Sensing Bits direkt auslesen.
In diesem anderen Teil wird erneut das TCNT1 Register gelesen und der im vorherigen Interrupt ermittelte Wert subtrahiert. Das Ergebnis ist das Äquvalent der Länge des Einganspulses. In meinem Beispiel als 1000 für 1ms.
Nun wird in diesem Programmteil das Sensing wieder auf steigende Flanke für den nächsten Servoimpuls umgestellt und fertig.
Da ein ATMEGA8 nur 4...5 geeignete Interuptquellen besitzt, kannst Du so auch leider nur 4...5 Einzelimpulse verarbeiten.
Drum hatte ich den Vorschlag mit einem Controller mit Pin Change Interrupt Möglichkeit vorgeschlagen, auch wenn das Handling der Pinchanges ein wenig schwieriger ist.
Die Comparematch Unit B des Timers 1 ist dabei noch gar nicht genutzt. Die könnte auch noch zur Erzeugung einer weiteren Impulskette verwendet werden. ;-)
Ist das nun Genial ??
Erstens dürfte hier ein fester Wert reichen.Zitat:
Und eins noch : Die Lenge des "Start-High-Pegels" muss sich ja verändern, damit die Gesammtlenge des Summensignals immer gleich bleibt, die kann man das lösen???
Das wurde schon bei den allerersten Fernsteuerungen so gemacht.
Zweitens - Wenn Du immer gleiche Framelängen willst, kannst Du auch alle bisherigen Impulslängen addieren und den daraus ermittelten Wert von der gewünschten Framelänge subtrahieren.
Der Rest ist die Länge der Startsequenz.
Da das eigentlich nur eine kleine Änderung ist, kannst Du ja mal zum Spaß beide Methoden ausprobieren.