Hallo liebe Leut, weis jemand wie das mit dem Input Capture Pin programmmiermässig abläuft, damit ich am Pin Impulslängen bestimmen kann? Bin leider aus dem Datenblatt nicht schlau geworden:( Freundlichen Grüßen Timo Gessner
Leider konnte ich über die Suchfunktion nichts drüber finden. Benutze Schlüsselwörter für Suche: Input Capture Pin, ICP.
Die Flanke am ICP-Pin kopiert den aktuellen Timerstand in die ICP-Register und löst danach den ICP-Interrupt aus. Die ISR sollte das ICP-Register (16 Bit, also 2 I/O-Register) auslesen und sichern, ggf. die wirksame Flanke umschalten und aus der Differenz zur letzten Sicherung die Impulslänge ermitteln. Der Vorteil gegenüber Ext-Int und Auslesen des Timers in der ISR besteht darin, dass der Timerstand in die ICP-Register kopiert wird, sobald die Flanke auftritt, also vor Ablauf der Interrupt-response-time. Damit ist der korrekte Timerstand kopiert, egal wie lange es dauert, bis die ISR wirksam wird (falls ein anderer Int den sofortigen Aufruf verhindert). ...
Also, wenn an Pin ICP eine steigende Flanke(POSITIV) anliegt, zählt der Timer dann für die länge der Positiven Flanke oder startet dann der Timer. Deshalb wurde auch wohl gemeint, das man schnell auf fallende Flanke wechseln muss, damit der Timer stoppt. Also wird dann bei POSTIV der Timer gestartet und erst bei NEGATIV gestoppt.?
Nein... Der Timer läuft durch. Zumindest, wenn du ihn aktiviert hast (Vorteiler). Die Flanke (also der Pegelwechsel, wie er im Steuerregister für ICP eingestellt ist) am ICP-Pin sorgt dafür, dass der momentane Zählerstand des Timers "fotografiert" wird, also in die ICP-Register übernommen wird. In der ISR liest du diesen Wert aus, auch wenn die ISR etwas verspätet kommt. Nun stellt sich die Frage, was du überhaupt messen willst. Interessiert dich nur die Periodendauer, also der Anstand der steigenden Flanken (die fallenden werden ignoriert, da sie unwichtig sind), dann brauchst du die Flanke natürlich nicht umzustellen. Dann wird bei jeder steigenden Flanke der Zählerstand des Timers ermittelt und der Int ausgelöst. Der Timer wird dabei nicht angehalten oder gestartet, der klappert munter weiter. In der ISR subtrahierst du den alten Wert (der ja älter, also kleiner ist) vom neuen Wert und erhältst dadurch die Differenz, also den Zeitabstand (in Timertakten gemessen) zwischen letzter Flanke und jetziger Flanke. Diese Differenz musst du dann woandershin kopieren, damit du den aktuellen Zählerstand für die nächste Subtraktion sichern kannst. Dein Ergebnis ist also immer die Differenz zwischen aktuellem Wert und Wert der letzten Messung. Natürlich sollte der Timer-Vorteiler so gewählt werden, dass sinnvolle Werte entstehen. Willst du Impulsdauer und Impulspause getrennt messen, dann musst du in der ISR erstmal ergründen, ob das jetzt die steigende oder die fallende Flanke war. Danach kannst du das Ergebnis der Subtraktion als Impulsdauer oder Pausendauer zuordnen. Damit die nächste Messung bei der umgekehrten Flanke erfolgt, muss nun auch die Flanke umgestellt werden. Damit bekommst du also wechselweise die Dauer der H-Phase und der L-Phase. Der Timer klappert dabei munter weiter, denn es wird ja jeweils die Differenz zwischen zwei "Schnappschüssen" ermittelt. Den Timer kannst du sogar noch gleichzeitig für Output-Compare benutzen. Dabei solltest du den Timer aber nicht auf 0 setzen (also kein CTC), sondern einfach den Output-Compare-Wert um den Wert des Intervalls erhöhen (nach $ffff kommt $0000). Somit kann dir der Timer gleichzeitig die Impulse am ICP-Pin messen und einen rythmischen Timer-Int zur Programmsteuerung (z.B. Software-PWM) erzeugen. Wenn du auch noch den Überlauf-Int nutzt, kannst du darin ein (oder 2) Register hochzählen, das/die du als Verbreiterung des Timers sehen kannst (obere Stellen, Übertrag, also 24 Bit oder 32 Bit Auflösung). Diese kann man bei ICP mit einbeziehen, um längere Zeiten messen zu können. Es werden dann neben den Werten in den ICP-Registern noch die Werte in den Übertrag-Registern zur Differenzbildung herangezogen. Der Timer1 bietet also sehr viele Möglichkeiten. Und dabei kann er ohne Halt durchlaufen. ...
Hat jemand ein Beispielprogramm (für GCC) in dem die Länge eines Pulses gemessen werden kann?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.