Forum: Mikrocontroller und Digitale Elektronik Excel Tabelle zur Bestimmung des OCR0 Werts


von Rafi D. (alexanderw)


Angehängte Dateien:

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

: Bearbeitet durch User
von fuelre (Gast)


Lesenswert?

Vielen dank - perfekt für unseren superinteligenten Prof.

von Peter D. (peda)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

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

Es gibt aber auch 8-Bit-Timer mit Prescaler 32 und 128.

MfG Spess

von Thomas E. (thomase)


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.

: Bearbeitet durch User
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.