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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.