[Rozwiązany] RTC, działania na podstawie czasu

Pytania, kody i porady dotyczące nie tylko Bascom.
grzeniu 73
Posty: 26
Rejestracja: 07 lip 2019, 0:32

Re: RTC, działania na podstawie czasu

Post autor: grzeniu 73 » 30 sty 2020, 14:23

Hejka! Przede wszystkim witam wszystkich. Robilem taki sterownik na 16 kanałów i każdy ma 4 programy + dni tygodnia + auto . Ja wszystko zamieniam na liczbę long

Kod: Zaznacz cały

    
          Lsecofday = 0
           Bsec = Sekundy
           Bmin = Minuty
           Bhour = Godziny



     Bhour = Bhour * 3600
     Bmin = Bmin * 60
     Lsecofday = Bhour + Bmin
     Lsecofday = Lsecofday + Bsec
     Czas_aktualny = Lsecofday
Tak samo ustawiony czas. Do wszystkich kanałów wystarczają mi 4 pętle na sprawdzenie włączenia i 4 na wyłączenia.

Kod: Zaznacz cały

  For I = 1 To 16 Step 1

               nop

          If Czas_aktualny >= Wl_ster_1(i) And Czas_aktualny <= Wyl_ster_1(i) And Dzien_tyg(i).d = 1 Then Ster(i).0 = 1
          If Czas_aktualny >= Wl_ster_2(i) And Czas_aktualny <= Wyl_ster_2(i) And Dzien_tyg(i).d = 1 Then Ster(i).1 = 1
          If Czas_aktualny >= Wl_ster_3(i) And Czas_aktualny <= Wyl_ster_3(i) And Dzien_tyg(i).d = 1 Then Ster(i).2 = 1
          If Czas_aktualny >= Wl_ster_4(i) And Czas_aktualny <= Wyl_ster_4(i) And Dzien_tyg(i).d = 1 Then Ster(i).3 = 1


            '************************************************

           If Czas_aktualny < Wl_ster_1(i) Or Wyl_ster_1(i) <= Czas_aktualny Then Ster(i).0 = 0       '     Czasy WYLACZENIA
           If Czas_aktualny < Wl_ster_2(i) Or Wyl_ster_2(i) <= Czas_aktualny Then Ster(i).1 = 0
           If Czas_aktualny < Wl_ster_3(i) Or Wyl_ster_3(i) <= Czas_aktualny Then Ster(i).2 = 0
           If Czas_aktualny < Wl_ster_4(i) Or Wyl_ster_4(i) <= Czas_aktualny Then Ster(i).3 = 0


            X = I - 1
            If Auto.x = 1 Then
             Ster(i) = Pk.x
             End If

            If Dzien_tyg(i).d = 0 And Auto.x = 0 Then Ster(i) = 0

            If Old_ster(i) <> Ster(i) Then
               Old_ster(i) = Ster(i)
              Print "ster:" ; I ; ":" ; Ster(i)
               End If


            Next I
To cały kod obsługi . Zmienna D to dzień tygodnia . X - to czy ma byc aktywna funkcja auto czy ręczne włączanie. Minus taki ,ze sporo longow do zapisu w eeprom , plus taki,ze jak braknie zasilania to po włączeniu i tak będzie wiedział czy ma byc pin włączony czy wyłączony. Porównując zgodność godziny po resecie juz sie nie włączy lub nie wyłączy.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 31 sty 2020, 8:40

@pimowo
Tę bazę musisz zainicjować za pierwszym razem w eeprom bo normalnie po programowaniu komórki eeprom mają FF a to znaczy że ósmy bit wszędzie ustawiony i nie znajdzie wolnego miejsca na pierwszy czy kolejny wpis.

Może później wrzucę to na chwilę na ZL3AVR i pomigam LEDami z dokładnością do sekundy ;)
Tu masz prawie wszystkie funkcje a dodałbym tu Timer 10ms dla podstawy czasu na potrzeby przycisków no i RTC, ale u sibie z lenistwa dam tylko kwarc zegarkowy :D
  1. $regfile = "m32def.dat"                                 'ATmega32 SRAM 2KB, EEPROM 1KB
  2.     $crystal = 16000000                                     'zewnętrzny rezonator  16MHz
  3.     $swstack = 64
  4.     $hwstack = 64
  5.     $framesize = 200
  6.     Config Submode = New
  7.  
  8.     Const Liczba_wpisow = 32
  9.  
  10.     Config Clock = User
  11.  
  12.     Dim Helpb As Byte , N As Byte , M As Byte , Idx As Word
  13.  
  14.     '|NR|SEC_ON|MIN_ON|HOUR_ON|SEC_OFF|MIN_OFF|HOUR_OFF|OUT_NR|   <-osiem bajtów
  15.     Const Rozmiar_bazy = Liczba_wpisow * 8
  16.  
  17.     Dim Base(rozmiar_bazy) As Byte                          'zarezerwuj tyle bajtów
  18.  
  19.     Dim Mybuff(8) As Byte
  20.     Dim Tempbuff(8) As Byte
  21.     Dim Sec_on As Byte At Mybuff(2) Overlay
  22.     Dim Sec_off As Byte At Mybuff(5) Overlay
  23.  
  24.     Dim Time_now As Long , Time_on As Long , Time_off As Long , Old_sec As Byte
  25.  
  26.     Dim Outs As Long
  27.     Dim _out(4) As Byte At Outs Overlay
  28.  
  29.     Sub Check_scheduler()
  30.      Outs = 0
  31.       Idx = 1
  32.  
  33.      Time_now = Syssec(_sec)                                'czas aktualny oblicz raz
  34.      Dim Daynow As Byte
  35.       Daynow = Dayofweek(time_now)                          'oblicz raz
  36.  
  37.      For N = 1 To Liczba_wpisow
  38.  
  39.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bajtów z bazy
  40.  
  41.        If Mybuff(1).7 = 1 Then                              'jeśli ósmy bit =1 to wpis jest aktywny
  42.           If Mybuff(1).daynow = 1 Then                      'jeśli w bajcie aktywny jest ten dzień tygodnia
  43.  
  44.             M = Memcopy(_sec , Tempbuff(4) , 3)             'kopiuj do Tempbuff _day, _month i _year
  45.             M = Memcopy(sec_on , Tempbuff(1) , 3)           'kopiuj sec_on, min_on i hour_on do Tempbuff
  46.             Time_on = Syssec(tempbuff(1))
  47.             M = Memcopy(sec_off , Tempbuff(1) , 3)
  48.             Time_off = Syssec(tempbuff(1))
  49.  
  50.             If Time_now > Time_on Then
  51.              If Time_now < Time_off Then
  52.               Helpb = Mybuff(8)                             'które wyjście
  53.               _out(helpb) = 1                               'zapamietaj że mamy to włączyć
  54.              End If
  55.             End If
  56.  
  57.           End If
  58.        End If
  59.       Idx = Idx + 8
  60.      Next
  61.  
  62.      For N = 1 To 4
  63.       If _out(n) = 1 Then
  64.        Select Case N
  65.         Case 1 : Set Porta.4
  66.         Case 2 : Set Portb.1
  67.         Case 3 : Set Portc.2
  68.         Case 4 : Set Portd.7
  69.        End Select
  70.       Else
  71.        Select Case N
  72.         Case 1 : Reset Porta.4
  73.         Case 2 : Reset Portb.1
  74.         Case 3 : Reset Portc.2
  75.         Case 4 : Reset Portd.7
  76.        End Select
  77.       End If
  78.      Next
  79.     End Sub
  80.  
  81.     Sub Set_record(byval Days As Byte , Byval Secs_on As Byte , Byval Mins_on As Byte , Byval Hours_on As Byte , _
  82.      Byval Secs_off As Byte , Byval Mins_off As Byte , Byval Hours_off As Byte , Byval Out_relay As Byte)
  83.  
  84.      For N = 1 To Liczba_wpisow
  85.  
  86.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bajtów z bazy
  87.       If Mybuff(1).7 = 0 Then                               'ten rekord jest wolny, zapiszemy go
  88.  
  89.        Mybuff(1) = Days
  90.        Mybuff(2) = Secs_on
  91.        Mybuff(3) = Mins_on
  92.        Mybuff(4) = Hours_on
  93.        Mybuff(5) = Secs_off
  94.        Mybuff(6) = Mins_off
  95.        Mybuff(7) = Hours_off
  96.        Mybuff(8) = Out_relay
  97.  
  98.        'zapis do RAM
  99.        M = Memcopy(mybuff(1) , Base(idx) , 8)
  100.  
  101.        'zapis do eeprom
  102.        Helpb = Idx + 8
  103.        For N = Idx To Helpb
  104.         Mybase_ee(n) = Base(n)
  105.        Next
  106.  
  107.  
  108.       End If
  109.  
  110.       Idx = Idx + 8
  111.      Next
  112.  
  113.     End Sub
  114.  
  115.  
  116.     Dim Ee_check As Eram Byte
  117.     Dim Mybase_ee(rozmiar_bazy) As Eram Byte
  118.  
  119.     'pierwsze programowanie eeprom
  120.     Helpb = Ee_check
  121.     If Helpb <> 0 Then
  122.      Ee_check = 0
  123.      Idx = 1
  124.       For N = 1 To Liczba_wpisow
  125.        Mybase_ee(idx) = 0
  126.        Idx = Idx + 8
  127.       Next
  128.  
  129.     End If
  130.  
  131.     'normalny odczyt eeprom do RAM
  132.     For Idx = 1 To Rozmiar_bazy
  133.      Base(idx) = Mybase_ee(idx)
  134.     Next
  135.  
  136.  
  137.     'bity 7=Aktywny, od prawej pon,wto,sro..i sob.
  138.     Call Set_record(&B1010_0111 , 0 , 0 , 12 , 0 , 30 , 23 , 4)       'relay 4  from 12:00 to 23:30
  139.  
  140.  
  141.  
  142.     Do
  143.      If Old_sec <> _sec Then
  144.       Old_sec = _sec
  145.        Call Check_scheduler                                 'np.raz na sekunde
  146.      End If
  147.     Loop
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 31 sty 2020, 9:47

