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.
:
Bearbeitet durch User
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, frei von der Leber weg liegt der gesuchte Pin dort wo im Datenblatt ganz vorn ICP dran steht. :-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.