Hallo Leute, ich habe mir den Beitrag von Herrn Starke http://www.mikrocontroller.net/articles/Entfernungsmessung_mit_Ultraschall zu gemüte geführt. Jedoch verstehe ich nicht für was er das ICR Register nutzt. void _40khz_init (void) { TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11); TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10); OCR1A = 100; ICR1 = 200; Soweit ich das verstanden habe. Läuft der Timer bis zu seinem Max Wert bevor er von 0 wieder zum zählen anfängt. Dazwischen habe ich einen OCR1A der mir bei einem comparematch einen Interrupt auslöst. Aber für was wird der ICR Wert genützt? Lt. Datenblatt ist der ICR Wert ein TOP Wert. Update of OCRnX at TOP TOV Flag set on TOP im Datenblatt stehen ebenfalls für andere WGM-Modes das Update of OCRnX at Bottom TOV Flag set on TOP Quelle vom Sourcecode http://www.mikrocontroller.net/mc-project/Pages/Projekte/Ultraschall/ultrasonic_usart.c vllt. hat jemand ein paar aufllärende Worte dazu? MfG Elias
:
Bearbeitet durch User
Moin, der einzige Kontext, in dem ich das kenne, dass das ICR beim AVR beschrieben wird, sind bestimmte Timer-Modes, in denen der Timer nicht bis MAX, also nicht bis 65535 (bzw. 255 beim 8-Bit-Timer) läuft, sondern bis zu einem frei definierbaren TOP-Wert (0<TOP<=65535 bzw. 0<TOP<=255). Als TOP-Wert wird in einigen PWM-Modes der Wert in OCRxA/OCRxB verwendet, in anderen Modes der Wert in ICR. Ich vermute, ein solcher Mode wird hier verwendet. Genaueres weiß - hoffentlich - das Datenblatt des verwendeten Controllers. MfG, Arno
Yep, mein Vorredner hat Recht. Mit mit dem ICR kanst Du die Frequenz der PWM einstellen und hast OCR1A und OCR1B frei, um zwei unterschiedliche Tastverhältnisse für diese Frequenz auszugeben. Zu beachten ist, dass die Werte von OCR1A und OCR1B nicht größer als der Wert von ICR sein sollten, da diese sonst nicht erreicht werden, weil ICR den hösten Wert angibt, den Timer1 erreichen kann.
:
Bearbeitet durch User
Hallo, Also wenn ich das richtig verstanden habe, kommt es bei einer Timer Sequenz zu 2 Interrupt Auslösern. 0 bis OCR dann imterrupt, von OCR bis ICR dann interrupt, von ICR bis Max, danach Timer wieder auf 0. Den Wert Max gibt es scheinbar nicht bei der Fast PWM nicht, hier wird der Timer Zählwert bei TOP resetet. D.h. Ich könnte interrupts mit unterschiedliche Frequenzen auslösen lassen, stimmt das? MfG Elias
:
Bearbeitet durch User
Elias 1234 schrieb: > Hallo, > > Also wenn ich das richtig verstanden habe, kommt es bei einer Timer > Sequenz zu 2 Interrupt Auslösern. > > 0 bis OCR dann imterrupt, von OCR bis ICR dann interrupt, von ICR bis > Max, danach Timer wieder auf 0. Nicht ganz. TOP, bestimmt durch ICR, löst einen Overflow-Interrupt aus. Aber nur im Fast-PWM-Mode, nicht im CTC. Einen ICR-Interrupt gibt es nicht. > Den Wert Max gibt es scheinbar nicht bei der Fast PWM nicht, hier wird > der Timer Zählwert bei TOP resetet. Natürlich. MAX, 65535 beim 16-Bit-Timer, wird ja auch nie erreicht. Ausser bei ICR1 = MAX. > D.h. Ich könnte interrupts mit unterschiedliche Frequenzen auslösen > lassen, stimmt das? Die Frequenz bestimmst du mit dem Topwert. Dabei können 3 Interrupt-Flags gesetzt werden und entsprechend Interrupts auslösen: COMPA, COMPB und OVF. COMPA und COMPB nur, wenn diese <= ICR1 sind. Die Frequenz ist aber für alle drei gleich. Nur die Zeitpunkte können unterschiedlich sein. mg.
Es gibt bei AVR soweit ich weiß drei verschiedene Timer-Interrupt-Typen: - Overflow: Der kann ausgelöst werden, wenn der Timer auf 0 springt (oder u.U. in den Vorwärts/Rückwärts-Zählmodi, z.B. WIMRE Phase Correct PWM, wenn der Timer 0 oder TOP oder MAX erreicht und die Richtung wechselt - Details stehen im Datenblatt) - Output Compare: Der kann ausgelöst werden, wenn der Timer-Wert mit dem Wert im OCR-Register übereinstimmt. Davon kann es pro Timer verschiedene geben. In manchen Modi wird der Timer auch gleich zurückgesetzt, wenn er den OCR-Wert erreicht. - Input Capture: Der kann bei bestimmten Ereignissen am Input Capture Pin ausgelöst werden. Wenn er eintrifft, wird der aktuelle Zähler-Wert ins ICR-Register kopiert (per Hardware, noch bevor die ISR aufgerufen wird) Nicht alle Interrupts können in allen Timer-Betriebs-Modi genutzt werden oder ergeben Sinn. Elias 1234 schrieb: > 0 bis OCR dann imterrupt, von OCR bis ICR dann interrupt, von ICR bis > Max, danach Timer wieder auf 0. Nein. Wenn der Timer bis MAX läuft, wird beim Erreichen von ICR kein Interrupt ausgelöst. Das Erreichen von ICR alleine löst keinen Interrupt aus, nur wenn ICR als TOP verwendet wird, kann danach der Overflow-Interrupt ausgelöst werden. Es gibt mehrere Möglichkeiten: 1) Der Timer läuft in einem Modus, in dem der ICR-Wert als TOP verwendet wird. Dann läuft er von 0 bis OCR, dann kommt der Compare-Interrupt, dann weiter bis TOP=ICR. Beim Erreichen von TOP gibt es zwei Möglichkeiten: 1a) Der Timer läuft in einem "Up-Counting"-Modus. Dann kommt nach TOP=ICR zurück auf 0 und der Overflow-Interrupt kann ausgelöst werden. 1b) Der Timer läuft in einem "Up-Down-Counting"-Modus. Dann geht es von TOP=ICR wieder rückwärts bis OCR, der Compare-Interrupt wird wieder ausgelöst, der Timer zählt weiter rückwärts bis 0, dann wieder vorwärts... entweder beim Erreichen von TOP=ICR oder beim Erreichen von 0 (welches von beidem weiß ich gerade nicht, steht aber im Datenblatt) kommt der Overflow-Interrupt. 2) Der Timer läuft in einem Modus, in dem MAX (oder ein anderer, fest definierter Wert, z.B. bei 10-Bit-PWM 1023, wenn der AVR das unterstützt) als TOP verwendet wird. Dann läuft er von 0 bis OCR, dann kommt der Compare-Interrupt, dann weiter bis TOP=MAX (bzw. TOP=1023), dann geht es weiter wie unter 1a) oder 1b) beschrieben. 3) Der Timer läuft in einem Modus, in dem OCR als TOP verwendet wird. Dann läuft er von 0 bis TOP=OCR, dann kommt der Compare-Interrupt und es geht weiter wie unter 1a) oder 1b) beschrieben, ggf. mit quasi gleichzeitigem (u.U. einen Timer-Takt später) Overflow-Interrupt. Das Beschreiben des ICR ist nur in Fall 1) sinnvoll, daher nehme ich mal an, dass hier ein solcher Modus verwendet wird. Welcher dieser Modi gewählt ist, hängt von COM... und WGM...-Bits ab. Ich meine, Atmel hat die Namen dieser Bits geändert, aber auch die alten Namen solltest du im Datenblatt finden. Oder war es umgekehrt und COM... und WGM... sind die neuen Namen? Dann such mal ein neues Datenblatt bei www.atmel.com, wenn du die Bits nicht in deinem Datenblatt findest. Im Kopf habe ich das auch nicht. Elias 1234 schrieb: > Den Wert Max gibt es scheinbar nicht bei der Fast PWM nicht, hier wird > der Timer Zählwert bei TOP resetet. Geben tut es den Wert MAX schon, der Timer erreicht ihn nur nicht, weil er vorher zurückgesetzt wird. Kann sein, dass das bei allen Fast PWM-Modi so ist, das weiß ich nicht aus dem Kopf. Wichtig ist, dass TOP je nach Modus entweder der Wert ist, der in einem der OCR-Register steht, oder der Wert, der im ICR-Register steht, oder MAX oder ein fester Wert. Elias 1234 schrieb: > D.h. Ich könnte interrupts mit unterschiedliche Frequenzen auslösen > lassen, stimmt das? Nur mit Tricks. Du kannst mehrere Interrupts bei unterschiedlichen Zählerständen auslösen lassen, ja. Du kannst die Frequenz des ganzen Timers beeinflussen, wenn du einen Modus wählst, in dem der Timer nur bis zu einem einstellbaren TOP-Wert läuft, ja. Aber in beiden Fällen beeinflusst das die Frequenz aller Interrupts desselben Timers. Ein möglicher Trick wäre aber zum Beispiel, den Timer frei und im "Up-Counting"-Modus bis MAX laufen zu lassen (dann hast du beim 16Bit-Timer alle 65536 Timer-Takte den Overflow-Interrupt zur Verfügung) und einen Output Compare-Interrupt zu aktivieren und in dessen ISR den Output Compare-Wert neu zu setzen. Damit kannst du den Output Compare-Interrupt mit einer anderen Frequenz triggern lassen als den Overflow-Interrupt. Vollständig unabhängig voneinander wird das aber nie. MfG, Arno
Danke dir Arno, ich habe mir das schon gedacht, dass wenn ich 2 Interrupts pro Timer auslösen lasse, diese nur Zeitversetzt auslösen. Jedoch immer mit den selben Frequenzen. Den Trick den du genannt hast klingt ganz gut. Wenn ich das richtig verstanden habe müsste ich den OCR Wert immer mit einer Zahl kombinieren um die Interrupts per Frequenz zu verändern. Gibt es dazu Beispiele? MfG Elias
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.