' Programmkopf für MEGA644 ' Version 27 ' Umstellung der Schnittstelle auf neue Version ' Schalten aller Ausgänge über die Schnittstelle ' Umschalten zwischen Logger und Statusanzeige $regfile = "M644def.dat" 'es handelt sich um einen ATmega644 $crystal = 8000000 'Taktfrequenz 8 Mhz $hwstack = 40 'im Speicher werden für den Hardware-Stack 32 Byte reserviert $swstack = 60 'im Speicher werden für den Software-Stack 10 Byte reserviert $framesize = 60 'Im Speicher Werden Für Den Frame 40 Byte Reserviert $baud = 9600 ' Geschwindigkeit für Schnittstelle '##################################################################### ' Konstanten definieren '##################################################################### Const Vers = "20160619_V27" ' Versionsangabe Const Ein = 1 ' für Relais Const Aus = 0 Const Sekunde = 1 Const Rmaximal = 66 ' Maximalanzahl der Rückmelder Const Amaximal = 66 ' Maximalanzahl der Ausgänge Const Pmaximal = 20 ' Maximalanzahl der Parameterspeicher Const Timerjust = 26472 ' Justierung der Uhrzeit Const Weinlesen = 200 ' Wartezeit nach einlesen der Tasten Const Minute = 60 ' Konstanten für Timereinstellungen Const Stunde = 3600 Const Tag = 86400 Const Woche = 604800 Const Monat = 181440000 ' 30 Tage '###################################################################### 'ALIAS - Deklarieren / PIN-Belegung '###################################################################### ' Port A - Belegung Fa0 Alias Pina.0 ' Freie Ports Fa1 Alias Pina.1 Fa2 Alias Pina.2 Fa3 Alias Pina.3 Fa4 Alias Pina.4 Fa5 Alias Pina.5 Fa6 Alias Pina.6 Fa7 Alias Pina.7 ' Port B - Belegung ' LCD - Display Lcde Alias Portb.0 Lcdrs Alias Portb.1 Lcd7 Alias Portb.2 Lcd6 Alias Portb.3 Lcd5 Alias Portb.4 Lcd4 Alias Portb.5 Fb1 Alias Portb.6 ' Freie - Ports Fb2 Alias Portb.7 ' Port C - Belegung E_reset Alias Portc.0 ' Rückmelder E_clk Alias Portc.1 E_ps Alias Portc.2 E_dat Alias Pinc.3 T_reset Alias Portc.4 ' Tastenfeld T_clk Alias Portc.5 T_ps Alias Portc.6 T_dat Alias Pinc.7 ' Port D - Belegung Rs232_rx Alias Portd.0 ' RS232 - Schnittstelle Rs232_tx Alias Portd.1 Taste1 Alias Pind.2 ' TASTER für die Programmeinstellungen Taste2 Alias Pind.3 Taste3 Alias Pind.4 Dat Alias Portd.5 ' Ports für das Schieberegister Clk Alias Portd.6 Stg Alias Portd.7 Stg_port Alias Portd Stg_pin Alias 7 Tim1 Alias Timer1 '####################################################################### 'Portstatus setzen '####################################################################### Config Taste1 = Input ' für Taster Config Taste2 = Input Config Taste3 = Input Portd.2 = 1 ' PullUp-Widerstand einschalten ( für Taster ) Portd.3 = 1 Portd.4 = 1 Config Clk = Output ' für Schieberegister Config Stg = Output Config Dat = Output Config E_dat = Input ' für Rückmelder Config E_ps = Output Config E_clk = Output Config E_reset = Output Portc.3 = 1 Config T_dat = Input ' für Tastenfeld Config T_ps = Output Config T_clk = Output Config T_reset = Output Portc.7 = 1 Config Tim1 = Timer , Prescale = 1024 On Ovf1 On_tint1 Enable Ovf1 'Schnittstellen konfiguration + Interrupt aktivieren Config Serialin = Buffered , Size = 30 , Bytematch = 60 Enable Interrupts '##################################################################### ' Variablen Deklaration '##################################################################### Dim I As Integer Dim T As Integer ' Zählervariable für TIMERCHECKEN Dim Z As Byte Dim X As Byte Dim Ln As Integer Dim Zw As String * 10 Dim Tbit As Byte ' Tasteneingabe Entpreller Dim U As Integer ' Außenbeleuchtung EIN-Check Dim Durch As Word ' Durchlaufzähler Dim Takt As Byte ' Taktgeber für Timer Dim Timsek As Long ' Sekundenzähler Dim Rmax As Byte Dim Amax As Byte Dim Pmax As Byte Dim Sb_a As Byte ' Variable für Übergabe in Schieberegister Dim Sb(amaximal) As Byte ' Statusvariable für Schaltzustände Dim Sba(amaximal) As Byte ' Verbraucherart Dim Sbs(amaximal) As Long ' Sonstige Eigenschaften ( zu Timerwert ) Dim Sbz(amaximal) As Long ' Zwischenspeicher ( zu Einschaltzeitpunkt ) Dim Sbsg(amaximal) As Long ' Grundeinstellungen für Schalteigenschaften Dim Sbss(amaximal) As Eram Long ' Speicher für Schalteigenschaften im Eeprom Dim Eb_a As Byte ' Variable für Übernahme von Rückmelder Dim Eb(rmaximal) As Byte ' Variable zum Speichern der Rückmeldezustände Dim Ebz(rmaximal) As Byte ' Status bei der letzten Melderabfrage Dim Eba(rmaximal) As Byte ' Schalterart ( Taster = 1 ; Schalter = 0 ) Dim Tb_a As Byte ' Variable für Übernahme der Eingaben Dim Tb(16) As Byte ' Variable zum speichern der Eingaben Dim T_eing As String * 5 ' Speicherung der Eingabe Dim Modus As Byte ' Statusvariable für Betriebsart Dim Ebene As Byte ' Statusvariable für LCD - Parametereingabe Dim P(pmaximal) As Byte ' Variablen für Programmeinstellungen Dim Ps(pmaximal) As Eram Byte ' Speicher Für Einstellungen Am Eeprom Dim Pg(pmaximal) As Byte ' Grundeinstellungen Dim Tzw As Byte ' Variablen für Testprogramm Dim Tpar As Byte ' Parameternummer Dim Twert As Long ' Neuer Wert Dim Twertalt As Long ' Alter Wert Dim Tsb As Byte ' Testprogramm Einstellen der Schaltzeiten Dim Tsbdauer As Long ' Testprogramm Einstellen der Schaltzeiten Dim Tnacht As Byte ' Nacht = 1; Tag = 0 Dim Serindata As String * 5 ' Einlesevariable für die Serielle Schnittstelle Dim Serinschalter As String * 5 ' Einlesevariable für Schalter Dim Serzw As String * 200 ' Serielle Ausgabe => Zwischenspeicher Dim Serzw1 As String * 30 ' Serielle Ausgabe => Zwischenspeicher Dim Serzw2 As String * 5 ' Serielle Ausgabe => Zwischenspeicher Dim Serzw3 As String * 30 ' Serielle Ausgabe => Zwischenspeicher Dim Sw As Byte ' Statusvariable für Daten an der Schnittstelle Dim Si As Integer ' Zähler für das Auslesen bzw. Zerlegen Dim Si2 As Integer ' Position der '#' im String Dim Loggerein As Integer ' Status der Ausgabe an Schnittstelle ( Logger / Bedienung ) Dim Xstd As Integer ' STD-Variable für Uhr Dim Xmin As Integer ' Minuten-Variable für UHR Dim Xsec As Integer ' Sekunden-Variable für integer Dim Wkurz As Byte ' Wartezeiten bei Einlesen Dim Wlang As Byte '###################################################################### 'SUB - Deklaration '###################################################################### Declare Sub Eepromsicherung() Declare Sub Eepromladen() Declare Sub Grundeinstellungen() Declare Sub Zeiteinstellungen() Declare Sub Einlesen() Declare Sub Ausgabe() Declare Sub Lcd_ausgabe() Declare Sub Tastaturauswertung() Declare Sub Schaltlogik() Declare Sub Statusneu(byval X As Byte) Declare Sub Timersetzen(byval X As Byte ) Declare Sub Timersetzenfix(byval X As Byte , Byval Fi As Long ) Declare Sub Timerchecken() Declare Sub Lcd_zeile(byval Text As String , Byval Zahl As Byte , Byval Zeile As Byte) Declare Sub Serialausgabe() Declare Sub Serialstatus(byval X As Byte) Declare Sub Serialstatusges() Declare Sub Serialausgabefirst() Declare Sub Serialschalterauswerten() Declare Sub Testprogramm(byval X As Byte) '###################################################################### ' Configuration des µC '###################################################################### Config Lcdpin = Pin , Db4 = Lcd4 , Db5 = Lcd5 , Db6 = Lcd6 , Db7 = Lcd7 , E = Lcde , Rs = Lcdrs Config Lcd = 16 * 4 Cls Locate 1 , 1 Lcd "Programm Start" '####################################################################### ' Parameter initialisieren '####################################################################### Durch = 0 Takt = 0 Timsek = 0 Modus = 5 Tbit = 0 Rmax = Rmaximal ' Maximalanzahl der Rückmelder Amax = Amaximal ' Maximalanzahl der Ausgänge Pmax = Pmaximal ' Maximalanzahl der Parameterspeicher Tzw = 1 ' Testvariable setzen Loggerein = 1 ' Schnittstelle auf Logger setzen Serinschalter = "" ' Serialschalter auf LEER ' Taster / Schalterdefinition ( Taster = 1; Schalter = 2 ) Eba(1) = 1 Eba(2) = 1 Eba(3) = 1 Eba(4) = 1 Eba(5) = 1 Eba(6) = 1 Eba(7) = 1 Eba(8) = 1 Eba(9) = 1 Eba(10) = 1 Eba(11) = 1 Eba(12) = 1 Eba(13) = 1 Eba(14) = 1 Eba(15) = 1 Eba(16) = 1 Eba(17) = 1 Eba(18) = 1 Eba(19) = 1 Eba(20) = 1 Eba(21) = 1 Eba(22) = 1 Eba(23) = 1 Eba(24) = 1 Eba(25) = 1 Eba(26) = 1 Eba(27) = 1 Eba(28) = 1 Eba(29) = 1 Eba(30) = 1 Eba(31) = 1 Eba(32) = 1 Eba(33) = 2 Eba(34) = 2 Eba(35) = 2 Eba(36) = 2 Eba(37) = 2 Eba(38) = 2 Eba(39) = 2 Eba(40) = 2 Eba(41) = 2 Eba(42) = 2 Eba(43) = 2 Eba(44) = 2 Eba(45) = 2 Eba(46) = 2 Eba(47) = 2 Eba(48) = 2 Eba(49) = 2 Eba(50) = 2 Eba(51) = 2 Eba(52) = 2 Eba(53) = 2 Eba(54) = 2 Eba(55) = 2 Eba(56) = 2 Eba(57) = 2 Eba(58) = 2 Eba(59) = 2 Eba(60) = 2 Eba(61) = 2 Eba(62) = 2 Eba(63) = 2 Eba(64) = 2 ' Verbraucherart definieren ( 1 = Licht; 2 = Steckdose ) Sba(1) = 1 Sba(2) = 1 Sba(3) = 1 Sba(4) = 1 Sba(5) = 1 Sba(6) = 1 Sba(7) = 1 Sba(8) = 1 Sba(9) = 1 Sba(10) = 1 Sba(11) = 1 Sba(12) = 1 Sba(13) = 1 Sba(14) = 1 Sba(15) = 1 Sba(16) = 1 Sba(17) = 1 Sba(18) = 1 Sba(19) = 1 Sba(20) = 1 Sba(21) = 1 Sba(22) = 1 Sba(23) = 1 Sba(24) = 1 Sba(25) = 1 Sba(26) = 1 Sba(27) = 1 Sba(28) = 1 Sba(29) = 1 Sba(30) = 1 Sba(31) = 1 Sba(32) = 1 Sba(33) = 1 Sba(34) = 1 Sba(35) = 1 Sba(36) = 1 Sba(37) = 1 Sba(38) = 1 Sba(39) = 1 Sba(40) = 1 Sba(41) = 1 Sba(42) = 1 Sba(43) = 1 Sba(44) = 1 Sba(45) = 1 Sba(46) = 1 Sba(47) = 1 Sba(48) = 1 Sba(49) = 1 Sba(50) = 1 Sba(51) = 1 Sba(52) = 1 Sba(53) = 1 Sba(54) = 1 Sba(55) = 1 Sba(56) = 1 Sba(57) = 1 Sba(58) = 1 Sba(59) = 1 Sba(60) = 1 Sba(61) = 1 Sba(62) = 1 Sba(63) = 1 Sba(64) = 1 ' Sonstige Eigenschaften definieren ( 0 = keine; kleinster Timerwert = 5 sec ) ' Einschaltzeiten der Geräte in Sekunden ' Sbsg(1) = 10800 Sbsg(2) = 10800 Sbsg(3) = 0 Sbsg(4) = 10800 Sbsg(5) = 300 Sbsg(6) = 300 Sbsg(7) = 300 Sbsg(8) = 300 Sbsg(9) = 300 Sbsg(10) = 10800 Sbsg(11) = 10800 Sbsg(12) = 10800 Sbsg(13) = 3600 Sbsg(14) = 3600 Sbsg(15) = 3600 Sbsg(16) = 7200 Sbsg(17) = 7200 Sbsg(18) = 3600 Sbsg(19) = 0 Sbsg(20) = 0 Sbsg(21) = 900 Sbsg(22) = 0 Sbsg(23) = 0 Sbsg(24) = 3600 Sbsg(25) = 900 Sbsg(26) = 600 Sbsg(27) = 3600 Sbsg(28) = 3600 Sbsg(29) = 3600 Sbsg(30) = 5 Sbsg(31) = 180 Sbsg(32) = 180 Sbsg(33) = 180 Sbsg(34) = 1800 Sbsg(35) = 1800 Sbsg(36) = 0 Sbsg(37) = 3600 Sbsg(38) = 600 Sbsg(39) = 600 Sbsg(40) = 1800 Sbsg(41) = 1800 Sbsg(42) = 0 Sbsg(43) = 0 Sbsg(44) = 900 Sbsg(45) = 0 Sbsg(46) = 0 Sbsg(47) = 0 Sbsg(48) = 0 Sbsg(49) = 0 Sbsg(50) = 0 Sbsg(51) = 0 Sbsg(52) = 0 Sbsg(53) = 0 Sbsg(54) = 0 Sbsg(55) = 0 Sbsg(56) = 0 Sbsg(57) = 0 Sbsg(58) = 0 Sbsg(59) = 0 Sbsg(60) = 0 Sbsg(61) = 0 Sbsg(62) = 0 Sbsg(63) = 0 Sbsg(64) = 600 ' Einschaltdauer der Außenbeleuchtung bei Handbetrieb ' Interne Parameter definieren Pg(1) = 1 ' Schalter über Rückmelder = 1; Schalter direkt = 0 Pg(2) = 64 ' Anzahl Rückmelder ( mindestens 16 ) Pg(3) = 64 ' Anzahl Ausgänge Pg(4) = 1 Pg(5) = 4 Pg(6) = 0 Pg(7) = 0 Pg(8) = 0 Pg(9) = 0 Pg(10) = 0 Pg(11) = 0 Pg(12) = 0 Pg(13) = 0 Pg(14) = 0 Pg(15) = 0 Pg(16) = 0 Pg(17) = 0 Pg(18) = 0 Pg(19) = 0 Pg(20) = 0 Wkurz = P(4) Wlang = P(5) '########################################################################### ' Hauptprogramm '########################################################################### ' Ein und Ausgänge zurücksetzen Cls Lcd "Programmstart" ' 1. Mal ausführen For I = 1 To Amax Sb(i) = 0 Next Call Ausgabe() Call Eepromladen() Call Einlesen() For I = 1 To Rmax Ebz(i) = Eb(i) Next For I = 1 To 16 Tb(i) = 0 Next Call Serialausgabefirst() ' kurze Pause Wait 2 Cls ' Starten der Endlosschleife Do Incr Durch ' Durchlaufzähler ' If Durch = 240 Then Durch = 1 Cls End If Zw = Str(durch) ' Einlesen von Tastendrücken und Rückmeldern Call Einlesen() ' Auswerten der eingelesenen Tastendrücke Call Serialschalterauswerten() Call Tastaturauswertung() Call Schaltlogik() ' Ausgabe der Schaltzustände am LCD - Display Call Lcd_ausgabe() ' Ausgabe der Schaltzustände am SERIALPORT Select Case Loggerein Case 1 : If Durch = 200 Then Call Serialausgabe() ' Ausgabe in LOG-File Case 2 : If Durch = 100 Then Call Serialstatusges() ' Ausgabe in Instumentenübersicht End Select ' Ausgabe der Schaltzustände an die Schieberegister / Schalten der Ausgänge Call Ausgabe() Loop ' Ende der Endlosschhleife End 'Ende des Programms '############################################################################## ' BEGINN der UNTERPROGRAMME '############################################################################## Modus1: Select Case Modus Case 1 : Modus = 2 Case 2 : Modus = 3 Case 3 : Modus = 4 Case 4 : Modus = 5 Case 5 : Modus = 1 End Select Cls Return Modus0: Select Case Modus Case 1 : Modus = 5 Case 2 : Modus = 1 Case 3 : Modus = 2 Case 4 : Modus = 3 Case 5 : Modus = 4 End Select Cls Return On_tint1: Timsek = Timsek + 5 Call Timerchecken() Xsec = Xsec + 5 If Xsec > 55 Then Xmin = Xmin + 1 Xsec = 0 End If If Xmin > 59 Then Xstd = Xstd + 1 Xmin = 0 End If If Xstd = 24 Then Xstd = 0 If Timsek >= Monat Then Timsek = 0 End If Tim1 = Timerjust Return '############################################################### ' Einlesen Der Rückmelderegister Sub Einlesen() Disable Interrupts Set E_ps 'Auslesen einleiten Set T_ps Waitms Wlang Set E_clk 'Position 1 - 8 auslesen Set T_clk Waitms Wkurz Set E_reset 'Reset der Zwischenspeicher Set T_reset Reset E_clk Reset T_clk Waitms Wkurz Reset E_ps 'Einleiteimpuls zurücksetzen Reset T_ps Reset E_reset 'Reset zurücksetzen Reset T_reset Eb(1) = E_dat Tb(1) = T_dat Z = P(2) For I = 2 To 16 Set E_clk Set T_clk Waitms Wkurz Reset E_clk Reset T_clk Waitms Wkurz Eb(i) = E_dat Tb(i) = T_dat Next For I = 17 To Z Set E_clk Waitms Wkurz Reset E_clk Waitms Wkurz Eb(i) = E_dat Next Enable Interrupts End Sub '############################################################### ' Tastaturauswerung Sub Tastaturauswertung() If Tbit = 0 Then ' Auswerten der Tastatureingaben If Tb(15) = 1 Then For I = 1 To 10 If Tb(i) = 1 Then Select Case I Case 1 : T_eing = T_eing + "1" Case 2 : T_eing = T_eing + "2" Case 3 : T_eing = T_eing + "3" Case 4 : T_eing = T_eing + "4" Case 5 : T_eing = T_eing + "5" Case 6 : T_eing = T_eing + "6" Case 7 : T_eing = T_eing + "7" Case 8 : T_eing = T_eing + "8" Case 9 : T_eing = T_eing + "9" Case 10 : T_eing = T_eing + "0" End Select Tbit = 1 End If Next If Tb(11) = 1 Then T_eing = "" Cls Tbit = 1 End If If Tb(12) = 1 Then If Tb(13) = 1 Then Z = Val(t_eing) If Z > 0 Then If Z <= P(2) Then If Eba(z) = 1 Then Eb(z) = 1 If Eba(z) = 2 Then If Ebz(z) = 1 Then Ebz(z) = 0 Else Ebz(z) = 1 End If End If End If End If If Tb(14) = 1 Then Z = Val(t_eing) If Z > 0 Then If Z <= P(3) Then If Sb(z) = 1 Then Sb(z) = 0 Else Sb(z) = 1 End If End If End If T_eing = "" Cls Tbit = 1 End If End If If Tb(16) = 1 Then If Tb(1) = 1 Then Call Testprogramm(1) If Tb(2) = 1 Then Call Testprogramm(2) If Tb(3) = 1 Then Call Testprogramm(3) If Tb(4) = 1 Then Call Testprogramm(4) If Tb(5) = 1 Then Call Testprogramm(5) If Tb(6) = 1 Then Call Testprogramm(6) If Tb(8) = 1 Then Call Testprogramm(8) If Tb(9) = 1 Then Call Testprogramm(9) If Tb(11) = 1 Then ' nach oben' Gosub Modus1 Tbit = 1 End If If Tb(10) = 1 Then ' nach unten' Gosub Modus0 Tbit = 1 End If End If Else Waitms Weinlesen Call Einlesen() Tbit = 0 End If End Sub '############################################################### ' Schaltlogik ' Nummer des Verbrauchers der geschalten werden soll wird übergeben ' Wenn mit einem Taster 2 Verbraucher geschalten werden sollen muss die Funktion 2 ' mal aufgerufen werden Sub Schaltlogik() For I = 1 To P(2) ' Auswerten der Rückmelder If Ebz(i) <> Eb(i) Then ' Schaltlogik wird nur abgefragt bei Statusänderung ' ACHTUNG: Bei Tastern muss vor der Call-Anweisung immer geprüft werden ob Eb(x) = 1 ist. ' Bei Schaltern ist das nicht nötig da jede Statusänderung ausgewertet werden soll. Select Case I Case 1 : If Eb(i) = 1 Then Call Statusneu(1) Case 2 : If Eb(i) = 1 Then Call Statusneu(2) Case 3 : If Eb(i) = 1 Then Call Statusneu(1) Case 4 : If Eb(i) = 1 Then Call Statusneu(2) Case 5 : If Eb(i) = 1 Then Call Statusneu(5) Call Statusneu(6) End If Case 6 : If Eb(i) = 1 Then Call Statusneu(7) Call Statusneu(8) End If Case 7 : If Eb(i) = 1 Then Call Statusneu(5) Call Statusneu(6) End If Case 8 : If Eb(i) = 1 Then Call Statusneu(7) Call Statusneu(8) End If Case 9 : If Eb(i) = 1 Then Call Statusneu(7) Call Statusneu(8) End If Case 10 : If Eb(i) = 1 Then Call Statusneu(9) End If Case 11 : If Eb(i) = 1 Then Call Statusneu(11) Call Statusneu(12) End If Case 12 : If Eb(i) = 1 Then Call Statusneu(7) Call Statusneu(8) End If Case 13 : If Eb(i) = 1 Then Gosub Aussenleuchten End If Case 14 : If Eb(i) = 1 Then Call Statusneu(5) Call Statusneu(6) End If Case 15 : If Eb(i) = 1 Then Call Statusneu(9) End If Case 16 : Gosub Schalter16 Case 17 : If Eb(i) = 1 Then Call Statusneu(11) Call Statusneu(12) End If Case 18 : If Eb(i) = 1 Then Call Statusneu(4) End If Case 19 : If Eb(i) = 1 And Sb(21) = 0 Then Call Statusneu(21) End If Case 21 : If Eb(i) = 1 And Sb(34) = 0 Then Call Statusneu(34) Call Statusneu(35) End If Case 22 : If Eb(i) = 1 And Sb(31) = 0 Then Call Statusneu(31) Call Statusneu(32) Call Statusneu(33) End If Case 23 : If Eb(i) = 1 And Sb(31) = 0 Then Call Statusneu(31) Call Statusneu(32) Call Statusneu(33) End If Case 25 : If Eb(i) = 1 Then 'Kompressor Call Statusneu(44) End If Case 34 : Call Statusneu(10) Case 35 : Call Statusneu(14) Case 36 : Call Statusneu(13) Case 37 : Call Statusneu(13) Case 38 : Call Statusneu(15) Case 39 : Call Statusneu(18) Case 40 : Gosub Schalter40 Case 41 : Gosub Toroeffnen Case 42 : Gosub Torschließen Case 43 : Gosub Tag_nacht Case 44 : Gosub Schalter44 Case 45 : Call Statusneu(24) Case 46 : Call Statusneu(25) Case 47 : Call Statusneu(26) Case 48 : Call Statusneu(27) Case 49 : Call Statusneu(30) Case 50 : Gosub Schalter50 Case 53 : Call Statusneu(40) ' Holzlage Case 56 : Call Statusneu(41) ' Hasenstall Case 55 : Call Statusneu(29) ' Werkzeugraum Case 59 : Call Statusneu(21) ' Zusatzlicht Garage Case 60 : Call Statusneu(38) ' Scheinwerfer Carport End Select Ebz(i) = Eb(i) End If Next End Sub Tag_nacht: If Eb(43) = 1 Then Tnacht = 0 Else Tnacht = 1 Return Toroeffnen: If Tnacht = 1 Then Sb(39) = 1 Call Timersetzen(39) End If Return Torschließen: If Tnacht = 1 Then Sb(39) = 1 Call Timersetzenfix(39 , 60) End If Return Schalter40: U = 0 ' Prüfen ob einer der anzusprechende Lichter bereits ein ist U = U + Sb(37) U = U + Sb(39) If U > 0 Then ' In diesem Fall werden alle Licher ausgeschaltet Sb(37) = 0 Sb(39) = 0 Else ' Wenn keines ein ist werden alle eingeschaltet Sb(37) = 1 Call Timersetzen(37) Sb(39) = 1 Call Timersetzen(39) End If Return Schalter44: U = 0 ' Prüfen ob einer der anzusprechende Lichter bereits ein ist U = U + Sb(28) U = U + Sb(29) If U > 0 Then ' In diesem Fall werden alle Licher ausgeschaltet Sb(28) = 0 Sb(29) = 0 Else ' Wenn keines ein ist werden alle eingeschaltet Sb(28) = 1 Call Timersetzen(28) Sb(29) = 1 Call Timersetzen(29) End If Return Schalter16: U = 0 U = U + Sb(21) U = U + Sb(37) U = U + Sb(39) U = U + Sb(18) U = U + Sb(38) If U > 0 Then Sb(21) = 0 Sb(37) = 0 Sb(39) = 0 Sb(38) = 0 Sb(18) = 0 Else Sb(39) = 1 Call Timersetzen(39) Sb(21) = 1 Call Timersetzen(21) End If Return Schalter50: Call Statusneu(34) Call Statusneu(35) Return Aussenleuchten: U = 0 U = U + Sb(31) U = U + Sb(32) U = U + Sb(33) U = U + Sb(38) U = U + Sb(36) If U = 5 Then Sb(31) = 0 Sb(32) = 0 Sb(33) = 0 Sb(36) = 0 Sb(38) = 0 End If If U = 0 Then Sb(31) = 1 Call Timersetzenfix(31 , Sbs(64)) Sb(32) = 1 Call Timersetzenfix(32 , Sbs(64)) Sb(33) = 1 Call Timersetzenfix(33 , Sbs(64)) End If If U = 3 Then Call Timersetzenfix(31 , Sbs(64)) Call Timersetzenfix(32 , Sbs(64)) Call Timersetzenfix(33 , Sbs(64)) Sb(36) = 1 Call Timersetzenfix(36 , Sbs(64)) Sb(38) = 1 Call Timersetzenfix(38 , Sbs(64)) End If Return Sub Statusneu(byval X As Byte) If Sb(x) = 0 Then Sb(x) = 1 Call Timersetzen(x) Else Sb(x) = 0 End If Call Serialstatus(x) End Sub '############################################################### ' Timer setzen Sub Timersetzen(byval X As Byte ) ' Setzt die Vordefnierte Einschaltdauer Sbz(x) = Sbs(x) + Timsek If Sbz(x) >= Monat Then Sbz(x) = Sbz(x) - Monat End Sub Sub Timersetzenfix(byval X As Byte ; Byval Fi As Long ) ' Setzt eine übergebene nicht die vordefinierte Einschaltdauer Sbz(x) = Fi + Timsek If Sbz(x) >= Monat Then Sbz(x) = Sbz(x) - Monat End Sub '############################################################### ' Timer checken Sub Timerchecken() For T = 1 To P(3) If Sbz(t) > 0 Then If Sbz(t) <= Timsek Then Sb(t) = 0 Sbz(t) = 0 Call Serialstatus(x) End If End If Next End Sub '############################################################### ' Ausgabe An Schieberegister Sub Ausgabe() If P(3) > 56 Then For I = 56 To 63 Z = I - 56 Sb_a.z = Sb(i + 1) Next Shiftout Dat , Clk , Sb_a , 1 , 8 End If If P(3) > 48 Then For I = 48 To 55 Z = I - 48 Sb_a.z = Sb(i + 1) Next Shiftout Dat , Clk , Sb_a , 1 , 8 End If If P(3) > 40 Then For I = 40 To 47 Z = I - 40 Sb_a.z = Sb(i + 1) Next Shiftout Dat , Clk , Sb_a , 1 , 8 End If If P(3) > 32 Then For I = 32 To 39 Z = I - 32 Sb_a.z = Sb(i + 1) Next Shiftout Dat , Clk , Sb_a , 1 , 8 End If If P(3) > 24 Then For I = 24 To 31 Z = I - 24 Sb_a.z = Sb(i + 1) Next Shiftout Dat , Clk , Sb_a , 1 , 8 End If If P(3) > 16 Then For I = 16 To 23 Z = I - 16 Sb_a.z = Sb(i + 1) Next Shiftout Dat , Clk , Sb_a , 1 , 8 End If If P(3) > 8 Then For I = 8 To 15 Z = I - 8 Sb_a.z = Sb(i + 1) Next Shiftout Dat , Clk , Sb_a , 1 , 8 End If If P(3) > 1 Then For I = 0 To 7 Z = I Sb_a.z = Sb(i + 1) Next Shiftout Dat , Clk , Sb_a , 1 , 8 Pulseout Stg_port , Stg_pin , 90000 End If End Sub Sub Lcd_ausgabe() ' E/A 1-16 anzeigen If Modus = 1 Then Locate 1 , 1 Lcd "Schalter 1-16 " Locate 2 , 1 Lcd Eb(1) ; Eb(2) ; Eb(3) ; Eb(4) ; Eb(5) ; Eb(6) ; Eb(7) ; Eb(8) ; Eb(9) ; Eb(10) ; Eb(11) ; Eb(12) ; Eb(13) ; Eb(14) ; Eb(15) ; Eb(16) Locate 3 , 1 Lcd "Verbraucher 1-16" Locate 4 , 1 Lcd Sb(1) ; Sb(2) ; Sb(3) ; Sb(4) ; Sb(5) ; Sb(6) ; Sb(7) ; Sb(8) ; Sb(9) ; Sb(10) ; Sb(11) ; Sb(12) ; Sb(13) ; Sb(14) ; Sb(15) ; Sb(16) End If ' E/A 17 - 32 anzeigen If Modus = 2 Then Locate 1 , 1 Lcd "Schalter 17-32" Locate 2 , 1 Lcd Eb(17) ; Eb(18) ; Eb(19) ; Eb(20) ; Eb(21) ; Eb(22) ; Eb(23) ; Eb(24) ; Eb(25) ; Eb(26) ; Eb(27) ; Eb(28) ; Eb(29) ; Eb(30) ; Eb(31) ; Eb(32) Locate 3 , 1 Lcd "Verbraucher17-32" Locate 4 , 1 Lcd Sb(17) ; Sb(18) ; Sb(19) ; Sb(20) ; Sb(21) ; Sb(22) ; Sb(23) ; Sb(24) ; Sb(25) ; Sb(26) ; Sb(27) ; Sb(28) ; Sb(29) ; Sb(30) ; Sb(31) ; Sb(32) End If ' E/A 33 - 48 anzeigen If Modus = 3 Then Locate 1 , 1 Lcd "Schalter 33-48" Locate 2 , 1 Lcd Eb(33) ; Eb(34) ; Eb(35) ; Eb(36) ; Eb(37) ; Eb(38) ; Eb(39) ; Eb(40) ; Eb(41) ; Eb(42) ; Eb(43) ; Eb(44) ; Eb(45) ; Eb(46) ; Eb(47) ; Eb(48) Locate 3 , 1 Lcd "Verbraucher33-48" Locate 4 , 1 Lcd Sb(33) ; Sb(34) ; Sb(35) ; Sb(36) ; Sb(37) ; Sb(38) ; Sb(39) ; Sb(40) ; Sb(41) ; Sb(42) ; Sb(43) ; Sb(44) ; Sb(45) ; Sb(46) ; Sb(47) ; Sb(48) End If ' E/A 49 - 64 anzeigen If Modus = 4 Then Locate 1 , 1 Lcd "Schalter 49-64" Locate 2 , 1 Lcd Eb(49) ; Eb(50) ; Eb(51) ; Eb(52) ; Eb(53) ; Eb(54) ; Eb(55) ; Eb(56) ; Eb(57) ; Eb(58) ; Eb(59) ; Eb(60) ; Eb(61) ; Eb(62) ; Eb(63) ; Eb(64) Locate 3 , 1 Lcd "Verbraucher 49-64" Locate 4 , 1 Lcd Sb(49) ; Sb(50) ; Sb(51) ; Sb(52) ; Sb(53) ; Sb(54) ; Sb(55) ; Sb(56) ; Sb(57) ; Sb(58) ; Sb(59) ; Sb(60) ; Sb(61) ; Sb(62) ; Sb(63) ; Sb(64) End If ' Normalanzeige If Modus = 5 Then Locate 1 , 1 Lcd Vers ; "-" ; Durch Locate 2 , 1 Lcd "Zeit: " ; Xstd ; ":" ; Xmin ; ":" ; Xsec Locate 3 , 1 Lcd "Eingabe:" ; T_eing Locate 4 , 1 Lcd "Z: " ; Timsek End If End Sub '############################################################### ' Testprogramme Sub Testprogramm(byval X As Byte) Cls If X = 1 Then Locate 1 , 1 Lcd "Parametereingabe" Locate 2 , 1 Lcd "[NEXT][+][-]" Ebene = 1 End If If X = 2 Then Locate 1 , 1 Lcd "Ausgänge testen" Locate 2 , 1 Lcd "Signal=ENTER" End If If X = 3 Then Locate 1 , 1 Lcd "Rückmelder =>" Locate 2 , 1 Lcd " auf Ausgänge" End If If X = 4 Then Locate 1 , 1 Lcd "Uhr einstellen" End If If X = 5 Then Locate 2 , 1 Lcd "Alles aus" Locate 3 , 1 Lcd " " Wait 1 For I = 1 To Amax Sb(i) = 0 Next Call Ausgabe() End If If X = 6 Then Locate 1 , 1 Lcd "Schaltz. abfr.:" Locate 2 , 1 Lcd "Verbraucher: " Locate 3 , 1 Lcd "Zeit: " End If If X = 9 Then Locate 1 , 1 Lcd "Grundeinst. u." Locate 2 , 1 Lcd "Zeiteinstellung" Locate 3 , 1 Lcd "laden!" Wait 2 Call Grundeinstellungen Call Zeiteinstellungen Call Eepromsicherung() Cls End If If X = 8 Then Locate 1 , 1 Lcd "Schaltz. eing.:" Locate 2 , 1 Lcd "Verbraucher: " Locate 3 , 1 Lcd "Zeit: " End If Wait 1 Tbit = 0 Do Call Einlesen() If Tb(9) = 1 Then Exit Do If X = 4 Then Exit Do If X = 5 Then Exit Do If X = 9 Then Exit Do If Tbit = 0 Then If X = 1 Then Select Case Ebene Case 1 : Call Lcd_zeile( "Betr.art :" , P(ebene) , 1) Case 2 : Call Lcd_zeile( "Anz.Eing.:" , P(ebene) , 1) Case 3 : Call Lcd_zeile( "Anz.Ausg.:" , P(ebene) , 1) Case 4 : Call Lcd_zeile( "Wkurz :" , P(ebene) , 1) Case 5 : Call Lcd_zeile( "Wlang :" , P(ebene) , 1) End Select If Tb(12) = 1 Then Incr Ebene If Tb(11) = 1 Then Incr P(ebene) If Tb(10) = 1 Then Decr P(ebene) If Ebene > 5 Then Wkurz = P(4) Wlang = P(5) Call Eepromsicherung() Exit Do End If End If If X = 2 Then ' Test aller Ausgänge ( Signal schaltet bei jedem Tastendruck um 1 weiter If Tb(12) = 1 Then Sb(tzw) = 0 If Tzw < P(3) Then Tzw = Tzw + 1 Else Tzw = 1 Sb(tzw) = 1 End If End If If X = 3 Then ' Einlesen der Rückmelder und 1 zu 1 auf die Ausgänge des Schieberegisters ausgeben. For I = 1 To P(2) If I <= P(3) Then Sb(i) = Eb(i) End If Next End If If X = 6 Then Cls Locate 1 , 1 Lcd "Schaltz. abfr.:" Locate 2 , 1 Lcd "Verbraucher: " Locate 3 , 1 Lcd "Zeit: " Do Locate 1 , 1 Lcd "Schaltz. abfr.:" Locate 3 , 1 Lcd "Zeit: " Locate 2 , 1 Lcd "Verbraucher: " ; T_eing Call Einlesen() If Tbit = 0 Then For I = 1 To 10 If Tb(i) = 1 Then Select Case I Case 1 : T_eing = T_eing + "1" Case 2 : T_eing = T_eing + "2" Case 3 : T_eing = T_eing + "3" Case 4 : T_eing = T_eing + "4" Case 5 : T_eing = T_eing + "5" Case 6 : T_eing = T_eing + "6" Case 7 : T_eing = T_eing + "7" Case 8 : T_eing = T_eing + "8" Case 9 : T_eing = T_eing + "9" Case 10 : T_eing = T_eing + "0" End Select Tbit = 1 End If Next If Tb(11) = 1 Then T_eing = "" Cls Tbit = 1 End If If Tb(12) = 1 Then Tsb = Val(t_eing) T_eing = "" Cls Tbit = 1 Locate 1 , 1 Lcd "Schaltz. abfr.:" Locate 2 , 1 Lcd "Verbraucher: " ; Tsb Locate 3 , 1 Lcd "Zeit: " ; Sbs(tsb) Wait 5 Exit Do End If Else Waitms Weinlesen Call Einlesen() Tbit = 0 End If Loop Exit Do End If If X = 8 Then Cls Locate 1 , 1 Lcd "Schaltz. eing.:" Locate 2 , 1 Lcd "Verbraucher: " Locate 3 , 1 Lcd "Zeit: " Do Locate 1 , 1 Lcd "Schaltz. eing.:" Locate 3 , 1 Lcd "Zeit: " Locate 2 , 1 Lcd "Verbraucher: " ; T_eing Call Einlesen() If Tbit = 0 Then For I = 1 To 10 If Tb(i) = 1 Then Select Case I Case 1 : T_eing = T_eing + "1" Case 2 : T_eing = T_eing + "2" Case 3 : T_eing = T_eing + "3" Case 4 : T_eing = T_eing + "4" Case 5 : T_eing = T_eing + "5" Case 6 : T_eing = T_eing + "6" Case 7 : T_eing = T_eing + "7" Case 8 : T_eing = T_eing + "8" Case 9 : T_eing = T_eing + "9" Case 10 : T_eing = T_eing + "0" End Select Tbit = 1 End If Next If Tb(11) = 1 Then T_eing = "" Cls Tbit = 1 End If If Tb(12) = 1 Then Tsb = Val(t_eing) T_eing = "" Cls Tbit = 1 Do Locate 1 , 1 Lcd "Schaltz. eing.:" Locate 2 , 1 Lcd "Verbraucher: " ; Tsb Locate 3 , 1 Lcd "Zeit: " ; T_eing Call Einlesen() If Tbit = 0 Then For I = 1 To 10 If Tb(i) = 1 Then Select Case I Case 1 : T_eing = T_eing + "1" Case 2 : T_eing = T_eing + "2" Case 3 : T_eing = T_eing + "3" Case 4 : T_eing = T_eing + "4" Case 5 : T_eing = T_eing + "5" Case 6 : T_eing = T_eing + "6" Case 7 : T_eing = T_eing + "7" Case 8 : T_eing = T_eing + "8" Case 9 : T_eing = T_eing + "9" Case 10 : T_eing = T_eing + "0" End Select Tbit = 1 End If Next If Tb(11) = 1 Then T_eing = "" Cls Tbit = 1 End If If Tb(12) = 1 Then Tsbdauer = Val(t_eing) T_eing = "" Cls Tbit = 1 Exit Do End If Else Waitms Weinlesen Call Einlesen() Tbit = 0 End If Loop Exit Do End If Else Waitms Weinlesen Call Einlesen() Tbit = 0 End If Loop Disable Interrupts Sbs(tsb) = Tsbdauer Sbss(tsb) = Tsbdauer Enable Interrupts Call Eepromladen() Exit Do End If Tbit = 1 Else Waitms Weinlesen Call Einlesen() Tbit = 0 End If Loop End Sub Sub Lcd_zeile(byval Text As String * 12 , Byval Zahl As Byte , Byval Zeile As Byte) Ln = 12 - Len(text) Locate Zeile , 1 Lcd Text ; Spc(ln) Zw = Str(zahl) Ln = 4 - Len(zw) Locate Zeile , 12 Lcd Spc(ln) ; Zw End Sub Sub Eepromsicherung() Disable Interrupts For I = 1 To Pmaximal Ps(i) = P(i) Next For I = 1 To Amaximal Sbss(i) = Sbs(i) Next Enable Interrupts End Sub Sub Eepromladen() For I = 1 To Pmaximal P(i) = Ps(i) Next For I = 1 To Amaximal Sbs(i) = Sbss(i) Next End Sub Sub Grundeinstellungen() For I = 1 To Pmaximal P(i) = Pg(i) Next End Sub Sub Zeiteinstellungen() For I = 1 To Amaximal Sbs(i) = Sbsg(i) Next End Sub ' SCHNITTSTELLENPROGRAMMIERUNG Serial0charmatch: Serzw1 = "" Disable Interrupts While Ischarwaiting() = 1 Serzw = Inkey() Serzw1 = Serzw1 + Serzw Wend Enable Interrupts ' Kontrollausgabe zur Sicherstellung der Schnittstellenübertragung ' Serzw3 = "Eingelesen: " + Serzw1 Print Serzw3 ' Bearbeitung des gelesenen Strings => Aufteilen in Träger und Signal ' Si = Len(serzw1) ' Serzw2 = Str(si) ' Serzw3 = "Länge: " + Serzw2 ' Print Serzw3 Si2 = Instr(serzw1 , "#") ' Serzw2 = Str(si2) ' Serzw3 = "Position der #: " + Serzw2 ' Print Serzw3 Si = Si - Si2 Si = Si + 1 Serzw1 = Right(serzw1 , Si) ' Serzw3 = "korrigierter String: " + Serzw1 ' Print Serzw3 ' Serzw2 = Str(si) ' Serzw3 = "korrigierte Länge: " + Serzw2 ' Print Serzw3 Serinschalter = Left(serzw1 , 3) ' Serzw3 = "Schlater: " + Serinschalter ' Print Serzw3 Si = Si - 4 Serzw1 = Right(serzw1 , Si ) ' Si = Len(serzw1) ' Serzw3 = "String ohne Schalter: " + Serzw1 ' Print Serzw3 ' Serzw2 = Str(si) ' Serzw3 = "Länge ohne Schalter: " + Serzw2 ' Print Serzw3 Si = Si - 1 Serindata = Left(serzw1 , Si) ' Serzw3 = "Serindata : " + Serindata ' Print Serzw3 ' Kontrollausgabe über die Schnittstelle nach erfolgter Aufteilung des Eingangsstrings ' Serzw3 = "Kontrollausgabe: " + Serinschalter + " / " + Serindata Print Serzw3 Return Sub Serialstatus(byval X As Byte ) ' Der geänderte Schaltzustand wird über die Serielle Schnittstelle ausgegeben. Serzw1 = Str(x) Serzw2 = Str(sb(x)) If Serzw2 = "1" Then Serzw = "7" Else Serzw = "0" Serzw3 = "Rückmeldung: " Print Serzw3 Serzw3 = "#50M" + Serzw + Serzw1 + "<" Print Serzw3 End Sub Sub Serialstatusges() ' Der Status aller Ausgänge wird über die Serielle - Schnittstelle an die Auswertesoftware übergeben #38 ' Print "#38M01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10<" Serzw = "#38M" For I = 1 To 10 If Str(sb(i)) = "0" Then Serzw = Serzw + "__ - " Else Serzw = Serzw + "_1 - " End If Next Serzw = Serzw + "<" Print Serzw Print "#38M----------------------------------------------------------<" Print "#38M11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20<" Serzw = "#38M" For I = 11 To 20 If Str(sb(i)) = "0" Then Serzw = Serzw + "__ - " Else Serzw = Serzw + "_1 - " End If Next Serzw = Serzw + "<" Print Serzw Print "#38M----------------------------------------------------------<" Print "#38M21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30<" Serzw = "#38M" For I = 21 To 30 If Str(sb(i)) = "0" Then Serzw = Serzw + "__ - " Else Serzw = Serzw + "_1 - " End If Next Serzw = Serzw + "<" Print Serzw Print "#38M----------------------------------------------------------<" Print "#38M31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40<" Serzw = "#38M" For I = 31 To 40 If Str(sb(i)) = "0" Then Serzw = Serzw + "__ - " Else Serzw = Serzw + "_1 - " End If Next Serzw = Serzw + "<" Print Serzw Print "#38M----------------------------------------------------------<" Print "#38M41 - 42 - 43 - 44 - 45 - 46 - 47 - 48 - 49 - 50<" Serzw = "#38M" For I = 41 To 50 If Str(sb(i)) = "0" Then Serzw = Serzw + "__ - " Else Serzw = Serzw + "_1 - " End If Next Serzw = Serzw + "<" Print Serzw Print "#38M----------------------------------------------------------<" Print "#38M51 - 52 - 53 - 54 - 55 - 56 - 57 - 58 - 59 - 60<" Serzw = "#38M" For I = 51 To 60 If Str(sb(i)) = "0" Then Serzw = Serzw + "__ - " Else Serzw = Serzw + "_1 - " End If Next Serzw = Serzw + "<" Print Serzw Print "#38M----------------------------------------------------------<" Print "#38M61 - 62 - 63 - 64 - 65 - 66 - 67 - 68 - 69 - 70<" Serzw = "#38M" For I = 61 To 70 If Str(sb(i)) = "0" Then Serzw = Serzw + "__ - " Else Serzw = Serzw + "_1 - " End If Next Serzw = Serzw + "<" Print Serzw Print "#38M----------------------------------------------------------<" Serzw2 = Str(xstd) Serzw = "#65M" + Serzw2 + "<" Print Serzw Serzw2 = Str(xmin) Serzw = "#66M" + Serzw2 + "<" Print Serzw Serzw2 = Str(xsec) Serzw = "#67M" + Serzw2 + "<" Print Serzw End Sub Sub Serialschalterauswerten() ' Loggermodus / Fernsteuermodus umschalten If Serinschalter = "#70" Then If Serindata = "1" Then Loggerein = 1 Else Loggerein = 2 ' Loggerausgabe End If ' Schalter - Panel auswerten If Serinschalter = "#50" Then Gosub Fernschalter ' Uhrzeit einstellen If Serinschalter = "#60" Then Xstd = Val(serindata) If Serinschalter = "#61" Then Xmin = Val(serindata) If Serinschalter = "#62" Then Xsec = Val(serindata) ' Variablen zurücksetzen Serinschalter = "" Serindata = "" End Sub Fernschalter: X = Val(serindata) Call Statusneu(x) Return Sub Serialausgabe() ' Ausgabe des Status der Verbraucher an die Serielle Schnittstelle in ein Log-File ' Serzw1 = Str(timsek) Serzw = Serzw1 + "; Status;" For I = 1 To Amaximal Serzw2 = Str(sb(i)) Serzw = Serzw + Serzw2 + ";" Next ' Zeit zusammenstellen Serzw = Serzw + " Zeit: " Serzw2 = Str(xstd) Serzw = Serzw + Serzw2 Serzw2 = Str(xmin) Serzw = Serzw + ":" + Serzw2 Serzw2 = Str(xsec) Serzw = Serzw + ":" + Serzw2 ' Ausgabe des gesamten Strings an die Schnittstelle Print Serzw End Sub Sub Serialausgabefirst() ' Erste Zeile für LOG-File ' Serzw1 = Str(timsek) Serzw = Serzw1 + "; Ausgang;01;02;03;04;05;06;07;08;09;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66" Print Serzw End Sub