ATMega32 TCCR0 PWM

Gast #980866
Lesenswert?

Hallo,
ich habe einen ATMega32 und möchte gerne mit dem TCCR0 Register eine PWM 
erzeugen. Aus dem Datenblatt habe ich entnommen, dass ich mit dieser 
Zeile eigentlich eine invertierte PWM erzeugen sollte, doch leider ist 
das nicht der Fall (habe das oszillographiert)

TCCR0  = (0<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(0<<CS00);


kann mir vielleicht jemand weiterhelfen.?

Danke Gruß Martin
#980884
Lesenswert?

Martin wrote:
> Hallo,
> ich habe einen ATMega32 und möchte gerne mit dem TCCR0 Register eine PWM
> erzeugen. Aus dem Datenblatt habe ich entnommen, dass ich mit dieser
> Zeile eigentlich eine invertierte PWM erzeugen sollte,
Nö. Mit der Konfiguration (COM01 und COM00 gesetzt) wird der Pin beim 
Hochzählen beim Compare Match gesetzt und beim Runterzählen beim Compare 
Match wieder gelöscht. Das wäre eine nicht-invertierende PWM.
Gast #980894
Lesenswert?

Also im Datenblatt steht das:

Table 14-4. Compare Output Mode, Fast PWM Mode(1)

COM01 COM00  Description
  0     0    Normal port operation, OC0 disconnected.
  0     1    Reserved
  1     0    Clear OC0 on compare match, set OC0 at BOTTOM,
             (nin-inverting mode)
  1     1    Set OC0 on compare match, clear OC0 at BOTTOM,
             (inverting mode)


heißte das nicht, das ich eine invertierte PWM erzeuge?

Danke Gruß Martin
Gast #980922
Lesenswert?

oh.. das hatte ich völlig übersehen.

Jetzt habe ich diese Zeile versucht.
 TCCR0  = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS00);

Wodurch ich eigentlich eine Fast PWM erzeugen müsste die invertiert ist, 
jedoch passiert leider wieder nichts..
gruß Martin
Gast #980990
Lesenswert?

oh man.. viel dümmer geht der Fehler auch nicht mehr.

Jetzt haben alle 4 PWM'S funktioniert. Da ich das ganze vom PC aus 
variabel steuern muss, also die Intensität der einzelnen PMW's habe ich 
mit dem UART angefangen. Das hat auch funktioniert (hat das erst bei 
einer getestet). Doch jetzt geht mitlerweile keine PWM mehr. Unten steht 
mein Quellcode.. Woran könnte das denn liegen?



#include <inttypes.h>
#include <avr/io.h>


void timer_initialisierung(void)
{
   DDRD = 0xff;  //Ports A,B,D werden als Ausgänge gesetzt
   DDRA = 0xff;
   DDRB = 0xff;


   TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<WGM10);
   TCCR1B = (1<<CS10);
   TCCR2  = (1<<CS20)|(1<<WGM20)|(1<<COM21);
   TCCR0  = 
(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(01<<COM00)|(1<<CS00)|(1<<CS02);

   TIMSK &= ~0x3c;
}

void Usart_EnableRX(void)
{
    UCSRB |= ( 1 << RXEN );
}


   /* Zeichen empfangen */
uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)));   // warten bis Zeichen verfuegbar

    return UDR;                   // Zeichen aus UDR an Aufrufer 
zurueckgeben
}



int main (void) {

   timer_initialisierung(); //Timer werden initialisiert bzw. PWM
          //LED's werden angesprochen
   uart_getc();


 while (1)
 {
  if (UDR ==1){
   OCR1AL = 10*2.55;}

    if (UDR ==0){
   OCR1AL = 100*2.55;}

   OCR1BL = 60*2.55;
   OCR2 = 40*2.55;
   OCR0 = 50*2.55;
}
}

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