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
Lesezeichen