Forum

Einloggen | Registrieren | RSS  

GeorgZ(R)

21.10.2023,
19:59
 

Einfache MicroPython Syntax Frage (Elektronik)

Hallo,
ich habe folgendes kleines Programm aus einem Tutorial:


Das "sleep(3)" habe ich angehängt, aber es macht nicht, was ich wollte.
So, wie es jetzt ist, wird zuerst das sleep(3) ausgeführt und dann erst i=0.
Ich wollte es aber umgekehrt: erst i=0, dann sleep(3) - dass die LED eben 3 Sekunden aus ist.

Übrigens würde es mich auch sehr interessieren, wie man, anstatt auf 0 zurück zu springen, per i = i - 3000 zu 0 zurückkehrt.

Gruß, Georg

Gast

21.10.2023,
20:52

@ GeorgZ

Einfache MicroPython Syntax Frage

» So, wie es jetzt ist, wird zuerst das sleep(3) ausgeführt und dann erst
» i=0.
Das kommt dir nur so vor weil das i=i+3000 so schnell in der Schleife hochgerechnet wird.

» Übrigens würde es mich auch sehr interessieren, wie man, anstatt auf 0
» zurück zu springen, per i = i - 3000 zu 0 zurückkehrt.
Eben genauso...

GeorgZ(R)

21.10.2023,
21:11

@ Gast

Einfache MicroPython Syntax Frage

Hallo,

» Das kommt dir nur so vor weil das i=i+3000 so schnell in der Schleife
» hochgerechnet wird.

Glaube ich nicht.
65535:3000 = ca.22 , 22 mal 0,1Sek = 2,2 Sek. Das, plus 3 Sek vom sleep(3) sind etwa 5 Sekunden.
Genau so lange dauert jetzt ein Durchlauf.
Aber die letzten 3 Sekunden ist die LED eben voll an und ich hätte sie gerne aus.

» » Übrigens würde es mich auch sehr interessieren, wie man, anstatt auf 0
» » zurück zu springen, per i = i - 3000 zu 0 zurückkehrt.
» Eben genauso...

Ich habe schon so einige Möglichkeiten versucht, das ins Programm zu schreiben, bis jetzt hat's nicht funktioniert.
Also mache ich wohl einen grundlegenden Syntaxfehler, denke ich.

Gruß, Georg

bastelix(R)

22.10.2023,
02:19

@ GeorgZ

Einfache MicroPython Syntax Frage

» Aber die letzten 3 Sekunden ist die LED eben voll an und ich hätte sie
» gerne aus.
Dann musst du die LED auch ausschalten bevor du sleep(3) aufrufst.

Schau dir doch mal deinen Programmablauf an.

Wir starten mit i = 60000

led.duty_u16(60000)
i = 60000 + 3000 => 63000
sleep 0.1
63000 > 65535 ? => nein

-- loop --

led.duty_u16(63000)
sleep 0.1
i = 63000 + 3000 => 66000
66000 > 65535 ? => ja
i = 0
sleep 3

-- loop --

led.duty_u16(0)
sleep 0.1
i = 0 + 3000 => 3000
3000 > 65535 ? => nein
...

Siehst du jetzt wo der Fehler liegt und wie du das lösen kannst?

» Also mache ich wohl einen grundlegenden Syntaxfehler, denke ich.
Bei Syntaxfehlern gibts mecker vom Compiler. :-P

Versucht mal zu verstehen wie dein Programm abläuft, also Schritt für Schritt was tut der Code wenn i = 0 ist, was tut der Code wenn i = 6000 ist und so weiter. Mal dir das mal auf ein Blatt Papier auf, damit du verstehst was da überhaupt passiert und dann vergleiche es mit dem was du willst, dass da passiert.

GeorgZ(R)

22.10.2023,
10:54

@ bastelix

Einfache MicroPython Syntax Frage

» » Aber die letzten 3 Sekunden ist die LED eben voll an und ich hätte sie
» » gerne aus.
» Dann musst du die LED auch ausschalten bevor du sleep(3) aufrufst.

Ich dachte, das passiert durch i = 0

» Versucht mal zu verstehen wie dein Programm abläuft, also Schritt für
» Schritt was tut der Code wenn i = 0 ist, was tut der Code wenn i = 6000 ist
» und so weiter.

Guter Rat :-)
Jetzt habe ich es anders gemacht und es funktioniert, genau wie ich's will:

Das Ende ist wie beim Tutorial-Programm. Hier funktionierts dort nicht - ich verstehe nicht warum.

Gruß, Georg

bastelix(R)

22.10.2023,
22:27

@ GeorgZ

Einfache MicroPython Syntax Frage

Es ginge auch eleganter mit zwei eingebetteten for Schleifen


Oder man nimmt nur die Endlosschleife und eine zweite Variable für die Zählrichtung


Schleifen mit break abzubrechen sollte man nur wenn es sich nicht anders lösen lässt.

Der Code ist Python kein MicroPython aber die print-Aufrufe durch deine led.duty_u16 zu ersetzten bekommst du schon hin. (Import und initialisieren für die LED nicht vergessen)

GeorgZ(R)

23.10.2023,
10:15

@ bastelix

Einfache MicroPython Syntax Frage

Hallo bastelix,

» Es ginge auch eleganter mit zwei eingebetteten for Schleifen

ja, das sieht schön aus und funktioniert auch perfekt.

» Oder man nimmt nur die Endlosschleife und eine zweite Variable für die
» Zählrichtung

Bei dieser Version blinkt die LED jeweils einmal kurz, wenn i bei 0 ist und wenn i bei 65535 ist, dann erst startet das heller - bzw. dunkler werden.
Ich hab noch nicht raus bekommen warum.

Danke jedenfalls !
Gruß, Georg