Forum: Mikrocontroller und Digitale Elektronik Antiny 2313 PWM


von Willi (Gast)


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

  }

}

von Nico (nico123)


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

von Willi (Gast)


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

von Nico (nico123)


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.

von Willi (Gast)


Lesenswert?

großes Ahaaaaaaa!

wieder was dazu gelernt

DANKE Nico

LG
Willi

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.