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
elseif(time1>sollTime1)
4
time1--;
5
6
if(time2<sollTime2)
7
time2++;
8
elseif(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