Forum: Mikrocontroller und Digitale Elektronik Funktionsweise von "Input Capture"


von MBD (Gast)


Lesenswert?

Hallo allerseits.

Ich bin gerade dabei, mich in "Input Capture" und "Output Compare" 
einzulesen und möchte nachfragen, ob ich die Funktionsweise von "Input 
Capture" folgendermaßen richtig verstanden habe:

Komponenten:
Free running Counter
Edge Select Logic (rising/falling)
Input Capture Latch

Wenn ein “Input Event“ (externes Signal) auftritt, kopiert die “Input 
Capture Function“ den Inhalt vom “Free running Counter” zum Latch.

Der Event kann von der “System-Clock“ gesteuert werden.

Eine “Status-Flag“ wird gesetzt, welches kennzeichnet, dass ein Input 
erfasst wurde.

Ein Interrupt wird erzeugt, wenn dieser eingeschaltet ist. Es wird die 
Differenz zwischen zwei exteren Signalen/Flanken ausgelesen. Der “Free 
Running Counter“ läuft die ganze Zeit weiter.

Vielen Dank im Voraus!

von Thomas Forster (Gast)


Lesenswert?

MBD schrieb:
> Eine “Status-Flag“ wird gesetzt, welches kennzeichnet, dass ein Input
> erfasst wurde.
>
> Ein Interrupt wird erzeugt, wenn dieser eingeschaltet ist.

Passt soweit. Bis hierher läuft alles von selbst, falls richtig 
konfiguriert.

> Es wird die Differenz zwischen zwei exteren Signalen/Flanken ausgelesen.

Nö. Du liest nur den aktuellen Zählerstand zum Zeitpunkt der Flanke am 
Eingang aus. Die Differenz musst du selbst ausrechnen. Dazu musst du 
natürlich den letzten Wert aufheben.

> Der “Free Running Counter“ läuft die ganze Zeit weiter.

Ja. Deshalb müssen auch Überläufe des Counters und die folgende 
Rückstellung auf Null abgearbeitet werden.

https://www.mikrocontroller.net/articles/High-Speed_capture_mit_ATmega_Timer#Keine_Angst_vor_.C3.9Cberl.C3.A4ufen

von fop (Gast)


Lesenswert?

MBD schrieb:
> Der Event kann von der “System-Clock“ gesteuert werden.

Das verstehe ich jetzt nicht so ganz. Der Trigger zum Speichern des 
Zählerstands kommt ja meist von aussen. Wenn man den selber auslösen 
würde, müsste man nicht bestimmen, wann der Trigger kam.
Natürlich synchronisiert die Input-Capture-Einheit das Eingangssignal 
mit ihrem (meist vom Systemtakt abgeleiteten) Takt.

Oft gibt es nur ein Latch in der Input-Capture Einheit. Wenn Du also den 
Abstand zwischen 2 Flanken brauchst, musst Du also das Latch nach der 
ersten Flanke ausgelesen haben, bevor die 2. Flanke kommt.

von Clemens L. (c_l)


Lesenswert?

MBD schrieb:
> Es wird die Differenz zwischen zwei exteren Signalen/Flanken ausgelesen.

Das ist das, was deine Software dann üblicherweise macht.

Es wäre aber auch möglich, dass die Software den Timer startet 
(Counter=0) und gleichzeitig ein Signal aussendet, und dann die Zeit bis 
zur Antwort misst.

von Axel S. (a-za-z0-9)


Lesenswert?

MBD schrieb:
> Wenn ein “Input Event“ (externes Signal) auftritt, kopiert die “Input
> Capture Function“ den Inhalt vom “Free running Counter” zum Latch.

Naja. Kopiert ist nicht das richtige Wort. Ein Latch ist in der 
Elektronik ein Bauelement mit einem (oder mehreren) Dateneingängen, 
deren Zustand beim aktivwerden des Latch-Signals gespeichert 
(übernommen) werden. Das Latch ist hier also permanent mit dem Zähler 
verbunden und die Capture Einheit generiert das Latch-Signal.

Darf man außerdem mal fragen, warum du die Fachbegriffe alle in 
Anführungszeichen setzt? Und warum du auch dann englische Begriffe 
verwendest, wenn es dafür auch etablierte deutsche Begriffe gibt?

