mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega32 TCCR0 PWM


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry..

OCR0 = 100*2.55;

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin wrote:

> OCR0 = 100*2.55;

Womit du also den Ausgang auf Dauer-Low schaltest.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.