so, ich habe nun einen neuen Lösungsansatz:
Problem war dass bei einem langen Tastendruck mehrmals zuvor geschaltet wurde bis der lange Tastendruck zählt(also der kurze Tastendruck wurde vorher ausgewertet). Nun habe ich mit den Bedingungen Variablen gesetzt und diese werden 1 mal pro Sekunde an die Ports übertragen.
Manchmal kommt es vor, dass der Timer schon fast durchgelaufen ist, wenn eine Taste gedrückt wird. Wie muss ich das anstellen, dass der Timer erst losläuft, wenn eine Taste gedrückt wird?
Code:'------------------------------------------------------------------------------- '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 = 64911 '100 mal pro Sekunde Enable Timer1 Enable Interrupts '------------------------------------------------------------------------------- 'Variablen: '------------------------------------------------------------------------------- Dim Address As Byte , Command As Byte , Command_old As Bit , Flag As Bit 'RC5 'Taste lange gedrückt Dim Taste_lang As Word '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 , Dim L1s As Bit , L2s As Bit Dim Sek As Byte 'wenn = 100 dann 1 sec um 'Lampen festlegen L1 Alias Portc.5 L2 Alias Portc.4 '------------------------------------------------------------------------------- '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 If Command.7 = Command_old Then Incr Taste_lang Else Command_old = Command.7 End If 'Print "Command.7: " ; Command.7 'Print "Taste_lang: " ; Taste_lang 'Command = Command And &B01111111 'reset toggle bit Reset Command.7 'reset toggle bit 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 L1s = L1 'Iststatus übernehmen L2s = L2 'Iststatus übernehmen If L1s = 0 And L2s = 0 Then L1s = 1 Goto Sprung1 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen End If If L1s = 1 And L2s = 0 Then L1s = 0 Goto Sprung1 End If If L1s = 1 And L2s = 1 Then L2s = 0 End If Sprung1: If Taste_lang => 2 Then 'wenn lange gedrückt wird Print "Taste_lang: " ; Taste_lang If L1 = 1 And L2 = 0 Then L1s = 1 'immer beide setzen, falls davor anders gesetzt wurde(einzellampe) L2s = 1 Goto Sprung2 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen End If If L1 = 1 And L2 = 1 Then L1s = 0 L2s = 0 Goto Sprung2 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen End If If L1 = 0 And L2 = 0 Then L1s = 1 L2s = 1 End If End If Sprung2: 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 If Sek => 100 Then Sek = 0 T1 = 0 T2 = 0 T3 = 0 T4 = 0 T5 = 0 T6 = 0 Taste_lang = 0 L1 = L1s L2 = L2s Print "L1: " ; L1 Print "L2: " ; L2 Sek = 0 End If Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Sprungmarken '------------------------------------------------------------------------------- Timer1_irq: Timer1 = Timervorgabe Incr Sek Return







Zitieren

Lesezeichen