> Der Event kann von der “System-Clock“ gesteuert werden.

Welcher "Event"? Der Zähler braucht natürlich irgendeinen Takt. Das kann 
z.B. der Systemtakt sein. Aber Event bezeichnet im Zusammenhang mit 
Input-Capture ein externes Signal. Und das ist idR. vollkommen 
unabhängig von irgendwelchen Takten innerhalb des µC.

> Eine “Status-Flag“ wird gesetzt, welches kennzeichnet, dass ein Input
> erfasst wurde.

Das Statusflag kennzeichnet, daß ein Capture-Event erfaßt wurde.

> Ein Interrupt wird erzeugt, wenn dieser eingeschaltet ist.
> Es wird die Differenz zwischen zwei exteren Signalen/Flanken
> ausgelesen.

Die Capture-Einheit liefert dir nur den Zählerstand (vulgo: einen 
Zeitstempel) für das Auftreten eines Events. Und sobald du den 
Zeitstempel aus dem Latch ausgelesen hast (zweckmäßigerweise in der 
Interrupt-Serviceroutine), kann sie das nächste Event erfassen.

Für sich wiederholende Events bekommst du also eine Folge von 
Zeitstempeln und kannst aus diesen den zeitlichen Abstand ausrechnen. 
Aber das ist eine Software-Funktion, die du dem System hinzufügst.

> Der “Free Running Counter“ läuft die ganze Zeit weiter.

Das ist die Bedeutung von free running. Daß der Zähler mit konstanter 
Frequenz vor sich hin tickt, ohne angehalten oder zurückgesetzt zu 
werden.

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Vielleicht noch eine Analogie im Maus-Stil zur Illustration wie Input 
Capture funktioniert:

Der freilaufende Zähler ist eine Wanduhr, die vor sich hin tickt. Ja, so 
eine altmodische mit Zeigern.

Das Capture-Latch ist eine Kamera auf einem Stativ, die auf die Uhr 
ausgerichtet ist.

Das Capture-Event ist das Auslösen der Kamera. Bei jedem Event macht die 
Kamera ein Bild und zeichnet so die aktuelle Zeit auf.

Das Auslösegeräusch der Kamera ist der Interrupt, der den Menschen der 
derzeit etwas ganz anders macht wie z.B. ein Buch lesen oder schlafen, 
davon benachrichtigt, daß etwas passiert ist. Er kann jetzt seine Arbeit 
unterbrechen (Interrupt!) und sich das Bild ansehen. (an dieser Stelle 
hat die Analogie ein Loch: eine Kamera kann idR. viele Bilder 
aufzeichen, die Capture-Einheit aber immer nur einen Zeitstempel)

Aus zwei aufeinanderfolgenden Bildern kann man eine Zeitdifferenz 
bestimmen. Das ist dann der zeitliche Abstand zwischen den beiden 
Events. Allerdings funktioniert das nur so lange, wie die Events nicht 
länger als 24 Stunden auseinander liegen, denn dann läuft die Uhr über. 
Genau das gleiche passiert mit dem Zähler der Capture-Einheit.

Wenn man jetzt neben die Uhr noch einen Kalender hängt (so einen kleinen 
mit einem Zettel zum Abreißen für jeden Tag) und per Wecksignal um 
Mitternacht den Operator aufweckt, daß er den Kalender weiterstellt, 
dann kann die Kamera zusätzlich zur Zeit noch das Datum aufzeichnen und 
ein Überlauf passiert nur noch einmal im Jahr.

Genau das gleiche kann man bei der elektronischen Version auch machen. 
Man aktiviert den Überlauf-Interrupt des Zählers und in der zugehörigen 
ISR zählt man einen weiteren Zähler hoch. In der ISR für ein 
Capture-Event muß man neben dem Latch auch noch diesen Zähler mit 
abspeichern.

von Clemens L. (c_l)


Lesenswert?

Axel S. schrieb:
> an dieser Stelle hat die Analogie ein Loch: eine Kamera kann idR. viele
> Bilder aufzeichen

Wir benutzen natürlich eine gute alte Lochkamera!

