mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Input Capture Pin


Autor: Timo Gessner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

die Forumsuchfunktion sollte Dir weiterhelfen.

Mfg
Dirk

Autor: Timo Gessner (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

...

Autor: Timo Gessner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, damit hilfst du mir sehr weiter.
Danke sehr.

Autor: Timo Gessner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat jemand ein Beispielprogramm (für GCC) in dem die Länge eines Pulses
gemessen werden kann?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.