$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_auto 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_auto = Input
Config Rc5 = Pinc.0 ' IR --> RC5
Dim Isekunde As Byte , Isminute As Byte , Dauer As Byte , Prozw3 As Byte
Dim Istunde As Byte , Pwm_stopstd As Byte , Pwm_stopmin As Byte , Maxdim As Byte
Dim Pwm_trigger As Byte , Pwm_startmin As Byte , Maxpwm As Byte , Prescale As Single
Dim Proz1 As Single , Prozw1 As Single , Prozw As Single , Pwm_wert As Single
Dim Proz2 As Single , Maxpwm1 As Single , Auto As Byte , menu as byte , Prescale2 As Byte , Pwm_startstd 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 , Adress2 As Byte , Command2 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 auf 100 %
Isekunde = 0
Isminute = 16
Istunde = 21
Pwm_startstd = 08
Pwm_startmin = 00
Pwm_stopstd = 19
Pwm_stopmin = 0
Maxpwm = 50
Pwm_trigger = 0
Pwm_wert = 0
Dauer = 0
menu = 0 ' Menü deaktiviert beim Start
Auto = 1 'Automatik beim Start aktiv
'**************************************
Daysek3 = Istunde * 3600 ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = Isminute * 60
Daysek = Daysek2 + Daysek3
Dimdownsek3 = Pwm_stopstd * 3600
Dimdownsek2 = Pwm_stopmin * 60
Dimdownsek = Dimdownsek2 + Dimdownsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimdownsekstd = Dimdownsek + 3600
Dimupsek3 = Pwm_startstd * 3600
Dimupsek2 = Pwm_startmin * 60
Dimupsek = Dimupsek2 + Dimupsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimupsekstd = Dimupsek + 3600
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
'**************************************
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
' If Auto = 1 Then Lcd "Automatik"
' If Auto = 0 Then Lcd "Manual "
' Lcd Adress
' Locate 2 , 11
' Lcd Command
End If
'**************************************
Ocr2a = Pwm_wert 'Ausgabe Spannung PWM (0-255)
'**************************************
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 Command = 1 Or Command2 = 1 Then Auto = 0
If Command = 2 Or Command2 = 2 Then Auto = 1
Getrc5(adress2 , Command2) ' RC5-Fernbedienung einlesen
If Adress2 < 255 Then
Command2 = Command2 And &B01111111
End If
If Menu = 0 Then
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
If Auto = 1 Then Lcd "Automatik"
If Auto = 0 Then Lcd "Manual "
End If
Debounce T_menu , 0 , menustd , Sub
Debounce T_hoch , 0 , addieren , Sub
Debounce T_runter , 0 , Subtrahieren , Sub
Loop
Timer_irq: ' der Interrupt wird jede Sekunde ausgeführt
Timer1 = Timervorgabe
Maxpwm1 = Maxpwm
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
Daysek = Daysek + 1 ' Sekunden des gesamten Tages
If Daysek > 86400 Then Daysek = 0 ' 86400 = 1 Tag in Sekunden
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
'*****************************
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
'*****************************
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
'*****************************
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
'*****************************
Dauer = 0
End If
End If
'**************************************
If Daysek > Dimupsek And Dimupsek < Dimdownsek And Auto = 1 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 And Auto = 1 Then
Evg = 0 'EVG ausschalten
Backlight = 0 'Backlight ausschalten
End If
If Daysek >= Dimdownsek And Daysek < 82800 And Auto = 1 Then
Moonlight = 1 'Mondlicht beim herabdimmen einschalten
End If
If Daysek >= 82800 And Auto = 1 Then
Moonlight = 0 'Mondlicht um 23:00 Uhr ausschalten
End If
'**************************************
Dauer = Dauer + 1
Return
menustd:
Menu = Menu + 1
if menu > 7 then menu = 0
cls
select case menu
case 1 :
LCD "Stunde: "
lcd sstunde
case 2 :
lcd "Minute: "
Lcd Sminute
case 3 :
lcd "Start Stunde: "
lcd pwm_startstd
case 4 :
lcd "Start Minute: "
lcd pwm_startmin
case 5 :
lcd "Stop Stunde: "
lcd pwm_stopstd
case 6 :
lcd "Stop Minute: "
lcd pwm_stopmin
case 7 :
Lcd "Max Beleuchtung"
Locate 2 , 1
Lcd "in %: "
lcd maxpwm
end select
return
addieren:
select case menu
case 1 :
Istunde = Istunde + 1
if istunde > 23 then istunde = 0
Daysek3 = Istunde * 3600 ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = Isminute * 60
Daysek = Daysek2 + Daysek3
Locate 1 , 10
Lcd Istunde
case 2 :
Isminute = Isminute + 1
if isminute > 59 then isminute = 0
Daysek3 = Istunde * 3600 ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = Isminute * 60
Daysek = Daysek2 + Daysek3
Locate 1 , 10
Lcd Istunde
case 3 :
pwm_startstd = pwm_startstd + 1
if pwm_startstd > 23 then pwm_startstd = 0
Locate 1 , 10
Lcd Pwm_startstd
case 4 :
pwm_startmin = pwm_startmin + 1
if pwm_startmin > 59 then pwm_startstd = 0
Locate 1 , 10
Lcd Pwm_startmin
case 5 :
pwm_stopstd = pwm_stopstd + 1
if pwm_stopstd > 23 then pwm_stopstd = 0
Locate 1 , 10
Lcd Pwm_stopstd
Dimdownsek3 = Pwm_stopstd * 3600
Dimdownsek2 = Pwm_stopmin * 60
Dimdownsek = Dimdownsek2 + Dimdownsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimdownsekstd = Dimdownsek + 3600
Dimupsek3 = Pwm_startstd * 3600
Dimupsek2 = Pwm_startmin * 60
Dimupsek = Dimupsek2 + Dimupsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimupsekstd = Dimupsek + 3600 'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
case 6 :
pwm_stopmin = pwm_stopmin + 1
if pwm_stopmin > 59 then pwm_stopmin = 0
Locate 1 , 10
Lcd Pwm_stopmin
Dimdownsek3 = Pwm_stopstd * 3600
Dimdownsek2 = Pwm_stopmin * 60
Dimdownsek = Dimdownsek2 + Dimdownsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimdownsekstd = Dimdownsek + 3600
Dimupsek3 = Pwm_startstd * 3600
Dimupsek2 = Pwm_startmin * 60
Dimupsek = Dimupsek2 + Dimupsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimupsekstd = Dimupsek + 3600 'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
case 7 :
maxpwm = maxpwm + 1
if maxpwm > 100 then maxpwm = 0
locate 1, 10
lcd maxpwm
'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
end select
return
subtrahieren:
select case menu
case 1 :
Istunde = Istunde - 1
if istunde < 0 then istunde = 0
Daysek3 = Istunde * 3600 ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = Isminute * 60
Daysek = Daysek2 + Daysek3
Locate 1 , 10
Lcd Istunde
case 2 :
Isminute = Isminute - 1
if isminute < 0 then isminute = 0
Daysek3 = Istunde * 3600 ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = Isminute * 60
Daysek = Daysek2 + Daysek3
Locate 1 , 10
Lcd Istunde
case 3 :
pwm_startstd = pwm_startstd - 1
if pwm_startstd < 0 then pwm_startstd = 0
Locate 1 , 10
Lcd Pwm_startstd
case 4 :
pwm_startmin = pwm_startmin - 1
if pwm_startmin < 0 then pwm_startmin = 0
Locate 1 , 10
Lcd Pwm_startmin
case 5 :
pwm_stopstd = pwm_stopstd - 1
If Pwm_stopstd < 0 Then Pwm_stopstd = 0
Locate 1 , 10
Lcd Pwm_stopstd
Dimdownsek3 = Pwm_stopstd * 3600
Dimdownsek2 = Pwm_stopmin * 60
Dimdownsek = Dimdownsek2 + Dimdownsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimdownsekstd = Dimdownsek + 3600
Dimupsek3 = Pwm_startstd * 3600
Dimupsek2 = Pwm_startmin * 60
Dimupsek = Dimupsek2 + Dimupsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimupsekstd = Dimupsek + 3600 'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
case 6 :
pwm_stopmin = pwm_stopmin - 1
if pwm_stopmin < 0 then pwm_stopmin = 0
Locate 1 , 10
Lcd Pwm_stopmin
Dimdownsek3 = Pwm_stopstd * 3600
Dimdownsek2 = Pwm_stopmin * 60
Dimdownsek = Dimdownsek2 + Dimdownsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimdownsekstd = Dimdownsek + 3600
Dimupsek3 = Pwm_startstd * 3600
Dimupsek2 = Pwm_startmin * 60
Dimupsek = Dimupsek2 + Dimupsek3 ' Sekunde bestimmen ab der der Dimmvorgang gestartet werden soll
Dimupsekstd = Dimupsek + 3600 'Dimmzeit + einer Stunde damit das Ende des Dimmvorgangs bestimmt werden kann
case 7 :
maxpwm = maxpwm - 1
if maxpwm < 0 then maxpwm = 0
locate 1, 10
lcd maxpwm
'Prozente und Teilerberechnung für die PWM
'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
end select
return