Hallo zusammen, sicher übersehe ich etwas, aber ich bin die Register der Timer und das Datenblatt nun gefühlt 100x durchgegangen: Der Code wie er hier steht funktioniert: An OC1A und OC2A werden erwartungsgemäß PWM Signale ausgegeben. Kommentiere ich nun die 4 Zeilen für den jeweiligen B-Werte ein, passiert nichts mehr. Beispielhaft OC1A und OC2A sind nun konstant auf 0V. Warum? Nur WGM10 gesetzt = Mode 1 = PWM phase correct bis 0xFF. Sollte also an den jeweiligen Vergleichswerten vorbei zählen und die Ausgänge schalten. Controller ist ein ATMega328P.
1 | #include <avr/io.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | PORTB = 0; |
6 | DDRB = (1<<DDB1)|(1<<DDB2)|(1<<DDB3); // PB1 = OC1A, PB2 = OC1B, PB3 = OC2A |
7 | |
8 | PORTD = 0; |
9 | DDRD = (1<<DDD3); // PD3 = OC2B |
10 | |
11 | TCCR1A = (1<<COM1A0)|(1<<COM1A1)|(1<<WGM10);// set output on cnt up, phase correct PWM 8 bit |
12 | // TCCR1A = (1<<COM1B0)|(1<<COM1B1); // same for B channel on Timer 1
|
13 | OCR1A = 110u; // compare value @50% |
14 | // OCR1B = 140u; // same for B channel on Timer 1
|
15 | TCCR1B = (1<<CS11); // Presc 8, Start Counter |
16 | |
17 | |
18 | TCCR2A = (1<<COM2A0)|(1<<COM2A1)|(1<<WGM20);// set output on cnt up, phase correct PWM |
19 | // TCCR2A = (1<<COM2B0)|(1<<COM2B1); // same for B channel on Timer 2
|
20 | OCR2A = 140u; // compare value @50% |
21 | // OCR2B = 110u; // same for B channel on Timer 2
|
22 | TCCR2B = (1<<CS21); // Presc 8, Start Counter |
23 | |
24 | while(1) |
25 | {
|
26 | //TODO:: Please write your application code
|
27 | }
|
28 | }
|
Viele Grüße