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 L1s As Bit , L2s As Bit , L3s As Bit , L4s As Bit , L5s As Bit , L6s As Bit , L7s As Bit , L8s As Bit , L9s As Bit , L10s As Bit , L11s As Bit , L12s As Bit ,
Dim Empfang As Bit 'ist 0 wenn kein empfang also 255 von address
Dim Sek As Byte 'wenn = 100 dann 1 sec um
'Lampen festlegen
L1 Alias Portc.5
L2 Alias Portc.4
L3 Alias Portc.3
L4 Alias Portc.2
L5 Alias Portc.1
L6 Alias Portc.0
L7 Alias Portb.5
L8 Alias Portb.4
L9 Alias Portb.3
L10 Alias Portb.2
L11 Alias Portb.1
L12 Alias Portb.0
'-------------------------------------------------------------------------------
'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 "Programm Start 38400 Baud..."
Do
'-------------------------------------------------------------------------------
'Rc5 Code einlesen:
Getrc5(address , Command)
'Print "Address: " ; Address
'Print "Command: " ; Command
'-------------------------------------------------------------------------------
'RC5 Code umsetzen:
If Address = 255 Then 'also kein Signal
Empfang = 0
End If
If Address = 0 Then 'Adresse 0=TV FB
If Empfang = 0 Then
Empfang = 1
Timer1 = Timervorgabe 'Timer1 zurücksetzen, damit erst bei Tastendruck gezählt wird
'Print "timerzurück"
End If
If Command.7 = Command_old Then
Incr Taste_lang
Else
Taste_lang = 0 'Variable zurücksetzen
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
Goto Lampe1
Case 2 : Incr T2
Goto Lampe3
Case 3 : Incr T3
Goto Lampe5
Case 4 : Incr T4
Goto Lampe7
Case 5 : Incr T5
Goto Lampe9
Case 6 : Incr T6
Goto Lampe11
Case Else : Print "Fehler: " ; Command
End Select
End If
'-------------------------------------------------------------------------------
'Relais ansteuern
'-------------------------------------------------------------------------------
Lampe1:
'=============
If T1 > 0 And Taste_lang < 6 Then 'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!
L1s = L1 'Iststatus von Lampen übernehmen
L2s = L2 'Iststatus von Lampen ü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 => 3 And Taste_lang <= 5 Then 'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
Print "Taste_lang: " ; Taste_lang
Taste_lang = 100 'Variable setzen damit Routine kein zweites mal erfüllt wird
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"
Goto Lampenende
Lampe3:
'=============
If T2 > 0 And Taste_lang < 6 Then 'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!
L3s = L3 'Iststatus von Lampen übernehmen
L4s = L4 'Iststatus von Lampen übernehmen
If L3s = 0 And L4s = 0 Then
L3s = 1
Goto Sprung3 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L3s = 1 And L4s = 0 Then
L3s = 0
Goto Sprung3
End If
If L3s = 1 And L4s = 1 Then
L4s = 0
End If
Sprung3:
If Taste_lang => 3 And Taste_lang <= 5 Then 'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
Print "Taste_lang: " ; Taste_lang
Taste_lang = 100 'Variable setzen damit Routine kein zweites mal erfüllt wird
If L3 = 1 And L4 = 0 Then
L3s = 1 'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
L4s = 1
Goto Sprung4 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L3 = 1 And L4 = 1 Then
L3s = 0
L4s = 0
Goto Sprung4 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L3 = 0 And L4 = 0 Then
L3s = 1
L4s = 1
End If
End If
Sprung4:
End If 'ENDE von "wenn Taste 1 gedrückt wurde"
Goto Lampenende
Lampe5:
'=============
If T3 > 0 And Taste_lang < 6 Then 'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!
L5s = L5 'Iststatus von Lampen übernehmen
L6s = L6 'Iststatus von Lampen übernehmen
If L5s = 0 And L6s = 0 Then
L5s = 1
Goto Sprung5 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L5s = 1 And L6s = 0 Then
L5s = 0
Goto Sprung5
End If
If L5s = 1 And L6s = 1 Then
L5s = 0
End If
Sprung5:
If Taste_lang => 3 And Taste_lang <= 5 Then 'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
Print "Taste_lang: " ; Taste_lang
Taste_lang = 100 'Variable setzen damit Routine kein zweites mal erfüllt wird
If L5 = 1 And L6 = 0 Then
L5s = 1 'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
L6s = 1
Goto Sprung6 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L5 = 1 And L6 = 1 Then
L5s = 0
L6s = 0
Goto Sprung6 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L5 = 0 And L6 = 0 Then
L5s = 1
L6s = 1
End If
End If
Sprung6:
End If 'ENDE von "wenn Taste 1 gedrückt wurde"
Goto Lampenende
Lampe7:
'=============
If T4 > 0 And Taste_lang < 6 Then 'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!
L7s = L7 'Iststatus von Lampen übernehmen
L8s = L8 'Iststatus von Lampen übernehmen
If L7s = 0 And L8s = 0 Then
L7s = 1
Goto Sprung7 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L7s = 1 And L8s = 0 Then
L7s = 0
Goto Sprung7
End If
If L7s = 1 And L8s = 1 Then
L8s = 0
End If
Sprung7:
If Taste_lang => 3 And Taste_lang <= 5 Then 'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
Print "Taste_lang: " ; Taste_lang
Taste_lang = 100 'Variable setzen damit Routine kein zweites mal erfüllt wird
If L7 = 1 And L8 = 0 Then
L7s = 1 'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
L8s = 1
Goto Sprung8 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L7 = 1 And L2 = 1 Then
L7s = 0
L8s = 0
Goto Sprung8 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L7 = 0 And L8 = 0 Then
L7s = 1
L8s = 1
End If
End If
Sprung8:
End If 'ENDE von "wenn Taste 1 gedrückt wurde"
Goto Lampenende
Lampe9:
'=============
If T5 > 0 And Taste_lang < 6 Then 'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!
L9s = L9 'Iststatus von Lampen übernehmen
L10s = L10 'Iststatus von Lampen übernehmen
If L9s = 0 And L10s = 0 Then
L9s = 1
Goto Sprung9 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L9s = 1 And L10s = 0 Then
L9s = 0
Goto Sprung9
End If
If L9s = 1 And L10s = 1 Then
L10s = 0
End If
Sprung9:
If Taste_lang => 3 And Taste_lang <= 5 Then 'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
Print "Taste_lang: " ; Taste_lang
Taste_lang = 100 'Variable setzen damit Routine kein zweites mal erfüllt wird
If L9 = 1 And L10 = 0 Then
L9s = 1 'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
L10s = 1
Goto Sprung10 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L9 = 1 And L10 = 1 Then
L9s = 0
L10s = 0
Goto Sprung10 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L9 = 0 And L10 = 0 Then
L9s = 1
L10s = 1
End If
End If
Sprung10:
End If 'ENDE von "wenn Taste 1 gedrückt wurde"
Goto Lampenende
Lampe11:
'=============
If T6 > 0 And Taste_lang < 6 Then 'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!
L11s = L11 'Iststatus von Lampen übernehmen
L12s = L12 'Iststatus von Lampen übernehmen
If L11s = 0 And L12s = 0 Then
L11s = 1
Goto Sprung11 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L11s = 1 And L12s = 0 Then
L11s = 0
Goto Sprung11
End If
If L11s = 1 And L12s = 1 Then
L12s = 0
End If
Sprung11:
If Taste_lang => 3 And Taste_lang <= 5 Then 'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
Print "Taste_lang: " ; Taste_lang
Taste_lang = 100 'Variable setzen damit Routine kein zweites mal erfüllt wird
If L11 = 1 And L12 = 0 Then
L11s = 1 'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
L12s = 1
Goto Sprung12 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L11 = 1 And L12 = 1 Then
L11s = 0
L12s = 0
Goto Sprung12 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
End If
If L11 = 0 And L12 = 0 Then
L11s = 1
L12s = 1
End If
End If
Sprung12:
End If 'ENDE von "wenn Taste 1 gedrückt wurde"
Goto Lampenende
Lampenende:
'Print "-----------------------"
'Print "Address: " ; Address
'Print "Command: " ; Command
'Print "-----------------------"
'_______________________________________________________________________________
If Sek => 100 And Address = 255 Then
Sek = 0
T1 = 0 'Tastenzähler zurücksetzen
T2 = 0
T3 = 0
T4 = 0
T5 = 0
T6 = 0
L1 = L1s 'Werte auf Ausgänge übertragen
L2 = L2s
L3 = L3s
L4 = L4s
L5 = L5s
L6 = L6s
L7 = L7s
L8 = L8s
L9 = L9s
L10 = L10s
L11 = L11s
L12 = L12s
Print "L1: " ; L1
Print "L2: " ; L2
Print "L3: " ; L3
Print "L4: " ; L4
Print "L5: " ; L5
Print "L6: " ; L6
Print "L7: " ; L7
Print "L8: " ; L8
Print "L9: " ; L9
Print "L10: " ; L10
Print "L11: " ; L11
Print "L12: " ; L12
Print "____________"
End If
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Timer1_irq:
Timer1 = Timervorgabe
Incr Sek
Return
Lesezeichen