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
Vielen dank - perfekt für unseren superinteligenten Prof.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.