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!
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
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.
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.
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.
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.
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!
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.
WOW! Vielen Dank an alle für die ausführlichen Antworten!
mikrocontroller.net scheint im Vergleich mit anderen Foren um einiges
sympathischer und informativer.
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).
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.
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.
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.
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.
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).
"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 ?
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.
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.
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.
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.
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.