Forum: Mikrocontroller und Digitale Elektronik HW PWM zum LED dimmen


von Eugen.S (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mal wieder eine Frage und hoffe auch eure Unterstützung. Ich 
möchte über eine HW PWM eine LED dimmen, solange mein Taster gedrückt 
ist. Kling eigentlich einfach aber ich komme nicht auf die Lösung :-(.
Ich habe mir diesen Beitrag angesehen und wollte diesen als Basis 
nehmen:
https://www.mikrocontroller.net/articles/LED-Fading

Wenn ich alles richtig verstanden habe, wird hier das eingetliche Dimmen 
(Fading) gemacht.

void pwm_up_down (const uint16_t pwm_table[], int16_t size, uint16_t 
delay)
{
    int16_t tmp;

    for (tmp = 0; tmp < size; tmp++)
    {
        OCR1A = pgm_read_word (& pwm_table[tmp]);
        my_delay (delay);
    }

    for (tmp = size-1; tmp >= 0; tmp--)
    {
        OCR1A = pgm_read_word (& pwm_table[tmp]);
        my_delay (delay);
    }
}

Mir ist nur nicht klar, wie ich es jetzt so umschreibe, dass nur gedimmt 
wird, solange der Taster gehalten wird und wenn ich ihn los lasse, soll 
die aktuelle Helligkeit bebehalten werden.

Meinen Versuch habe ich euch angehängt.

Ich bedanke mich im Voraus für die Unterstützung.

von Karl H. (kbuchegg)


Lesenswert?

Eugen.S schrieb:

> Mir ist nur nicht klar, wie ich es jetzt so umschreibe,


in diesem Fall: schreibs neu. Diese Funktion kannst du so nicht sinnvoll 
umschreiben bzw. du schreibst sie sowieso neu
1
int main()
2
{
3
4
   alles einstellen
5
6
   dimm_stufe = 0;
7
   up_down = 0;
8
9
   OCR1A = 0;
10
11
   while( 1 ) {
12
13
     if( Taster ist gedrückt ) {
14
15
       // In welche Richtung soll gedimmt werden? Heller oder Dunkler?
16
       // Je nachdem die Dimmstufe erhöhen oder erniedrigen
17
       // wenn die jeweilige Enden der Skala erreicht sind, die
18
       // Richtung entsprechend umdrehen
19
       if( up_down == 0 ) {
20
         dimm_stufe++;
21
         if( dimm_stufe == MAX_DIMMSTUFE )
22
           up_down = 1;
23
       }
24
25
       else {
26
         dimm_stufe--;
27
         if( dimm_stufe == 0 )
28
           up_down = 0;
29
       }
30
31
       // die Dimmstufe 'realisieren'
32
       OCR1A = pgm_read_word ( &pwm_table[dimm_stufe] );
33
34
       bissi warten, sonst gehts rasend schnell
35
     }
36
   }


PS: den ganzen Entprellen Quatsch kannst du dir sparen. Entprellen 
brauchst du nur, wenn dich ein Tastendruck interessiert. Wenn du aber, 
so wie hier, eine Aktion ablaufen lassen willst, SOLANGE ein Taster 
gedrückt ist, braucht nichts entprellt werden.

: Bearbeitet durch User
von Eugen.S (Gast)


Lesenswert?

Danke ich versuche es mal und melde mich wieder, wenn es Probleme gibt.

von Karl H. (kbuchegg)


Lesenswert?

Eugen.S schrieb:
> Danke ich versuche es mal und melde mich wieder, wenn es Probleme gibt.

Wenn es Probleme gibt, solltest du erst mal versuchen die selbst zu 
lösen. Ist ja nicht so, dass die skizzierte 'Strategie' jetzt wahnsinnig 
komplex wäre.

Du musst dich von der Vorstellung lösen, dass Programmieren so wie 
Lego-Spielen (heutiges) funktioniert, wo man sich fertige Komponenten 
sucht und die vielleicht noch ein klein wenig anpasst aber ansonsten 
steckt man die nach Anleitung zusammen. Das klappt nicht. Studiert man 
anderen Code (und das ist gut, das zu tun), dann muss man die 
Quintessenz davon extrahieren. Also die Codeteile, die essentiell 
wichtig sind und die von den Teilen trennen, die nur dazu dienen, die 
Funktionalität in Aktion zu zeigen.
Um eine LED zu auf einen bestimmten Helligkeitswert zu dimmen, schreibt 
man in diesem Beispiel den gewünschten Dimmgrad ins OCR Register. 
Dadurch, dass man geordnet immer andere Dimmgrade in Folge ins OCR 
Register schreibt, ergibt sich der Dimm Effekt als ganzes, bei dem die 
LED ihre Helligkeit langsam ändert. Die for-Schleife in deiner Vorlage 
dient nur dazu, auf simple Art und Weise eine Abfolge von diesen 
Dimmgraden zu erzeugen, hat aber abgesehen davon keine weitere 
Bedeutung.

: Bearbeitet durch User
von Eugen.S (Gast)


Lesenswert?

Karl Heinz schrieb:
> Eugen.S schrieb:
> Danke ich versuche es mal und melde mich wieder, wenn es Probleme gibt.
>
> Wenn es Probleme gibt, solltest du erst mal versuchen die selbst zu
> lösen. Ist ja nicht so, dass die skizzierte 'Strategie' jetzt wahnsinnig
> komplex wäre.
>
> Du musst dich von der Vorstellung lösen, dass Programmieren so wie
> Lego-Spielen (heutiges) funktioniert, wo man sich fertige Komponenten
> sucht und die vielleicht noch ein klein wenig anpasst aber ansonsten
> steckt man die nach Anleitung zusammen. Das klappt nicht. Studiert man
> anderen Code (und das ist gut, das zu tun), dann muss man die
> Quintessenz davon extrahieren. Also die Codeteile, die essentiell
> wichtig sind und die von den Teilen trennen, die nur dazu dienen, die
> Funktionalität in Aktion zu zeigen.
> Um eine LED zu auf einen bestimmten Helligkeitswert zu dimmen, schreibt
> man in diesem Beispiel den gewünschten Dimmgrad ins OCR Register.
> Dadurch, dass man geordnet immer andere Dimmgrade in Folge ins OCR
> Register schreibt, ergibt sich der Dimm Effekt als ganzes, bei dem die
> LED ihre Helligkeit langsam ändert. Die for-Schleife in deiner Vorlage
> dient nur dazu, auf simple Art und Weise eine Abfolge von diesen
> Dimmgraden zu erzeugen, hat aber abgesehen davon keine weitere
> Bedeutung.

Ich gebe dir vollkommen recht. Mein Beitrag ob sollte nicht suggerieren, 
dass ich mich beim kleinsten Problem melden.

Danke nochmal für deine Anregungen.

von Frank (Gast)


Lesenswert?

Karl Heinz schrieb:
> PS: den ganzen Entprellen Quatsch kannst du dir sparen.

Korrigier mich wenn ich falsch liege, tut er dann aber evtl nicht in die 
falsche Richtung dummen?
Sprich er drückt einmal drauf und eigentlich wäre hochdimmen dran. Das 
macht es auch kurz, aber durch das prellen springt er kurz wieder raus. 
Beim nächsten Einsparung steht updown aber auf runterdimmen...

von Frank (Gast)


Lesenswert?

Sch*** Autokorrektur!

von Frank (Gast)


Lesenswert?

Vergiss es, mein Fehler.
Es wird ja erst bei MIN/MAX gewechselt.
Nicht bei jedem Tastenwechsel.

von Eugen.S (Gast)


Lesenswert?

Ich habe noch eine Verständnisfarge:

Karl Heinz schrieb:
> pgm_read_word ( &pwm_table[dimm_stufe] );

Ist pwm_table ein Array in dem dann meine Werte für OCR1A drin stehen 
und meine dimm_stufe ist dann max. 256 bei einem 16 bit Array? Wenn 
nicht, wie funktioniert dieser Befehl? Ich habe im Netz nicht gefunden, 
was mir weitergeholfen hat.

Ich stehe gerade voll auf dem Schlauch sorry.

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.