Für das Problem fallen mir ein paar Lösungsvorschläge ein.
Meine erste Wahl wäre da der ICP ( Interrupt ), bei dem beim entsprechenden Pegelwechsel gleich der Zählerstand eines Timers in ein Register geschrieben wird.
Stellt man innerhalb dieser Routine auch gleich das Sensing von steigende auf fallende Flanke um, kann sowohl die Impulslänge, als auch die Pausenlänge bestimmt werden.
Man zieht einfach die entsprechenden, zwischengespeicherten ICP Werte voneinander ab.
Möchte man sich die sensing Umschalterei sparen, könnte man auch zwei Interrupts z.B. INT0 und INT1 parallel schalten und den einen auf steigende Flanke und den anderen auf fallende Flanke einstellen.
Innerhalb der Interrupts kann man dann einen Timer auslesen, und mit dem vorherigen Wert der anderen Routine verrechnen.
Eine weitere Möglichkeit wär der Pin Change Interrupt, der bei einem Pegelwechsel an bestimmten Pins einen Interrupt verursacht.
Allerdings muss man dabei selber rauskriegen welcher Pin und welche Flanke den Interrupt verursacht hat.
Als letzte Möglichkeit wär noch das Polling, bei dem in festen Abständen abgefragt wird, wie der Pegel am entsprechenden Eingang ist.
Um da eine Gleichförmigkeit reinzukriegen, würde ich dafür einen Timer Interrupt verwenden.
Wenn Du dazu einen Comparematch Interrupt verwendest, sind die Zeitintervalle sogar noch einfach einstellbar.
Es kommt halt auf die Signalfrequenz und die benötigte Auflösung an, welche Methode für Dich die Beste ist.
Lesezeichen