Hallo,
ich möchte mit einer RC5FB bei kurzem druck auf Taste 1 Ausgang 1 schalten. Bei langem Druck sollen Ausgang 1&2 schalten.
Wie werte ich die Tastenlänge aus?
In meinem Versuch zähle ich eine Variable hoch - aber irgend wo hängt es - uns zwar beim zurücksetzen/auswerten der Variable.
Code:
'RC5 Eingang über Pin5 / PD3
'L1-L12 sind die Lampen, wobei die ungerade die halbe Helligkeit ist und die gerade die volle Helligkeit mit beiden zusammen
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 16000000 'Quarz: 16 MHz
$baud = 38400 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrb = &B11111111 '1 Ausgang, 0 Eingang => Pin PB7-0 als Ausgang
Ddrc = &B11111111 '1 Ausgang, 0 Eingang => Pin PB7-0 als Ausgang
Portb = 0
Portc = 0
'-------------------------------------------------------------------------------
'Timer0 = 8 Bit
'wird für RC5 Auswertung benötigt!!!
Config Rc5 = Pind.3 'Timer0 in Benutzung!!!
Portd.3 = 1 '??????????????????????????????????
'16Bit Timer:
Config Timer1 = Timer , Prescale = 256
On Timer1 Timer1_irq
Const Timervorgabe = 34286 '2 mal pro Sekunde
Enable Timer1
Enable Interrupts
'-------------------------------------------------------------------------------
'Variablen:
'-------------------------------------------------------------------------------
Dim Address As Byte , Command As Byte , Flag As Bit 'RC5
'Taste 1-6 auf der FB
Dim T1 As Word , T2 As Word , T3 As Word , T4 As Word , T5 As Word , T6 As Word
'Lampe 1-12
Dim L1 As Bit , L2 As Bit , L3 As Bit , L4 As Bit , L5 As Bit , L6 As Bit , L7 As Bit , L8 As Bit , L9 As Bit , L10 As Bit , L11 As Bit , L12 As Bit ,
'Lampen festlegen
Portc.5 = L1
Portc.4 = L2
'-------------------------------------------------------------------------------
'Vor Programmstart:
'alle Lampen aus:
L1 = 0
L2 = 0
L3 = 0
L4 = 0
L5 = 0
L6 = 0
L7 = 0
L8 = 0
L9 = 0
L10 = 0
L11 = 0
L12 = 0
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Print " geht los... "
Do
'-------------------------------------------------------------------------------
'Rc5 Code einlesen:
Getrc5(address , Command)
'Print "Address: " ; Address
'Print "Command: " ; Command
'-------------------------------------------------------------------------------
'RC5 Code umsetzen:
If Address = 0 Then 'Adresse 0=TV FB
Command = Command And &B01111111
Reset Command.7 ' reset toggle bit / Restmüll beseitigen
Select Case Command
Case 0 : Print "CASE = 0"
Case 1 : Incr T1
Case 2 : Incr T2
Case 3 : Incr T3
Case 4 : Incr T4
Case 5 : Incr T5
Case 6 : Incr T6
Case Else : Print "Fehler: " ; Command
End Select
If T1 > 0 Then 'wenn Taste 1 gedrückt wurde
If T1 => 1 And T1 < 6 Then 'wenn Taste kurz gedrückt wurde
Print "--> T1: " ; T1
If L1 = 0 Then 'wenn Lampe 1 aus ist
Set L1 'schalte Lampe 1 an
Print "L1 an"
Else 'sonst
Reset L1 'schalte Lampe 1 aus
Print "L1 aus"
Reset L2 'schalte Lampe 2 aus
Print "L2 aus"
End If
Else 'Wenn Taste 1 lange gedrückt wurde
Print "--> T1größer5: " ; T1
If L1 <> L2 Then 'also nur 1 Lampen an
Set L1 'schalte Lampe 1 an
Print "L1an"
Set L2 'schalte Lame 2 an
Print "L2an"
End If
If L1 = 1 And L2 = 1 Then 'Wenn beide Lampen an sind
Reset L1 'schalte Lampe 1 aus
Print "L1aus"
Reset L2 'schalte Lampe 2 aus
Print "L2aus"
End If
If L1 = 0 And L2 = 0 Then 'Wenn beide Lampen aus sind
Set L1 'schlate Lampe 1 an
Print "L1 AN"
Set L2 'schalte Lampe 2 an
Print "L2 AN"
End If
End If
End If 'ENDE von "wenn Taste 1 gedrückt wurde"
'Print "-----------------------"
'Print "Address: " ; Address
'Print "Command: " ; Command
'Print "-----------------------"
Else 'Wenn Adresse nicht = 0
Timer1 = Timervorgabe 'Timer1 zurücksetzen, damit erst bei Tastendruck gezählt wird
Print "timerzurück"
End If
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Timer1_irq:
Timer1 = Timervorgabe
T1 = 0
T2 = 0
T3 = 0
T4 = 0
T5 = 0
T6 = 0
Print "L1: " ; L1
Print "L2: " ; L2
Return
wo muss ich den Timer zurück setzen? - nun wird er nach jedem Tastendruck zurück gesetzt und wenn man die Taste lange drückt, verhält sich das Programm so, als wenn die FB immer Impulse sendet.
Hintergrund:
Ich habe 6 Lampen mit je 2 Leuchtmitteln. 1 Leuchtmittel ist also halbe Helligkeit und 2 Leuchtmittel sind dann volle Helligkeit. Wenn man kurz drückt, soll eine Lampe angehen und wenn man etwas länger drückt, sollen beide Leuchtmittel angehen. "Aus" natürlich genauso.
Lesezeichen