sorry natürlich ist das Signal digital (Spannungspegel 5V positiv, 0V negativ) - ich habe es nur fälschlicherweise analog bezeichnet.
sorry natürlich ist das Signal digital (Spannungspegel 5V positiv, 0V negativ) - ich habe es nur fälschlicherweise analog bezeichnet.
Wenn Du Dein Signal an einem externen Interrupt Pin anlegst, kannst Du mit einer Pegeländerung einen Interrupt hervorrufen. Das ist die Methode der Wahl, wenn die Pegeländerung relativ selten passiert und wenn der Prozessor zwischenzeitlich (wenn der Pegel stabil ist) etwas anderes machen soll. Die Zeitdauer eines High-Pegels kann man z.B. messen, wenn man beim Pegelwechsel Low> High mittels Interruptroutine einen Timer startet und beim Übergang high > Low nachsieht, wie weit er mit dem Zählen gekommen ist. Das Timer starten bzw. nachsehen braucht nur wenige Maschinenbefehle, der Timer selbst läuft im Hintergrund.
Gute Idee das könnte klappen. Ich werds mal ausprobieren und melde dann meinen Erfolg/Misserfolg![]()
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.
Das sind schon einige Gute Eindrücke.
Ich werds alles mal ausprobieren.
Vielen Dank!
Mein Signal kommt übrigens mit 2khz am Eingang an!
Gibts die Möglichkeit das Polling in Hardware umzusetzen oder gibts so ewas gar nicht in Hardware?
Ich meine 2khz sollte man in gewisser regelmäßigkeit abtasten können, ohne dass meine CPU doll ausgelastet wird. Schöner wärs trotzdem![]()
Kann man sicher machen, aber was soll das bringen? Bei einem Pegelwechsel muss trotzdem der µC aktiv werden.Gibts die Möglichkeit das Polling in Hardware umzusetzen oder gibts so ewas gar nicht in Hardware?
Dann kann mans ebenso gut über Interrupts lösen und braucht keine zusätzliche Hardware.
Bei 2kHz würd ich die ICP Methode benutzen. Bei 8MHz Taktfrequenz und einem Prescaler von 8 kriegst Du dabei eine Auflösung von 1µS.
Der maximale Abstand zwischen 2 Pegelwechseln darf dabei, bei einem 16Bit Counter, ca. 65ms betragen, wenn man ohne einen Überlaufzähler arbeitet.
Mit einem 16Bit Überlaufzähler ( Zähl Variable die im Timer Overflow hochzählt ) kommt man auf etwa 42000 Sekunden.
Lesezeichen