PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : % Rechnung



Marco78
18.03.2005, 22:54
Folgender Codeteil erbringt nicht das erhoffte:

Do
For X = 800 To 0 Step -10
Pwm1b = X
Pwm1a = X
A = X / 8
Cls
Lcd A ; "%"
Lowerline
Lcd X
Waitms 150
Next X
Wait 1
Loop
X ist Word und A ist Byte. Wenigstens das sollte schonmal richtig sein.
Das ganze ist eine PWM die soweit auch funktioniert, bis auf das auf dem LCD angezeigte.

Im ersten Durchlauf fängt X mit 800 an. Aber A zeigt nur 4%
X zählt in 10er Schritten runter. A wird auch weniger. Nachdem A=0 hatte fängt A wieder mit 31 an. X zählt normal weiter. A zählt auch runter und fängt nach 0 wieder mit 31 an.
Irgendwann sind dann X und A=0.

Dann fängt X mit 6553X an. Welche Zahl genau kann ich so schnell nicht sehen. Aber ziemlich am max was Word aufnehmen kann. A zählt auch da immer nur von 31 runter.
X zählt immer un 10 runter und die Bel. wird heller. Bei max. Helligkeit fängt sie wieder bei (fast) Null an heller zu werden.

Sieht da jemand den Fehler im Programm und kann mir die Lösung nennen?

Michael
18.03.2005, 23:42
Hallo Marco78,

X ist Word und A ist Byte. Wenigstens das sollte schonmal richtig sein.

Dimensionier A als Word, und es sollte passen.
Wenn du nämlich von deinem Anfangswert (800) nur die unteren 8 Bit (Byte) nimmst, hast du 32! Das geteilt durch 8 ist 4.
Gruß, Michael

Marco78
18.03.2005, 23:56
Danke, genau das war's!

Hast du auch ne Idee, warum der Zähler danach bei 65536 anfängt?
Man könnte es ja auch mit decr lösen. Aber verstehen würd ich es trotzdem gerne. Ich hatte auch schon ein X=0 vor loop eingefügt, aber das änderte nichts.

Michael
19.03.2005, 00:10
Hallo Marco78,

Hast du auch ne Idee, warum der Zähler danach bei 65536 anfängt?
Wir die Loop-Schleife dann wiederholt, oder hängt er noch in der FOR-Schleife fest?
Laß mal das Do-Loop weg und teste dann, ob X überhaupt 0(Null) erreicht.
Ich nehme an, daß die FOR-Schleife nicht verlassen wird.
Hast du die End Anweisung drin?
Gruß, Michael

Marco78
19.03.2005, 00:28
Interessante Erkentniss :D

Also, die 0 wird erreicht. End habe ich ganz am Ende des Listings.
Aber nachdem ich wait mal auf 100 gesetzt habe, konnte ich beobachten das er sofort (ohne über eine Minute zu warten) mit 65536 wieder anfängt.
Bei Step -1 war es auch so. Eigentlich müsste die 0 ja erreicht werden.

Was für ein Fehler habe ich denn da wieder eingebaut?!?

Ich hab grad mal nachgeschaut. Sonst sind da im Programm keine Schleifen eingebaut. Den Rest habe ich mit Incr und Loop Until gemacht. Wäre da zwar auch möglich, aber 10 Schritte auf einmal sollten es schon sein. Da wäre Step -10 einfacher denke ich.
Oder alternativ X = X - 10
Verstehen warum es so nicht geht möchte ich aber dennoch.

Michael
19.03.2005, 02:17
Hallo Marco78,
so, ich hab jetzt mal das ganze aufgebaut und getestet.
Es stimmt, der Zähler X läuft über, und zwar in der FOR-Schleife.
Abhilfe schafft entweder:
For X = 800 To 1 Step -10
allerdings ist der letzte Schleifenwert dann 10, bzw. 1%
oder:
For X = 0 To 800 Step 10
Pwm1b = 800 - X
.
A = 800 - x
A = A / 8
usw.
Gruß, Michael

Marco78
19.03.2005, 13:17
Ich denke ich hab das Problem erkannt. von 800 bis 0 sind es 801 Schritte. Und das lässt sich schlecht durch 10 teilen ;)

Aber ich hab's gestern Nacht noch in Do und Loop Until und X = X + 10 geändert.

Wenn doch alle Lösungen so einfach wären :(