Wygląda na to, że wszytko zrobiłem tak samo.
Wydaje mi się, że coś jest nie tak z wczytywaniem danych czasu z bazy i tu kombinowałem.

Z tego co pamiętam to zmieniłem:
  1. M = Memcopy(_sec , Tempbuff(4) , 3)             'kopiuj do Tempbuff _day, _month i _year
na:
  1. M = Memcopy(_day , Tempbuff(4) , 3)             'kopiuj do Tempbuff _day, _month i _year
I coś jeszcze, ale teraz nie pamiętam :(
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 31 sty 2020, 9:56

Teraz wyruszam moją śnieżną panterą do Biedronki. Jak wrócę to pewnie wrzucę to na chwilę na płytę i jakiś kolejny mój błąd się znajdzie :D
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 31 sty 2020, 18:52

A co to jest "śnieżna pantera"? :)

Coś zaczęło działać, ale nie zdążyłem potestować dokładniej, może wieczorem się uda.
.
  1. $regfile = "m32def.dat"                                 'ATmega32 SRAM 2KB, EEPROM 1KB
  2. $crystal = 16000000                                     'zewnętrzny rezonator  16MHz
  3. $swstack = 64
  4. $hwstack = 64
  5. $framesize = 200
  6.  
  7. '**********************************************************
  8. '
  9.  
  10. Config Submode = New
  11.  
  12. '**********************************************************
  13. 'TIMER
  14.  
  15. Config Timer2 = Timer , Prescale = 1024 , Compare = Disconnect , Clear_timer = 1 : Compare2 = 155       '10ms @16MHz
  16.  
  17. '**********************************************************
  18. 'WYJŚCIA "przekaźniki"
  19.  
  20. Config Porta.0 = Output : Porta.0 = 0 : Pk_1 Alias Porta.0  'wyjście nr1
  21. Config Porta.1 = Output : Porta.1 = 0 : Pk_2 Alias Porta.1  'wyjście nr2
  22. Config Porta.2 = Output : Porta.2 = 0 : Pk_3 Alias Porta.2  'wyjście nr3
  23. Config Porta.3 = Output : Porta.3 = 0 : Pk_4 Alias Porta.3  'wyjście nr4
  24. Config Porta.4 = Output : Porta.4 = 0 : Pk_5 Alias Porta.4  'wyjście nr5
  25. Config Porta.5 = Output : Porta.5 = 0 : Pk_6 Alias Porta.5  'wyjście nr6
  26. Config Porta.6 = Output : Porta.6 = 0 : Pk_7 Alias Porta.6  'wyjście nr7
  27. Config Porta.7 = Output : Porta.7 = 0 : Pk_8 Alias Porta.7  'wyjście nr8
  28. Config Portd.0 = Output : Portd.0 = 0 : Pk_9 Alias Portd.0  'wyjście nr9
  29. Config Portd.1 = Output : Portd.1 = 0 : Pk_10 Alias Portd.1 'wyjście nr19
  30. Config Portd.2 = Output : Portd.2 = 0 : Pk_11 Alias Portd.2 'wyjście nr11
  31. Config Portd.3 = Output : Portd.3 = 0 : Pk_12 Alias Portd.3 'wyjście nr12
  32. Config Portd.4 = Output : Portd.4 = 0 : Pk_13 Alias Portd.4 'wyjście nr13
  33. Config Portd.5 = Output : Portd.5 = 0 : Pk_14 Alias Portd.5 'wyjście nr14
  34. Config Portd.6 = Output : Portd.6 = 0 : Pk_15 Alias Portd.6 'wyjście nr15
  35. Config Portd.7 = Output : Portd.7 = 0 : Pk_16 Alias Portd.7 'wyjście nr16
  36.  
  37. '**********************************************************
  38. 'WYŚWIETLACZ LCD
  39.  
  40. $lib "bl_Lcd_i2c.lib"                                       'biblioteka I2C LCD
  41.  
  42. 'Config Lcd = 16x2                                           'wyświetlacz 16x2
  43. Config Lcd = 20x4                                           'wyświetlacz 20x4
  44.  
  45. Const Pcf_d4 = 4                                            'pin D4
  46. Const Pcf_d5 = 5                                            'pin D5
  47. Const Pcf_d6 = 6                                            'pin D6
  48. Const Pcf_d7 = 7                                            'pin D7
  49. Const Pcf_rs = 0                                            'pin RS
  50. Const Pcf_rw = 1                                            'pin RW
  51. Const Pcf_e1 = 2                                            'pin E
  52.  
  53. Dim _lcd_e As Byte
  54. Dim Backlight As Byte
  55.  
  56. Backlight_on Alias &H08
  57. Backlight_off Alias &H00
  58. Backlight = Backlight_on                                    'włącz podświetlenie
  59. _lcd_e = 128
  60.  
  61. 'Const Pcf8574_lcd = &H4E                                    'adres PCF
  62. 'Const Pcf8574_lcd = &H40
  63. Const Pcf8574_lcd = &H7E
  64.  
  65. Waitms 100 : Cls                                            'odczekaj 100ms i wyczyść ekran
  66.  
  67. '**********************************************************
  68. 'I2C
  69.  
  70. Config Scl = Portc.0                                        'pin SCL
  71. Config Sda = Portc.1                                        'pin SDA
  72. I2cinit
  73. Config Twi = 400000                                         'prędkość I2C
  74.  
  75. '**********************************************************
  76. 'DS3231
  77.  
  78. Config Clock = User
  79. Config Date = Dmy , Separator = /                           'oddziel datę ukośnikiem
  80.  
  81. Const Ds3231w = &HD0                                        'adres DS3231 do zapisu
  82. Const Ds3231r = &HD1                                        'adres DS3231 do odczytu
  83.  
  84. '**********************************************************
  85. 'CZAS
  86.  
  87. Dim 100ms As Byte
  88. Dim 1s As Byte
  89. Dim 1m As Byte
  90.  
  91. '**********************************************************
  92. 'ZEGAR
  93.  
  94. Dim Weekday As Byte , Weekday_str As String * 12
  95. Dim Old_sec As Byte
  96. Dim Date_str As String * 10
  97.  
  98. '_hour = 17                                                   'ustaw godzinę
  99. '_min = 0                                                   'ustaw minutę
  100. '_sec = 0                                                    'ustaw sekundę
  101. 'Gosub Settime                                               'zapisz czas
  102.  
  103. '_day = 31                                                   'ustaw dzień
  104. '_month = 1                                                  'ustaw miesiąc
  105. '_year = 20                                                  'ustaw rok
  106. 'Gosub Setdate                                               'zapisz datę
  107.  
  108. '**********************************************************
  109. 'CZASÓWKA
  110.  
  111. Const Liczba_wpisow = 32
  112. Const Rozmiar_bazy = Liczba_wpisow * 8
  113.  
  114. '|DAY_WEEK|SEC_ON|MIN_ON|HOUR_ON|SEC_OFF|MIN_OFF|HOUR_OFF|OUT_NR|   <-osiem bajtów
  115.  
  116. Dim Helpb As Byte , N As Byte , D As Byte , M As Byte , Idx As Word
  117.  
  118. Dim Base(rozmiar_bazy) As Byte                          'zarezerwuj tyle bajtów
  119.  
  120. Dim Ee_check As Eram Byte
  121. Dim Mybase_ee(rozmiar_bazy) As Eram Byte
  122.  
  123. Dim Mybuff(8) As Byte
  124. Dim Tempbuff(8) As Byte
  125.  
  126. Dim Sec_on As Byte At Mybuff(2) Overlay
  127. Dim Sec_off As Byte At Mybuff(5) Overlay
  128. Dim Time_now As Long , Time_on As Long , Time_off As Long
  129.  
  130. Dim Daynow As Byte
  131.  
  132. Dim Outs As Long
  133. Dim _out(16) As Byte At Outs Overlay
  134.  
  135. '**********************************************************
  136. 'HARMONOGRAM DZIAŁANIA CZASÓWEK
  137.  
  138. Sub Check_scheduler()
  139.  
  140.    Outs = 0
  141.    Idx = 1
  142.  
  143.    For N = 1 To Liczba_wpisow
  144.  
  145.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bajtów z bazy
  146.  
  147.       If Mybuff(1).7 = 1 Then                               'jeśli ósmy bit =1 to wpis jest aktywny
  148.  
  149.          If Mybuff(1).daynow = 1 Then                       'jeśli w bajcie aktywny jest ten dzień tygodnia
  150.  
  151.             M = Memcopy(_day , Tempbuff(4) , 3)             'kopiuj do Tempbuff _day, _month i _year
  152.  
  153.             M = Memcopy(sec_on , Tempbuff(1) , 3)           'kopiuj sec_on, min_on i hour_on do Tempbuff
  154.             Time_on = Syssec(tempbuff(1) , Tempbuff(4))
  155.  
  156.             M = Memcopy(sec_off , Tempbuff(1) , 3)
  157.             Time_off = Syssec(tempbuff(1) , Tempbuff(4))
  158.  
  159.             If Time_now >= Time_on Then
  160.  
  161.                If Time_now <= Time_off Then
  162.  
  163.                   Helpb = Mybuff(8)                         'które wyjście
  164.                   _out(helpb) = 1                           'zapamietaj że mamy to włączyć
  165.  
  166.                End If
  167.  
  168.             End If
  169.  
  170.          End If
  171.  
  172.       End If
  173.  
  174.       Idx = Idx + 8
  175.  
  176.    Next
  177.  
  178.    '-----------------------------------
  179.    'STEROWANIE WYJŚCIAMI
  180.  
  181.    For N = 1 To 16
  182.  
  183.       If _out(n) = 1 Then
  184.  
  185.          Select Case N
  186.  
  187.             Case 1 : Set Pk_1
  188.             Case 2 : Set Pk_2
  189.             Case 3 : Set Pk_3
  190.             Case 4 : Set Pk_4
  191.             Case 5 : Set Pk_5
  192.             Case 6 : Set Pk_6
  193.             Case 7 : Set Pk_7
  194.             Case 8 : Set Pk_8
  195.             Case 9 : Set Pk_9
  196.             Case 10 : Set Pk_10
  197.             Case 11 : Set Pk_11
  198.             Case 12 : Set Pk_12
  199.             Case 13 : Set Pk_13
  200.             Case 14 : Set Pk_14
  201.             Case 15 : Set Pk_15
  202.             Case 16 : Set Pk_16
  203.  
  204.          End Select
  205.  
  206.       Else
  207.  
  208.          Select Case N
  209.  
  210.             Case 1 : Reset Pk_1
  211.             Case 2 : Reset Pk_2
  212.             Case 3 : Reset Pk_3
  213.             Case 4 : Reset Pk_4
  214.             Case 5 : Reset Pk_5
  215.             Case 6 : Reset Pk_6
  216.             Case 7 : Reset Pk_7
  217.             Case 8 : Reset Pk_8
  218.             Case 9 : Reset Pk_9
  219.             Case 10 : Reset Pk_10
  220.             Case 11 : Reset Pk_11
  221.             Case 12 : Reset Pk_12
  222.             Case 13 : Reset Pk_13
  223.             Case 14 : Reset Pk_14
  224.             Case 15 : Reset Pk_15
  225.             Case 16 : Reset Pk_16
  226.  
  227.          End Select
  228.  
  229.       End If
  230.  
  231.    Next
  232.  
  233. End Sub
  234.  
  235. '**********************************************************
  236. '
  237.  
  238. Sub Set_record(byval Days As Byte , Byval Secs_on As Byte , Byval Mins_on As Byte , Byval Hours_on As Byte , _
  239.                Byval Secs_off As Byte , Byval Mins_off As Byte , Byval Hours_off As Byte , Byval Out_relay As Byte)
  240.  
  241.    Idx = 1
  242.  
  243.    For N = 1 To Liczba_wpisow
  244.  
  245.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bajtów z bazy
  246.  
  247.       If Mybuff(1).7 = 0 Then                               'ten rekord jest wolny, zapiszemy go
  248.  
  249.          Mybuff(1) = Days
  250.          Mybuff(2) = Secs_on
  251.          Mybuff(3) = Mins_on
  252.          Mybuff(4) = Hours_on
  253.          Mybuff(5) = Secs_off
  254.          Mybuff(6) = Mins_off
  255.          Mybuff(7) = Hours_off
  256.          Mybuff(8) = Out_relay
  257.  
  258.          'zapis do RAM
  259.          M = Memcopy(mybuff(1) , Base(idx) , 8)
  260.  
  261.          'zapis do eeprom
  262.          Helpb = Idx + 8
  263.  
  264.          For N = Idx To Helpb
  265.  
  266.             Mybase_ee(n) = Base(n)
  267.  
  268.          Next
  269.  
  270.       End If
  271.  
  272.       Idx = Idx + 8
  273.  
  274.    Next
  275.  
  276. End Sub
  277.  
  278. '**********************************************************
  279. 'pierwsze programowanie eeprom
  280.  
  281. Helpb = Ee_check
  282.  
  283. If Helpb <> 0 Then
  284.  
  285.    Ee_check = 0
  286.    Idx = 1
  287.  
  288.    For N = 1 To Liczba_wpisow
  289.  
  290.       Mybase_ee(idx) = 0
  291.       Idx = Idx + 8
  292.  
  293.    Next
  294.  
  295. End If
  296.  
  297. '**********************************************************
  298. 'Uzupełnij bazę
  299.  
  300. 'bity 7=Aktywny, od prawej pon,wto,sro..i sob.
  301. Call Set_record(&B1111_1111 , 0 , 0 , 18 , 0 , 0 , 19 , 1)  'wyjście 1, przekażnik 1, czas 1
  302. Call Set_record(&B1111_1111 , 0 , 0 , 17 , 0 , 0 , 18 , 1)  'wyjście 1, przekażnik 1, czas 2
  303. Call Set_record(&B1111_1111 , 0 , 0 , 16 , 0 , 0 , 17 , 1)  'wyjście 1, przekażnik 1, czas 3
  304. Call Set_record(&B1111_1111 , 0 , 0 , 15 , 0 , 0 , 16 , 1)  'wyjście 1, przekażnik 1, czas 4
  305.  
  306. Call Set_record(&B1111_1111 , 0 , 0 , 18 , 0 , 0 , 19 , 2)  'wyjście 2, przekażnik 2, czas 1
  307. Call Set_record(&B1111_1111 , 0 , 0 , 17 , 0 , 0 , 18 , 2)  'wyjście 2, przekażnik 2, czas 2
  308. Call Set_record(&B1111_1111 , 0 , 0 , 16 , 0 , 0 , 17 , 2)  'wyjście 2, przekażnik 2, czas 3
  309. Call Set_record(&B1111_1111 , 0 , 0 , 15 , 0 , 0 , 16 , 2)  'wyjście 2, przekażnik 2, czas 4
  310.  
  311. Call Set_record(&B1111_1111 , 0 , 0 , 18 , 0 , 0 , 19 , 3)  'wyjście 3, przekażnik 3, czas 1
  312. Call Set_record(&B1111_1111 , 0 , 0 , 17 , 0 , 0 , 18 , 3)  'wyjście 3, przekażnik 3, czas 2
  313. Call Set_record(&B1111_1111 , 0 , 0 , 16 , 0 , 0 , 17 , 3)  'wyjście 3, przekażnik 3, czas 3
  314. Call Set_record(&B1111_1111 , 0 , 0 , 15 , 0 , 0 , 16 , 3)  'wyjście 3, przekażnik 3, czas 4
  315.  
  316. Call Set_record(&B1111_1111 , 0 , 0 , 18 , 0 , 0 , 19 , 4)  'wyjście 4, przekażnik 4, czas 1
  317. Call Set_record(&B1111_1111 , 0 , 0 , 17 , 0 , 0 , 18 , 4)  'wyjście 4, przekażnik 4, czas 2
  318. Call Set_record(&B1111_1111 , 0 , 0 , 16 , 0 , 0 , 17 , 4)  'wyjście 4, przekażnik 4, czas 3
  319. Call Set_record(&B1111_1111 , 0 , 0 , 15 , 0 , 0 , 16 , 4)  'wyjście 4, przekażnik 4, czas 4
  320.  
  321. Call Set_record(&B1111_1111 , 0 , 0 , 18 , 0 , 0 , 19 , 5)  'wyjście 5, przekażnik 5, czas 1
  322. Call Set_record(&B1111_1111 , 0 , 0 , 17 , 0 , 0 , 18 , 5)  'wyjście 5, przekażnik 5, czas 2
  323. Call Set_record(&B1111_1111 , 0 , 0 , 16 , 0 , 0 , 17 , 5)  'wyjście 5, przekażnik 5, czas 3
  324. Call Set_record(&B1111_1111 , 0 , 0 , 15 , 0 , 0 , 16 , 5)  'wyjście 5, przekażnik 5, czas 4
  325.  
  326. Call Set_record(&B1111_1111 , 0 , 0 , 18 , 0 , 0 , 19 , 6)  'wyjście 6, przekażnik 6, czas 1
  327. Call Set_record(&B1111_1111 , 0 , 0 , 17 , 0 , 0 , 18 , 6)  'wyjście 6, przekażnik 6, czas 2
  328. Call Set_record(&B1111_1111 , 0 , 0 , 16 , 0 , 0 , 17 , 6)  'wyjście 6, przekażnik 6, czas 3
  329. Call Set_record(&B1111_1111 , 0 , 0 , 15 , 0 , 0 , 16 , 6)  'wyjście 6, przekażnik 6, czas 4
  330.  
  331. Call Set_record(&B1111_1111 , 0 , 0 , 18 , 0 , 0 , 19 , 7)  'wyjście 7, przekażnik 7, czas 1
  332. Call Set_record(&B1111_1111 , 0 , 0 , 17 , 0 , 0 , 18 , 7)  'wyjście 7, przekażnik 7, czas 2
  333. Call Set_record(&B1111_1111 , 0 , 0 , 16 , 0 , 0 , 17 , 7)  'wyjście 7, przekażnik 7, czas 3
  334. Call Set_record(&B1111_1111 , 0 , 0 , 15 , 0 , 0 , 16 , 7)  'wyjście 7, przekażnik 7, czas 4
  335.  
  336. Call Set_record(&B1111_1111 , 0 , 0 , 18 , 0 , 0 , 19 , 8)  'wyjście 8, przekażnik 8, czas 1
  337. Call Set_record(&B1111_1111 , 0 , 0 , 17 , 0 , 0 , 18 , 8)  'wyjście 8, przekażnik 8, czas 2
  338. Call Set_record(&B1111_1111 , 0 , 0 , 16 , 0 , 0 , 17 , 8)  'wyjście 8, przekażnik 8, czas 3
  339. Call Set_record(&B1111_1111 , 0 , 0 , 15 , 0 , 0 , 16 , 8)  'wyjście 8, przekażnik 8, czas 4
  340.  
  341. '**********************************************************
  342. 'Odczyt eeprom do RAM
  343.  
  344. For Idx = 1 To Rozmiar_bazy
  345.  
  346.    Base(idx) = Mybase_ee(idx)
  347.  
  348. Next
  349.  
  350. Enable Interrupts
  351.  
  352. 'Gosub Getdatetime
  353. 'Call Check_scheduler
  354.  
  355. '**********************************************************
  356. '**********************************************************
  357. 'GŁÓWNA PĘTLA PROGRAMU
  358. '**********************************************************
  359. '**********************************************************
  360.  
  361. Do
  362.  
  363.    If Tifr.ocf2 = 1 Then                                    'minęło 10ms, flagę ustawia Timer
  364.  
  365.       Tifr.ocf2 = 1                                         'flagi kasuje się wpisując jeden, nie zero
  366.  
  367.       If 100ms < 9 Then
  368.  
  369.          Incr 100ms
  370.  
  371.       Else
  372.  
  373.          100ms = 0
  374.  
  375.          If 1s < 9 Then
  376.  
  377.             Incr 1s
  378.  
  379.          Else
  380.  
  381.             1s = 0
  382.  
  383.             Time_now = Syssec(_sec)                         'czas aktualny oblicz raz
  384.             Daynow = Dayofweek(time_now)
  385.  
  386. '            Weekday_str = Lookupstr(daynow , Weekdays)      'dzień tygodnia
  387.  
  388. '            Date_str = Date(_day)
  389. '            Date_str = Mid(date_str , 1 , 6) + "20"
  390. '            Date_str = Date_str + Str(_year)
  391.  
  392. '            Locate 1 , 1 : Lcd Time$ ; Weekday_str
  393. '            Locate 2 , 1 : Lcd Date_str
  394.  
  395.             Locate 1 , 1 : Lcd Time$
  396.             Locate 2 , 1 : Lcd Date$
  397.  
  398.             'Call Check_scheduler
  399.  
  400.             If 1m < 59 Then
  401.  
  402.                Incr 1m
  403.  
  404.             Else
  405.  
  406.                1m = 0
  407.  
  408.                'Call Check_scheduler
  409.  
  410.             End If
  411.  
  412.          End If
  413.  
  414.       End If
  415.  
  416.    End If
  417.  
  418.    If _sec = 0 Then Call Check_scheduler
  419.  
  420. Loop
  421. End
  422.  
  423. '**********************************************************
  424. '**********************************************************
  425. 'KONIEC GŁÓWNEJ PĘTLI PROGRAMU
  426. '**********************************************************
  427. '**********************************************************
  428.  
  429.  
  430. '**********************************************************
  431. 'ODCZYT ZEGARA
  432.  
  433. Getdatetime:
  434.  
  435.    I2cstart                                                 'wygeneruj kod startowy
  436.    I2cwbyte Ds3231w                                         'wyślij adres
  437.    I2cwbyte 0                                               'adres początkowy DS3231
  438.    I2cstart                                                 'Wygeneruj kod startowy
  439.    I2cwbyte Ds3231r                                         'wyślij adres
  440.    I2crbyte _sec , Ack                                      'sekunda
  441.    I2crbyte _min , Ack                                      'minuta
  442.    I2crbyte _hour , Ack                                     'godzina
  443.    I2crbyte Weekday , Ack                                   'dzień tygodnia
  444.    I2crbyte _day , Ack                                      'dzień
  445.    I2crbyte _month , Ack                                    'miesiąc
  446.    I2crbyte _year , Nack                                    'rok
  447.    I2cstop
  448.  
  449.    _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  450.    _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
  451.  
  452. Return
  453.  
  454. '**********************************************************
  455. 'ZAPIS DATY
  456.  
  457. Setdate:
  458.  
  459.    _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  460.  
  461.    I2cstart                                                 'wygeneruj kod startowy
  462.    I2cwbyte Ds3231w                                         'wyślij adres
  463.    I2cwbyte 4                                               'adres początkowy DS3231
  464.    I2cwbyte _day                                            'dzień
  465.    I2cwbyte _month                                          'miesiąc
  466.    I2cwbyte _year                                           'rok
  467.    I2cwbyte Weekday                                         'dzien tygodnia
  468.    I2cstop
  469.  
  470. Return
  471.  
  472. '**********************************************************
  473. 'ZAPIS CZASU
  474.  
  475. Settime:
  476.  
  477.    _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  478.  
  479.    I2cstart                                                 'wygeneruj kod startowy
  480.    I2cwbyte Ds3231w                                         'wyślij adres
  481.    I2cwbyte 0                                               'adres początkowy DS3231
  482.    I2cwbyte _sec                                            'sekunda
  483.    I2cwbyte _min                                            'minuta
  484.    I2cwbyte _hour                                           'godzina
  485.    I2cstop
  486.  
  487. Return
  488.  
  489. '**********************************************************
  490. 'DNI TYGODNIA
  491.  
  492. Weekdays:
  493.  
  494. Data "Poniedzialek" , "   Wtorek   " , "   Sroda    " , "  Czwartek  " , "   Piatek   " , "   Sobota   " , " Niedziela  "
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 01 lut 2020, 11:53

