Hallo zusammen. Ich bin mit meinem AVR-Latein am Ende: Folgendes Mini-Programm läuft nicht, bzw. die ISR wird nur 1x durchlaufen. Dabei soll die LED im Sekundentakt getoggelt werden. Was mache ich falsch? Liegt es daran, dass bei Nutzung des Registers TCCR1B auch in TCCR1A noch etwas gesetzt werden muss?
1 | /*
|
2 | LED blinken mit timer-interrupt auf attiny84 8Mhz
|
3 | */
|
4 | |
5 | #include <avr/io.h> |
6 | #include <avr/interrupt.h> |
7 | |
8 | |
9 | |
10 | ISR( TIM1_COMPB_vect ) |
11 | {
|
12 | PORTB ^= (1 << 0); // toggle the LED at PORTB0 |
13 | }
|
14 | //-------------------------------------------------------
|
15 | void timer_init( void ) // Timer 1 init |
16 | {
|
17 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10); // CTC ; XTAL / 1024 |
18 | OCR1BH = 0x1E; // set Output compare register to 7812 (== 1 sec) |
19 | OCR1BL = 0x84; |
20 | TIMSK1 = (1<<OCIE1B); // enable Output Compare B Match Interrupt |
21 | }
|
22 | //-------------------------------------------------------
|
23 | int main( void ) |
24 | {
|
25 | DDRB = 0x0F; // make the PORTB pins to outputs |
26 | |
27 | timer_init(); |
28 | sei(); |
29 | while(1){ // |
30 | }
|
31 | }
|
Gruß JR