Antiny 2313 PWM

Gast #3024573
Lesenswert?

Hallo,

ich befasse mich seit kurzem mit MC und möchte mich so Schritt für 
Schritt mit den verschiedenen Themen ausernandersetzten. Bin gerade mit 
den Timer beschäftigt. Timer-Interrupt habe ich durch und funktioniert 
auch einwandfrei. Doch beim PWM happerts. Das folgende Programm will und 
will nicht funzen, komme einfach nicht dahinter, warum die LED (PB2) 
nicht leuchtet. Hardware funktioniert, wenn ich PB2 ohne PWM auf 1 
setzte, leuchtet die LED auch.
Was ist da falsch?

MC = Antiny 2313

Danke schon im Vorraus.

LG
Willi



/*
 * Timer_2313__Fast_PWM.c
 *
 * Created: 29.01.2013 20:10:57
 *  Author: willi
 */
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  uint8_t i;

  DDRB |= (1<<PB2);                 // PB2 auf Ausgang stellen. Dieser 
Pin trägt auch die Bezeichnung OC0 und ist der Pin an dem der Timer 0 
seine PWM ausgibt

  OCR0A = 250;

  TCCR0A = (1<<WGM01) | (1<<WGM00);
  TCCR0B = (1<<CS01);               // Vorteiler 8, Fast PWM 8 Bit
  TCCR0A =  (1<<COM0A1);

    while(1)
    {



      OCR0A = 30;
    _delay_ms(1000);
    OCR0A =200;
    _delay_ms(1000);

    for (i=0; i < 255; ++i)
      {
      OCR0A = i;
      _delay_ms(10);
      }

  }

}
#3024600
Lesenswert?

Hallo Willi,

Du initialisierst den Timer0 nicht richtig! Du beschreibst zwei mal das 
Register TCCR0A, damit geht der erste Schreibvorgang verloren. Entweder 
setzt Du alle 3 Bits (WGM00, WGM01 und COM0A1) in einer Anweisung oder 
Du setzt die Bits in zwei Befehlen, musst dann aber das Register TCCR0A 
damit verodern.

so: TCCR0A = (1<<WGM01) | (1<<WGM00) | (1<<COM0A1);
oder so: TCCR0A |= (1<<WGM01) | (1<<WGM00);
         TCCR0A |= (1<<COM0A1);

Grüße, Nico
Gast #3024615
Lesenswert?

Nico ... schrieb:
> so: TCCR0A = (1<<WGM01) | (1<<WGM00) | (1<<COM0A1);
> oder so: TCCR0A |= (1<<WGM01) | (1<<WGM00);
>          TCCR0A |= (1<<COM0A1);


Hallo Nico,

Danke für die promte Antwort.

Habe ich das richtig verstanden, dass zwischen den beiden Zeilen 
(Register TCCR0A) keine andere Anweisung stehen darf?

LG
Willi
#3024622
Lesenswert?

Willi schrieb:
> Habe ich das richtig verstanden, dass zwischen den beiden Zeilen
> (Register TCCR0A) keine andere Anweisung stehen darf?

Nein, das nicht.
Aber achte auf das | vor dem = welches ich eingefügt habe, das fehlte 
bei dir und damit wurde durch das zweite Beschreiben des Registers 
TCCRA0 die beiden Bits WGM00 und WGM01 wieder auf 0 gesetzt.

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