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 | 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
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
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...
Vergiss es, mein Fehler. Es wird ja erst bei MIN/MAX gewechselt. Nicht bei jedem Tastenwechsel.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.