Forum: Mikrocontroller und Digitale Elektronik Input Capture Pin


von Timo Gessner (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

Hi,

die Forumsuchfunktion sollte Dir weiterhelfen.

Mfg
Dirk

von Timo Gessner (Gast)


Lesenswert?

Leider konnte ich über die Suchfunktion nichts drüber finden. Benutze
Schlüsselwörter für Suche: Input Capture Pin, ICP.

von ...HanneS... (Gast)


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

...

von Timo Gessner (Gast)


Lesenswert?

Super, damit hilfst du mir sehr weiter.
Danke sehr.

von Timo Gessner (Gast)


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

von ...HanneS... (Gast)


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.

...

von Willi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.