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






Hoffentlich liegt das Ziel auch am Weg
Zitieren
Nur wie ich die SSS abfgrage (elektronisch) bin ich mir noch nicht ganz sicher... Hätte halt gerne was mit dem Sleep-Modus des µC gemacht. Das er, wenn der Taster eine gewisse Zeit nicht betätigt wird, in diesen Modus wechselt und die Relais nicht die ganze Zeit bestromt werden....hoffe da hat noch jemand den richtigen Geistesblitz! 

Lesezeichen