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.
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
intmain()
2
{
3
4
alleseinstellen
5
6
dimm_stufe=0;
7
up_down=0;
8
9
OCR1A=0;
10
11
while(1){
12
13
if(Tasteristgedrü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
bissiwarten,sonstgehtsrasendschnell
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.
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.
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.
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...
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.