Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage, Soft PWM, Atmega8,C


von Attila C. (attila)


Lesenswert?

Hallo

ich habe eine Soft PWM nach Vorlage des Tutorials gebastelt. Ich möchte 
24 LEDs ansteuern.

In der ISR des Timers wird die Variable "zaehler" hochgezählt. Die 
Variable "schwelle" bestimmt ab welchem Wert der Variable "zaehler" der 
Pin auf high gesetzt wird. In meinem Hauptprogramm sieht das so aus:

if (zaehler>schwelle[0])
pwm[0]=0b00000000;
else
pwm[0]=0b00000001;

Das funktioniert soweit. Jetzt müsste ich aber diesen Code Schnipsel ja 
24 mal modifiziert im Hauptprogramm stehen haben um 24 LED anzusteueren.

Das kann es doch nicht sein , oder? Das geht doch bestimmt schöner und 
geschickter?

Welches Kapitel in meinem C Buch sollte ich studieren um eine bessere 
Lösung zu finden. Was raten die Profis hier?

Vielen Dank!

von Unlucky2012 (Gast)


Lesenswert?

Ich weiß natürlich nicht wie deine Ports bzw. Pins belegt sind, aber in 
solchen Fällen bietet sich doch eine Schleife geradezu an.

von Attila C. (attila)


Lesenswert?

Das Ganze befindet sich natürlich in einer while(1) Schleife da ja 
sonst, zumindest so wie ich das verstehe, gar kein PWM generiert wird.

von Thomas E. (thomase)


Lesenswert?

Attila Ciftci schrieb:
> Welches Kapitel in meinem C Buch sollte ich studieren um eine bessere
> Lösung zu finden. Was raten die Profis hier
Array und Index(Zählvariable).

mfg.

von Unlucky2012 (Gast)


Lesenswert?

Die while(1) Schleife ist aber einfach nur eine klassische 
Endlosschleife, damit dein Controller nicht von "vorne" anfängt. Für 
Soft-PWM in seiner klassischen Form brauchst du ja einen Timer/Counter 
Interrupt, welchen du innerhalb einer Interrupt Service Routine 
abarbeitest. Und dort wäre dann eine Schleife nötig, welche eben für 
jede LED überprüft, ob der Grenzwert überschritten worden ist oder eben 
nicht. Abhängig davon schaltest du dann die entsprechende LED ein oder 
aus.

Die konkrete Implementierung hängt ein wenig davon ab, wie du deine LEDs 
an den Controller angeschlossen hast. Das entscheidet nämlich darüber, 
ob du jede LED bzw. jeden PIN einzeln schalten willst bzw. musst, oder 
ob du den gesamten Port schalten willst bzw. kannst.

von Johannes G. (gutenberg)


Lesenswert?

Attila Ciftci schrieb:
> Welches Kapitel in meinem C Buch sollte ich studieren um eine bessere
> Lösung zu finden. Was raten die Profis hier?

Kapitel 1: For-Schleife

Ausserdem musst du natürlich nicht immer den Wert setzten, sondern nur 
wenn er sich ändert.


Das hast du angeschaut?
http://www.mikrocontroller.net/articles/Soft-PWM

Was ist denn das Problem?

von Attila C. (attila)


Lesenswert?

Hallo!

Ich habe jetzt dies in meiner ISR stehen:


if (zaehler>schwelle[0])
pwm[0]=0b00000000;
else
pwm[0]=0b00000001;

if (zaehler>schwelle[1])
pwm[1]=0b00000000;
else
pwm[1]=0b00000010;

usw usw usw bis

if (zaehler>schwelle[7])
pwm[7]=0b00000000;
else
pwm[7]=0b10000000;

Dies "bedient" 8 LEDs. So wie ich das verstanden habe könnte ich die 
Felder "schwelle" und "pwm" in einer for Schleife innerhalb der ISR 
hochzählen. Wie aber ändere ich innerhalb dieser Schleife den jeweiligen 
PIN von pwm der auf high geschaltet werden soll?

Ich hoffe dies erklärt das Problem

von Krapao (Gast)


Lesenswert?


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.