Forum: Mikrocontroller und Digitale Elektronik Vorteiler berechnen


von Delay (Gast)


Lesenswert?

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?

von Düsendieb (Gast)


Lesenswert?

(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

von Purzel H. (hacky)


Lesenswert?

Ein relativ triviales Vorgehen ist das Scope anzuhaengen und die 
moeglichen Werte durchzuprobieren.

von Karl H. (kbuchegg)


Lesenswert?

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.

von david (Gast)


Lesenswert?

Für Rechenfaule: http://www.avrcalc.com/

Gruss
david

von Delay (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Uwe (de0508)


Lesenswert?

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.

von Jörg E. (jackfritt)


Lesenswert?

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