ich versuche mich mit pwm + isr:
1 | static void pwm_timer_init(void) |
2 | {
|
3 | ICR1 = 0xFF; // set TOP to 16bit |
4 | |
5 | // set none-inverting mode
|
6 | TCCR1A |= (1 << COM1A1)|(1 << COM1B1); |
7 | |
8 | // set Fast PWM mode using ICR1 as TOP
|
9 | TCCR1A |= (1 << WGM11); |
10 | TCCR1B |= (1 << WGM12)|(1 << WGM13); |
11 | |
12 | |
13 | TCCR0A |= (1 << COM0A1)|(1 << COM0B1); |
14 | // set none-inverting mode
|
15 | TCCR0A |= (1 << WGM01) | (1 << WGM00); |
16 | // set fast PWM Mode
|
17 | |
18 | |
19 | |
20 | TCCR2A |= (1 << COM2A1)|(1 << COM2B1); |
21 | // set none-inverting mode
|
22 | TCCR2A |= (1 << WGM21) | (1 << WGM20); |
23 | // set fast PWM Mode
|
24 | |
25 | |
26 | TCCR0B |= ti_prescaler_8;//1 |
27 | TCCR2B |= ti_prescaler_8;//1 |
28 | TCCR1B |= ti_prescaler_8;//1 |
29 | |
30 | OCR1A = 60; |
31 | OCR1B = 60; |
32 | OCR0A = 60; |
33 | OCR0B = 60; |
34 | OCR2A = 60; |
35 | OCR2B = 60; |
36 | |
37 | |
38 | DDRB |= (1 << 3); DDRD |= (1 << 3); |
39 | DDRB |= (1 << 1) | (1 << 2); |
40 | DDRD |= (1 << 5) | (1 << 6); |
41 | |
42 | // Enable Timer1 capture event interrupt.
|
43 | // TIFR0 = _BV(ICF1) | _BV(OCF1B) | _BV(OCF1A) | _BV(TOV1) ;
|
44 | // TIMSK0 =
|
45 | // TCCR0A |= (1 << WGM01);
|
46 | |
47 | TIMSK0 |= (1 << OCIE0A); //Set the ISR COMPA vect |
48 | // TIMSK0 |= (1 << TOIE0); //Set the ISR ovf vect
|
49 | // Enable Timer1 capture event interrupt.
|
50 | |
51 | // TIFR1 = (1<<ICF1) | (1<<OCF1B) | (1<<OCF1A) | (1<<TOV1) ;
|
52 | // TIMSK1 = (1<<ICIE1);
|
53 | |
54 | sei(); |
55 | }
|
56 | |
57 | v u16 tim; |
58 | |
59 | ISR(TIMER0_COMPA_vect) |
60 | {
|
61 | tim++; |
62 | if(tim>10){ |
63 | tim=0; |
64 | led1_tog; |
65 | }
|
66 | }
|
pwm funktioniert, die isr wird aber nur einmal angesprungen. Was ist falsch?