Prawie działa... prawie, ponieważ nie mam pojęcia dlaczego, ale dla wyjść 1-4 sterowanie (włącz/wyłącz) działa co do sekundy, a dla wyjść 5-8 działa tylko włączenie (przekaźniki włączają się o ustalonym czasie, ale już się nie wyłączają)
.
  1. $regfile = "m32def.dat"                                     'ATmega32 SRAM 2KB, EEPROM 1KB
  2. $crystal = 16000000                                         'zewnętrzny rezonator  16MHz
  3. $swstack = 64
  4. $hwstack = 64
  5. $framesize = 200
  6.  
  7. '**********************************************************
  8. '
  9.  
  10. Config Submode = New
  11.  
  12. '**********************************************************
  13. 'TIMER
  14.  
  15. Config Timer2 = Timer , Prescale = 1024 , Compare = Disconnect , Clear_timer = 1 : Compare2 = 155       '10ms @16MHz
  16.  
  17. '**********************************************************
  18. 'WYJŚCIA "przekaźniki"
  19.  
  20. Config Porta.0 = Output : Porta.0 = 0 : Pk_1 Alias Porta.0  'wyjście nr1
  21. Config Porta.1 = Output : Porta.1 = 0 : Pk_2 Alias Porta.1  'wyjście nr2
  22. Config Porta.2 = Output : Porta.2 = 0 : Pk_3 Alias Porta.2  'wyjście nr3
  23. Config Porta.3 = Output : Porta.3 = 0 : Pk_4 Alias Porta.3  'wyjście nr4
  24. Config Porta.4 = Output : Porta.4 = 0 : Pk_5 Alias Porta.4  'wyjście nr5
  25. Config Porta.5 = Output : Porta.5 = 0 : Pk_6 Alias Porta.5  'wyjście nr6
  26. Config Porta.6 = Output : Porta.6 = 0 : Pk_7 Alias Porta.6  'wyjście nr7
  27. Config Porta.7 = Output : Porta.7 = 0 : Pk_8 Alias Porta.7  'wyjście nr8
  28. Config Portd.0 = Output : Portd.0 = 0 : Pk_9 Alias Portd.0  'wyjście nr9
  29. Config Portd.1 = Output : Portd.1 = 0 : Pk_10 Alias Portd.1 'wyjście nr19
  30. Config Portd.2 = Output : Portd.2 = 0 : Pk_11 Alias Portd.2 'wyjście nr11
  31. Config Portd.3 = Output : Portd.3 = 0 : Pk_12 Alias Portd.3 'wyjście nr12
  32. Config Portd.4 = Output : Portd.4 = 0 : Pk_13 Alias Portd.4 'wyjście nr13
  33. Config Portd.5 = Output : Portd.5 = 0 : Pk_14 Alias Portd.5 'wyjście nr14
  34. Config Portd.6 = Output : Portd.6 = 0 : Pk_15 Alias Portd.6 'wyjście nr15
  35. Config Portd.7 = Output : Portd.7 = 0 : Pk_16 Alias Portd.7 'wyjście nr16
  36.  
  37. '**********************************************************
  38. 'WYŚWIETLACZ LCD
  39.  
  40. $lib "bl_Lcd_i2c.lib"                                       'biblioteka I2C LCD
  41.  
  42. 'Config Lcd = 16x2                                           'wyświetlacz 16x2
  43. Config Lcd = 20x4                                           'wyświetlacz 20x4
  44.  
  45. Const Pcf_d4 = 4                                            'pin D4
  46. Const Pcf_d5 = 5                                            'pin D5
  47. Const Pcf_d6 = 6                                            'pin D6
  48. Const Pcf_d7 = 7                                            'pin D7
  49. Const Pcf_rs = 0                                            'pin RS
  50. Const Pcf_rw = 1                                            'pin RW
  51. Const Pcf_e1 = 2                                            'pin E
  52.  
  53. Dim _lcd_e As Byte
  54. Dim Backlight As Byte
  55.  
  56. Backlight_on Alias &H08
  57. Backlight_off Alias &H00
  58. Backlight = Backlight_on                                    'włącz podświetlenie
  59. _lcd_e = 128
  60.  
  61. 'Adres PCF
  62. 'Const Pcf8574_lcd = &H4E
  63. 'Const Pcf8574_lcd = &H40
  64. Const Pcf8574_lcd = &H7E
  65.  
  66. Waitms 100 : Cls                                            'odczekaj 100ms i wyczyść ekran
  67.  
  68. '**********************************************************
  69. 'I2C
  70.  
  71. Config Scl = Portc.0                                        'pin SCL
  72. Config Sda = Portc.1                                        'pin SDA
  73. I2cinit
  74. Config Twi = 400000                                         'prędkość I2C
  75.  
  76. '**********************************************************
  77. 'DS3231
  78.  
  79. Config Clock = User
  80. Config Date = Dmy , Separator = /                           'oddziel datę ukośnikiem
  81.  
  82. Const Ds3231w = &HD0                                        'adres DS3231 do zapisu
  83. Const Ds3231r = &HD1                                        'adres DS3231 do odczytu
  84.  
  85. '**********************************************************
  86. 'CZAS
  87.  
  88. Dim 100ms As Byte
  89. Dim 1s As Byte
  90. Dim 1m As Byte
  91.  
  92. '**********************************************************
  93. 'ZEGAR
  94.  
  95. Dim Weekday As Byte , Weekday_str As String * 12
  96. Dim Old_sec As Byte
  97. Dim Date_str As String * 10
  98.  
  99. '_hour = 17                                                   'ustaw godzinę
  100. '_min = 0                                                   'ustaw minutę
  101. '_sec = 0                                                    'ustaw sekundę
  102. 'Gosub Settime                                               'zapisz czas
  103.  
  104. '_day = 31                                                   'ustaw dzień
  105. '_month = 1                                                  'ustaw miesiąc
  106. '_year = 20                                                  'ustaw rok
  107. 'Gosub Setdate                                               'zapisz datę
  108.  
  109. '**********************************************************
  110. 'CZASÓWKA
  111.  
  112. Const Liczba_wpisow = 32
  113. Const Rozmiar_bazy = Liczba_wpisow * 8
  114.  
  115. '|ON-OFF/DAY_WEEK|SEC_ON|MIN_ON|HOUR_ON|SEC_OFF|MIN_OFF|HOUR_OFF|OUT_NR|   <-osiem bajtów
  116.  
  117. Dim Helpb As Byte , N As Byte , D As Byte , M As Byte , Idx As Word
  118.  
  119. Dim Base(rozmiar_bazy) As Byte                              'zarezerwuj tyle bajtów
  120.  
  121. Dim Ee_check As Eram Byte
  122. Dim Mybase_ee(rozmiar_bazy) As Eram Byte
  123.  
  124. Dim Mybuff(8) As Byte
  125. Dim Tempbuff(8) As Byte
  126.  
  127. Dim Sec_on As Byte At Mybuff(2) Overlay
  128. Dim Sec_off As Byte At Mybuff(5) Overlay
  129. Dim Time_now As Long , Time_on As Long , Time_off As Long
  130.  
  131. Dim Daynow As Byte
  132.  
  133. Dim Outs As Long
  134. Dim _out(16) As Byte At Outs Overlay
  135.  
  136. '**********************************************************
  137. 'HARMONOGRAM DZIAŁANIA CZASÓWEK
  138.  
  139. Sub Check_scheduler()
  140.  
  141.    Outs = 0
  142.    Idx = 1
  143.  
  144.    Time_now = Syssec(_sec)                                  'czas aktualny oblicz raz
  145.    Daynow = Dayofweek(time_now)
  146.  
  147.    For N = 1 To Liczba_wpisow
  148.  
  149.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bajtów z bazy
  150.  
  151.       If Mybuff(1).7 = 1 Then                               'jeśli ósmy bit =1 to wpis jest aktywny
  152.  
  153.          If Mybuff(1).daynow = 1 Then                       'jeśli w bajcie aktywny jest ten dzień tygodnia
  154.  
  155.             M = Memcopy(_day , Tempbuff(4) , 3)             'kopiuj do Tempbuff _day, _month i _year
  156.  
  157.             M = Memcopy(sec_on , Tempbuff(1) , 3)           'kopiuj sec_on, min_on i hour_on do Tempbuff
  158.             Time_on = Syssec(tempbuff(1) , Tempbuff(4))
  159.  
  160.             M = Memcopy(sec_off , Tempbuff(1) , 3)
  161.             Time_off = Syssec(tempbuff(1) , Tempbuff(4))
  162.  
  163.             If Time_now >= Time_on Then
  164.  
  165.                If Time_now <= Time_off Then
  166.  
  167.                   Helpb = Mybuff(8)                         'które wyjście
  168.                   _out(helpb) = 1                           'zapamietaj że mamy to włączyć
  169.  
  170.                End If
  171.  
  172.             End If
  173.  
  174.          End If
  175.  
  176.       End If
  177.  
  178.       Idx = Idx + 8
  179.  
  180.    Next
  181.  
  182.    '-----------------------------------
  183.    'STEROWANIE WYJŚCIAMI
  184.  
  185.    For N = 1 To 16
  186.  
  187.       If _out(n) = 1 Then
  188.  
  189.          Select Case N
  190.  
  191.             Case 1 : Set Pk_1
  192.             Case 2 : Set Pk_2
  193.             Case 3 : Set Pk_3
  194.             Case 4 : Set Pk_4
  195.             Case 5 : Set Pk_5
  196.             Case 6 : Set Pk_6
  197.             Case 7 : Set Pk_7
  198.             Case 8 : Set Pk_8
  199.             Case 9 : Set Pk_9
  200.             Case 10 : Set Pk_10
  201.             Case 11 : Set Pk_11
  202.             Case 12 : Set Pk_12
  203.             Case 13 : Set Pk_13
  204.             Case 14 : Set Pk_14
  205.             Case 15 : Set Pk_15
  206.             Case 16 : Set Pk_16
  207.  
  208.          End Select
  209.  
  210.       Else
  211.  
  212.          Select Case N
  213.  
  214.             Case 1 : Reset Pk_1
  215.             Case 2 : Reset Pk_2
  216.             Case 3 : Reset Pk_3
  217.             Case 4 : Reset Pk_4
  218.             Case 5 : Reset Pk_5
  219.             Case 6 : Reset Pk_6
  220.             Case 7 : Reset Pk_7
  221.             Case 8 : Reset Pk_8
  222.             Case 9 : Reset Pk_9
  223.             Case 10 : Reset Pk_10
  224.             Case 11 : Reset Pk_11
  225.             Case 12 : Reset Pk_12
  226.             Case 13 : Reset Pk_13
  227.             Case 14 : Reset Pk_14
  228.             Case 15 : Reset Pk_15
  229.             Case 16 : Reset Pk_16
  230.  
  231.          End Select
  232.  
  233.       End If
  234.  
  235.    Next
  236.  
  237. End Sub
  238.  
  239. '**********************************************************
  240. '
  241.  
  242. Sub Set_record(byval Days As Byte , Byval Secs_on As Byte , Byval Mins_on As Byte , Byval Hours_on As Byte , _
  243.                Byval Secs_off As Byte , Byval Mins_off As Byte , Byval Hours_off As Byte , Byval Out_relay As Byte)
  244.  
  245.    Idx = 1
  246.  
  247.    For N = 1 To Liczba_wpisow
  248.  
  249.       M = Memcopy(base(idx) , Mybuff(1) , 8)                'wczytaj osiem bajtów z bazy
  250.  
  251.       If Mybuff(1).7 = 0 Then                               'ten rekord jest wolny, zapiszemy go
  252.  
  253.          Mybuff(1) = Days
  254.          Mybuff(2) = Secs_on
  255.          Mybuff(3) = Mins_on
  256.          Mybuff(4) = Hours_on
  257.          Mybuff(5) = Secs_off
  258.          Mybuff(6) = Mins_off
  259.          Mybuff(7) = Hours_off
  260.          Mybuff(8) = Out_relay
  261.  
  262.          'zapis do RAM
  263.          M = Memcopy(mybuff(1) , Base(idx) , 8)
  264.  
  265.          'zapis do eeprom
  266.          Helpb = Idx + 8
  267.  
  268.          For N = Idx To Helpb
  269.  
  270.             Mybase_ee(n) = Base(n)
  271.  
  272.          Next
  273.  
  274.       End If
  275.  
  276.       Idx = Idx + 8
  277.  
  278.    Next
  279.  
  280. End Sub
  281.  
  282. '**********************************************************
  283. 'Pierwsze programowanie eeprom
  284.  
  285. Helpb = Ee_check
  286.  
  287. If Helpb <> 0 Then
  288.  
  289.    Ee_check = 0
  290.    Idx = 1
  291.  
  292.    For N = 1 To Liczba_wpisow
  293.  
  294.       Mybase_ee(idx) = 0
  295.       Idx = Idx + 8
  296.  
  297.    Next
  298.  
  299. End If
  300.  
  301. '**********************************************************
  302. 'Uzupełnij bazę
  303.  
  304. 'bity 7=Aktywny, od prawej pon,wto,sro..i sob.
  305. Call Set_record(&B1111_1111 , 10 , 29 , 11 , 20 , 29 , 11 , 1)       'wyjście 1, przekażnik 1, czas 1
  306. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 1)    'wyjście 1, przekażnik 1, czas 2
  307. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 1)    'wyjście 1, przekażnik 1, czas 3
  308. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 1)    'wyjście 1, przekażnik 1, czas 4
  309.  
  310. Call Set_record(&B1111_1111 , 10 , 30 , 11 , 20 , 30 , 11 , 2)       'wyjście 2, przekażnik 2, czas 1
  311. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 2)    'wyjście 2, przekażnik 2, czas 2
  312. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 2)    'wyjście 2, przekażnik 2, czas 3
  313. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 2)    'wyjście 2, przekażnik 2, czas 4
  314.  
  315. Call Set_record(&B1111_1111 , 10 , 31 , 11 , 20 , 31 , 11 , 3)       'wyjście 3, przekażnik 3, czas 1
  316. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 3)    'wyjście 3, przekażnik 3, czas 2
  317. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 3)    'wyjście 3, przekażnik 3, czas 3
  318. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 3)    'wyjście 3, przekażnik 3, czas 4
  319.  
  320. Call Set_record(&B1111_1111 , 10 , 32 , 11 , 20 , 32 , 11 , 4)       'wyjście 4, przekażnik 4, czas 1
  321. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 4)    'wyjście 4, przekażnik 4, czas 2
  322. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 4)    'wyjście 4, przekażnik 4, czas 3
  323. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 4)    'wyjście 4, przekażnik 4, czas 4
  324.  
  325. Call Set_record(&B1111_1111 , 10 , 33 , 11 , 20 , 33 , 11 , 5)       'wyjście 5, przekażnik 5, czas 1
  326. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 5)    'wyjście 5, przekażnik 5, czas 2
  327. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 5)    'wyjście 5, przekażnik 5, czas 3
  328. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 5)    'wyjście 5, przekażnik 5, czas 4
  329.  
  330. Call Set_record(&B1111_1111 , 10 , 34 , 11 , 20 , 34 , 11 , 6)       'wyjście 6, przekażnik 6, czas 1
  331. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 6)    'wyjście 6, przekażnik 6, czas 2
  332. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 6)    'wyjście 6, przekażnik 6, czas 3
  333. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 6)    'wyjście 6, przekażnik 6, czas 4
  334.  
  335. Call Set_record(&B1111_1111 , 10 , 35 , 11 , 20 , 35 , 11 , 7)       'wyjście 7, przekażnik 7, czas 1
  336. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 7)    'wyjście 7, przekażnik 7, czas 2
  337. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 7)    'wyjście 7, przekażnik 7, czas 3
  338. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 7)    'wyjście 7, przekażnik 7, czas 4
  339.  
  340. Call Set_record(&B1111_1111 , 10 , 36 , 11 , 20 , 36 , 11 , 8)       'wyjście 8, przekażnik 8, czas 1
  341. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 8)    'wyjście 8, przekażnik 8, czas 2
  342. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 8)    'wyjście 8, przekażnik 8, czas 3
  343. Call Set_record(&B1111_1111 , 0 , 0 , 0 , 0 , 0 , 0 , 8)    'wyjście 8, przekażnik 8, czas 4
  344.  
  345. '**********************************************************
  346. 'Odczyt eeprom do RAM
  347.  
  348. For Idx = 1 To Rozmiar_bazy
  349.  
  350.    Base(idx) = Mybase_ee(idx)
  351.  
  352. Next
  353.  
  354. Enable Interrupts
  355.  
  356. '**********************************************************
  357. '**********************************************************
  358. 'GŁÓWNA PĘTLA PROGRAMU
  359. '**********************************************************
  360. '**********************************************************
  361.  
  362. Do
  363.  
  364.    If Tifr.ocf2 = 1 Then                                    'minęło 10ms, flagę ustawia Timer
  365.  
  366.       Tifr.ocf2 = 1                                         'flagi kasuje się wpisując jeden, nie zero
  367.  
  368.       If 100ms < 9 Then
  369.  
  370.          Incr 100ms
  371.  
  372.       Else
  373.  
  374.          100ms = 0
  375.  
  376.          If 1s < 9 Then
  377.  
  378.             Incr 1s
  379.  
  380.          Else
  381.  
  382.             1s = 0
  383.  
  384.             Call Check_scheduler
  385.  
  386.             Weekday_str = Lookupstr(daynow , Weekdays)      'dzień tygodnia
  387.  
  388.             Date_str = Date(_day)
  389.             Date_str = Mid(date_str , 1 , 6) + "20"
  390.             Date_str = Date_str + Str(_year)
  391.  
  392.             Locate 1 , 1 : Lcd Time$ ; Weekday_str
  393.             Locate 2 , 1 : Lcd Date_str
  394.  
  395. '            Locate 1 , 1 : Lcd Time$
  396. '            Locate 2 , 1 : Lcd Date$
  397.  
  398.             If 1m < 59 Then
  399.  
  400.                Incr 1m
  401.  
  402.             Else
  403.  
  404.                1m = 0
  405.  
  406.             End If
  407.  
  408.          End If
  409.  
  410.       End If
  411.  
  412.    End If
  413.  
  414.    'If _sec = 0 Then Call Check_scheduler
  415.  
  416. Loop
  417. End
  418.  
  419. '**********************************************************
  420. '**********************************************************
  421. 'KONIEC GŁÓWNEJ PĘTLI PROGRAMU
  422. '**********************************************************
  423. '**********************************************************
  424.  
  425.  
  426. '**********************************************************
  427. 'ODCZYT ZEGARA
  428.  
  429. Getdatetime:
  430.  
  431.    I2cstart                                                 'wygeneruj kod startowy
  432.    I2cwbyte Ds3231w                                         'wyślij adres
  433.    I2cwbyte 0                                               'adres początkowy DS3231
  434.    I2cstart                                                 'Wygeneruj kod startowy
  435.    I2cwbyte Ds3231r                                         'wyślij adres
  436.    I2crbyte _sec , Ack                                      'sekunda
  437.    I2crbyte _min , Ack                                      'minuta
  438.    I2crbyte _hour , Ack                                     'godzina
  439.    I2crbyte Weekday , Ack                                   'dzień tygodnia
  440.    I2crbyte _day , Ack                                      'dzień
  441.    I2crbyte _month , Ack                                    'miesiąc
  442.    I2crbyte _year , Nack                                    'rok
  443.    I2cstop
  444.  
  445.    _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  446.    _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
  447.  
  448. Return
  449.  
  450. '**********************************************************
  451. 'ZAPIS DATY
  452.  
  453. Setdate:
  454.  
  455.    _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  456.  
  457.    I2cstart                                                 'wygeneruj kod startowy
  458.    I2cwbyte Ds3231w                                         'wyślij adres
  459.    I2cwbyte 4                                               'adres początkowy DS3231
  460.    I2cwbyte _day                                            'dzień
  461.    I2cwbyte _month                                          'miesiąc
  462.    I2cwbyte _year                                           'rok
  463.    I2cwbyte Weekday                                         'dzien tygodnia
  464.    I2cstop
  465.  
  466. Return
  467.  
  468. '**********************************************************
  469. 'ZAPIS CZASU
  470.  
  471. Settime:
  472.  
  473.    _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  474.  
  475.    I2cstart                                                 'wygeneruj kod startowy
  476.    I2cwbyte Ds3231w                                         'wyślij adres
  477.    I2cwbyte 0                                               'adres początkowy DS3231
  478.    I2cwbyte _sec                                            'sekunda
  479.    I2cwbyte _min                                            'minuta
  480.    I2cwbyte _hour                                           'godzina
  481.    I2cstop
  482.  
  483. Return
  484.  
  485. '**********************************************************
  486. 'DNI TYGODNIA
  487.  
  488. Weekdays:
  489.  
  490. Data "Poniedzialek" , "   Wtorek   " , "   Sroda    " , "  Czwartek  " , "   Piatek   " , "   Sobota   " , " Niedziela  "
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 03 lut 2020, 10:00

