Forum: Compiler & IDEs Timer + OCR + ICR Hilfestellung


von Elias 1. (alajas)


Lesenswert?

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
von Arno (Gast)


Lesenswert?

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

von Detlef K. (adenin)


Lesenswert?

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
von Elias 1. (alajas)


Lesenswert?

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
von Thomas E. (thomase)


Lesenswert?

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.

von Arno (Gast)


Lesenswert?

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

von Elias 1. (alajas)


Lesenswert?

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
Noch kein Account? Hier anmelden.