Excel Tabelle zur Bestimmung des OCR0 Werts

OP #3403294
Lesenswert?

Hab eine kleine Tabelle zusammengeschrieben die die ms angibt bei der 
der OVF einsetzt.
Dabei hab ich für die leichtere Überschaubarkeit die Ganzzahligen Werte 
hervorgehoben.
Ich zumindest mit verschiedensten Frequenzen und timern und brauche eben 
diese OCR0 Werte um leichter und genauer Timer zu setzen...
Vllt. hilft sie ja euch auch...

So funktionierts: Frequenz eingeben und Enter drücken... und jetzt kommt 
der schwierige Part, den passenden Prescaler zu der nötigen ms Zeit 
suchen und den zugehörigen OCR0 Wert ablesen... ;)

P.S. die ist nur für einen 8-bit timer gedacht...

Für Feedback und Kritik stehe ich gerne zur Verfügung
Angehängte Dateien:
#3403533
Lesenswert?

Peter Dannegger schrieb:
> Warum schreibst Du die Formel nicht einfach direkt in den Quelltext?
>
> Der C-Compiler rechnet Konstanten schon zur Compilezeit selber aus. Es
> entsteht daher kein zusätzlicher Code.

Genau.
1
    #if TIMER0_MODE == TIMER0_CTC      //Prescaler ermitteln
2

3
        #ifndef TIMER0_INTERVAL
4
          #define TIMER0_INTERVAL 1000
5
          #warning "Timer0: Interval not defined in CTC Mode. Set to Default 1ms"
6
        #endif
7

8
        #ifdef TIMER0_WARNINGS
9
          #warning "Timer0 CTC"
10
        #endif
11
        
12
        #ifdef TIMER0_PRESCALER
13
          #undef TIMER0_PRESCALER
14
        #endif
15

16
        #define TIMER0_PRESCALER 1L
17
  
18
        #define OCR0A_VALUE F_CPU / (TIMER0_INTERVAL * TIMER0_PRESCALER) - 1
19

20
        #if OCR0A_VALUE > 255
21
          #undef TIMER0_PRESCALER
22
          #define TIMER0_PRESCALER 8L
23
          #if OCR0A_VALUE > 255
24
            #undef TIMER0_PRESCALER
25
            #define TIMER0_PRESCALER 64L
26
            #if OCR0A_VALUE > 255
27
              #undef TIMER0_PRESCALER
28
              #define TIMER0_PRESCALER 256L
29
              #if OCR0A_VALUE > 255
30
                #undef TIMER0_PRESCALER
31
                #define TIMER0_PRESCALER 1024L
32
                #if OCR0A_VALUE > 255
33
                  #error "TIMER0_INTERVAL: value too small" 
34
                #endif
35
              #endif
36
            #endif
37
          #endif
38
        #endif
39
    #endif
40

41

42
    #ifndef TIMER0_PRESCALER
43
      #define TIMER0_PRESCALER 64
44
      #warning "Timer0 Prescaler undefined. Set to 64 by default"
45
    #endif
46

47
    #if TIMER0_PRESCALER == 1
48
      #define CS0 (1 << CS00)
49
      #ifdef TIMER0_WARNINGS
50
        #warning "Timer0 Prescaler = 1"
51
      #endif
52
    #endif
53

54
    #if TIMER0_PRESCALER == 8
55
      #define CS0 (1 << CS01)
56
      #ifdef TIMER0_WARNINGS
57
        #warning "Timer0 Prescaler = 8"
58
      #endif
59
    #endif
60

61
    #if TIMER0_PRESCALER == 64
62
      #define CS0 (1 << CS01) | (1 << CS00)
63
      #ifdef TIMER0_WARNINGS
64
        #warning "Timer0 Prescaler = 64"
65
      #endif
66
    #endif
67

68
    #if TIMER0_PRESCALER == 256
69
      #define CS0 (1 << CS02)
70
      #ifdef TIMER0_WARNINGS
71
        #warning "Timer0 Prescaler = 256"
72
      #endif
73
    #endif
74

75
    #if TIMER0_PRESCALER == 1024
76
      #define CS0 (1 << CS02) | (1 << CS00)
77
      #ifdef TIMER0_WARNINGS
78
        #warning "Timer0 Prescaler = 1024"
79
      #endif
80
    #endif
81
  //---
82

83

84
    #if TIMER0_MODE == TIMER0_CTC      //Register einstellen
85

86
          #ifdef TIMER0_TOGGLE_OC0A
87
            #define COM0A (1 << COM0A0)
88
            #define OC0A_OUT (1 << OC0A_BIT_)
89
          #endif
90

91
          #ifdef TIMER0_TOGGLE_OC0B
92
            #define COM0B (1 << COM0B0)
93
            #define OC0B_OUT (1 << OC0B_BIT_)
94
          #endif
95

96
          #ifndef OC0A_OUT
97
            #define OC0A_OUT 0
98
          #endif
99

100
          #ifndef OC0B_OUT
101
            #define OC0B_OUT 0
102
          #endif
103

104
          #ifndef COM0A
105
            #define COM0A 0
106
          #endif
107

108
          #ifndef COM0B
109
            #define COM0B 0
110
          #endif
111

112
          #ifdef TIMER0_NOIRQ
113
            #define TIMSK0_SET 0
114
          #else
115
            #define TIMSK0_SET (1 << OCIE0A)
116
          #endif
117

118
          #ifdef TIMER0_INIT
119
            #undef TIMER0_INIT
120
          #endif
121
          
122
          #ifdef TIMER0_INVERTA
123
            #define FO0A (1 << FOC0A)
124
          #else
125
            #define FO0A 0
126
          #endif
127

128
          #ifdef TIMER0_INVERTB
129
            #define FO0B (1 << FOC0B)
130
          #else
131
            #define FO0B 0
132
          #endif
133

134
          #define TIMER0_INIT      {TCCR0A = COM0B | COM0A | (1  << WGM01);\
135
                            OC0A_DDR_ |= OC0A_OUT;\
136
                            OC0B_DDR_ |= OC0B_OUT;\
137
                            TCCR0B = FO0B| FO0A | CS0;\
138
                            OCR0A = OCR0A_VALUE;\
139
                            TIMSK0 |= TIMSK0_SET;}
140

141
    #endif  //TIMER0_CTC

mfg.

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