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







Zitieren

Lesezeichen