Hi Leute,
ich bin neu in uC versuche gerade den genauen/gravierenden Unterschied
zwischen den beiden CTC Modes (Mode4 und Mode12) zu verstehen. So wie
ich das Datenblatt verstehe, besteht der einzige Unterschied darin, in
welches Register der Wert geschrieben wird, bei dem ein Compare Match
auftritt. Bei Mode 4 ist es OCR1A und bei Mode 12 ist es ICR1.
Jetzt frage ich mich allerdings, welcher der beiden Modes zu
empfehlen/vorzuziehen ist, wenn wir von Timern sprechen. Oder wird das
erst später von Interesse sein, wenn man vielleicht noch mal eine PWM
mit einbauen will? Denn bei meinem aktuellen Stand sind beide Modi
gleich mit Ausnahme des unterschiedlichen Registers.
Vielen Dank für eure Hilfe.
Anbei mein C Code:
1
#include<avr/io.h>
2
#include<util/delay.h>
3
#include<avr/interrupt.h>
4
5
voidMODE4(void);
6
voidMODE12(void);
7
8
intmain(void)
9
{
10
11
MODE12();
12
13
while(1)
14
{
15
16
}
17
}
18
19
voidMODE4(void)
20
{
21
22
DDRB|=(1<<PB1);// PB1 as output (DDRB must be set to enable the output driver)
23
OCR1A|=976;// Value determines interrupt request every second
24
// 16bit equals 65536 and uC runs with 1MHz => 1us
25
// With prescaler set to 1024 one period is then 1us*1024=1024us, counter increases every 1024us
26
// For 65536 we need 65536*1024us=67.1s
27
// For 1s we need 65536*1s/67.1 = 976
28
// Note that for different prescales other values for OCR1A are needed but the principle
29
// calculation remains the same
30
31
TCCR1B|=(1<<WGM12);// CTC with OCR1A
32
TCCR1B|=(1<<CS12)|(1<<CS10);// Sets prescaler to 1024
33
TIMSK|=(1<<OCIE1A);// Output Compare A Match Interrupt Enable
34
sei();// Enable interrups (SEt Interrupts)
35
}
36
37
voidMODE12(void)
38
{
39
DDRB|=(1<<PB1);// PB1 as output (DDRB must be set to enable the output driver)
40
ICR1|=976;// Value determines interrupt request every second
41
// 16bit equals 65536 and uC runs with 1MHz => 1us
42
// With prescaler set to 1024 one period is then 1us*1024=1024us, counter increases every 1024us
43
// For 65536 we need 65536*1024us=67.1s
44
// For 1s we need 65536*1s/67.1 = 976
45
// Note that for different prescales other values for ICR1 are needed but the principle
46
// calculation remains the same
47
TCCR1B|=(1<<WGM12)|(1<<WGM13);// CTC with ICR1
48
TCCR1B|=(1<<CS12)|(1<<CS10);// Sets prescaler to 1024
49
TIMSK|=(1<<OCIE1A);// Output Compare A Match Interrupt Enable
50
sei();// Enable interrups (SEt Interrupts)
51
}
52
53
54
// Interrupt routine makes LED blink every second for 100ms
al3ko schrieb:> So wie> ich das Datenblatt verstehe, besteht der einzige Unterschied darin, in> welches Register der Wert geschrieben wird, bei dem ein Compare Match> auftritt. Bei Mode 4 ist es OCR1A und bei Mode 12 ist es ICR1.
nicht ganz richtig verstanden.
Das jeweilige Register gibt an, wann der Overflow auftritt, also den
höchsten Wert, der der Timer annehmen kann.
al3ko schrieb:> wenn man vielleicht noch mal eine PWM> mit einbauen will?
Wenn man ICR1 als TOP-Register benutzt, kann man zwei PWMs erzeugen.
Wenn man OCR1 als TOP-Register benutzt, nur noch ein (OCR2).
al3ko schrieb:> Jetzt frage ich mich allerdings, welcher der beiden Modes zu> empfehlen/vorzuziehen ist
Das kann man so nicht sagen.
Du nimmst den Modus, bei dem sich die Register nicht in die Quere
kommen.
Wenn du in deinem Projekt das ICR1 Register für was anderes brauchst,
dann kannst du ihn nicht für den Top Wert des Timers nehmen. Brauchst du
das OCR1A und kannst nicht auf OCR1B dafür ausweichen, dann kannst du
nicht Mode 4 nehmen.
> Denn bei meinem aktuellen Stand sind beide Modi> gleich mit Ausnahme des unterschiedlichen Registers.
Wenn es bei dir keine Rolle spielt, dann wirf eine Münze.
STK500-Besitzer schrieb:> al3ko schrieb:>> So wie>> ich das Datenblatt verstehe, besteht der einzige Unterschied darin, in>> welches Register der Wert geschrieben wird, bei dem ein Compare Match>> auftritt. Bei Mode 4 ist es OCR1A und bei Mode 12 ist es ICR1.>> nicht ganz richtig verstanden.> Das jeweilige Register gibt an, wann der Overflow auftritt, also den> höchsten Wert, der der Timer annehmen kann.
Ist das wirklich ein Overflow, der auftritt? Ich dachte, der Overflow
tritt nur im Normal mode auf, bei dem das TCTN Register bei jedem Takt
hochzählt. Aber beim CTC Mode wird doch das TCTN Register mit einem Wert
aus dem Output Compare Register verglichen. Schließlich heißt ja auch
die Interrupt Routine Compare Match und nicht Overflow.
Oder missverstehe ich die Vokabeln?
Karl Heinz Buchegger schrieb:> Wenn es bei dir keine Rolle spielt, dann wirf eine Münze.
Okay, danke. Sowas in der Art hätte ich auch gemacht.
Dann bedanke ich mich für eure Antworten. Jetzt ist es ein wenig klarer.
Zu ungenau formuliert:
al3ko schrieb:> Ist das wirklich ein Overflow, der auftritt? Ich dachte, der Overflow> tritt nur im Normal mode auf, bei dem das TCTN Register bei jedem Takt> hochzählt. Aber beim CTC Mode wird doch das TCTN Register mit einem Wert> aus dem Output Compare Register verglichen. Schließlich heißt ja auch> die Interrupt Routine Compare Match und nicht Overflow.
Beim Normal Mode bzw. Overflow mode zählt das TCTN Register normal hoch,
bis dessen maximaler Wert auftritt. Dann geschieht ein Overflow und die
Overflow Routine wird ausgeführt.
Beim CTC Mode zählt das TCTN Register normal hoch und wird mit einem
definierten Wert verglichen. Entsteht ein Match, wird die Compare Match
ISR ausgeführt.
So hätte ich es schreiben wollen.
al3ko schrieb:> Beim Normal Mode bzw. Overflow mode zählt das TCTN Register normal hoch,> bis dessen maximaler Wert auftritt. Dann geschieht ein Overflow und die> Overflow Routine wird ausgeführt.
Nur, solange auch die entsprechende ISR freigeschaltet ist
(Overflow-Interrupt Enable).
Ein Overflow ist nichts anderes als der Überlauf eines begrenzten
Zahlenbereichs. Im Normalmodus wird dann das Overflow-Interrupt-Flag
gesetzt, bei den anderen beiden halt das jeweils passende Flag.
Ein Überlauf ist es in allen drei Fällen.