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

OP #6932998
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
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

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.