Forum: Compiler & IDEs Phasenanschnitt


von Andre (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Andre (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

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?

von Andre (Gast)


Angehängte Dateien:

Lesenswert?

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,

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Andre (Gast)


Lesenswert?

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;

von Andre (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.