Vorteiler berechnen

Gast #2415250
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
#2415350
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.
#2892592
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren