Hi,
ich versuche eine definierte Frequenz mittels dem Timer/Counter und dem
CTC Modus zu erreichen. Hierzu folgender Code für einen Atmel Mega8:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 |
|
5 |
|
6 | int main (void)
|
7 | {
|
8 | DDRC |= (1 << PC1); // Set LED as output
|
9 |
|
10 | TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
|
11 | TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
|
12 |
|
13 | sei(); // Enable global interrupts
|
14 | OCR1A = 50; // Set CTC compare value
|
15 |
|
16 | TCCR1B |= (1 << CS10); // Start timer at Fcpu
|
17 |
|
18 | for (;;) //Endlosschleife
|
19 | {
|
20 | __asm volatile ("nop");
|
21 | }
|
22 | }
|
23 |
|
24 | //Compare Timer ISR
|
25 | ISR(TIMER1_COMPA_vect)
|
26 | {
|
27 | PORTC ^= (1 << PC1); // Toggle the LED
|
28 | }
|
Der Controller läuft mit einem Takt von 3,6864Mhz. Wenn ich das alles
richtig verstanden habe müsste meine Led mit folgender Frequenz
leuchten:
F(led) = Takt(cpu) / (2* (1+ OCR1A))
Die 2-3 Ticks, die er fürs Toggeln braucht dürften vernachlässigbar
sein. Rein rechnerisch komme ich so auf 36,14kHz... mit dem Oszi
gemessen habe ich aber 9,664KhZ ?! Woher kommt die Differenz?
Gruß
Stephan