'**********************************************************
'MIKROKONTROLER
$regfile = "m32def.dat" 'ATmega32
$crystal = 16000000 'zewnętrzny rezonator 16MHz
'**********************************************************
'
$swstack = 64
$hwstack = 64
$framesize = 200
'**********************************************************
'
Config Submode = New
'**********************************************************
'TIMER
Config Timer2 = Timer , Prescale = 1024 , Compare = Disconnect , Clear_timer = 1 : Compare2 = 155 '10ms @16MHz
'**********************************************************
'WYJŚCIA "przekaźniki"
Config Porta.0 = Output : Porta.0 = 0 : Pk_1 Alias Porta.0 'wyjście nr1
Config Porta.1 = Output : Porta.1 = 0 : Pk_2 Alias Porta.1 'wyjście nr2
Config Porta.2 = Output : Porta.2 = 0 : Pk_3 Alias Porta.2 'wyjście nr3
Config Porta.3 = Output : Porta.3 = 0 : Pk_4 Alias Porta.3 'wyjście nr4
Config Porta.4 = Output : Porta.4 = 0 : Pk_5 Alias Porta.4 'wyjście nr5
Config Porta.5 = Output : Porta.5 = 0 : Pk_6 Alias Porta.5 'wyjście nr6
Config Porta.6 = Output : Porta.6 = 0 : Pk_7 Alias Porta.6 'wyjście nr7
Config Porta.7 = Output : Porta.7 = 0 : Pk_8 Alias Porta.7 'wyjście nr8
Config Portd.0 = Output : Portd.0 = 0 : Pk_9 Alias Portd.0 'wyjście nr9
Config Portd.1 = Output : Portd.1 = 0 : Pk_10 Alias Portd.1 'wyjście nr19
Config Portd.2 = Output : Portd.2 = 0 : Pk_11 Alias Portd.2 'wyjście nr11
Config Portd.3 = Output : Portd.3 = 0 : Pk_12 Alias Portd.3 'wyjście nr12
Config Portd.4 = Output : Portd.4 = 0 : Pk_13 Alias Portd.4 'wyjście nr13
Config Portd.5 = Output : Portd.5 = 0 : Pk_14 Alias Portd.5 'wyjście nr14
Config Portd.6 = Output : Portd.6 = 0 : Pk_15 Alias Portd.6 'wyjście nr15
Config Portd.7 = Output : Portd.7 = 0 : Pk_16 Alias Portd.7 'wyjście nr16
'**********************************************************
'WYŚWIETLACZ LCD
$lib "bl_Lcd_i2c.lib" 'biblioteka I2C LCD
Config Lcd = 16x2 'wyświetlacz 16x2
Const Pcf_d4 = 4 'pin D4
Const Pcf_d5 = 5 'pin D5
Const Pcf_d6 = 6 'pin D6
Const Pcf_d7 = 7 'pin D7
Const Pcf_rs = 0 'pin RS
Const Pcf_rw = 1 'pin RW
Const Pcf_e1 = 2 'pin E
Dim _lcd_e As Byte
Dim Backlight As Byte
Backlight_on Alias &H08
Backlight_off Alias &H00
Backlight = Backlight_on 'włącz podświetlenie
_lcd_e = 128
Const Pcf8574_lcd = &H4E 'adres PCF8574
Waitms 100 : Cls 'odczekaj 100ms i wyczyść ekran
'**********************************************************
'I2C
Config Scl = Portc.0 'pin SCL
Config Sda = Portc.1 'pin SDA
I2cinit
Config Twi = 400000 'prędkość I2C
'**********************************************************
'DS3231
Config Clock = User
Config Date = Dmy , Separator = / 'oddziel datę ukośnikiem
Const Ds3231w = &HD0 'adres DS3231 do zapisu
Const Ds3231r = &HD1 'adres DS3231 do odczytu
'**********************************************************
'CZAS
Dim 100ms As Byte
Dim 1s As Byte
Dim 1m As Byte
'**********************************************************
'DZIEŃ "START"
Dim Co2_dzien As Byte , Co2_miesiac As Byte , Co2_rok As Byte
Dim Co2_dzien_start As Word , Co2_dzien_teraz As Word
Dim Co2_data_start_str As String * 8
Co2_dzien = 17 'ustaw dzień DNIA "START"
Co2_miesiac = 1 'ustaw miesiąc DNIA "START"
Co2_rok = 20 'ustaw rok DNIA "START"
'**********************************************************
'ZEGAR
Dim Weekday As Byte , Weekdayx As Byte , Weekday_str As String * 2
Dim Date_str As String * 10
Dim Old_sec As Byte
'_hour = 17 'ustaw godzinę
'_min = 6 'ustaw minutę
'_sec = 0 'ustaw sekundę
'Gosub Settime 'zapisz czas
'_day = 29 'ustaw dzień
'_month = 1 'ustaw miesiąc
'_year = 20 'ustaw rok
'Gosub Setdate 'zapisz datę
'**********************************************************
'CZASÓWKA
'| IDX | ON/OFF | DAY_MON | DAY_TUE | DAY_WED | DAY_THU | DAY_FRI | DAY_SAT |
'| DAY_SUN | SEC_ON | MIN_ON | HOUR_ON | SEC_OFF | MIN_OFF | HOUR_OFF | OUT_NR |
Const Liczba_wpisow = 32
Const Rozmiar_bazy = Liczba_wpisow * 16
Dim Helpb As Byte , N As Byte , M As Byte , Idx As Word
Dim Base(rozmiar_bazy) As Byte 'zarezerwuj tyle bajtów
Dim Mybuff(16) As Byte
Dim Day_week As Byte
Dim Day_on_off As Byte At Mybuff(2) Overlay
Dim Day_mon As Byte At Mybuff(3) Overlay
Dim Day_tue As Byte At Mybuff(4) Overlay
Dim Day_wed As Byte At Mybuff(5) Overlay
Dim Day_thu As Byte At Mybuff(6) Overlay
Dim Day_fri As Byte At Mybuff(7) Overlay
Dim Day_sat As Byte At Mybuff(8) Overlay
Dim Day_sun As Byte At Mybuff(9) Overlay
Dim Sec_on_s As Byte At Mybuff(10) Overlay
Dim Sec_on_m As Byte At Mybuff(11) Overlay
Dim Sec_on_h As Byte At Mybuff(12) Overlay
Dim Sec_off_s As Byte At Mybuff(13) Overlay
Dim Sec_off_m As Byte At Mybuff(14) Overlay
Dim Sec_off_h As Byte At Mybuff(15) Overlay
Dim Time_on_str As String * 8 , Time_on As Long
Dim Time_off_str As String * 8 , Time_off As Long
Dim Time_now As Long
Dim Outs As Long
Dim _out(16) As Byte At Outs Overlay
'**********************************************************
'HARMONOGRAM DZIAŁANIA CZASÓWEK
Sub Sprawdz_harmonogram()
Outs = 0
Idx = 1
For N = 1 To Liczba_wpisow
M = Memcopy(base(idx) , Mybuff(1) , 16)
Select Case Weekdayx
Case 0 : Day_week = Day_mon
Case 1 : Day_week = Day_tue
Case 2 : Day_week = Day_wed
Case 3 : Day_week = Day_thu
Case 4 : Day_week = Day_fri
Case 5 : Day_week = Day_sat
Case 6 : Day_week = Day_sun
End Select
If Day_on_off = 1 Then 'jeżeli czasówka jest włączona
If Day_week = 1 Then 'jeżeli czasówka ma być włączona w danym dniu
Time_now = Syssec(_sec) 'czas aktualny
'--------------------------
'CZAS WŁĄCZENIA
If Sec_on_h < 10 Then
Time_on_str = "0" + Str(sec_on_h)
Else
Time_on_str = Str(sec_on_h)
End If
If Sec_on_m < 10 Then
Time_on_str = Time_on_str + ":0" + Str(sec_on_m)
Else
Time_on_str = Time_on_str + ":" + Str(sec_on_m)
End If
If Sec_on_s < 10 Then
Time_on_str = Time_on_str + ":0" + Str(sec_on_s)
Else
Time_on_str = Time_on_str + ":" + Str(sec_on_s)
End If
Time_on = Syssec(time_on_str , Date$)
'--------------------------
'CZAS WYŁĄCZENIA
If Sec_off_h < 10 Then
Time_off_str = "0" + Str(sec_off_h)
Else
Time_off_str = Str(sec_off_h)
End If
If Sec_off_m < 10 Then
Time_off_str = Time_off_str + ":0" + Str(sec_off_m)
Else
Time_off_str = Time_off_str + ":" + Str(sec_off_m)
End If
If Sec_off_s < 10 Then
Time_off_str = Time_off_str + ":0" + Str(sec_off_s)
Else
Time_off_str = Time_off_str + ":" + Str(sec_off_s)
End If
Time_off = Syssec(time_off_str , Date$)
If Time_on <= Time_now Then
If Time_off >= Time_now Then
Helpb = Mybuff(16) 'które wyjście
_out(helpb) = 1 'zapamiętaj że mamy to włączyć
End If
End If
End If
End If
Idx = Idx + 16
Next
'-----------------------------------
'STEROWANIE WYJŚCIAMI
For N = 1 To 16
If _out(n) = 1 Then
Select Case N
Case 1 : Set Pk_1
Case 2 : Set Pk_2
Case 3 : Set Pk_3
Case 4 : Set Pk_4
Case 5 : Set Pk_5
Case 6 : Set Pk_6
Case 7 : Set Pk_7
Case 8 : Set Pk_8
Case 9 : Set Pk_9
Case 10 : Set Pk_10
Case 11 : Set Pk_11
Case 12 : Set Pk_12
Case 13 : Set Pk_13
Case 14 : Set Pk_14
Case 15 : Set Pk_15
Case 16 : Set Pk_16
End Select
Else
Select Case N
Case 1 : Reset Pk_1
Case 2 : Reset Pk_2
Case 3 : Reset Pk_3
Case 4 : Reset Pk_4
Case 5 : Reset Pk_5
Case 6 : Reset Pk_6
Case 7 : Reset Pk_7
Case 8 : Reset Pk_8
Case 9 : Reset Pk_9
Case 10 : Reset Pk_10
Case 11 : Reset Pk_11
Case 12 : Reset Pk_12
Case 13 : Reset Pk_13
Case 14 : Reset Pk_14
Case 15 : Reset Pk_15
Case 16 : Reset Pk_16
End Select
End If
Next
End Sub
Gosub Wypelnij_baze 'testowo uzupełnij bazę danymi
Call Sprawdz_harmonogram
'Gosub Czytaj_baze
'Wait 5 : Cls
Gosub Dzien_start
Enable Interrupts
'**********************************************************
'**********************************************************
'GŁÓWNA PĘTLA PROGRAMU
'**********************************************************
'**********************************************************
Do
If Tifr.ocf2 = 1 Then 'minęło 10ms, flagę ustawia Timer
Tifr.ocf2 = 1 'flagi kasuje się wpisując jeden, nie zero
If 100ms < 9 Then
Incr 100ms
Else
100ms = 0
If 1s < 9 Then
Incr 1s
Else
1s = 0
Call Sprawdz_harmonogram 'sprawdź harmonogram czasówek co sekundę
If 1m < 59 Then
Incr 1m
Else
1m = 0
Gosub Dzien_start
'Call Sprawdz_harmonogram 'sprawdź harmonogram czasówek co minutę
End If
End If
End If
End If
'-----------------------------------
'WYŚWIETL CZAS, DATĘ I DZIEŃ TYGODNIA
If Old_sec <> _sec Then 'jeśli zapamiętana sekunda rózni się od aktualnej
Old_sec = _sec 'zapamiętaj aktualną
'--------------------------------
'ZMIANA WYŚWIETLANIA ROKU Z 01/01/20 NA 01/01/2020
Date_str = Date(_day)
Date_str = Mid(date_str , 1 , 6) + "20"
Date_str = Date_str + Str(_year)
'--------------------------------
'WYLICZ DZIEŃ TYGODNIA
Weekdayx = Dayofweek()
Weekday_str = Lookupstr(weekdayx , Weekdays)
'--------------------------------
'WYŚWIETLAJ ZEGAR
Locate 1 , 1 : Lcd Time$ 'wyświetl czas
Locate 2 , 1 : Lcd Date_str ; " " ; Weekday_str 'wyświetl datę i dzień tygodnia
End If
Loop
End
'**********************************************************
'**********************************************************
'KONIEC GŁÓWNEJ PĘTLI PROGRAMU
'**********************************************************
'**********************************************************
'**********************************************************
'ODCZYT/ZAPIS ZEGARA
Getdatetime:
I2cstart 'wygeneruj kod startowy
I2cwbyte Ds3231w 'wyślij adres
I2cwbyte 0 'adres początkowy DS3231
I2cstart 'Wygeneruj kod startowy
I2cwbyte Ds3231r 'wyślij adres
I2crbyte _sec , Ack 'sekunda
I2crbyte _min , Ack 'minuta
I2crbyte _hour , Ack 'godzina
I2crbyte Weekday , Ack 'dzień tygodnia
I2crbyte _day , Ack 'dzień
I2crbyte _month , Ack 'miesiąc
I2crbyte _year , Nack 'rok
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
'**********************************************************
'ZAPIS DATY
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart 'wygeneruj kod startowy
I2cwbyte Ds3231w 'wyślij adres
I2cwbyte 4 'adres początkowy DS3231
I2cwbyte _day 'dzień
I2cwbyte _month 'miesiąc
I2cwbyte _year 'rok
I2cwbyte Weekday 'dzien tygodnia
I2cstop
Return
'**********************************************************
'ZAPIS CZASU
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart 'wygeneruj kod startowy
I2cwbyte Ds3231w 'wyślij adres
I2cwbyte 0 'adres początkowy DS3231
I2cwbyte _sec 'sekunda
I2cwbyte _min 'minuta
I2cwbyte _hour 'godzina
I2cstop
Return
'**********************************************************
'
Dzien_start:
If Co2_dzien < 10 Then 'jeżeli dzień jest mniejszy niż 10 to dodaj "0"
Co2_data_start_str = "0" + Str(co2_dzien) + "/"
Else
Co2_data_start_str = Str(co2_dzien) + "/"
End If
If Co2_miesiac < 10 Then 'jeżeli miesiąc jest mniejszy niż 10 to dodaj "0"
Co2_data_start_str = Co2_data_start_str + "0" + Str(co2_miesiac) + "/"
Else
Co2_data_start_str = Co2_data_start_str + Str(co2_miesiac) + "/"
End If
Co2_data_start_str = Co2_data_start_str + Str(co2_rok) 'utwórz string daty dnia "START"
Co2_dzien_start = Sysday(co2_data_start_str) 'data dnia "START"
Co2_dzien_teraz = Sysday() 'teraźniejsza data
Co2_dzien_teraz = Co2_dzien_teraz - Co2_dzien_start 'odejmij datę dnia "START" od teraźniejszej daty
Locate 2 , 14 : Lcd "|" ; Co2_dzien_teraz ; " " 'wyświetl ile dni minęło od dnia "START"
Return
'**********************************************************
'TESTOWO WYPEŁNIJ BAZĘ DANYMI
Wypelnij_baze:
'| IDX | ON/OFF | DAY_MON | DAY_TUE | DAY_WED | DAY_THU | DAY_FRI | DAY_SAT |
'| DAY_SUN | SEC_ON | MIN_ON | HOUR_ON | SEC_OFF | MIN_OFF | HOUR_OFF | OUT_NR |
'-----------------------------------
'CZASÓWKA NR1
Base(1) = 1 : Base(2) = 1 : Base(3) = 1 : Base(4) = 1 : Base(5) = 1 : Base(6) = 1 : Base(7) = 1 : Base(8) = 1
Base(9) = 1 : Base(10) = 0 : Base(11) = 0 : Base(12) = 12 : Base(13) = 0 : Base(14) = 0 : Base(15) = 23 : Base(16) = 1
'-----------------------------------
'CZASÓWKA NR2
Base(17) = 2 : Base(18) = 1 : Base(19) = 1 : Base(20) = 1 : Base(21) = 1 : Base(22) = 1 : Base(23) = 1 : Base(24) = 1
Base(25) = 1 : Base(26) = 0 : Base(27) = 0 : Base(28) = 12 : Base(29) = 0 : Base(30) = 0 : Base(31) = 23 : Base(32) = 2
'-----------------------------------
'CZASÓWKA NR3
Base(33) = 3 : Base(34) = 1 : Base(35) = 1 : Base(36) = 1 : Base(37) = 1 : Base(38) = 1 : Base(39) = 1 : Base(40) = 1
Base(41) = 1 : Base(42) = 0 : Base(43) = 0 : Base(44) = 12 : Base(45) = 0 : Base(46) = 0 : Base(47) = 23 : Base(48) = 3
'-----------------------------------
'CZASÓWKA NR4
Base(49) = 4 : Base(50) = 1 : Base(51) = 1 : Base(52) = 1 : Base(53) = 1 : Base(54) = 1 : Base(55) = 1 : Base(56) = 1
Base(57) = 1 : Base(58) = 0 : Base(59) = 0 : Base(60) = 12 : Base(61) = 0 : Base(62) = 0 : Base(63) = 23 : Base(64) = 4
'-----------------------------------
'CZASÓWKA NR5
Base(65) = 5 : Base(66) = 1 : Base(67) = 1 : Base(68) = 1 : Base(69) = 1 : Base(70) = 1 : Base(71) = 1 : Base(72) = 1
Base(73) = 1 : Base(74) = 0 : Base(75) = 0 : Base(76) = 12 : Base(77) = 0 : Base(78) = 0 : Base(79) = 23 : Base(80) = 5
'-----------------------------------
'CZASÓWKA NR6
Base(81) = 6 : Base(82) = 1 : Base(83) = 1 : Base(84) = 1 : Base(85) = 1 : Base(86) = 1 : Base(87) = 1 : Base(88) = 1
Base(89) = 1 : Base(90) = 0 : Base(91) = 0 : Base(92) = 12 : Base(93) = 0 : Base(94) = 0 : Base(95) = 23 : Base(96) = 6
'-----------------------------------
'CZASÓWKA NR7
Base(97) = 7 : Base(98) = 1 : Base(99) = 1 : Base(100) = 1 : Base(101) = 1 : Base(102) = 1 : Base(103) = 1 : Base(104) = 1
Base(105) = 1 : Base(106) = 0 : Base(107) = 0 : Base(108) = 12 : Base(109) = 0 : Base(110) = 0 : Base(111) = 23 : Base(112) = 7
'-----------------------------------
'CZASÓWKA NR8
Base(113) = 8 : Base(114) = 1 : Base(115) = 1 : Base(116) = 1 : Base(117) = 1 : Base(118) = 1 : Base(119) = 1 : Base(120) = 1
Base(121) = 1 : Base(122) = 0 : Base(123) = 0 : Base(124) = 12 : Base(125) = 0 : Base(126) = 0 : Base(127) = 23 : Base(128) = 8
'-----------------------------------
'CZASÓWKA NR9
'-----------------------------------
'CZASÓWKA NR10
'-----------------------------------
'CZASÓWKA NR11
'-----------------------------------
'CZASÓWKA NR12
'-----------------------------------
'CZASÓWKA NR13
'-----------------------------------
'CZASÓWKA NR14
'-----------------------------------
'CZASÓWKA NR15
'-----------------------------------
'CZASÓWKA NR16
'-----------------------------------
'CZASÓWKA NR17
'-----------------------------------
'CZASÓWKA NR18
'-----------------------------------
'CZASÓWKA NR19
'-----------------------------------
'CZASÓWKA NR20
'-----------------------------------
'CZASÓWKA NR21
'-----------------------------------
'CZASÓWKA NR22
'-----------------------------------
'CZASÓWKA NR23
'-----------------------------------
'CZASÓWKA NR24
'-----------------------------------
'CZASÓWKA NR25
'-----------------------------------
'CZASÓWKA NR26
'-----------------------------------
'CZASÓWKA NR27
'-----------------------------------
'CZASÓWKA NR28
'-----------------------------------
'CZASÓWKA NR29
'-----------------------------------
'CZASÓWKA NR30
'-----------------------------------
'CZASÓWKA NR31
'-----------------------------------
'CZASÓWKA NR32
Return
'**********************************************************
'WYŚWIETL ZAPISY BAZY
Czytaj_baze:
'-----------------------------------
'CZASÓWKA NR1
' |HOUR_ON| |MIN_ON| |SEC_ON| |HOUR_OFF| |MIN_OFF| |SEC_OFF|
Locate 1 , 1 : Lcd Base(12) ; ":" ; Base(11) ; ":" ; Base(10) ; " " ; Base(15) ; ":" ; Base(14) ; ":" ; Base(13)
' |IDX| |ON/OFF| |DAY_MON| |DAY_TUE| |DAY_WED| |DAY_THU| |DAY_FRI| |DAY_SAT| |DAY_SUN|
Locate 2 , 1 : Lcd Base(1) ; " " ; Base(2) ; " " ; Base(3) ; Base(4) ; Base(5) ; Base(6) ; Base(7) ; Base(8) ; Base(9)
Return
'**********************************************************
'DNI TYGODNIA
Weekdays:
Data "Pn" , "Wt" , "Sr" , "Cz" , "Pt" , "So" , "Nd" 'dzień tygodnia do wyświetlenia