Wenn der Timer0 mit einer Zeitverzögerung von 1ms realisiert werden soll... und der CPU-Takt 8MHz beträgt... Wie komme ich dann darauf, dass ich für das TTCR0 den Vorteiler 64 nehme?
(1/8.000.000)*64 = 8µsec : das währe die Zeit die die Interruptroutine aufgerufen werden würde, wenn in Timerregister 255 steht. 8µs * 255 = 2,04ms : das währe die Zeit die die Interruptroutine aufgerufen werden würde, wenn in Timerregister 0 steht. Da die 1ms in zwischen diesen Werten liegt ist der Vorteiler OK. Axel
Ein relativ triviales Vorgehen ist das Scope anzuhaengen und die moeglichen Werte durchzuprobieren.
Delay schrieb: > Wie komme ich dann darauf, dass ich für das TTCR0 den Vorteiler 64 > nehme? Durch rechnen? So viele Vorteiler gibts ja nicht. Also rechnet man sich mit allen verfügbaren Vorteilern aus, welche Interruptfrequenz da rauskommt.
Karl Heinz Buchegger schrieb: > Delay schrieb: > > > Durch rechnen? > So viele Vorteiler gibts ja nicht. Also rechnet man sich mit allen > verfügbaren Vorteilern aus, welche Interruptfrequenz da rauskommt. Mir war/ist nicht ganz bewusst wie ich durch rechnen darauf komme.
Delay schrieb: > Karl Heinz Buchegger schrieb: >> Delay schrieb: >> >> >> Durch rechnen? >> So viele Vorteiler gibts ja nicht. Also rechnet man sich mit allen >> verfügbaren Vorteilern aus, welche Interruptfrequenz da rauskommt. > > Mir war/ist nicht ganz bewusst wie ich durch rechnen darauf komme. FAQ ganz unten
Hallo ! ich lasse das immer der Preprocessor von avr gcc erledigen.
1 | #define T0_FREQUENCE 1000UL // 1000Hz
|
2 | |
3 | // --------------------------------------------------------
|
4 | // Timer0 ist 8 Bit
|
5 | // Wir berechnen den optimalen Prescale-Faktor
|
6 | // --------------------------------------------------------
|
7 | |
8 | #define T0_MAX_COUNTER 256UL
|
9 | |
10 | // --------------------------------------------------------
|
11 | // 8-Bit Timer - Timer0
|
12 | // --------------------------------------------------------
|
13 | #define _T0_PRESCALE_0 (0)
|
14 | #define _T0_PRESCALE_1 (1<<CS00)
|
15 | #define _T0_PRESCALE_8 (1<<CS01)
|
16 | #define _T0_PRESCALE_64 (1<<CS01 | 1<<CS00)
|
17 | #define _T0_PRESCALE_256 (1<<CS02)
|
18 | #define _T0_PRESCALE_1024 (1<<CS02 | 1<<CS00)
|
19 | |
20 | |
21 | // --------------------------------------------------------
|
22 | // Timer0 Vorteiler berechnen
|
23 | // --------------------------------------------------------
|
24 | #if (F_CPU / T0_FREQUENCE) < T0_MAX_COUNTER
|
25 | # define T0_PRESCALE 1U // prescaler :1
|
26 | # define T0_PRESCALE_VALUE _T0_PRESCALE_1
|
27 | |
28 | #elif (F_CPU / (T0_FREQUENCE * 8 )) < T0_MAX_COUNTER
|
29 | # define T0_PRESCALE 8U // prescaler :8
|
30 | # define T0_PRESCALE_VALUE _T0_PRESCALE_8
|
31 | |
32 | #elif (F_CPU / (T0_FREQUENCE * 64 )) < T0_MAX_COUNTER
|
33 | # define T0_PRESCALE 64U // prescaler :64
|
34 | # define T0_PRESCALE_VALUE _T0_PRESCALE_64
|
35 | |
36 | #elif (F_CPU / (T0_FREQUENCE * 256UL )) < T0_MAX_COUNTER
|
37 | # define T0_PRESCALE 256U // prescaler :256
|
38 | # define T0_PRESCALE_VALUE _T0_PRESCALE_256
|
39 | |
40 | #elif (F_CPU / (T0_FREQUENCE * 1024UL)) < T0_MAX_COUNTER
|
41 | # define T0_PRESCALE 1024U // prescaler :1024
|
42 | # define T0_PRESCALE_VALUE _T0_PRESCALE_1024
|
43 | |
44 | #else
|
45 | # error "T0_FREQUENCE"
|
46 | #endif
|
47 | |
48 | // --------------------------------------------------------
|
49 | // Timer0 Counterwert berechnen um auf T0_FREQUENCE zu kommen
|
50 | // --------------------------------------------------------
|
51 | |
52 | #define T0_COUNTER (uint16_t)(1.0 * F_CPU / (T0_PRESCALE * T0_FREQUENCE) +0.5)
|
53 | |
54 | // in T0_PRESCALE_VALUE stehen dann Bit-Werte für den Prescaler.
|
Sorry wenn ich das alte Ding nochmal anpacke, aber bei mir funktioniert das nur wenn man
1 | define T0_PRESCALE 8UL |
setzt. Hier mal der komplette geänderte Teil
1 | #if (F_CPU / T0_FREQUENCE) < T0_MAX_COUNTER
|
2 | # define T0_PRESCALE 1UL // prescaler :1
|
3 | # define T0_PRESCALE_VALUE _T0_PRESCALE_1
|
4 | |
5 | #elif (F_CPU / (T0_FREQUENCE * 8 )) < T0_MAX_COUNTER
|
6 | # define T0_PRESCALE 8UL // prescaler :8
|
7 | # define T0_PRESCALE_VALUE _T0_PRESCALE_8
|
8 | |
9 | #elif (F_CPU / (T0_FREQUENCE * 64 )) < T0_MAX_COUNTER
|
10 | # define T0_PRESCALE 64UL // prescaler :64
|
11 | # define T0_PRESCALE_VALUE _T0_PRESCALE_64
|
12 | |
13 | #elif (F_CPU / (T0_FREQUENCE * 256UL )) < T0_MAX_COUNTER
|
14 | # define T0_PRESCALE 256UL // prescaler :256
|
15 | # define T0_PRESCALE_VALUE _T0_PRESCALE_256
|
16 | |
17 | #elif (F_CPU / (T0_FREQUENCE * 1024UL)) < T0_MAX_COUNTER
|
18 | # define T0_PRESCALE 1024UL // prescaler :1024
|
19 | # define T0_PRESCALE_VALUE _T0_PRESCALE_1024
|
20 | |
21 | #else
|
22 | # error "T0_FREQUENCE"
|
23 | #endif
|
Sons kommt beim berechnen von T0_COUNTER ein falscher Wert raus. Gruss, Jörg
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.