Hi! Ich möchte mit meinem ATMEGA8 eine im Sekundenrhythmus blinken lassen und dafür die Output Compare Funktion des Timer2 verwenden. Mein Quartz hat eine Frequenz von 11.059 Mhz. Der Timer soll mit einem Prescaler von 8 und einem OC-Wert von 125 einen Zähler laufen lassen, der alle 11059 Ticks die LED ansteuert. Mit meinem Programm blinkt die LED aber viel zu schnell. Wo ist mein Denkfehler? Fuses: http://www.frank-zhao.com/fusecalc/fusecalc.php?chip=atmega8&LOW=DE&HIGH=D9&LOCKBIT=FF
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <inttypes.h> |
4 | #define LED_DIR DDRB |
5 | |
6 | uint32_t i; |
7 | |
8 | ISR(TIMER2_COMP_vect) |
9 | { |
10 | i++; |
11 | |
12 | if (i==11059) |
13 | { |
14 | i=0; |
15 | PORTB ^= ( 1 << PB0 ); |
16 | } |
17 | } |
18 | |
19 | int main( void ) |
20 | { |
21 | DDRB = 0xFF; |
22 | TCCR2 = (1<<WGM21)|(0<<WGM20); // CTC Modus |
23 | TCCR2 |= (0<<CS22)|(0<<CS21)|(1<<CS20); // Prescaler 8, bleiben 11059000/8=1382375 Hz |
24 | TCCR2 |= (0<<COM21)|(0<<COM20); // Ports normale Funktion |
25 | OCR2 = 125-1; // bleiben 1382375/125=11059 Hz |
26 | TIMSK |= (1<<OCIE2); |
27 | |
28 | sei(); |
29 | for(;;){ } |
30 | } |
Greetings Teima