Die Schleife "while Taster = 0" setzt einen prellfreien Kontakt voraus. Auch scheint das Licht nicht anzubleiben, wenn der Taster losgelassen wird. Oder habe ich da nen Denkfehler?
Mein erster Versuch würde jetzt so aussehen:
Zweite Idee mit zusätzlichem Eingang für ~65 Sekunden Licht:Code:$regfile = "attiny13.dat" $hwstack = 16 $swstack = 16 $framesize = 24 $crystal = 1200000 Taster Alias Pinb.4 'Led1 : Portb.0 'Led2 : Portb.1 'Led3 : Portb.2 Dim Taste As Bit Dim Tastealt As Bit Dim Zeit As Word Dim Ledspeicher As Byte 'Speichert Zustand der LEDs in einzelnen Bits Ddrb = &B00000111 Portb = &B00110000 Ledspeicher = &B00110111 'damit das erste mal kurz Tasten gleich alle Ausgänge setzt, falls nocht nicht alles bestückt ist. Do Gosub Tastercheck Gosub Szeit Gosub Licht Loop End Tastercheck: Debounce Taster , 0 , Taste_zu Debounce Taster , 1 , Taste_offen Taste_zu: Taste = 1 Return Taste_offen: Taste = 0 Return Szeit: If Taste = 0 Then If Tastealt = 1 Then If Zeit < 500 Then 'wurde nur kurz gedrückt, dann ein-/ausschalten Gosub Schalten End If Reset Tastealt End If End If If Taste = 1 Then If Tastealt = 0 Then Set Tastealt Zeit = 0 End If Waitms 1 Incr Zeit End If Return Licht: If Taste = 1 Then Select Case Zeit Case 500 : Portb = &B00110001 'bit 4 immer an, wegen Pullup am Tastereingang Case 1000 : Portb = &B00110010 'bit 5 immer an, wegen Pullup an offenem Eingang Case 1500 : Portb = &B00110100 Case 2000 : Portb = &B00110011 Case 2500 : Portb = &B00110101 Case 3000 : Portb = &B00110110 Case 3500 : Portb = &B00110111 Case Is >= 4000 : Zeit = 499 End Select End If Return Schalten: If Portb > &B00110000 Then 'Wert größer Pullups Ledspeicher = Portb Portb = &B00110000 Else Portb = Ledspeicher End If Return
Beide ungetestet, da keine passende Hardware hier. Werden die ganzen Zeiten halbiert und waitms auf 2 erhöht, verdoppelt sich die Laufzeit des Lichttimers. wtimer darf natürlich nicht größer werden.Code:$regfile = "attiny13.dat" $hwstack = 16 $swstack = 16 $framesize = 24 $crystal = 1200000 Taster Alias Pinb.4 Tasterzeit Alias Pinb.5 'Led1 : Portb.0 'Led2 : Portb.1 'Led3 : Portb.2 Dim Taste As Bit Dim Tastealt As Bit Dim Zeit As Word Dim Ledspeicher As Byte 'Speichert Zustand der LEDs in einzelnen Bits Dim Wtimer As Word Ddrb = &B00000111 Portb = &B00111000 Ledspeicher = &B00111111 'damit das erste mal kurz Tasten gleich alle Ausgänge setzt, falls nocht nicht alles bestückt ist. Do Gosub Tastercheck Gosub Szeit Gosub Licht Loop End Tastercheck: Debounce Taster , 0 , Taste_zu Debounce Tasterzeit , 0 , Taste_zeit Reset Taste Return Taste_zu: Set Taste Wtimer = 0 Return Taste_zeit: Wtimer = 65535 Return Szeit: If Taste = 0 Then If Tastealt = 1 Then If Zeit < 500 Then 'wurde nur kurz gedrückt, dann ein-/ausschalten Gosub Schalten End If Reset Tastealt End If End If If Taste = 1 Then If Tastealt = 0 Then Set Tastealt Zeit = 0 End If Waitms 1 Incr Zeit End If If Wtimer >= 1 Then Decr Wtimer If Wtimer = 0 Then If Portb > &B00110000 Then Gosub Schalten End If End If End If Return Licht: If Taste = 1 Then Select Case Zeit Case 500 : Portb = &B00111001 'bit 4 immer an, wegen Pullup am Tastereingang Case 1000 : Portb = &B00111010 'bit 5 immer an, wegen Pullup an offenem Eingang Case 1500 : Portb = &B00111100 Case 2000 : Portb = &B00111011 Case 2500 : Portb = &B00111101 Case 3000 : Portb = &B00111110 Case 3500 : Portb = &B00111111 Case Is >= 4000 : Zeit = 499 End Select End If Return Schalten: If Portb > &B00110000 Then 'Wert größer Pullups Ledspeicher = Portb Portb = &B00110000 Else Portb = Ledspeicher End If Return







Zitieren
Lesezeichen