Das stimmt so nicht ganz.Beide Flanken sind in diesem Fall gar nicht nötig. Die fallende Flanke des einen Kanals entspricht zeitlich der Steigenden des nächsten.
Nach dem letzten Kanal und am Anfang des ersten Kanal ist eine Pause von mindestens 4ms.
Aus dieser Pause heraus wird im Empfänger der Start eines neuen Pulspaketes ermittelt.
Du kannst alle InterruptQuellen eines AVR Controllers nutzen die von einem externen Pin aus angesteuert werden können.
Also INT0, INT1, ICP, Comperator. Wenn Du einen Controller findest der 8 solcher Interruptquellen hat, kannst Du die verwenden.
Wenn nicht bleibt Dir noch die Möglichkeit mit den Pin Change Interrupts wie oben beschrieben.
Ein möglicher Kandidat wäre hier der ATMEGA88. Guck mal ins Datenblatt ab Seite 69.
Um überschneidungen bei den Interrupt Flags zu vermeiden würde ich für die geraden Kanäle den PCINT1 und für die ungeraden Kanäle den PCINT2 verwenden.
Somit wird der gleiche Interrupt maximal 1mal pro Millisekunde aufgerufen.
Das sind 20000 Taktzyklen. Da in dieser Zeit ja 2mal der Pinchange aufgerufen wird hat jeder dieser Interrupts 10000 mögliche Taktzyklen. Das sollte auch für umfangreichere Auswertungen ausreichen.
Der TCNT Wert, sowie die Zustände der Ports sollten ganz am Anfang der Interruptroutine eingelesen werden.
Das sollte den Jitter verringern.
Die Impulsausgabe selber könnte man mit Comparematch Interrupts machen.
Man zählt in den Comparematch Interrupts eine Variable hoch und lädt in das Comparematch Register den Wert für den nächsten Potentialwechsel ( TCNT + gewünschter Änderungspunkt ).
Dann brauchst Du nur noch per Swich Case Anweisung abhängig von der Zähl Variable das Ausgangssignal nach 1 oder 0 zu setzen.
Um die Reaktionszeiten möglichst kurz zu halten müsste man einen 20MHz Quarz verwenden und eventuell auch die Interruptroutinen in Assembler schreiben und die Register Sicherung im Interrupt optimieren.
Das wäre meine Lösung des Problems, wie das Timing hinhaut kannst Du mit dem Simulator vom AVR Studio 6.xx austesten.
Lesezeichen