von Axel S. (a-za-z0-9)


Lesenswert?

Clemens L. schrieb:
> Axel S. schrieb:
>> an dieser Stelle hat die Analogie ein Loch: eine Kamera kann idR. viele
>> Bilder aufzeichen
>
> Wir benutzen natürlich eine gute alte Lochkamera!

Oder eine Digitalkamera, bei der die Speicherkarte voll ist. Die zeigt 
dann das letzte Bild so lange auf dem Display, bis das nächste Mal 
ausgelöst wird.

von MBD (Gast)


Lesenswert?

WOW! Vielen Dank an alle für die ausführlichen Antworten! 
mikrocontroller.net scheint im Vergleich mit anderen Foren um einiges 
sympathischer und informativer.

von m.n. (Gast)


Lesenswert?

MBD schrieb:
> Input Capture Latch

Hier wird immer wieder der Begriff Latch verwendet, obwohl es sich um 
ein Register handelt.

Ein Latch hat typischweise einen Freigabe-Eingang (enable), der die 
Pegel an den Eingängen an die Ausgänge durchschaltet. Erst beim 
Abschalten (enable wird passiv) wird der Zustand der Ausgänge 
eingefroren. Die Arbeitsweise eines Latch ist asynchron.
Ein typisches IC dafür ist 74xx373.

Für input-capture braucht man ein Register, welches bei einer aktiven 
Flanke am Takt-Eingang den Zustand der Eingänge übernimmt und auf die 
Ausgänge legt. Das ist die Funktion eines D-FFs, welches immer 
flankengetriggert und synchron zum Takt-Eingang arbeitet. Seriell 
kaskadiert werden daraus Schiebe- Register. "Schiebe-Latches" gibt es 
nicht!
Typische ICs: 74xx74 (zweifach) oder 74xx374 (achtfach).

von fop (Gast)


Lesenswert?

Latch ist vielleicht auch die falsche Bezeichnung für das 
Input-Capture-Register. Unter Latch kenne ich ein Bauteil, dass man auch 
transparent schalten kann. Sprich am Ausgang erscheint alles so, wie es 
gerade am Eingang ist. Und wenn man dann genug von dieser Transparenz 
hat, kann man mit einem Steuersignal sagen : "Stopp" und alle Ausgänge 
behalten ihren momentanen Zustand bei. Und das solange, bis man mit dem 
Steuersignal wieder auf transparent schaltet.
Das Register kennt nur ein Speichern und ein jetzt übernehmen.

Du kannst also nicht beständig den Wert des Timers in das Capture 
Register spiegeln. Es sei denn, Du generierst sehr oft Flanken am 
Capture Eingang.

von Axel S. (a-za-z0-9)


Lesenswert?

m.n. schrieb:
> MBD schrieb:
>> Input Capture Latch
>
> Hier wird immer wieder der Begriff Latch verwendet, obwohl es sich um
> ein Register handelt.

Die Abgrenzung ist (mindestens in der deutschen Sprache) nicht 
eindeutig.

> Ein Latch hat typischweise einen Freigabe-Eingang (enable), der die
> Pegel an den Eingängen an die Ausgänge durchschaltet. Erst beim
> Abschalten (enable wird passiv) wird der Zustand der Ausgänge
> eingefroren.
> Ein typisches IC dafür ist 74xx373.

Das ist das, was man meist als transparentes Latch bezeichnet. In 
älterer Literatur auch gern mal taktzustandgesteuert.

> Für input-capture braucht man ein Register, welches bei einer aktiven
> Flanke am Takt-Eingang den Zustand der Eingänge übernimmt und auf die
> Ausgänge legt.

Und das dann zur Abgrenzung als flankengetriggertes Latch/Register.

> Das ist die Funktion eines D-FFs, welches immer
> flankengetriggert und synchron zum Takt-Eingang arbeitet.

Ich verstehe nicht, was du hier "synchron zum Takt" nennst. Da es das 
Taktsignal ist, das das Latch (oder meinetwegen Register) steuert, 
erfolgt diese Steuerung immer taktsynchron.

