[Rozwiązany] RTC, działania na podstawie czasu
- pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
[Rozwiązany] RTC, działania na podstawie czasu
Hej,
Panowie, drapię się po głowie i nie mogę nic mądrego wymyślić odnośnie sterowania na podstawie czasu.
Mam dwie zagadki:
0. RTC to DS3231 - zegar działa i wszystko jest OK
1. Liczenie czasu (dni) od zmiennej. Chciałbym ustawić sobie jakąś zmienną, dajmy "start" (zmienną zapiszę do eeprom, aby nie zginęła) i od tej zmiennej liczyć dni. Przykładowo "start" ustawiłem w dniu 01/01/2020, a dziś mamy 21/01/2020 Jak obliczyć ile dni minęło? Jak obliczyć gdy "start" będzie np. 01/02/2020, a na zegarze już 15/08/2020?
2. Sterowanie wyjściami na podstawie czasu, taka czasówka włącz/wyłącz - tu to w ogóle już nie ogarniam.
Jak to miało by działać:
a) 8 wyjść
b) każde z wyjść:
- 4 czasy załączania na dobę
- włącz/wyłącz czas 1, 2, 3 i 4
- czas załączenia/wyłączenia to godzina, minuta, sekunda i dzień tygodnia - dla każdego z osobna
Jak zacząłem to rozpisywać to wychodzą mi dziesiątki linii kodu i mnóstwo zmiennych
Może ktoś robił coś podobnego i podzieli się pomysłem jak to ugryźć?
Z góry dziękuję i pozdrawiam.
Piotrek
Panowie, drapię się po głowie i nie mogę nic mądrego wymyślić odnośnie sterowania na podstawie czasu.
Mam dwie zagadki:
0. RTC to DS3231 - zegar działa i wszystko jest OK
1. Liczenie czasu (dni) od zmiennej. Chciałbym ustawić sobie jakąś zmienną, dajmy "start" (zmienną zapiszę do eeprom, aby nie zginęła) i od tej zmiennej liczyć dni. Przykładowo "start" ustawiłem w dniu 01/01/2020, a dziś mamy 21/01/2020 Jak obliczyć ile dni minęło? Jak obliczyć gdy "start" będzie np. 01/02/2020, a na zegarze już 15/08/2020?
2. Sterowanie wyjściami na podstawie czasu, taka czasówka włącz/wyłącz - tu to w ogóle już nie ogarniam.
Jak to miało by działać:
a) 8 wyjść
b) każde z wyjść:
- 4 czasy załączania na dobę
- włącz/wyłącz czas 1, 2, 3 i 4
- czas załączenia/wyłączenia to godzina, minuta, sekunda i dzień tygodnia - dla każdego z osobna
Jak zacząłem to rozpisywać to wychodzą mi dziesiątki linii kodu i mnóstwo zmiennych
Może ktoś robił coś podobnego i podzieli się pomysłem jak to ugryźć?
Z góry dziękuję i pozdrawiam.
Piotrek
Ostatnio zmieniony 04 lut 2020, 20:58 przez pimowo, łącznie zmieniany 1 raz.
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: RTC, działania na podstawie czasu
Poczytaj o Sysday() Date() Datetime i podobnych w helpie. Są gotowe funkcje. Sam mam kilka gotowych czasówek z oledami, ze zwykłymi wyświetlaczami alfanumerycznymi, z aplikacjami na fona itd
Nawet sterownik dzwonów ma kalendarz na cały rok liturgiczny i pinka ludziom różnie w różnych porach roku ahahahha Podobnie sterownik Kurantów z MP3.
Np. W przypadku pierwszego pytania możesz chyba policzyć tak:
Powinno zadzialać nawet w symulatorze, ale nie sprawdzałem.
Włączenie czegoś o danej porze w danym dniu tez jest proste. Zamieniasz datę i godzinę z RTC na LONG. Tu nic nie musisz robić. Puste nawiasy Target = SYSSEC() i Bascom sam to wyciągnie z zegarka. Potem liczysz drugi Long wpisując żądaną datę i godzinę. Target = SYSSEC(strTime, strDate) Potem piszesz warunek "Jeżeli Long1 = Long2 Then ....włącz/wyłącz.
Nawet sterownik dzwonów ma kalendarz na cały rok liturgiczny i pinka ludziom różnie w różnych porach roku ahahahha Podobnie sterownik Kurantów z MP3.
Np. W przypadku pierwszego pytania możesz chyba policzyć tak:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim Myword1 As Word, Myword2 As Word
- Myword1 = Sysday("01/01/20")
- Myword2 = Sysday("02/02/20")
- Myword2 = Myword2 - Myword1
- Print "Minelo "; myword2 ; " dni."
Włączenie czegoś o danej porze w danym dniu tez jest proste. Zamieniasz datę i godzinę z RTC na LONG. Tu nic nie musisz robić. Puste nawiasy Target = SYSSEC() i Bascom sam to wyciągnie z zegarka. Potem liczysz drugi Long wpisując żądaną datę i godzinę. Target = SYSSEC(strTime, strDate) Potem piszesz warunek "Jeżeli Long1 = Long2 Then ....włącz/wyłącz.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim Long1 As Long , Long2 As Long
- Long1 = Syssec()
- Long2 = Sysec("08:00:00","21/01/20")
- If Long1 = Long2 Then
- End If
- pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Re: RTC, działania na podstawie czasu
Dzięki, będę wieczorkiem próbował.
Mówisz, że to proste he he, a ja już spędziłem kilka roboczogodzin nad tym i nic mi nie wychodziło. Tyle, że ja próbowałem inaczej, a dokładnie to tam gdzie program co sekundę wskakuje aby odczytać zegar dałem kilka if-ów i porównywałem czas z ustawionym czasem załączenia - dla jednego timera i jednego czasu gdy miał pracować codziennie to było OK, ale dla kilku timerów który ma kilka ustawień to wychodził mi jakiś kosmos normalnie.
A tak jeszcze teraz mnie naszło... Co zrobić w sytuacji gdy ustawię czas startu i czas zatrzymania, a w międzyczasie będzie jakiś zanik napięcia?
Mówisz, że to proste he he, a ja już spędziłem kilka roboczogodzin nad tym i nic mi nie wychodziło. Tyle, że ja próbowałem inaczej, a dokładnie to tam gdzie program co sekundę wskakuje aby odczytać zegar dałem kilka if-ów i porównywałem czas z ustawionym czasem załączenia - dla jednego timera i jednego czasu gdy miał pracować codziennie to było OK, ale dla kilku timerów który ma kilka ustawień to wychodził mi jakiś kosmos normalnie.
A tak jeszcze teraz mnie naszło... Co zrobić w sytuacji gdy ustawię czas startu i czas zatrzymania, a w międzyczasie będzie jakiś zanik napięcia?
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: RTC, działania na podstawie czasu
Chyba jeszcze tego nie czujesz
Policz trzy Longi. Czas włączenia, wyłaczenia i czas aktualny.
"Jeśli Long czasu włączenia jest mniejszy od czasu aktualnego i Long czasu wyłączenia większy od czasu aktualnego to włącz urządzenie."
Taką procedurą możesz się przelecieć np. tylko po restarcie a potem już na bieżąco.
Na taką minimalną baze danych potrzebujesz 2x6Bajtów na jeden cykl Włącz/Wyłącz.
Czyli na bazę 10 wpisów potrzebujesz 120bajtów Eeprom - nie jest źle...
Warto jednak dodać do bazy numer porzadkowy i które wyjście ma być uruchamiane. Wyjdzie np po 14 bajtów...
Na bajtach działa się szybciej niz na stringach.
Robisz więc bazę "Dim Mybuff(140) As Byte" a potem możesz sobie latać po bazie np. najprostszym "For N = 1 to 126 Step 14" albo "Mypointer = Mypointer + 14" itd...
Policz trzy Longi. Czas włączenia, wyłaczenia i czas aktualny.
"Jeśli Long czasu włączenia jest mniejszy od czasu aktualnego i Long czasu wyłączenia większy od czasu aktualnego to włącz urządzenie."
Taką procedurą możesz się przelecieć np. tylko po restarcie a potem już na bieżąco.
Na taką minimalną baze danych potrzebujesz 2x6Bajtów na jeden cykl Włącz/Wyłącz.
Czyli na bazę 10 wpisów potrzebujesz 120bajtów Eeprom - nie jest źle...
Warto jednak dodać do bazy numer porzadkowy i które wyjście ma być uruchamiane. Wyjdzie np po 14 bajtów...
Na bajtach działa się szybciej niz na stringach.
Robisz więc bazę "Dim Mybuff(140) As Byte" a potem możesz sobie latać po bazie np. najprostszym "For N = 1 to 126 Step 14" albo "Mypointer = Mypointer + 14" itd...
- pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Re: RTC, działania na podstawie czasu
No i znów namieszał mi w głowie...
Usiądę na spokojnie i jeszcze poczytam, teraz to chociaż wiem w którą stronę iść. Dzięki
Usiądę na spokojnie i jeszcze poczytam, teraz to chociaż wiem w którą stronę iść. Dzięki
- pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Re: RTC, działania na podstawie czasu
Dziś troszkę brakło czasu, ale zmajstrowałem coś takiego odnośnie punktu "1"
Kod testowy odpaliłem na płytce testowej z ATmega32 (docelowo ATmega2560) i LCD 16x2 (docelowo LCD graficzny 320x240)
.
.
Wygląda na to, że działa.
Przygotowałem sobie od razu zmienne abym mógł wpisać dzień, miesiąc i rok dla dnia "start"
Jutro może uda się pokombinować z punktem "2"
Kod testowy odpaliłem na płytce testowej z ATmega32 (docelowo ATmega2560) i LCD 16x2 (docelowo LCD graficzny 320x240)
.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m32def.dat"
- $crystal = 16000000
- $swstack = 64
- $hwstack = 64
- $framesize = 200
- Config Submode = New
- $lib "bl_Lcd_i2c.lib"
- Config Lcd = 16x2
- Const Pcf_d4 = 4
- Const Pcf_d5 = 5
- Const Pcf_d6 = 6
- Const Pcf_d7 = 7
- Const Pcf_rs = 0
- Const Pcf_rw = 1
- Const Pcf_e1 = 2
- Dim _lcd_e As Byte
- Dim Backlight As Byte
- Backlight_on Alias &H08
- Backlight_off Alias &H00
- Backlight = Backlight_on
- _lcd_e = 128
- Const Pcf8574_lcd = &H4E
- Waitms 100 : Cls
- Config Scl = Portc.0
- Config Sda = Portc.1
- I2cinit
- Config Twi = 400000
- Config Clock = User
- Config Date = Dmy , Separator = /
- Const Ds3231w = &HD0
- Const Ds3231r = &HD1
- Dim Weekday As Byte
- Dim Myword1 As Word , Myword2 As Word
- Dim Dzien As Byte , Miesiac As Byte , Rok As Byte
- Dim Data_start As String * 8
- Dzien = 1
- Miesiac = 1
- Rok = 20
- If Dzien < 10 Then
- Data_start = "0" + Str(dzien) + "/"
- Else
- Data_start = Str(dzien) + "/"
- End If
- If Miesiac < 10 Then
- Data_start = Data_start + "0" + Str(miesiac) + "/"
- Else
- Data_start = Data_start + Str(miesiac) + "/"
- End If
- Data_start = Data_start + Str(rok)
- 'Time$ = "23:00:00"
- 'Date$ = "21/01/20"
- Enable Interrupts
- Do
- Locate 1 , 1 : Lcd Time$
- Locate 2 , 1 : Lcd Date$
- Myword1 = Sysday(data_start)
- Myword2 = Sysday(date$)
- Myword2 = Myword2 - Myword1
- Locate 1 , 11 : Lcd "Minelo"
- Locate 2 , 11 : Lcd Myword2 ; "dni"
- Wait 1
- Loop
- End
- Getdatetime:
- I2cstart ' Generate start code
- I2cwbyte Ds3231w ' send address
- I2cwbyte 0 ' start address in 1307
- I2cstart ' Generate start code
- I2cwbyte Ds3231r ' send address
- I2crbyte _sec , Ack
- I2crbyte _min , Ack ' MINUTES
- I2crbyte _hour , Ack ' Hours
- I2crbyte Weekday , Ack ' Day of Week
- I2crbyte _day , Ack ' Day of Month
- I2crbyte _month , Ack ' Month of Year
- I2crbyte _year , Nack ' Year
- I2cstop
- _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
- _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
- Return
- Setdate:
- _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
- I2cstart ' Generate start code
- I2cwbyte Ds3231w ' send address
- I2cwbyte 4 ' starting address in 1307
- I2cwbyte _day ' Send Data to SECONDS
- I2cwbyte _month ' MINUTES
- I2cwbyte _year ' Hours
- I2cstop
- Return
- Settime:
- _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
- I2cstart ' Generate start code
- I2cwbyte Ds3231w ' send address
- I2cwbyte 0 ' starting address in 1307
- I2cwbyte _sec ' Send Data to SECONDS
- I2cwbyte _min ' MINUTES
- I2cwbyte _hour ' Hours
- I2cstop
- Return
- Weekdays:
- Data "Poniedzialek" , "Wtorek" , "Sroda" , "Czwartek" , "Piatek" , "Sobota" , "Niedziela"
Wygląda na to, że działa.
Przygotowałem sobie od razu zmienne abym mógł wpisać dzień, miesiąc i rok dla dnia "start"
Jutro może uda się pokombinować z punktem "2"
- pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Re: RTC, działania na podstawie czasu
Jednak muszę prosić o pomoc ponieważ kompletnie nie wiem jak ugryźć tą bazę z danymi dla czasówek
Próbowałem sobie to jakoś rozrysować na papierze, ale nie wiem jak to przełożyć na kod uC.
Mam 8 timerów, które mogę włączyć lub wyłączyć - jeżeli wyłączę timer to żadne wpisy w nim nie działają, ale jak włączę to timer działa według ustawionego harmonogramu. W każdym timerze mam 4 czasy, które mogę włączyć lub wyłączyć - jeżeli wyłączę któryś czas to to nie będzie brane pod uwagę, ale jak włączę to ma działać według ustawionego czasu, czyli "start: godzina, minuta i sekunda" oraz "stop: godzina, minuta i sekunda" oraz muszę ustawić dzień/dni tygodnia.
Do tego dochodzi jeszcze jak uzupełniać taką bazę no i jak wyciągnąć dane z tej bazy aby sterować wyjściami? Dodatkowo chciałbym tą bazę trzymać w eeprom*
Zaczynam się zastanawiać czy to w ogóle jest możliwe.
*Dane, które chcę zapisywać w nieulotnej pamięci to lepiej zapisywać w uC czy może już się szykować na coś zewnętrznego? Jeżeli coś zewnętrznego to co kupić?
Mój testowy kod (działa dla jednego przekaźnika) wygląda teraz tak:
.
Próbowałem sobie to jakoś rozrysować na papierze, ale nie wiem jak to przełożyć na kod uC.
Mam 8 timerów, które mogę włączyć lub wyłączyć - jeżeli wyłączę timer to żadne wpisy w nim nie działają, ale jak włączę to timer działa według ustawionego harmonogramu. W każdym timerze mam 4 czasy, które mogę włączyć lub wyłączyć - jeżeli wyłączę któryś czas to to nie będzie brane pod uwagę, ale jak włączę to ma działać według ustawionego czasu, czyli "start: godzina, minuta i sekunda" oraz "stop: godzina, minuta i sekunda" oraz muszę ustawić dzień/dni tygodnia.
Do tego dochodzi jeszcze jak uzupełniać taką bazę no i jak wyciągnąć dane z tej bazy aby sterować wyjściami? Dodatkowo chciałbym tą bazę trzymać w eeprom*
Zaczynam się zastanawiać czy to w ogóle jest możliwe.
*Dane, które chcę zapisywać w nieulotnej pamięci to lepiej zapisywać w uC czy może już się szykować na coś zewnętrznego? Jeżeli coś zewnętrznego to co kupić?
Mój testowy kod (działa dla jednego przekaźnika) wygląda teraz tak:
.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '
- '
- '**********************************************************
- 'MIKROKONTROLER
- $regfile = "m32def.dat" 'ATmega32
- $crystal = 16000000 'zewnętrzny rezonator 16MHz
- $swstack = 64
- $hwstack = 64
- $framesize = 200
- '**********************************************************
- '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
- '**********************************************************
- '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 'odczekaj 100ms
- Cls '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
- '**********************************************************
- '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 = 1 'ustaw dzień DNIA "START"
- Co2_miesiac = 1 'ustaw miesiąc DNIA "START"
- Co2_rok = 20 'ustaw rok DNIA "START"
- '**********************************************************
- 'ZEGAR
- Dim Dzien_tygodnia As Byte , Dzien_tygodnia_str As String * 2
- Dim Date_str As String * 10
- '_hour = 22 'ustaw godzinę
- '_min = 0 'ustaw minutę
- '_sec = 0 'ustaw sekundę
- 'Gosub Settime 'zapisz czas
- '_day = 24 'ustaw dzień
- '_month = 1 'ustaw miesiąc
- '_year = 20 'ustaw rok
- 'Gosub Setdate 'zapisz datę
- '**********************************************************
- 'CZASÓWKA
- Dim Pk_czas_start As String * 8 'godzina włączenia
- 'Dim Pk_data_start As String * 8 'data włączenia
- Dim Pk_long_start As Long 'czas włączenia
- Dim Pk_czas_stop As String * 8 'godzina wyłączenia
- 'Dim Pk_data_stop As String * 8 'data wyłączenia
- Dim Pk_long_stop As Long 'czas wyłączenia
- Dim Pk_dzien_tygodnia As Byte 'dzień tygodnia
- Dim Pk_long_teraz As Long 'teraźniejszy czas i data
- Pk_czas_start = "11:00:00" 'ustaw godzinę włączenia
- 'Pk_data_start = "24/01/20" 'ustaw datę włączenia
- Pk_czas_stop = "12:00:00" 'ustaw godzinę wyłączenia
- 'Pk_data_stop = "24/01/20" 'ustaw datę wyłączenia
- Pk_dzien_tygodnia = 5 'ustaw dzień tygodnia włączenia/wyłączenia
- '**********************************************************
- 'GLOBALNE PRZERWANIA
- Enable Interrupts
- '==========================================================
- 'GOŁÓWNA PĘTLA PROGRAMU
- '==========================================================
- Do
- '----------------------------------------------------------
- 'WYLICZ ILE DNI MINĘŁO OD DNIA "START" DO TERAZ
- 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 , 15 : Lcd Co2_dzien_teraz 'wyświetl ile dni minęło od dnia "START"
- '----------------------------------------------------------
- 'WYLICZ DZIEŃ TYGODNIA
- Dzien_tygodnia = Dayofweek()
- Dzien_tygodnia_str = Lookupstr(dzien_tygodnia , Dni_tygodnia)
- '----------------------------------------------------------
- '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)
- '----------------------------------------------------------
- 'WYŚWIETL CZAS, DATĘ I DZIEŃ TYGODNIA
- Locate 1 , 1 : Lcd Time$ 'wyświetl czas
- Locate 2 , 1 : Lcd Date_str ; " " ; Dzien_tygodnia_str 'wyświetl datę i dzień tygodnia
- '----------------------------------------------------------
- 'OBLICZ CZAS ZAŁĄCZANIA
- Pk_long_teraz = Syssec() 'czas teraźniejszy
- 'Pk_long_start = Syssec(pk_czas_start , Pk_data_start) 'czas i data włączenia
- Pk_long_start = Syssec(pk_czas_start , Date$) 'czas i data włączenia
- 'Pk_long_stop = Syssec(pk_czas_stop , Pk_data_stop) 'czas i data wyłączenia
- Pk_long_stop = Syssec(pk_czas_stop , Date$) 'czas i data wyłączenia
- '----------------------------------------------------------
- 'WŁĄCZ/WYŁĄCZ WYJŚCIA
- 'Jeżeli zostaną spełnione warunki:
- 'czas włączenia
- 'dzień tygodnia
- 'To włącz wyjście. Jeżeli któryś z warunków nie zostanie spełniony to wyłącz wyjście
- If Pk_long_start <= Pk_long_teraz And Pk_long_stop >= Pk_long_teraz And Pk_dzien_tygodnia = Dzien_tygodnia Then
- Set Pk_1 'włącz przekaźnik
- Locate 1 , 11 : Lcd "PK ON " 'wyświetl, że przekaźnik jest włączony
- Else
- Reset Pk_1 'wyłącz przekaźnik
- Locate 1 , 11 : Lcd "PK OFF" 'wyświetl, że przekaźnik jest wyłączony
- End If
- Loop
- End
- '==========================================================
- 'KONIEC GOŁÓWNEJ PĘTLI PROGRAMU
- '==========================================================
- '**********************************************************
- 'ODCZYT/ZAPIS ZEGARA
- Getdatetime: 'czytaj czas i datę
- 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 Dzien_tygodnia , 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
- Setdate: 'zapisz datę
- _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 Dzien_tygodnia 'dzien tygodnia
- I2cstop
- Return
- Settime: 'zapisz czas
- _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
- Dni_tygodnia:
- Data "Pn" , "Wt" , "Sr" , "Cz" , "Pt" , "So" , "Nd" 'dzień tygodnia do wyświetlenia
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: RTC, działania na podstawie czasu
Witam
Na sam początek zrezygnowałbym z sekund , taka precyzja uważam jest zbędna w tego typu sterownikach .
Nie będę silił się na pisanie przykładu w Bascom , bo znowu wpadnę w wir elektroniki , a tego teraz nie chce
Jak ja to widzę :
1. Podprogram zapis danych rok , miesiąc , dzień , godziny , minuty , sekundy do RTC .
2. Podprogram zapis do EEprom start/stop danych rok , miesiąc , dzień , godziny , minuty .
3.Warunek if start/stop zamknięty w pętli For Next w której odczytuję dane aktualne z zegara RTC i dane do porównania z EEprom .
Celowo zrezygnowałem z sekund , bo może się całe sprawdzanie pętli For Next nie zmieścić w czasie jednej sekundy zegara RTC ( to tylko moje przypuszczenia )
Na sam początek zrezygnowałbym z sekund , taka precyzja uważam jest zbędna w tego typu sterownikach .
Nie będę silił się na pisanie przykładu w Bascom , bo znowu wpadnę w wir elektroniki , a tego teraz nie chce
Jak ja to widzę :
1. Podprogram zapis danych rok , miesiąc , dzień , godziny , minuty , sekundy do RTC .
2. Podprogram zapis do EEprom start/stop danych rok , miesiąc , dzień , godziny , minuty .
3.Warunek if start/stop zamknięty w pętli For Next w której odczytuję dane aktualne z zegara RTC i dane do porównania z EEprom .
Celowo zrezygnowałem z sekund , bo może się całe sprawdzanie pętli For Next nie zmieścić w czasie jednej sekundy zegara RTC ( to tylko moje przypuszczenia )
- pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Re: RTC, działania na podstawie czasu
Pomysł sekund pojawił się ponieważ chciałem tym też sterować pompami perystaltycznymi, ale to chyba jednak zły pomysł. Pompki zrobię na osobnym sterowaniu - mam do tego fajny kod, ale niestety w Arduino.
Kombinuję dalej
Zrobiłem bazę (mam nadzieję, że dobrze zrozumiałem co Bartek pisał) do której mogę wpisać: czas 1-4 dla 8 czasówek, godzinę włączenia, minutę włączenia, godzinę wyłączenia, minutę włączenia, dni tygodnia kiedy ma pracować dana czasówka oraz przypisanie przekaźnika do czasówki
.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '
- '
- '**********************************************************
- 'MIKROKONTROLER
- $regfile = "m32def.dat" 'ATmega32
- $crystal = 16000000 'zewnętrzny rezonator 16MHz
- $swstack = 64
- $hwstack = 64
- $framesize = 200
- '**********************************************************
- '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 'odczekaj 100ms
- Cls '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
- '**********************************************************
- 'ZEGAR
- Dim Dzien_tygodnia As Byte , Dzien_tygodnia_str As String * 2
- Dim Date_str As String * 10
- '_hour = 14 'ustaw godzinę
- '_min = 13 'ustaw minutę
- '_sec = 0 'ustaw sekundę
- 'Gosub Settime 'zapisz czas
- '_day = 25 'ustaw dzień
- '_month = 1 'ustaw miesiąc
- '_year = 20 'ustaw rok
- 'Gosub Setdate 'zapisz datę
- '**********************************************************
- 'CZASÓWKA
- Dim Czasowka(392) As Byte , Czasowka_ee(392) As Eram Byte
- 'dane dla testów - docelowe dane będą wpisywane z menu sterownika
- Czasowka_ee(1) = 1 'włącz pierwszy czas dla czasówki nr1
- Czasowka_ee(33) = 16 'ustaw godzinę włączenia dla pierwszego czasu, czasówki nr1
- Czasowka_ee(65) = 0 'ustaw minutę włączenia dla pierwszego czasu, czasówki nr1
- Czasowka_ee(97) = 17 'ustaw godzinę wyłączenia dla pierwszego czasu, czasówki nr1
- Czasowka_ee(129) = 11 'ustaw minutę wyłączenia dla pierwszego czasu, czasówki nr1
- Czasowka_ee(161) = 1 'włącz załączanie pierwszego czasu dla czasówki nr w poniedziałek
- Czasowka_ee(193) = 1 'włącz załączanie pierwszego czasu dla czasówki nr we wtorek
- Czasowka_ee(225) = 1 'włącz załączanie pierwszego czasu dla czasówki nr w środę
- Czasowka_ee(257) = 1 'włącz załączanie pierwszego czasu dla czasówki nr w czwartek
- Czasowka_ee(289) = 1 'włącz załączanie pierwszego czasu dla czasówki nr w piątek
- Czasowka_ee(321) = 1 'włącz załączanie pierwszego czasu dla czasówki nr w sobotę
- Czasowka_ee(353) = 0 'wyłącz załączanie pierwszego czasu dla czasówki nr w niedzielę
- Czasowka_ee(385) = 1 'przypisz przekaźnik "Pk_1" dla czasówki nr1
- '----------------------------------------------------------
- '==========================================================
- '----------------------------------------------------------
- 'BAZA CZASÓWEK
- '--------------------------------------------------------------------------------------------------------------------------------
- 'czas (zakres 0-1) wyłącz/włącz
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
- '--------------------------------------------------------------------------------------------------------------------------------
- 'godzina start (zakres 0-23)
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '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
- '--------------------------------------------------------------------------------------------------------------------------------
- 'minuta start (zakres 0-59)
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
- '--------------------------------------------------------------------------------------------------------------------------------
- 'godzina stop (zakres 0-23)
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
- '--------------------------------------------------------------------------------------------------------------------------------
- 'minuta stop (zakres 0-59)
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
- '--------------------------------------------------------------------------------------------------------------------------------
- 'poniedziałek (zakres 0-1) wyłącz/włącz
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
- '--------------------------------------------------------------------------------------------------------------------------------
- 'wtorek (zakres 0-1) wyłącz/włącz
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
- '--------------------------------------------------------------------------------------------------------------------------------
- 'środa (zakres 0-1) wyłącz/włącz
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
- '--------------------------------------------------------------------------------------------------------------------------------
- 'czwartek (zakres 0-1) wyłącz/włącz
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
- '--------------------------------------------------------------------------------------------------------------------------------
- 'piątek (zakres 0-1) wyłącz/włącz
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
- '--------------------------------------------------------------------------------------------------------------------------------
- 'sobota (zakres 0-1) wyłącz/włącz
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
- '--------------------------------------------------------------------------------------------------------------------------------
- 'niedziela (zakres 0-1) wyłącz/włącz
- '1-1 1-2 1-3 1-4 2-1 2-2 2-3 2-4 3-1 3-2 3-3 3-4 4-1 4-2 4-3 4-4 5-1 5-2 5-3 5-4 6-1 6-2 6-3 6-4 7-1 7-2 7-3 7-4 8-1 8-2 8-3 8-4
- 'pozycja w bazie
- '353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
- '--------------------------------------------------------------------------------------------------------------------------------
- 'przekaźnik (zakres 1-16) przypisz przekaźnik do czasówki
- '1 2 3 4 5 6 7 8
- 'pozycja w bazie
- '385 386 387 388 389 390 391 392
- '--------------------------------------------------------------------------------------------------------------------------------
- 'Wczytaj dane czasówek z eeprom
- Dim N As Word
- For N = 1 To 392
- Czasowka(n) = Czasowka_ee(n)
- Next
- Dim Pk_czas_start As String * 8 'godzina włączenia
- Dim Pk_long_start As Long 'czas włączenia
- Dim Pk_czas_stop As String * 8 'godzina wyłączenia
- Dim Pk_long_stop As Long 'czas wyłączenia
- Dim Pk_long_teraz As Long 'teraźniejszy czas i data
- 'czas włączenia
- If Czasowka(33) < 10 Then
- Pk_czas_start = "0" + Str(czasowka(33))
- Else
- Pk_czas_start = Str(czasowka(33))
- End If
- If Czasowka(65) < 10 Then
- Pk_czas_start = Pk_czas_start + ":0" + Str(czasowka(65)) + ":00"
- Else
- Pk_czas_start = Pk_czas_start + ":" + Str(czasowka(65)) + ":00"
- End If
- 'czas wyłączenia
- If Czasowka(97) < 10 Then
- Pk_czas_stop = "0" + Str(czasowka(97))
- Else
- Pk_czas_stop = Str(czasowka(97))
- End If
- If Czasowka(129) < 10 Then
- Pk_czas_stop = Pk_czas_stop + ":0" + Str(czasowka(129)) + ":00"
- Else
- Pk_czas_stop = Pk_czas_stop + ":" + Str(czasowka(129)) + ":00"
- End If
- 'sprawdzam przypisanie czasu włączenia/wyłączenia
- Locate 1 , 1 : Lcd Pk_czas_start
- Locate 2 , 1 : Lcd Pk_czas_stop
- Wait 1 : Cls
- '**********************************************************
- 'GLOBALNE PRZERWANIA
- Enable Interrupts
- '==========================================================
- 'GŁÓWNA PĘTLA PROGRAMU
- '==========================================================
- Do
- '----------------------------------------------------------
- 'WYLICZ DZIEŃ TYGODNIA
- Dzien_tygodnia = Dayofweek()
- Dzien_tygodnia_str = Lookupstr(dzien_tygodnia , Dni_tygodnia)
- '----------------------------------------------------------
- '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)
- '----------------------------------------------------------
- 'WYŚWIETL CZAS, DATĘ I DZIEŃ TYGODNIA
- Locate 1 , 1 : Lcd Time$ 'wyświetl czas
- Locate 2 , 1 : Lcd Date_str ; " " ; Dzien_tygodnia_str 'wyświetl datę i dzień tygodnia
- '----------------------------------------------------------
- 'OBLICZ CZAS ZAŁĄCZANIA
- Pk_long_teraz = Syssec() 'czas teraźniejszy
- Pk_long_start = Syssec(pk_czas_start , Date$) 'czas i data włączenia
- Pk_long_stop = Syssec(pk_czas_stop , Date$) 'czas i data wyłączenia
- '----------------------------------------------------------
- 'WŁĄCZ/WYŁĄCZ WYJŚCIA
- ' Jeżeli zostaną spełnione warunki:
- ' 1. Czas włączenia jest mniejszy lub równy od teraźniejszego czasu
- ' 2. Czas wyłączenia jest większy lub równy od teraźniejszego czasu
- ' 3. Dzień tygodnia jest zgodny z dzisiejszym dniem tygodnia - w bazie ma wartość "1"
- ' To włącz wyjście.
- ' Jeżeli któryś z warunków nie zostanie spełniony to wyłącz wyjście
- If Pk_long_start <= Pk_long_teraz And Pk_long_stop >= Pk_long_teraz And Czasowka(321) = 1 Then
- Set Pk_1 'włącz przekaźnik
- Locate 1 , 11 : Lcd "PK ON " 'wyświetl, że przekaźnik jest włączony
- Else
- Reset Pk_1 'wyłącz przekaźnik
- Locate 1 , 11 : Lcd "PK OFF" 'wyświetl, że przekaźnik jest wyłączony
- End If
- Loop
- End
- '==========================================================
- 'KONIEC GŁÓWNEJ PĘTLI PROGRAMU
- '==========================================================
- '**********************************************************
- 'ODCZYT/ZAPIS ZEGARA
- Getdatetime: 'czytaj czas i datę
- 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 Dzien_tygodnia , 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
- Setdate: 'zapisz datę
- _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 Dzien_tygodnia 'dzien tygodnia
- I2cstop
- Return
- Settime: 'zapisz czas
- _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
- Dni_tygodnia:
- Data "Pn" , "Wt" , "Sr" , "Cz" , "Pt" , "So" , "Nd" 'dzień tygodnia do wyświetlenia
No i teraz tak, dane będę wpisywał z menu sterownika (teraz wpisałem przykładowe dane dla pierwszego czasu, pierwszej czasówki) dane trafią do eeprom. Baza działa, ale ja nie wiem jak napisać program aby wyciągnąć te dane i na ich podstawie sterować wyjściami - teraz działa, ale tylko dla jednego czasu, a będzie ich w sumie 32
Druga sprawa, jak przypisać czasówkę do przekaźnika?
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: RTC, działania na podstawie czasu
Wydaje mi się, że niektóre rzeczy niepotrzebnie sobie komplikujesz
Nie znalazłbym się w tych Twoich numerach bajtów za to ja pisze to używając stałych. Wiem że jeden wpis ma mieć np. osiem bajtów. W pierwszym mogę sobie dać numer porządkowy lub aktywne dni tygodnia a w ostatnim numer wyjścia którym chcę sterować. Wpisów ma być 32 tak? No to piszę Liczba_wpisów = 32 a potem niżej, że Rozmiar_bazy to Liczba_wpisów * 8 i kompilator mi to sam policzy a ja dokładnie wiem ile bajtów muszę zarezerwować (a dokładniej to nie muszę tego wiedzieć )
Później buduję sobie buforek na osiem bajtów a po bazie będę się poruszał "co osiem bajtów" (Idx = Idx + 8)
Bascomowe funkcje do czasu wymagaja tylko jednego. Musisz mieć w kodzie zdefiniowane trzy bajty, jeden za drugim w których będzie sekanda, minuta i godzina.
Na taki buforek nakładam sobie takie fantowowe zmienne poprzez Overlay i już moge napisać Time_on = Syssec(Sec_on) Wszystko prosto i króciutko.
Jak znajdę taki wpis że akurat coś ma być włączone to sprawdzam ostatni bajt buforka żeby sprawdzić którym wyjściem mamy się zająć...i to pomału wszystko.
Wystarczy teraz dopisać Eeprom. To chyba na razie tylko 256bajtów a masz 1KB
Możesz to sobie sprawdzać nawet co sekundę. Procek i tak będzie ziewał.
Zauważ tylko ile mniej jest myślenia jak tworzysz pętle a masz stałe - piszesz np "For N = 1 To Liczba_wpisów"
W ten sposób możesz sobie kiedyś dodać kilka wpisów i nie martwić się że gdzieś w kodzie masz za małą cyferkę
Niestety na razie muszę wracać do swoich zadań no i nie chciałem psuć Tobie całej zabawy
Nie znalazłbym się w tych Twoich numerach bajtów za to ja pisze to używając stałych. Wiem że jeden wpis ma mieć np. osiem bajtów. W pierwszym mogę sobie dać numer porządkowy lub aktywne dni tygodnia a w ostatnim numer wyjścia którym chcę sterować. Wpisów ma być 32 tak? No to piszę Liczba_wpisów = 32 a potem niżej, że Rozmiar_bazy to Liczba_wpisów * 8 i kompilator mi to sam policzy a ja dokładnie wiem ile bajtów muszę zarezerwować (a dokładniej to nie muszę tego wiedzieć )
Później buduję sobie buforek na osiem bajtów a po bazie będę się poruszał "co osiem bajtów" (Idx = Idx + 8)
Bascomowe funkcje do czasu wymagaja tylko jednego. Musisz mieć w kodzie zdefiniowane trzy bajty, jeden za drugim w których będzie sekanda, minuta i godzina.
Na taki buforek nakładam sobie takie fantowowe zmienne poprzez Overlay i już moge napisać Time_on = Syssec(Sec_on) Wszystko prosto i króciutko.
Jak znajdę taki wpis że akurat coś ma być włączone to sprawdzam ostatni bajt buforka żeby sprawdzić którym wyjściem mamy się zająć...i to pomału wszystko.
Wystarczy teraz dopisać Eeprom. To chyba na razie tylko 256bajtów a masz 1KB
Możesz to sobie sprawdzać nawet co sekundę. Procek i tak będzie ziewał.
Zauważ tylko ile mniej jest myślenia jak tworzysz pętle a masz stałe - piszesz np "For N = 1 To Liczba_wpisów"
W ten sposób możesz sobie kiedyś dodać kilka wpisów i nie martwić się że gdzieś w kodzie masz za małą cyferkę
Niestety na razie muszę wracać do swoich zadań no i nie chciałem psuć Tobie całej zabawy
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m32def.dat" 'ATmega32 SRAM 2KB, EEPROM 1KB
- $crystal = 16000000 'zewnętrzny rezonator 16MHz
- $swstack = 64
- $hwstack = 64
- $framesize = 200
- Config Submode = New
- Const Liczba_wpisow = 32
- Config Clock = User
- Dim Helpb As Byte , N As Byte , M As Byte , Idx As Word
- '|NR|SEC_ON|MIN_ON|HOUR_ON|SEC_OFF|MIN_OFF|HOUR_OFF|OUT_NR| <-osiem bajtów
- Const Rozmiar_bazy = Liczba_wpisow * 8
- Dim Base(rozmiar_bazy) As Byte 'zarezerwuj tyle bajtów
- Dim Mybuff(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 Outs As Long
- Dim _out(4) As Byte At Outs Overlay
- Sub Check_scheduler()
- Outs = 0
- Idx = 1
- For N = 1 To Liczba_wpisow
- M = Memcopy(base(idx) , Mybuff(1) , 8)
- Time_now = Syssec(_sec) 'czas aktualny
- Time_on = Syssec(sec_on)
- Time_off = Syssec(sec_off)
- 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
- Idx = Idx + 8
- Next
- For N = 1 To 4
- If _out(n) = 1 Then
- Select Case N
- Case 1 : Set Porta.4
- Case 2 : Set Portb.1
- Case 3 : Set Portc.2
- Case 4 : Set Portd.7
- End Select
- Else
- Select Case N
- Case 1 : Reset Porta.4
- Case 2 : Reset Portb.1
- Case 3 : Reset Portc.2
- Case 4 : Reset Portd.7
- End Select
- End If
- Next
- End Sub
- Do
- If _sec = 0 Then Call Check_scheduler 'np.raz na minute
- Loop