Dlatego zawsze wszystkim powtarzam, że wolę od razu wiedzieć ile czego ma być niż potem zmieniać kod.
Nie przewidziałem tylu wyjść i myśląc, że będą cztery poszedłem na łatwiznę i wziąłem zmienną typu LONG która ma cztery bajty tylko po to by za jednym zamachem kasować wyjścia. Na tę zmienną nałożyłem tablicę czterech bajtów i to w ogóle szczęście że cokolwiek tam działało po tym jak nałożyłeś szesnaście bajtów na taka czterobajtową.
Prawdopodobnie program jeździł po jakichś innych zmiennych, chociaż ta LONG była na szczęście ostatnią zdefiniowaną.
Żeby mieć więcej wyjść trzeba te kilka linijek zmieć tak:
  1.   Dim _out(16) As Byte
  2.  
  3.     '**********************************************************
  4.     'HARMONOGRAM DZIAŁANIA CZASÓWEK
  5.  
  6.     Sub Check_scheduler()
  7.  
  8.        Helpb = 0
  9.        M = Memcopy(helpb , _out(1) , 16 , 2)                'wypełnij szybko tablicę zerami
  10.        Idx = 1
  11.  
  12.        Time_now = Syssec(_sec)                              'czas aktualny oblicz raz
  13.        Daynow = Dayofweek(time_now)
  14.  
  15.        For N = 1 To Liczba_wpisow
  16.  
  17.           M = Memcopy(base(idx) , Mybuff(1) , 8)            'wczytaj osiem bajtów z bazy
  18.  
  19.           If Mybuff(1).7 = 1 Then                           'jeśli ósmy bit =1 to wpis jest aktywny
  20.  
  21.              If Mybuff(1).daynow = 1 Then                   'jeśli w bajcie aktywny jest ten dzień tygodnia
  22.  
  23.                 M = Memcopy(_day , Tempbuff(4) , 3)         'kopiuj do Tempbuff _day, _month i _year
  24.  
  25.                 M = Memcopy(sec_on , Tempbuff(1) , 3)       'kopiuj sec_on, min_on i hour_on do Tempbuff
  26.                 Time_on = Syssec(tempbuff(1) , Tempbuff(4))
  27.  
  28.                 M = Memcopy(sec_off , Tempbuff(1) , 3)
  29.                 Time_off = Syssec(tempbuff(1) , Tempbuff(4))
  30.  
  31.                 If Time_now >= Time_on Then
  32.  
  33.                    If Time_now <= Time_off Then
  34.  
  35.                       Helpb = Mybuff(8)                     'które wyjście
  36.                       _out(helpb) = 1                       'zapamietaj że mamy to włączyć
  37.  
  38.                    End If
  39.  
  40.                 End If
  41.  
  42.              End If
  43.  
  44.           End If
  45.  
  46.           Idx = Idx + 8
  47.  
  48.        Next
  49.  
  50.        '-----------------------------------
  51.        'STEROWANIE WYJŚCIAMI
  52.  
  53.        For N = 1 To 16
  54.  
  55.           If _out(n) = 1 Then
  56.  
  57.              Select Case N
  58.  
  59.                 Case 1 : Set Pk_1
  60.                 Case 2 : Set Pk_2
  61.                 Case 3 : Set Pk_3
  62.                 Case 4 : Set Pk_4
  63.                 Case 5 : Set Pk_5
  64.                 Case 6 : Set Pk_6
  65.                 Case 7 : Set Pk_7
  66.                 Case 8 : Set Pk_8
  67.                 Case 9 : Set Pk_9
  68.                 Case 10 : Set Pk_10
  69.                 Case 11 : Set Pk_11
  70.                 Case 12 : Set Pk_12
  71.                 Case 13 : Set Pk_13
  72.                 Case 14 : Set Pk_14
  73.                 Case 15 : Set Pk_15
  74.                 Case 16 : Set Pk_16
  75.  
  76.              End Select
  77.  
  78.           Else
  79.  
  80.              Select Case N
  81.  
  82.                 Case 1 : Reset Pk_1
  83.                 Case 2 : Reset Pk_2
  84.                 Case 3 : Reset Pk_3
  85.                 Case 4 : Reset Pk_4
  86.                 Case 5 : Reset Pk_5
  87.                 Case 6 : Reset Pk_6
  88.                 Case 7 : Reset Pk_7
  89.                 Case 8 : Reset Pk_8
  90.                 Case 9 : Reset Pk_9
  91.                 Case 10 : Reset Pk_10
  92.                 Case 11 : Reset Pk_11
  93.                 Case 12 : Reset Pk_12
  94.                 Case 13 : Reset Pk_13
  95.                 Case 14 : Reset Pk_14
  96.                 Case 15 : Reset Pk_15
  97.                 Case 16 : Reset Pk_16
  98.  
  99.              End Select
  100.  
  101.           End If
  102.  
  103.        Next
  104.  
  105.     End Sub