Der Unterschied ist, daß beim flankengesteuerten Latch/Register die 
Ausgänge ihren Zustand ausschließlich zum Zeitpunkt der aktiven 
Taktflanke wechseln können. Das taktzustandgesteuerte Latch/Register ist 
für den einen (aktiven) Pegel des Taktsignals transparent - d.h. die 
Ausgänge folgen dem Pegel der Eingänge. Die Ausgänge werden dann in dem 
Moment "eingefroren", wenn das Taksignal auf den inaktiven Pegel 
zurückwechselt. Mit synchron oder asynchron hat das insofern nichts zu 
tun. Der Effekt des "latchens" (engl. to latch = einrasten) erfolgt 
bei beiden an einer Taktflanke. Und damit natürlich taktsynchron.

von m.n. (Gast)


Lesenswert?

Axel S. schrieb:
> Ich verstehe nicht, was du hier "synchron zum Takt" nennst.

Das englische Wort "clock" macht es vielleicht deutlicher.

Axel S. schrieb:
> Der Unterschied ist,

asynchrone und synchrone Arbeitsweise.

von Axel S. (a-za-z0-9)


Lesenswert?

m.n. schrieb:
> Axel S. schrieb:
>> Ich verstehe nicht, was du hier "synchron zum Takt" nennst.
>
> Das englische Wort "clock" macht es vielleicht deutlicher.

Kein bißchen. Beide Arten von Latch arbeiten synchron zum Steuersignal. 
Man könnte jetzt natürlich Haare spalten und sagen, daß das Signal beim 
transparenten Latch typisch latch enable heißt und nicht clock. Das 
macht das Argument noch unsinniger. Denn wenn es kein Signal namens 
clock gibt, dann kann auch nichts asynchron sein.

von A. S. (Gast)


Lesenswert?

Zu erwähnen sei noch, dass die Timer (Respektive Zähler) unter Umständen 
sehr variabel konfigurierbar sind. Es kann also sein, dass man ihn als 
Zähler externer Signal betreibt und ...

MBD schrieb:
> Der Event kann von der “System-Clock“ gesteuert werden.
z.B. jede ms.


Auch Deine folgende Funktion
> Es wird die Differenz zwischen zwei exteren Signalen/Flanken ausgelesen.


ist prinzipiell möglich und sinnvoll, wenn die beiden Signale sehr sehr 
kurz sind und die HW das vorsieht. Ich habe das aber noch nicht gesehen 
(was nichts heisst. Ich habe es noch nie gebraucht).

von fop (Gast)


Lesenswert?

"Latch" ist für mich nicht wirklich ein typisch deutsches Wort. Von 
daher finde ich die Aussage
> Die Abgrenzung ist (mindestens in der deutschen Sprache) nicht
> eindeutig.
hat was von Tautologie. Wenn wir schon fleissig am Haare spalten sind.

Ps: Noch irgendwer 'ne Frage zu Input-Capture ?

von Dirk (Gast)


Lesenswert?

fop schrieb:
> Ps: Noch irgendwer 'ne Frage zu Input-Capture ?

Ja :-)

Ich bin auch gerade dabei mich in das Thema Input Capture und Output 
Compare einzuarbeiten, da ich mit einem ATtiny2313 zwei PPM - 
Servosignale einlesen und dann zwei Ausgänge mittels PWM steuern möchte.
Meine Frage ist warscheinlich ganz einfach. Im Datenblatt steht immer 
was von Input Capture pin (ICP1). Aber welcher Pin ist das tatsächlich? 
Wie heisst der im Pinout?
Da ich 2 PPM Signale einlesen möchte, müsste ich ja 2 ICP Eingänge 
haben, den ich aber wohl mit einem ATiny nicht habe?
Meine 2. Überlegung ist, die INT0 und INT1 Eingänge zu verwenden und bei 
fallender Flanke immer einen Timerwert zu speichern und bei fallender 
Flanke die Differenz zu berechnen. Dann könnte ich zwei Eingangssignale 
einlesen. Oder ist das zu kompliziert gedacht?

Gruß
Dirk

P.S. PPM Signal: 1-2ms länge, ca. 20ms Pause. In der Zeit 1-2ms steckt 
die Information über die Servoauslenkung.

von Checker (Gast)


Lesenswert?

Hallo,

