Anfängerfrage PWM

Gast #2673653
Lesenswert?

Hallo,

ich habe einen ATmega2560 (STK600)und versuche im folgenden eine 8-bit 
pwm über Timer0 zu erzeugen.
Ich habe als F-CPU 8MHz.
Die PWM lege ich auf eine LED, die leuchtet auch, allerdings unabhängig 
vom eingestellten OCRA0A.
Auch mit dem Oszi kann ich keine PWM feststellen, finde aber den Fehler 
nicht. Hoffe mir kann jemand weiterhelfen.

Vielen Dank schonmal.


int main(void)
{
    while(1)
    {
    DDRB|=0b10000000;
    OCR0A=0x80;
    TCCR0A|=(1<<WGM01)|(1<<WGM00);  //PWM-Mode 3 (FastPWM)
    TCCR0A|=(1<<COM0A1);    //Non-Inverting PWM
    TCCR0A|=(1<<CS01);              // Prescaler auf 8
    }
}
Gast #2674254
Lesenswert?

Hallo,

Danke erstmal für die Antwort.
Also ich habe die Initialisierung aus der main rausgenommen. Das mit dem 
stehenden Timer habe ich allerdings nicht verstanden bzw. läuft der doch 
nach der Initialisierung.

int main(void)
{
    DDRB|=0b10000000;
    OCR0A=0x80;
    TCCR0A|=(1<<WGM01)|(1<<WGM00);  //PWM-Mode 3 (FastPWM)
    TCCR0A|=(1<<COM0A1);    //Non-Inverting PWM
    TCCR0A|=(1<<CS01);

while(1)
return 0;
}
#2674257
Lesenswert?

pwm-gast schrieb:
> Hallo,
>
> Danke erstmal für die Antwort.
> Also ich habe die Initialisierung aus der main rausgenommen. Das mit dem
> stehenden Timer habe ich allerdings nicht verstanden

Schau nochmal ins Datenblatt, welches Steuerbit in welchem 
Kontrollregister beheimatet ist.
Hinweis: Nicht alle Bits sind im Kontrollregister TCCR0A. Es gibt bei 
deinem µC noch ein zweites: TCCR0B


Wenn du von woanders Code übernimmst, der für einen anderen µC (auch aus 
derselben Familie) geschrieben wurde, musst du IMMER mit dem für deinen 
µC relevanten Datenblatt kontrollieren, ob
* die Bitnamen auch dasselbe bedeuten (tun sie in deinem Fall)
* die Bits auch in diesem Register sind

Tust du das nicht, kannst du ordentlich auf die Schnauze fallen.
Daher: Das Datenblatt ist dein Freund, deine Bibel, die einzige für 
deinen µC relevante Autorität!

>
> while(1)

da fehlt mindestens ein ;

Du willst ja nicht endlos oft einen 'return 0;' ausführen.

Wenn du dir nicht sicher bist, dann benutz halt die Langform mit { }
1
    while( 1 )
2
    {
3
    }
4

5
    return 0;

so kann dann auch ein Blinder greifen, dass es in der Hauptschleife 
nichts zu tun gibt.
Gast #2674280
Lesenswert?

Hallo,

das ; bei while ist durchs kopieren untergegangen, im Quelltext verwende 
ich die Langform, bei sowas meckert ja eh der Compiler.
Das Datenblatt habe ich hier liegen, den Code habe ich versucht selbst 
zu schreiben, daher funktioniert es wohl auch nicht :)


Karl Heinz Buchegger schrieb:
> Hinweis: Nicht alle Bits sind im Kontrollregister TCCR0A. Es gibt noch
> ein zweites: TCCR0B

Handelt es sich bei deinem Schlag auf meinen Hinterkopf um das Bit 7 des 
TCCR0B? Ich vermute es muss auf eins gesetzt werden. Allerdings verstehe 
ich nicht ganz was da vor sich geht. Irgendwie wird ein Vergleichswert 
gesetzt...
Also muss ich noch TCCR0B|=(1<<FOC0A); hinzufügen?
#2674483
Lesenswert?

pwm-gast schrieb:
> Stefan Ernst schrieb:
>>> TCCR0A|=(1<<CS01);              // Prescaler auf 8
>>
>> Nö. Und ein Timer, der steht, kann natürlich auch keine PWM erzeugen.
>
> Falscher Register
> TCCR0B|=(1<<CS01);
> so müßte es richtig sein.
> So langsam wirds glaub ich.

Na endlich.
Schwere Geburt.

Der Punkt ist:
natürlich hätten wir dir sagen können, dass die Vorteilerbits in TCCR0B 
beheimatet sind. Aber dann hättest du dir wieder nicht im Datenblatt 
angesehen und verinnerlicht, dass es deren 2 Kontrollregister gibt.
So hast du eine Lektion durchgemacht, die du so schnell nicht wieder 
vergisst.
Auch Datenblattstudium will gelernt werden und wenn man es nie macht, 
lernt man es auch nicht.

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