Phase correct PWM: keine Funktion, wenn OCnA und OCnB zusammen

OP #6932998
Lesenswert?

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
#6933002
Lesenswert?

Hallo,

die neuen ehemals auskommentierten Zeilen haben wegen "=" die 
Eigenschaft, diejenigen Bits zu übeschreiben, die in der vorhergehenden 
Zeile gesetzt wurden. Verwende "|=", um zu verodern, denn Du möchtest 
vermutlich zusätzliche Bits setzen oder schreibe in die neue Zeile alle 
bishereigen Klammern mit dazu.

z.B.
  TCCR2A = (1<<COM2A0)|(1<<COM2A1)|(1<<WGM20) |(1<<COM2B0)|(1<<COM2B1);

mfG

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren