Forum: Mikrocontroller und Digitale Elektronik ATMega32 TCCR0 PWM


von Martin (Gast)


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

von Johannes M. (johnny-m)


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.

von Martin (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

Du setzt WGM00, aber nicht WGM01. Das gibt eine Phase Correct PWM, und 
dann musst Du bei den COM-Bits auch in der entsprechenden Tabelle 
nachsehen. Und nicht in der Tabelle für Fast PWM!

von Martin (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

Martin wrote:
> Wodurch ich eigentlich eine Fast PWM erzeugen müsste die invertiert ist,
> jedoch passiert leider wieder nichts..
Wie, es passiert gar nichts ?

Ist der Pin denn überhaupt als Ausgang konfiguriert?

von Martin (Gast)


Lesenswert?

Da ich noch andere PWM's erzeuge, habe ich diese Zeilen:

DDRD = 0xff;
DDRA = 0xff;
DDRB = 0xff;

damit müsste ich ihn eigentlich sie eigentlich als Ausgang definiert 
haben.

von Johannes M. (johnny-m)


Lesenswert?

Dir muss man aber auch alles aus der Nase ziehen! Was steht in OCR0?

von Martin (Gast)


Lesenswert?

Sorry..

OCR0 = 100*2.55;

von Stefan E. (sternst)


Lesenswert?

Martin wrote:

> OCR0 = 100*2.55;

Womit du also den Ausgang auf Dauer-Low schaltest.

von Martin (Gast)


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;
}
}

von Stefan E. (sternst)


Lesenswert?

> Doch jetzt geht mitlerweile keine PWM mehr.

Und wieder: was bedeutet das genau? Kein Output? Geht das Einstellen 
nicht? Oder was?

In der Endlosschleife liest du laufend UDR aus, auch wenn gar kein 
Zeichen empfangen wurde.

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.