Genau richtig!Also der Timer läuft einfach vor sich hin, kein Eingriff durch mich.
Ich speicher die zeit beim beginn des Puls und beim Ende. Differenz ist dann die Dauer (aktuell Messe ich ja immer von 0 ab).
Durch unsigned ist der Überlauf irrelevant.
Lass doch den Timer Überlauf Interrupt komplett weg und füg die Pausen zwischen den Pulsen auch bei der Comparematchroutine mit ein.Beim nächsten Timerüberlauf das gleich für den nächsten Kanal.
Dadurch bleibt die Pausezeit auch variabel.
Du musst nur darauf achten, das das Comparematchregister einen höheren Wert hat als das TCNT1 Register, sonst wird da kein Interrupt mehr ausgelöst.
Eine Pause von 50µs reicht da völlig aus. Die CodeZeilen für das Setzen des TCC1Ax Register müssen abgearbeitet sein, bevor der TCNT1 diesen Zählerstand erreicht - Simulieren.
Für die Mehrfachkanalausgabe auf verschiedenen Ports geht das im Prinzip genauso, weil wer sagt, das in einem Comparematchinterrupt nur ein Port verändert werden darf.
Ich mach das so, das nach dem ersten Impuls der erste Port nach 0 gesetzt dann gleich der 2te gesetzt wird usw. bis alle Kanäle - Ausgänge durch sind.
Dann fügst Du eine Pause ein, damit die Wiederholrate nicht zu groß wird und fängst dann wieder von vorne an.
Für die Sync mit dem Empfänger gibt's im Prinzip mehrere Möglichkeiten.
Einmal kannst Du für Kanal 1 einen eigenen Interrupt verwenden, dann ist Kanal 1 klar definiert.
Zum anderen kannst Du die Pausen zwischen 2 Impulsketten auswerten, die ja mindestens 4ms betragen muß.
Zum dritten kannst Du auch die Idee mit den Pin Change Interrupts realisieren, dann sind die Kanäle ohnehin klar erkennbar.
Lesezeichen