frei von der Leber weg liegt der gesuchte Pin dort wo im Datenblatt ganz 
vorn ICP dran steht. :-)

von Checker (Gast)


Lesenswert?

Hallo,

ICP haste nur einen.

Zur letzten Frage.
Beide Ints brücken, damit Signal an beiden dran. Die Ints jeweils so 
konfigurieren das der eine auf rising und der andere auf falling 
detektiert.

von fop (Gast)


Lesenswert?

PD6 / ICP
Pin 9 am MLF-Gehäuse sonst Pin 11

Tja, nur Timer 1 hat ICP. Gleichzeitig kannst Du damit nur ein Signal 
ausmessen. Nacheinander/abwechselnd könnte man vermutlich was tricksen, 
indem man das 2. Signal am Komparator anschließt.

Du kannst natürlich auch im Interrupt per Software den Zählerstand 
auslesen. Dann hast Du halt eine Ungenauigkeit durch die Zeit, die der 
Mikrocontroller braucht, um in den Interrupt zu gehen und dem Code, den 
der Conpiler vor Deine Anweisungen setzt, z.B. um Register zu sichern.
Ist immer noch besser, als ohne Interrupts zu arbeiten.
Ob das noch genau genug ist, musst Du selbst ermitteln. Wobei eine feste 
Verzögerung vermutlich besser ist als eine schwankende.

von m.n. (Gast)


Lesenswert?

Dirk schrieb:
> Da ich 2 PPM Signale einlesen möchte, müsste ich ja 2 ICP Eingänge
> haben, den ich aber wohl mit einem ATiny nicht habe?

Wenn es nicht gleichzeitig sein muß, kann im Wechsel mit ICP1 auch der 
Komparator (AIN0, AIN1) einen ICP bei Timer1 auslösen.

> Meine 2. Überlegung ist, die INT0 und INT1 Eingänge zu verwenden und bei
> fallender Flanke immer einen Timerwert zu speichern und bei fallender
> Flanke die Differenz zu berechnen. Dann könnte ich zwei Eingangssignale
> einlesen. Oder ist das zu kompliziert gedacht?

Das kannst Du bei den langen Zeiten im ms-Bereich so machen.

von c-hater (Gast)


Lesenswert?

Dirk schrieb:

> da ich mit einem ATtiny2313 zwei PPM -
> Servosignale einlesen und dann zwei Ausgänge mittels PWM steuern möchte.
[...]
> P.S. PPM Signal: 1-2ms länge, ca. 20ms Pause. In der Zeit 1-2ms steckt
> die Information über die Servoauslenkung.

Das ist ein PWM-Signal.

PPM ist, wenn mehrere dieser Signale (bis zu acht) sozusagen ineinander 
verschachtelt werden. Wenn's wirklich PPM wäre, wäre das für dich 
besser, denn dann würde der eine ICP reichen, um beide Kanäle einzulesen 
(oder halt auch bis zu acht).

Vermutlich stammen deine zwei PWM-Signale aus irgendeinem 
Fernsteuerungsempfänger, der den Demultiplexer von PPM auf n PWM-Kanäle 
eingebaut hat. Da bieten sich zwei Möglichkeiten an:

1) Manche dieser Empfänger bieten auch einen Ausgang für das PPM-Signal. 
Wenn deiner dazu gehört, dann solltest du dieses Signal verwenden.

2) Wenn dein Empfänger nicht zu dieser Kategorie gehört, hast du 
trotzdem die Möglichkeit, mit ein wenig einfacher externer Logik die vom 
Empfänger gelieferten PWM-Kanäle wieder zu einem PPM-Signal zu 
multiplexen. Im einfachsten Fall: soviele Dioden, wie du Kanäle hast 
(also zwei in deinem Fall) und einen Widerstand. So eine Konstruktion 
nennt man "wired OR".

Neben den Vorteil, dass du damit alle Kanäle mit der maximal möglichen 
Genauigkeit, nämlich der des ICP-Mechanismus, erfassen kannst, ist ein 
nicht zu verachtender positiver Nebeneffekt, dass du dazu halt nur einen 
einzigen Pin benötigst, was bei der geringen Pinzahl der Tinys ja nie 
schlecht sein 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.