Guten morgen, ich habe ein Problem mit dem Timer2 bei einem Atmega328. Dieser hat einen 16MHz quarz angeschlossen.
1 | TCCR0A & ~(1 << WGM00) | (1 << WGM01) & ~(1 << WGM02); |
2 | TCCR0B | (1 << CS00) | (1 << CS01) & ~(1 << CS02); |
3 | OCR0A = 250 - 1; |
4 | TIMSK0 | (1 << OCIE0A)); |
5 | |
6 | TCCR2A & ~(1 << WGM20) | (1 << WGM21) & ~(1 << WGM22); |
7 | TCCR2B & ~(1 << CS20) & ~(1 << CS21) | (1 << CS22); |
8 | OCR2A = 250-1; |
9 | TIMSK2 | (1 << OCIE2A)); |
1 | void TIMER0_COMPA_vect(void) |
2 | { |
3 | static uint16_t millis = 0; |
4 | static uint8_t seconds = 0; |
5 | static uint8_t minutes = 0; |
6 | static uint8_t hours = 0; |
7 | millis++; |
8 | if(millis >= 1000) |
9 | { |
10 | //PORTB ^= ( 1 << PORTB5 ); |
11 | seconds++; |
12 | millis = 0; |
13 | if(seconds >= 10 ) |
14 | { |
15 | minutes++; |
16 | seconds = 0; |
17 | if(minutes >= 10) |
18 | { |
19 | hours++; |
20 | minutes = 0; |
21 | if(hours >= 10) |
22 | { |
23 | hours = 0; |
24 | } |
25 | } |
26 | } |
27 | } |
28 | } |
29 | |
30 | |
31 | void TIMER2_COMPA_vect(void) |
32 | { |
33 | static uint16_t millis = 0; |
34 | static uint8_t seconds = 0; |
35 | millis++; |
36 | if(millis >= 1000) |
37 | { |
38 | PORTB ^= ( 1 << PORTB5 ); |
39 | seconds++; |
40 | millis = 0; |
41 | } |
42 | } |
eigentlich sollten so beide Timer gleich laufen. Wenn ich zur Probe eine LED in Timer0 blinken lasse, blinkt diese auch im Sekundentakt. Aber in der ISR vom Timer2 wird die LED nicht getoggelt. Hier bleibt diese aus (habe dazu natürlich das Togglen aus der ISR vom Timer0 herausgenommen). Nach Beitrag "Atmega328p Timer2 will nicht" liegt es daran dass der Timer2 zwei Teiler mehr hat als Timer0. Aber im Datenblatt finde ich für Teiler nur das Register TCCR2B. Wo finde ich den zweiten? Gruß Kai