Hallo, ich habe hier ein Programm welches über Uart die Dimmwerte empfängt und dann gedimmt wird das Funktioniert alles. Nun meine Frage, ich möchte gern wenn ich einen dimmwert sende und der aktuelle Dimmwert kleiner oder grösser ist,aAutomatisch hoch oder runtergedimmt wird. vielleicht kann mir jemand von euch weiterhelfen. mfg
Füg dir 2 neue Variablen ein: sollTime1 und SollTime2 Hier
1 | if (kanal == 1) |
2 | {
|
3 | light1 = received; |
4 | time1 = b*light1; |
5 | |
6 | }
|
7 | if (kanal == 2) |
8 | {
|
9 | light2 = received; |
10 | time2 = b*light2; |
11 | }
|
wo du dir von der UART die Dimmwerte holst, speicherst du sie nicht direkt in time1 bzw. time2 sondern erst mal nur in den sollTime1 und sollTime2. Und am Ende der Schleife, führst du dann time1 bzw. time2 langsam an die Sollwerte heran, bei jedem Schleifendurchlauf immer nur um 1 Schritt.
1 | if( time1 < sollTime1 ) |
2 | time1++; |
3 | else if( time1 > sollTime1 ) |
4 | time1--; |
5 | |
6 | if( time2 < sollTime2 ) |
7 | time2++; |
8 | else if( time2 > sollTime2 ) |
9 | time2--; |
10 | }
|
Auf die Art erhöht bzw. verringern sich die tatsächlich benutzten PWM Werte nur langsam in kleinen Schritten in Richtung deiner Vorgabewerte. Das Problem wird allerdings sein, dass dein Programm kein vernünftiges Zeit-Management hat, so dass das Nachführen wahrscheinlich immer noch viel zu schnell passieren wird. Aber probiers einfach mal aus.
Karl Heinz Buchegger schrieb: > Das Problem wird allerdings sein, dass dein Programm kein vernünftiges > Zeit-Management hat, so dass das Nachführen wahrscheinlich immer noch > viel zu schnell passieren wird. Aber probiers einfach mal aus. Eine Möglichkeit könnte sein, das Nachführen der time Variablen zb in den Overflow Interrupt deines Timer 1 zu legen, anstelle von der Hauptschleife.
HALLO, erstmal vielen dank für die Antwort, so ich hab das denn mal so versucht umzusätzen wie vorgeschlagen nun läuft aber garnixmehr. den Sourcecode habe ich im Anhang.
Andre schrieb: > HALLO, > erstmal vielen dank für die Antwort, so ich hab das denn mal so versucht > umzusätzen wie vorgeschlagen Nö. Hast du nicht. Du hast da Änderungen gemacht, die völlig unmotiviert sind. Nochmal zurück zur ursprünglichen Version. Dann: denkst du nach, was das Prinzip dieser langsamen Nachführung ist Und dann implementierst du es. Die Sache mit dem Timer Interrupt ist in Ordnung, das kannst du so lassen. Aber die restlichen Änderungen sind schlecht. Warum hast du denn zb die UART ISR komplett umgebaut? Die wird für jedes(!) Zeichen erneut aufgerufen. Du kannst da nicht einfach so tun als ob du durch 2-maliges Lesen von UDR die beiden Bytes kriegen würdest.
Karl Heinz Buchegger schrieb: > Andre schrieb: >> HALLO, >> erstmal vielen dank für die Antwort, so ich hab das denn mal so versucht >> umzusätzen wie vorgeschlagen > > > Nö. Hast du nicht. > Du hast da Änderungen gemacht, die völlig unmotiviert sind. > > Nochmal zurück zur ursprünglichen Version. Obwohl. Ich hab mir die gerade noch mal angesehen. Die ist ja auch schon viel zu umständlich, was das Handling der UART betrifft. Räum das doch erst mal auf.
So müsste das zumindest soweit (basierend auf deinem ersten Code) gehen. Bei deiner UART Übertragung musst du dir noch was einfallen lassen. Wie erkennt denn die UART, welches Byte jetzt gerade für die eine und welches füpr die andere LED ist?
Die Uart sollte dann später noch umgeändert werden, das programm läuft so aber nich,weil ja die berechnung light1 = sollTime1; time1 = b*light1; noch fehlte ich hab sie jetzt mal eingefügt läuft trotzdem nicht,
Andre schrieb: > Die Uart sollte dann später noch umgeändert werden, > das programm läuft so aber nich,weil ja die berechnung > light1 = sollTime1; > time1 = b*light1; > noch fehlte Die fehlt ganz sicher nicht. ZUmindest nicht hier. Der Witz an der ganzen Sache ist ja, dass es im ganzen Programm keine direkte Zuweisung an time1 gibt. time1 wird immer nur um 1 erhöht oder erniedrigt. Welches von beiden gemacht werden muss, wird über sollTime1 gesteuert. Wenn schon, dann musst du daher sollTime1 mit b multiplizieren (in der UART ISR). Was auch immer diese Multiplikation bewirken soll.
Noch was. Hab ich auch übersehen. Wenn du tim1 mit 50 initialisierst, solltest du auch SollTime1 mit 50 initialisiern. Sonst dimmt dir diese Einstellung sofort die Variable time1 auf 0 herunter. time1 ist die Variable, die aussagt welche Dimm-Einstellung jetzt gerade realisiert wird. SollTime1 ist die Variable, die aussagt, bis wohin time1 verändert werden soll. Und am Anfang sollten die wahrscheinlich erst mal gleich sein.
Karl Heinz Buchegger schrieb: > Der Witz an der ganzen Sache ist ja, dass es im ganzen Programm keine > > direkte Zuweisung an time1 gibt. time1 wird immer nur um 1 erhöht oder > > erniedrigt. Welches von beiden gemacht werden muss, wird über sollTime1 > > gesteuert. > > Wenn schon, dann musst du daher sollTime1 mit b multiplizieren (in der > > UART ISR). Was auch immer diese Multiplikation bewirken soll. a = TCNT1; b = a/100; hiermit wird ja der Dimmwert berechnet light1 = sollTime1; time1 = (a/100)*light1; light2 = sollTime2; time2 = (a/100)*light2;
hallo, jetzt funktioniert es erst einmal das Dimmen mit dem Vergleich zwischen ist und soll, aber ich kann nur bis 64 hoch Dimmen alles was über 64 ist dan stürtzt der mega8 ab,aber woran liegt das. vielleicht könnt mir vo euch jemand weiterhelfen. mfg
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.