Nimm keine Loops, nimm Subs.
PseudoCode:
Code:do If taster then incr Modus If Modus > AnzahlModi then Modus=1 select case modus case 1 Gosub Lichteffekt1 case 2 Gosub Lichteffekt2 end select loop end Lichteffekt1: ... return Licheffekt2: ... return
Ich hab gesucht, wurde aber nicht fündig. Das Thema wurde bestimmt schon einmal besprochen. Ich hoffe jemand kann meine Frage beantworten.
Ich habe in Bascom verschiedene Lauflichter programmiert (LED Blinklichter). Eigentlich ne recht einfache Sache, sie gehen mit einem Schalter an und aus.
Jetzt möchte ich gerne einen Taster einsetzen mit dem ich die verschiedenen Loops ansteuern kann.
Leider weis ich nicht welchen Befehl ich dafür benutzen kann um aus einer Loop heraus zu kommen und in die nächste springen kann.
Und natürlich wie dann zum Schluss der befehl des ausbleibends kommen kann.
Gruß Glenn
Nimm keine Loops, nimm Subs.
PseudoCode:
Code:do If taster then incr Modus If Modus > AnzahlModi then Modus=1 select case modus case 1 Gosub Lichteffekt1 case 2 Gosub Lichteffekt2 end select loop end Lichteffekt1: ... return Licheffekt2: ... return
Das ist jetzt ein bisschen ausführlicher, aber nun zeigt er mir 3 Fehler bezogen auf "Modus" an.
Code:$regfile = "attiny13.dat" $crystal = 1200000 $hwstack = 0 $swstack = 0 $framesize = 0 Config Portb.1 = Output Config Portb.2 = Output Config Portb.3 = Output Config Portb.4 = Output Config Pinb.0 = Input do If Pinb.0 = 1 Then Incr Modus If Modus > AnzahlModi then Modus=1 Select Case Modus Case 1 Gosub Lichteffekt1 Case 2 Gosub Lichteffekt2 end select loop end Lichteffekt1: Portb.1 = 1 Portb.2 = 0 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.3 = 0 Portb.4 = 1 Waitms 100 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.1 = 0 Portb.2 = 1 Portb.3 = 0 Portb.4 = 1 Waitms 100 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.3 = 0 Portb.4 = 1 Waitms 100 return Licheffekt2: Portb.1 = 1 Portb.2 = 1 Portb.3 = 1 Portb.4 = 1 Waitms 100 Portb.1 = 0 Portb.2 = 0 Portb.3 = 0 Portb.4 = 0 Waitms 100 return
Hi
du musst die Variablen Modus und AnzahlModi auch definieren.
Code:$regfile = "attiny13.dat" $crystal = 1200000 $hwstack = 0 $swstack = 0 $framesize = 0 Config Portb.1 = Output Config Portb.2 = Output Config Portb.3 = Output Config Portb.4 = Output Config Pinb.0 = Input Dim Modus As Integer Dim Anzahlmodi As Integer Modus = 1 Anzahlmodi = 2 do If Pinb.0 = 1 Then Incr Modus If Modus > AnzahlModi then Modus=1 Select Case Modus Case 1 Gosub Lichteffekt1 Case 2 Gosub Lichteffekt2 end select loop end Lichteffekt1: Portb.1 = 1 Portb.2 = 0 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.3 = 0 Portb.4 = 1 Waitms 100 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.1 = 0 Portb.2 = 1 Portb.3 = 0 Portb.4 = 1 Waitms 100 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.3 = 0 Portb.4 = 1 Waitms 100 Return Lichteffekt2: Portb.1 = 1 Portb.2 = 1 Portb.3 = 1 Portb.4 = 1 Waitms 100 Portb.1 = 0 Portb.2 = 0 Portb.3 = 0 Portb.4 = 0 Waitms 100 Return
| Mfg |
| McGrizzly123 |
Okay, zumindest bekomme ich jetzt das Programm gespeichert. Habs grad mal auf den Tiny übertragen. Es spielt bei Stromzufuhr sofort den ersten Lichteffekt ab und reagiert nicht auf den Taster oder auf den Reset.
Ich probier das ganze morgen nach der Arbeit nochmal.
Schon mal danke bis hier hin...
Hallo,
Du drückst die Taste zu lange
Angenommen dein do-loop benötigt 1ms für einen Durchlauf, dann wird bei jedem Durchlauf Modus inkrementiert!Code:If Pinb.0 = 1 Then Incr Modus
Du musst also die Flanke erfassen, wenn das Signal der Taste von 0 auf 1 springt und nur dann Modus inkrementieren.
BASIC ist lange her bei mir, ich hoffe es hat keine Tippfehler.Code:$regfile = "attiny13.dat" $crystal = 1200000 $hwstack = 0 $swstack = 0 $framesize = 0 Config Portb.1 = Output Config Portb.2 = Output Config Portb.3 = Output Config Portb.4 = Output Config Pinb.0 = Input Dim Modus As Integer Dim Anzahlmodi As Integer Dim Taste_old As Bit Dim Taste_new As Bit Modus = 1 Anzahlmodi = 2 Taste_new = 0 do Taste_old = Taste_new Taste_new = Pinb.0 If ((Taste_old XOR Taste_new) AND Taste_new) = 1 Then Incr Modus If Modus > AnzahlModi then Modus=1 Select Case Modus Case 1 Gosub Lichteffekt1 Case 2 Gosub Lichteffekt2 end select loop end
Hier noch die Erklärung zum Ausdruck ((Taste_old XOR Taste_new) AND Taste_new):
(Taste_old XOR Taste_new)
liefert 1 Wenn sich der Wert von Taste geändert hat, also seit der letzten Abfrage gedrückt oder losgelassen wurde.
Ich gehe davon aus, dass eine gedrückte Taste eine 1 liefert, das hängt jetzt aber von deiner Hardware ab.
Der Ganze Ausdruck liefert nur 1 wenn die Taste gedrückt wurde.
Die Hilfsvariable Taste_new benötigt man, weil sich Pinb.0 zwischen zwei Abfragen ändern könnte.
MfG Peter(TOO)
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Hier zeigt er mir eine Fehlermeldung an. Daher habe ich diese Zeile mal im Code weggelassen.Code:If ((Taste_old XOR Taste_new) AND Taste_new) = 1 Then Incr Modus
Lustig:Code:$regfile = "attiny13.dat" $crystal = 1200000 $hwstack = 10 $swstack = 10 $framesize = 10 Config Portb.1 = Output Config Portb.2 = Output Config Portb.3 = Output Config Portb.4 = Output Config Pinb.0 = Input Dim Modus As Integer Dim Anzahlmodi As Integer Dim Taste_old As Bit Dim Taste_new As Bit Modus = 1 Anzahlmodi = 2 Taste_new = 0 Do Taste_old = Taste_new Taste_new = Pinb.0 If Pinb.0 = 1 Then Incr Modus If Modus > Anzahlmodi Then Modus = 1 Select Case Modus Case 1 Gosub Lichteffekt1 Case 2 Gosub Lichteffekt2 End Select Loop End
Solange ich den Taster gedrückt halte laufen alle Lichteffekte nach einander ab.
Jenes Lichteffekt, dass gerade läuft während ich den Taster los lasse, läuft dann nur noch alleine.
Im Grunde ganz witzig aber nicht das was ich zur zeit möchte.
Ist vielleicht nur ein Tippfehler im obigen Code?
Danke Peter
Gruß Glenn
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Hallo,
Lösch mal das "= 1" in der fraglichen Zeile.
MfG Peter(TOO)
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Lesezeichen