$regfile = "m32def.dat" 'ATmega32 SRAM 2KB, EEPROM 1KB
$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
Config Lcd = 20x4 'wyświetlacz 20x4
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
'Adres PCF
'Const Pcf8574_lcd = &H4E
'Const Pcf8574_lcd = &H40
Const Pcf8574_lcd = &H7E
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
'**********************************************************
'ZEGAR
Dim Weekday As Byte , Weekday_str As String * 12
Dim Old_sec As Byte
Dim Date_str As String * 10
'_hour = 17 'ustaw godzinę
'_min = 0 'ustaw minutę
'_sec = 0 'ustaw sekundę
'Gosub Settime 'zapisz czas
'_day = 31 'ustaw dzień
'_month = 1 'ustaw miesiąc
'_year = 20 'ustaw rok
'Gosub Setdate 'zapisz datę
'**********************************************************
'CZASÓWKA
Const Liczba_wpisow = 32
Const Rozmiar_bazy = Liczba_wpisow * 8
'|ON-OFF/DAY_WEEK|SEC_ON|MIN_ON|HOUR_ON|SEC_OFF|MIN_OFF|HOUR_OFF|OUT_NR| <-osiem bajtów
Dim Helpb As Byte , N As Byte , D As Byte , M As Byte , Idx As Word
Dim Base(rozmiar_bazy) As Byte 'zarezerwuj tyle bajtów
Dim Ee_check As Eram Byte
Dim Mybase_ee(rozmiar_bazy) As Eram Byte
Dim Mybuff(8) As Byte
Dim Tempbuff(8) As Byte
Dim Sec_on As Byte At Mybuff(2) Overlay
Dim Sec_off As Byte At Mybuff(5) Overlay
Dim Time_now As Long , Time_on As Long , Time_off As Long
Dim Daynow As Byte
Dim Outs As Long
Dim _out(16) As Byte At Outs Overlay
'**********************************************************
'HARMONOGRAM DZIAŁANIA CZASÓWEK
Sub Check_scheduler()
Outs = 0
Idx = 1
Time_now = Syssec(_sec) 'czas aktualny oblicz raz
Daynow = Dayofweek(time_now)
For N = 1 To Liczba_wpisow
M = Memcopy(base(idx) , Mybuff(1) , 8) 'wczytaj osiem bajtów z bazy
If Mybuff(1).7 = 1 Then 'jeśli ósmy bit =1 to wpis jest aktywny
If Mybuff(1).daynow = 1 Then 'jeśli w bajcie aktywny jest ten dzień tygodnia
M = Memcopy(_day , Tempbuff(4) , 3) 'kopiuj do Tempbuff _day, _month i _year
M = Memcopy(sec_on , Tempbuff(1) , 3) 'kopiuj sec_on, min_on i hour_on do Tempbuff
Time_on = Syssec(tempbuff(1) , Tempbuff(4))
M = Memcopy(sec_off , Tempbuff(1) , 3)
Time_off = Syssec(tempbuff(1) , Tempbuff(4))
If Time_now >= Time_on Then
If Time_now <= Time_off Then
Helpb = Mybuff(8) 'które wyjście
_out(helpb) = 1 'zapamietaj że mamy to włączyć
End If
End If
End If
End If
Idx = Idx + 8
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
'**********************************************************
'
Sub Set_record(byval Days As Byte , Byval Secs_on As Byte , Byval Mins_on As Byte , Byval Hours_on As Byte , _
Byval Secs_off As Byte , Byval Mins_off As Byte , Byval Hours_off As Byte , Byval Out_relay As Byte)
Idx = 1
For N = 1 To Liczba_wpisow
M = Memcopy(base(idx) , Mybuff(1) , 8) 'wczytaj osiem bajtów z bazy
If Mybuff(1).7 = 0 Then 'ten rekord jest wolny, zapiszemy go
Mybuff(1) = Days
Mybuff(2) = Secs_on
Mybuff(3) = Mins_on
Mybuff(4) = Hours_on
Mybuff(5) = Secs_off
Mybuff(6) = Mins_off
Mybuff(7) = Hours_off
Mybuff(8) = Out_relay
'zapis do RAM
M = Memcopy(mybuff(1) , Base(idx) , 8)
'zapis do eeprom
Helpb = Idx + 8
For N = Idx To Helpb
Mybase_ee(n) = Base(n)
Next
End If
Idx = Idx + 8
Next
End Sub
'**********************************************************
'Pierwsze programowanie eeprom
Helpb = Ee_check
If Helpb <> 0 Then
Ee_check = 0
Idx = 1
For N = 1 To Liczba_wpisow
Mybase_ee(idx) = 0
Idx = Idx + 8
Next
End If
'**********************************************************
'Uzupełnij bazę
'bity 7=Aktywny, od prawej pon,wto,sro..i sob.
Call Set_record(&B1111_1111 , 10 , 29 , 11 , 20 , 29 , 11 , 1) 'wyjście 1, przekażnik 1, czas 1
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 1) 'wyjście 1, przekażnik 1, czas 2
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 1) 'wyjście 1, przekażnik 1, czas 3
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 1) 'wyjście 1, przekażnik 1, czas 4
Call Set_record(&B1111_1111 , 10 , 30 , 11 , 20 , 30 , 11 , 2) 'wyjście 2, przekażnik 2, czas 1
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 2) 'wyjście 2, przekażnik 2, czas 2
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 2) 'wyjście 2, przekażnik 2, czas 3
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 2) 'wyjście 2, przekażnik 2, czas 4
Call Set_record(&B1111_1111 , 10 , 31 , 11 , 20 , 31 , 11 , 3) 'wyjście 3, przekażnik 3, czas 1
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 3) 'wyjście 3, przekażnik 3, czas 2
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 3) 'wyjście 3, przekażnik 3, czas 3
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 3) 'wyjście 3, przekażnik 3, czas 4
Call Set_record(&B1111_1111 , 10 , 32 , 11 , 20 , 32 , 11 , 4) 'wyjście 4, przekażnik 4, czas 1
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 4) 'wyjście 4, przekażnik 4, czas 2
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 4) 'wyjście 4, przekażnik 4, czas 3
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 4) 'wyjście 4, przekażnik 4, czas 4
Call Set_record(&B1111_1111 , 10 , 33 , 11 , 20 , 33 , 11 , 5) 'wyjście 5, przekażnik 5, czas 1
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 5) 'wyjście 5, przekażnik 5, czas 2
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 5) 'wyjście 5, przekażnik 5, czas 3
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 5) 'wyjście 5, przekażnik 5, czas 4
Call Set_record(&B1111_1111 , 10 , 34 , 11 , 20 , 34 , 11 , 6) 'wyjście 6, przekażnik 6, czas 1
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 6) 'wyjście 6, przekażnik 6, czas 2
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 6) 'wyjście 6, przekażnik 6, czas 3
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 6) 'wyjście 6, przekażnik 6, czas 4
Call Set_record(&B1111_1111 , 10 , 35 , 11 , 20 , 35 , 11 , 7) 'wyjście 7, przekażnik 7, czas 1
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 7) 'wyjście 7, przekażnik 7, czas 2
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 7) 'wyjście 7, przekażnik 7, czas 3
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 7) 'wyjście 7, przekażnik 7, czas 4
Call Set_record(&B1111_1111 , 10 , 36 , 11 , 20 , 36 , 11 , 8) 'wyjście 8, przekażnik 8, czas 1
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 8) 'wyjście 8, przekażnik 8, czas 2
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 8) 'wyjście 8, przekażnik 8, czas 3
Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 8) 'wyjście 8, przekażnik 8, czas 4
'**********************************************************
'Odczyt eeprom do RAM
For Idx = 1 To Rozmiar_bazy
Base(idx) = Mybase_ee(idx)
Next
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 Check_scheduler
Weekday_str = Lookupstr(daynow , Weekdays) 'dzień tygodnia
Date_str = Date(_day)
Date_str = Mid(date_str , 1 , 6) + "20"
Date_str = Date_str + Str(_year)
Locate 1 , 1 : Lcd Time$ ; Weekday_str
Locate 2 , 1 : Lcd Date_str
' Locate 1 , 1 : Lcd Time$
' Locate 2 , 1 : Lcd Date$
If 1m < 59 Then
Incr 1m
Else
1m = 0
End If
End If
End If
End If
'If _sec = 0 Then Call Check_scheduler
Loop
End
'**********************************************************
'**********************************************************
'KONIEC GŁÓWNEJ PĘTLI PROGRAMU
'**********************************************************
'**********************************************************
'**********************************************************
'ODCZYT 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
'**********************************************************
'DNI TYGODNIA
Weekdays:
Data "Poniedzialek" , " Wtorek " , " Sroda " , " Czwartek " , " Piatek " , " Sobota " , " Niedziela "