PS. Mam nadzieję, że te wpisy rekordów w kodzie to masz teraz tak testowo tylko bo po co męczyć za każdym razem Eeprom jak i tak masz to wszystko na stałe we Flash? :D
Jak już to wrzuć to do tego IF`a gdzie jest pierwsze programowanie pamięci. Wtedy po zaprogramowaniu programatorem zapisze to w Eeprom raz i potem juz będziesz mógł resetować i jeszcze raz patrzeć na wyjścia, ale baza wczyta się z Eeprom.
Ideą tego Sub`a do rekordów było to by można było coś wpisać z poziomu menu urządzenia.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 03 lut 2020, 11:29

niveasoft pisze:Dlatego zawsze wszystkim powtarzam, że wolę od razu wiedzieć ile czego ma być niż potem zmieniać kod.
Przepraszam za zamieszanie. Na początku miało być 8 czasówek (8 wyjść) i każda miała mieć 4 czasy załączania, ale później jak pokazałeś swoje pomysły na obejście "problemu" to wyszło, że lepiej będzie zrobić 1 czasówka to jeden czas. Jak już to zaczęło działać to ja dołożyłem pomysł aby była możliwość wybrania 8 wyjść z 16 przekaźników - przypisanie czasówki do przekaźnika.
Summa summarum wyszło lepiej niż na początku zakładałem ponieważ teraz nie mam przypisanych na sztywno 4 czasów do jednej czasówki i mogę nawet (nie wiem po co, ale mogę) ustawić 32 różne czasy dla przekaźnika (jeżeli będę używał tylko jednego wyjścia) w ciągu doby :)
niveasoft pisze:Nie przewidziałem tylu wyjść i myśląc, że będą cztery poszedłem na łatwiznę i wziąłem zmienną typu LONG która ma cztery bajty tylko po to by za jednym zamachem kasować wyjścia. Na tę zmienną nałożyłem tablicę czterech bajtów i to w ogóle szczęście że cokolwiek tam działało po tym jak nałożyłeś szesnaście bajtów na taka czterobajtową.
Dopiero jak to napisałeś to mnie olśniło, a ja szukałem, kombinowałem w kodzie z wczytywaniem bazy.
niveasoft pisze:Mam nadzieję, że te wpisy rekordów w kodzie to masz teraz tak testowo tylko bo po co męczyć za każdym razem Eeprom jak i tak masz to wszystko na stałe we Flash? :D
Tak, tak, to tylko test bo sobie kombinowałem z różnymi czasami działania. Docelowo oczywiście będzie to ustawiane z menu sterownika.
Bardzo dziękuję za kod - wieczorkiem sprawdzę i dam znać, ale myślę, że już nie będzie żadnego problemu.

