Forum: Mikrocontroller und Digitale Elektronik Phase correct PWM: keine Funktion, wenn OCnA und OCnB zusammen


von Ste R. (ste_r)


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

von Christian S. (roehrenvorheizer)


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

von MWS (Gast)


Lesenswert?

Zum Bitsetzen beim zweiten Registerzugriff verodern.

von Ste R. (ste_r)


Lesenswert?

Oh Gott. Ihr habt natürlich recht. Anfängerfehler.

Vielen Dank und gute Nacht :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.