Forum: Mikrocontroller und Digitale Elektronik Software PWM mit Atmega8 funktioniert nicht


von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich hab vor 3 Tagen das erste mal einen AVR programmiert, ist 
also alles noch neugebiet für mich. Ich programmiere übrigens in C mit 
AVRstudio 4.12 und USBprog als AVRISP mkII klon.

Jetzt habe ich versucht eine Software PWM zu programmieren für die LED 
die an PORTB angeschlossen ist. Ziel ist das das Tastverhältnis am 
anfang 1 ist und dann langsam bis 0 "fadet" und dann wieder auf 1 
resettet wird.
Ich benutze den internen RC oscillator.

Problem: Die LED flackert seeehr schwach mit (GROB geschätzt) ~2Hz, wenn 
i<0 ist leuchtet sie für ein paar Zehntel einer Sekunde auf voller 
Leuchtstärke, und flackert dann wieder wie vorhin beschrieben.
Die LED soll aber langsam Faden.

Code ist im Anhang, schonmal vielen dank im voraus :)

von greg2k (Gast)


Angehängte Dateien:

Lesenswert?

Ich mache Soft-PWM mit Timer immer. Sehe Beispiel im Anhang.

Mit "pwm"-Variable kannst Du die Leuchtstärke einstellen;

von Stefan E. (sternst)


Lesenswert?

o wird mit Null initialisiert und dann im weiteren Code nie verändert.

von Tom (Gast)


Lesenswert?

Ok, könntest du evtl. meinen Code korrigieren? Weil ich bekomme das 
jetzt noch immer nicht hin?

von Karl H. (kbuchegg)


Lesenswert?

So wird das auch nichts.
Deine Variable i ist in ein paar Zehntel-Millisekunden von 100 auf 0 
runtergezählt. Kein Wunder das das flackert.
Du musst die 'PWM' schon eine gewisse Zeit lang laufen lassen, damit du 
überhaupt mal was siehst und erst dann die Stufe um 1 runterschalten.

PS: Alle delay Funktionen, die mit dem AVR-gcc kommen, sind darauf 
ausgelegt, dass sie ein konstantes Argument bekommen. Ansonsten stimmen 
die Zeiten hinten und vorne nicht.

von Karl H. (kbuchegg)


Lesenswert?

greg2k schrieb:
> Ich mache Soft-PWM mit Timer immer. Sehe Beispiel im Anhang.
>
> Mit "pwm"-Variable kannst Du die Leuchtstärke einstellen;

Lass das SREG in einer ISR in Ruhe!
Die Prozessorregister gehören in C dem Compiler. Wenn du dich daran zu 
schaffen machst, machst du es meistens nur schlimmer, nie besser. Dein 
Compiler weiß schon, was in einer ISR zu tun ist. Überlass es ihm, sich 
um solche Feinheiten zu kümmern.

von greg2k (Gast)


Angehängte Dateien:

Lesenswert?

Das war nur Beispiel-Code. Du musst "pwm" Variable in deinem Code 
irgendwo ändern.

Ich habe schnell ein Beispiel für Mega8 8MHz gebastelt :)
LED habe ich an PortC Pin1 angeschlossen.

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.