$regfile = "m644def.dat"
$crystal = 16000000
$lib "mcsbyte.lbx"
Const Timsk = Timsk0
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2 'configure lcd screen
Evg Alias Portc.3 'Leuchtstoffröhre ein / aus
Moonlight Alias Portc.2 'Mondlicht
Backlight Alias Portc.1 'Hintergrundbeleuchtung
T_menu Alias Pina.6
T_hoch Alias Pina.7
T_runter Alias Pinc.5
T_home Alias Pinc.4
Led Alias Portd.6 ' LED Hintergrundbeleuchtung
Config Porta = Output 'LCD Display
Config Pind.7 = Output 'PWM
Config Evg = Output 'Relais EVG Ein / Aus
Config Moonlight = Output 'Relais Moonlight Ein / Aus
Config Backlight = Output 'Relais Backlight Ein / Aus
Config T_menu = Input
Config T_hoch = Input
Config T_runter = Input
Config T_home = Input
Config Rc5 = Pinc.0 ' IR --> RC5
Dim Isekunde As Byte , Prozw1 As Single , Prozw As Single
Dim Isminute As Byte , Dauer As Byte
Dim Istunde As Byte , Pwm_stopstd As Byte , Pwm_stopmin As Byte , Maxdim As Byte
Dim Proz1 As Single
Dim Proz2 As Single , Maxpwm1 As Single , Prozw3 As Byte
Dim Pwm_wert As Single
Dim Pwm_trigger As Byte , Pwm_startmin As Byte , Maxpwm As Byte , Prescale As Single
Dim Flanke1 As Byte , Flanke2 As Byte , Flanke3 As Byte , Flanke4 As Byte , Pwm_startstd As Byte
Dim Prescale2 As Byte
Dim Sstunde As String * 2 , Sminute As String * 2 , Pwm_startmins As String * 2 , Pwm_startstds As String * 2
Dim Daysek As Dword , Dimupsek As Dword , Dimupsek2 As Dword , Dimupsek3 As Dword , Dimdownsek As Dword , Dimdownsek2 As Dword , Dimdownsek3 As Dword
Dim Daysek2 As Dword , Daysek3 As Dword , Dimdownsekstd As Dword , Dimupsekstd As Dword
Dim Adress As Byte , Command As Byte
Enable Interrupts
'**************************************
'Konfiguration Timer 2 für Hardware-PWM an OC2 (B.3)
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 128 'Timer 2 = PWM für 1-10V Dimmer
Config Timer1 = Timer , Prescale = 256 'Timer1 für den Sekundentakt
Enable Timer2
Timer2 = 0
Start Timer2
Const Timervorgabe = 3036
On Timer1 Timer_irq
Enable Timer1
'**************************************
Maxdim = 170 '255 = Hardwaremax - lampe bei 170 100 %
Isekunde = 0
Isminute = 18
Istunde = 13
Pwm_startstd = 8
Pwm_startmin = 0
Pwm_stopstd = 18
Pwm_stopmin = 0
Maxpwm = 50
Pwm_trigger = 0
Pwm_wert = 0
Flanke1 = 0
Flanke2 = 0
Flanke3 = 0
Dauer = 0
'**************************************
Main:
Initlcd 'init display again
Cursor On
Cls
Do
Getrc5(adress , Command) ' RC5-Fernbedienung einlesen
If Adress < 255 Then
Command = Command And &B01111111
Locate 2 , 8
Lcd Command
End If
If Daysek >= 86401 Then Daysek = 0 ' 86400 = 1 Tag in Sekunden
'**************************************
Dimupsek3 = Pwm_startstd * 3600
Dimupsek2 = Pwm_startmin * 60
Dimupsek = Dimupsek2 + Dimupsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
'**************************************
Dimdownsek3 = Pwm_stopstd * 3600
Dimdownsek2 = Pwm_stopmin * 60
Dimdownsek = Dimdownsek2 + Dimdownsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
'**************************************
Daysek3 = Istunde * 3600 ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = Isminute * 60
Daysek = Daysek2 + Daysek3
'**************************************
Dimdownsekstd = Dimdownsek + 3600
'Prozente und Teilerberechnung für die PWM
Maxpwm1 = Maxpwm 'byte nach Single konvertieren
Prozw1 = Maxpwm1 / 100
Prozw = Maxdim * Prozw1
Prozw3 = Prozw 'Prozenztwert in Digits
Prescale = 3600 / Prozw ' Auflösung des Dimm Vorgangs bestimmen 3600 = 1 Stunde zum Dimmen
Prescale2 = Prescale
'**************************************
Dimupsekstd = Dimupsek + 3600 'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
Ocr2a = Pwm_wert 'Ausgabe Spannung PWM (0-255)
Pwm_wert = Pwm_trigger 'PWM Wert bestimmen
Proz1 = Pwm_wert / Maxdim 'Prozent Wert berechnen für Ausgabe LCD --> 170 max. Helligkeit am Display (255 ist der Maxwert am Ausgang)
Proz2 = Proz1 * 100 'Prozent Wert berechnen für Ausgabe LCD
Sstunde = Str(istunde)
Sstunde = Format(sstunde , "00")
Sminute = Str(isminute)
Sminute = Format(sminute , "00")
Pwm_startstds = Str(pwm_startstd , "00") 'Formatierung auf 2 Stellen
Pwm_startstds = Format(pwm_startstds , "00")
Pwm_startmins = Str(pwm_startmin , "00")
Pwm_startmins = Format(pwm_startmins , "00")
If Daysek => Dimupsek And Dimupsek < Dimdownsek Then
Evg = 1 'EVG einschalten wenn das Dimmen beginnen soll
'Backlight = 1 'Blaues Hintergrundlicht ausschalten
Moonlight = 0 'Mondlicht noch einmal ausschalten
End If
If Daysek => Dimdownsekstd Then
Evg = 0 'EVG ausschalten
'Backlight = 0 'Backlight ausschalten
End If
If Daysek >= Dimdownsek And Daysek < 82800 Then Moonlight = 1 'Mondlicht beim herabdimmen einschalten
If Daysek >= 82800 Then Moonlight = 0 'Mondlicht um 23:00 Uhr ausschalten
If Command = 2 Then
Backlight = 0
End If
If Command = 1 Then Backlight = 1
Locate 1 , 1
Lcd Sstunde
Lcd ":"
Lcd Sminute
Locate 1 , 8
Lcd Fusing(proz2 , "##.#") + "%" 'Prozent Wert Anzeigen
Locate 2 , 1
Lcd Pwm_startstds 'Startzeit zum Dimmen
Lcd ":"
Lcd Pwm_startmins
'Locate 2 , 8
'Lcd Pwm_wert
If T_menu = 0 And Flanke2 = 0 Then 'Menü aufrufen
Flanke2 = 1
Goto Menustd
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
Loop
Timer_irq: ' der Interrupt wird jede Sekunde ausgeführt
Timer1 = Timervorgabe
Daysek = Daysek + 1 ' Sekunden des gesamten Tages
Isekunde = Isekunde + 1
If Isekunde >= 60 Then
Isekunde = 0
Isminute = Isminute + 1
End If
If Isminute >= 60 Then
Isminute = 0
Istunde = Istunde + 1
End If
If Istunde >= 24 Then
Istunde = 0
End If
'**************************************
If Daysek > Dimupsek And Daysek < Dimdownsek And Daysek < Dimupsekstd Then 'Trigger nur erhöhen wenn Startzeit erreicht ist
If Dauer > Prescale2 And Pwm_trigger < Maxdim Then 'Trigger nur erhöhen wenn prescale erreicht ist (Teiler damit auf eine Stunde gedimmt wird)
Pwm_trigger = Pwm_trigger + 1 '170 ist max sonst 255
Dauer = 0
End If
End If
'**************************************
If Daysek > Dimdownsek Then 'Trigger nur verringern wenn die Startzeit für das Herunterdimmen erreicht ist
If Dauer > Prescale2 And Pwm_trigger > 0 Then 'Trigger nur verringern wenn prescale erreicht ist (Teiler damit auf eine Stunde gedimmt wird)
Pwm_trigger = Pwm_trigger - 1
Dauer = 0
End If
End If
'**************************************
Dauer = Dauer + 1
Return
Menustd:
Cls
Lcd "Stunde : "
Do
Locate 1 , 10
Lcd Istunde
If T_hoch = 0 And Flanke1 = 0 Then 'Stunde um eins erhöhen
Istunde = Istunde + 1
Flanke1 = 1
End If
If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0
If T_runter = 0 And Flanke3 = 0 Then 'Stunde um eins verringern
Istunde = Istunde - 1
Flanke3 = 1
End If
If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
If T_menu = 0 And Flanke2 = 0 Then
Flanke2 = 1
Goto Menumin
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
If T_home = 1 And Flanke4 = 0 Then
Flanke4 = 1
Goto Main
End If
If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
Loop
Return
Menumin:
Cls
Lcd "Minute : "
Locate 1 , 10
Lcd Isminute
Do
Locate 1 , 10
Lcd Isminute
If T_hoch = 0 And Flanke1 = 0 Then 'Minute um eins erhöhen
Isminute = Isminute + 1
Flanke1 = 1
End If
If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0 'Flanke entfernen
If T_runter = 0 And Flanke3 = 0 Then 'Minute um eins verringern
Isminute = Isminute - 1
Flanke3 = 1
End If
If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
If T_menu = 0 And Flanke2 = 0 Then
Flanke2 = 1
Goto Menustartstd
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
If T_home = 1 And Flanke4 = 0 Then
Flanke4 = 1
Goto Main
End If
If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
Loop
Return
Menustartstd:
Cls
Lcd "Start Stunde"
Do
Locate 2 , 1
Lcd Pwm_startstd
If T_hoch = 0 And Flanke1 = 0 Then 'Start Wert für das Dimmen erhöhen
Pwm_startstd = Pwm_startstd + 1
Flanke1 = 1
End If
If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0 'Flanke entfernen
If T_runter = 0 And Flanke3 = 0 Then 'Start Stunde um eins verringern
Pwm_startstd = Pwm_startstd - 1
Flanke3 = 1
End If
If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
If T_menu = 0 And Flanke2 = 0 Then
Flanke2 = 1
Goto Menustartmin
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
If T_home = 1 And Flanke4 = 0 Then
Flanke4 = 1
Goto Main
End If
If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
Loop
Return
Menustartmin:
Cls
Lcd "Start Minute"
Do
Locate 2 , 1
Lcd Pwm_startmin
If T_hoch = 0 And Flanke1 = 0 Then 'Start Wert für das Dimmen erhöhen
Pwm_startmin = Pwm_startmin + 1
Flanke1 = 1
End If
If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0 'Flanke entfernen
If T_runter = 0 And Flanke3 = 0 Then 'Start Minute um eins verringern
Pwm_startmin = Pwm_startmin - 1
Flanke3 = 1
End If
If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
If T_menu = 0 And Flanke2 = 0 Then
Flanke2 = 1
Goto Max_pwm
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
If T_home = 1 And Flanke4 = 0 Then
Flanke4 = 1
Goto Main
End If
If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
Loop
Return
Max_pwm:
Cls
Lcd "Max Beleuchtung in %"
Do
Locate 2 , 1
Lcd Maxpwm
If T_hoch = 0 And Flanke1 = 0 Then 'Maximalwert auf dem gedimmt werden soll
Maxpwm = Maxpwm + 1
If Maxpwm > 100 Then Maxpwm = 100
Flanke1 = 1
End If
If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0 'Flanke entfernen
If T_runter = 0 And Flanke3 = 0 Then
Maxpwm = Maxpwm - 1
Flanke3 = 1
End If
If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
If T_menu = 0 And Flanke2 = 0 Then
Flanke2 = 1
Goto Menustopstd
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
If T_home = 1 And Flanke4 = 0 Then
Flanke4 = 1
Goto Main
End If
If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
Loop
Return
Menustopstd:
Cls
Lcd "Stop Stunde"
Do
Locate 2 , 1
Lcd Pwm_stopstd
If T_hoch = 0 And Flanke1 = 0 Then 'Start Wert für das Dimmen erhöhen
Pwm_stopstd = Pwm_stopstd + 1
Flanke1 = 1
End If
If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0 'Flanke entfernen
If T_runter = 0 And Flanke3 = 0 Then 'Start Stunde um eins verringern
Pwm_stopstd = Pwm_stopstd - 1
Flanke3 = 1
End If
If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
If T_menu = 0 And Flanke2 = 0 Then
Flanke2 = 1
Goto Menustopmin
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
If T_home = 1 And Flanke4 = 0 Then
Flanke4 = 1
Goto Main
End If
If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
Loop
Return
Menustopmin:
Cls
Lcd "Stop Minute"
Do
Locate 2 , 1
Lcd Pwm_stopmin
If T_hoch = 0 And Flanke1 = 0 Then 'Start Wert für das Dimmen erhöhen
Pwm_stopmin = Pwm_stopmin + 1
Flanke1 = 1
End If
If T_hoch = 1 And Flanke1 = 1 Then Flanke1 = 0 'Flanke entfernen
If T_runter = 0 And Flanke3 = 0 Then 'Start Minute um eins verringern
Pwm_stopmin = Pwm_stopmin - 1
Flanke3 = 1
End If
If T_runter = 1 And Flanke3 = 1 Then Flanke3 = 0
If T_menu = 0 And Flanke2 = 0 Then
Flanke2 = 1
Goto Main
End If
If T_menu = 1 And Flanke2 = 1 Then Flanke2 = 0
If T_home = 1 And Flanke4 = 0 Then
Flanke4 = 1
Goto Main
End If
If T_home = 0 And Flanke4 = 1 Then Flanke4 = 0
Loop
Return