Input Capture Pin

Gast #162288
Lesenswert?

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).

...
Gast #162290
Lesenswert?

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.?
Gast #162291
Lesenswert?

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.

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren