Atmega8 Timer1 OC1A/OC1B: nur A läuft

OP #6192299
Lesenswert?

Hallo,

Atmega8

Möchte die PWM von Timer1 benutzen um auf OC1A und OC1B verschiedene 
Frequenzen auszugeben.
Mit meinem Init vom Timer läuft nur OC1A (mit LEDs getestet).

Warum läuft OC1B nicht mit?

void init_timer1(void)
{
  DDRB |= (1<<PB1);
  DDRB |= (1<<PB2);//OC1A/OC1B als Output
  TCCR1A |= (1<<COM1A1) | (COM1B1);//set at bottom;clear at compare
  TCCR1A |= (1<<WGM10);//phase correct, 8Bit
  TCCR1B |= (1<<CS11);//Prescaler 8: 14745600 / 256 = 57600 / 8 = 7200
  //Test
  OCR1A = 162;
  OCR1B = 100;
}

Jens
OP #6192347
Lesenswert?

o.k

Habs jetzt mal in zwei Zeilen geschrieben:

TCCR1A |= (1<<COM1A1);//set at bottom;clear at compare
TCCR1A |= (1<<COM1B1);//set at bottom;clear at compare

Das geht!

Wie setzt man richtig mehrere Bits in einem Register gleichzeitig?

Jens

P.S.: Habs gefunden, man muss die Masken wohl klammern:

TCCR1A |= ((1<<COM1A1) | (1<<COM1B1));
Gast #6192416
Lesenswert?

Jens N. schrieb:

> Möchte die PWM von Timer1 benutzen um auf OC1A und OC1B verschiedene
> Frequenzen auszugeben.

Tja, dann hast du ein ernsthaftes Problem. Das ist nämlich völlig 
unmöglich. Zwei PWM-Kanäle eines AVR8-Timers haben zwangsläufig 
immer dieselbe PWM-Frequenz.

Bestenfalls (z.B. halt bei Timer1 der Atmegas) ist es wenigstens 
überhaupt möglich, an der Frequenz zu drehen und trotzdem zwei 
PWM-Kanäle zu haben.

Sprich: lies' endlich das verdammte Datenblatt!

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