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)
Lesezeichen