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:
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
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
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
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.
Lesezeichen