Hallo,
ich bin hier gerade an einem RGB-Led Projekt am basteln und hab
folgendes Problem:
Timer1 (16-Bit Timer) soll zwei PWM-Kanäle versorgen und Timer2 den
dritten. OC2 und OC1B funktionieren wunderbar nur OC1A macht Ärger. Bei
einem Wert von 0 schalte ich den Kanal komplett ab, was auch
funktioniert, und bei Werten größer 0 wird ein entsprechendes PWM-Signal
erzeugt. Sobald ich OC1A verbinde kann ich am Pin eine Spannung von 3,6V
messen und wenn das Tastverhältnis entsprechend hoch wird bis zu fast
5V, aber nie weniger (hab kein Oszi da :( ). OC1B arbeitet genauso
(identischer Code bis auf die Registernamen B<->A) und finktioniert
einwandfrei. Sieht jemand den Fehler oder kennt das Problem?
Hier die Initialisierung der Timer:
1 | void initPWM(){
|
2 | //start with random light mode
|
3 | random_counter = 0;
|
4 | random_light = 1;
|
5 |
|
6 | TIMSK &= ~(1<<TICIE1);
|
7 | TIMSK &= ~(1<<OCIE1A);
|
8 | TIMSK &= ~(1<<OCIE1B);
|
9 | TIMSK &= ~(1<<TOIE1);
|
10 |
|
11 | //timer1 as fast pwm
|
12 | //clear on match, set on bottom
|
13 | TCCR1A |= (1<<COM1A1);
|
14 | TCCR1A &= ~(1<<COM1A0);
|
15 | TCCR1A |= (1<<COM1B1);
|
16 | TCCR1A &= ~(1<<COM1B0);
|
17 | //fast pwm, 8 bit
|
18 | TCCR1A |= (1<<WGM10);
|
19 | TCCR1A &= ~(1<<WGM11);
|
20 | TCCR1B |= (1<<WGM12);
|
21 | TCCR1B &= ~(1<<WGM13);
|
22 | //no prescaling => 31,25 kHz
|
23 | TCCR1B |= (1<<CS10);
|
24 | TCCR1B &= ~(1<<CS11);
|
25 | TCCR1B &= ~(1<<CS12);
|
26 | //init with 50%
|
27 | pwm_index_green = 15;
|
28 | OCR1AH = 0x00;
|
29 | OCR1AL = pwmtable_8D[pwm_index_green];
|
30 | pwm_index_blue = 15;
|
31 | OCR1BL = pwmtable_8D[pwm_index_blue];
|
32 |
|
33 | //timer2 as fast pwm
|
34 | TCCR2 |= (1<<WGM21) | (1<<WGM20);
|
35 | //clear on match, set on bottom
|
36 | TCCR2 |= (1<<COM21);
|
37 | TCCR2 &= ~(1<<COM20);
|
38 | //no prescaling => 31,25 kHz
|
39 | TCCR2 |= (1<<CS10);
|
40 | TCCR2 &= ~(1<<CS11);
|
41 | TCCR2 &= ~(1<<CS12);
|
42 | //init with 50%
|
43 | pwm_index_red = 15;
|
44 | OCR2 = pwmtable_8D[pwm_index_red];
|
45 | //pins to output
|
46 | DDRD |= (1<<PD4) | (1<<PD5) | (1<<PD7);
|
47 |
|
48 | lightOn();
|
49 |
|
50 | //switch on box light
|
51 | boxlight = 0;
|
52 | switchBoxLight();
|
53 | }
|