Jeden "puzzel" z wielkiej układanki będę mógł odhaczyć ;)
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: RTC, działania na podstawie czasu

Post autor: niveasoft » 03 lut 2020, 11:47

W każdym kodzie i chyba zawsze znajdzie się coś co można poprawić i tutaj możnaby zamiast 16 bajtów użyć jednego WORD`a bo ma 16 bitów. Wtedy kasowanie to też "Outs=0" i finito :D
Pomyśl :P Chociaż wersja na BYTE powinna być szybsza.

[EDIT] Dobra, łap! :P Bawię się najnowszym Bascom`em 2083 bo jest już dla tych betatesterów :P
Zauważ to że numeracja bitów to nie od 1 do 16 tylko 0 do 15 i dlatego w jednym miejscu jest -1 a For N 0 To 15
  1.  Dim Outs As Word
  2.  
  3.     '**********************************************************
  4.     'HARMONOGRAM DZIAŁANIA CZASÓWEK
  5.  
  6.     Sub Check_scheduler()
  7.  
  8.        Outs = 0
  9.        Idx = 1
  10.  
  11.        Time_now = Syssec(_sec)                              'czas aktualny oblicz raz
  12.        Daynow = Dayofweek(time_now)
  13.  
  14.        For N = 1 To Liczba_wpisow
  15.  
  16.           M = Memcopy(base(idx) , Mybuff(1) , 8)            'wczytaj osiem bajtów z bazy
  17.  
  18.           If Mybuff(1).7 = 1 Then                           'jeśli ósmy bit =1 to wpis jest aktywny
  19.  
  20.              If Mybuff(1).daynow = 1 Then                   'jeśli w bajcie aktywny jest ten dzień tygodnia
  21.  
  22.                 M = Memcopy(_day , Tempbuff(4) , 3)         'kopiuj do Tempbuff _day, _month i _year
  23.  
  24.                 M = Memcopy(sec_on , Tempbuff(1) , 3)       'kopiuj sec_on, min_on i hour_on do Tempbuff
  25.                 Time_on = Syssec(tempbuff(1) , Tempbuff(4))
  26.  
  27.                 M = Memcopy(sec_off , Tempbuff(1) , 3)
  28.                 Time_off = Syssec(tempbuff(1) , Tempbuff(4))
  29.  
  30.                 If Time_now >= Time_on Then
  31.  
  32.                    If Time_now <= Time_off Then
  33.  
  34.                       Helpb = Mybuff(8) - 1                 'które wyjście (0-15)
  35.                       Outs.helpb = 1                        'zapamietaj że mamy to włączyć
  36.  
  37.                    End If
  38.  
  39.                 End If
  40.  
  41.              End If
  42.  
  43.           End If
  44.  
  45.           Idx = Idx + 8
  46.  
  47.        Next
  48.  
  49.        '-----------------------------------
  50.        'STEROWANIE WYJŚCIAMI
  51.  
  52.        For N = 0 To 15
  53.  
  54.           If Outs.n = 1 Then
  55.  
  56.              Select Case N
  57.  
  58.                 Case 0 : Set Pk_1
  59.                 Case 1 : Set Pk_2
  60.                 Case 2 : Set Pk_3
  61.                 Case 3 : Set Pk_4
  62.                 Case 4 : Set Pk_5
  63.                 Case 5 : Set Pk_6
  64.                 Case 6 : Set Pk_7
  65.                 Case 7 : Set Pk_8
  66.                 Case 8 : Set Pk_9
  67.                 Case 9 : Set Pk_10
  68.                 Case 10 : Set Pk_11
  69.                 Case 11 : Set Pk_12
  70.                 Case 12 : Set Pk_13
  71.                 Case 13 : Set Pk_14
  72.                 Case 14 : Set Pk_15
  73.                 Case 15 : Set Pk_16
  74.  
  75.              End Select
  76.  
  77.           Else
  78.  
  79.              Select Case N
  80.  
  81.                 Case 0 : Reset Pk_1
  82.                 Case 1 : Reset Pk_2
  83.                 Case 2 : Reset Pk_3
  84.                 Case 3 : Reset Pk_4
  85.                 Case 4 : Reset Pk_5
  86.                 Case 5 : Reset Pk_6
  87.                 Case 6 : Reset Pk_7
  88.                 Case 7 : Reset Pk_8
  89.                 Case 8 : Reset Pk_9
  90.                 Case 9 : Reset Pk_10
  91.                 Case 10 : Reset Pk_11
  92.                 Case 11 : Reset Pk_12
  93.                 Case 12 : Reset Pk_13
  94.                 Case 13 : Reset Pk_14
  95.                 Case 14 : Reset Pk_15
  96.                 Case 15 : Reset Pk_16
  97.  
  98.              End Select
  99.  
  100.           End If
  101.  
  102.        Next
  103.  
  104.     End Sub
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: RTC, działania na podstawie czasu

Post autor: pimowo » 03 lut 2020, 12:14

Kurcze, a ja nie mogę nawet sprawdzić bo siedzę w pracy do 22 - to już trzeci dzień z rzędu po 12h :(
Chyba muszę sobie zrobić jakiś kieszonkowy zestaw testowy, abym mógł go zabierać ze sobą.

PS
Jakieś ciekawostki w nowym Bascomie?
ODPOWIEDZ