Atmega i DS3231

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Atmega i DS3231

Post autor: Jacek » 02 wrz 2022, 21:08

Witam, wiem że to dział dla xmegi ale nie chce zakładać nowego tematu DS3231.
Testuje zegar na A2560 program główny wygląda tak
  1. $regfile = "m2560def.dat"
  2. $crystal = 16000000
  3. $hwstack = 255
  4. $swstack = 128
  5. $framesize = 128
  6. $baud = 9600
  7. $eeprom
  8. '****************************************************************
  9. 'Debug Off
  10. Debug On
  11. Const Max_nex_command_len = 50
  12.  
  13. '-------------------------------------------------------------------------------------------
  14. '****************************************************************
  15. $projecttime = 127
  16. $version 0 , 0 , 154
  17. Config Submode = New
  18. Config Watchdog = 2048
  19. Enable Interrupts
  20.  
  21. '****************************************************************
  22. '*         CONFIG BUFFERED USART FOR DEBUG via USB                       *
  23. '****************************************************************
  24. Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  25. Config Serialin0 = Buffered , Size = 100                                        'buforowoanie  pierwszy uart
  26. Config Serialout0 = Buffered , Size = 100                                       'buforowoanie  pierwszy uart
  27. Echo Off
  28. Open "COM1:" For Binary As #1
  29. Const Debug_ = 1
  30. '****************************************************************
  31. '*      CONFIG BUFFERED USART FOR RS485_1 FULL DUPLEX           *
  32. '****************************************************************
  33. Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  34. Config Serialin1 = Buffered , Size = 100                                        'buforowoanie  drugi uart
  35. Config Serialout1 = Buffered , Size = 100                                       'buforowoanie  drugi uart
  36. Open "COM2:" For Binary As #2
  37. Const RS485_1 = 2
  38. '****************************************************************
  39. '*      CONFIG BUFFERED USART FOR LCD          *
  40. '****************************************************************
  41. 'Config Com3 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  42. 'Config Serialin2 = Buffered , Size = 100                                        'buforowoanie  trzeci uart
  43. 'Config Serialout2 = Buffered , Size = 100                                       'buforowoanie  trzeci uart
  44. 'Dim Cmd_timeout As Byte
  45. 'Open "COM3:" For Binary As #3
  46. 'Const Nex = 3
  47. '-------------------------------------------------------------------------------------------
  48. Config Com3 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8       'Asynchroneous
  49. Dim Cmd_timeout As Byte , Got_str As Byte
  50.     'unnecessary
  51. Dim Command As String * Max_nex_command_len
  52. Config Serialin2 = Buffered , Size = Max_nex_command_len                        'RX
  53. 'Config Serialout6 = Buffered , Size = 128
  54. Open "COM3:" For Binary As #3
  55. Const Nex = 3
  56. '****************************************************************
  57. '*                           CONFIG BUFFERED USART DEBUG                           *
  58. '****************************************************************
  59. Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  60. Config Serialin3 = Buffered , Size = 100                                        'buforowoanie  czwarty uart
  61. Config Serialout3 = Buffered , Size = 100                                       'buforowoanie  czwarty uart
  62. Open "COM4:" For Binary As #4
  63. Const Usb = 4
  64. '****************************************************************
  65. '           KONFIGURACJA TIMERA        CONFIG TIMER'S                           *
  66. '****************************************************************
  67. Config Timer1 = Timer , Prescale = 8
  68. On Timer1 Przertimer1
  69. Enable Timer1
  70. Config Timer2 = Pwm , Compare_a_pwm = Clear_up , Prescale = 1024
  71. Enable timer2
  72. Enable Interrupts
  73. '****************************************************************
  74. '****************************************************************
  75. '                                       BIBLIOTEKI       LIBRARY                                        *
  76. '****************************************************************
  77. $lib "i2c_twi.lbx"                                                              ' we do not use software emulated I2C but the TWI
  78.  
  79. '****************************************************************
  80. '                        PODPROGRAMY   INCLUD PROGRAMS                             *
  81. '****************************************************************
  82. $include "subs\clock.inc"
  83. $include "subs\Setdate.inc"
  84. $include "subs\Settime.inc"
  85. $include "subs\mruganie.inc"
  86. $include "subs\Uartrx0.inc"
  87. '****************************************************************
  88. '##########################################################
  89. '                                                          ZMIENNE                                                 #
  90. '##########################################################
  91. '                                                   ZMIENNE CZASU                                          #
  92. '##########################################################
  93. Dim Timer_tikx10 As Byte                                                        'zmienna liczaca przepełnienie timera
  94. Dim Timertikx100 As Byte                                                        'zmienna liczaca przepełnienie timera x10
  95. Dim Timertikx200 As Byte                                                        'zmienna liczaca przepełnienie timera x 20
  96. Dim Timertikx500 As Byte                                                        'zmienna liczaca przepełnienie timera x 50
  97. Dim Timer_tik_flag As Byte
  98. Flaga10ms Alias Timer_tik_flag.0
  99. Flaga100ms Alias Timer_tik_flag.1
  100. Flaga500ms Alias Timer_tik_flag.2
  101. Flaga1s Alias Timer_tik_flag.3
  102. Flaga2s Alias Timer_tik_flag.4
  103.  
  104.  'zostaly jeszce trzy wolne flagi
  105.  ' a uzylem tylko jednego bajtu
  106.  'Pawer SP9DR
  107. '##########################################################
  108. '                  ZMIENNE POBIERANIA CZASU I DATY DS3231                    #
  109. '##########################################################
  110. Dim Sekundy As Byte
  111. Dim New_Sekundy As Byte
  112. Dim Minuty As Byte
  113.  Dim New_Minuty As Byte
  114. Dim Godziny As Byte
  115. Dim New_Godziny As Byte
  116. Dim Dni As Byte
  117. Dim New_Dni As Byte
  118. Dim Dzien As Byte
  119. Dim New_Dzien As Byte
  120. Dim Miesiac As Byte
  121. Dim New_Miesiac As Byte
  122. Dim Rok As Byte
  123. Dim New_Rok As Byte
  124. Dim Sekundystr As String * 2
  125. Dim Minutystr As String * 2
  126. Dim Godzinystr As String * 2
  127. Dim Dzienstr As String * 2
  128. Dim Miesiacstr As String * 2
  129. Dim Rokstr As String * 2
  130. '##########################################################
  131. '                                          By NiveaSoft                                                             #
  132. Dim I2c_err As Bit
  133. Dim Temp_sec As Byte
  134. Dim Temp_min As Byte
  135. Dim Temp_hour As Byte
  136. Dim Weekday As Byte
  137. Dim Temp_day As Byte
  138.  Dim Temp_month As Byte
  139.  Dim Temp_year As Byte
  140. '##########################################################
  141. '                                         ZMIENNE UARTRX0                                              #
  142. '##########################################################                                                    '
  143. Dim Lcount_0 As Byte
  144. Dim Uart_command_0 As String * 20                                               'musi byc wystarczjaco dlugie
  145. Dim Getcommands_0(10) As String * 10                                            'tablica na pociete komendy
  146. Dim Komenda As String * 10
  147.  
  148. '##########################################################
  149. '                                        ZMIENNA SKANERA I2C                                       #
  150. '##########################################################
  151. Dim B As Byte
  152. '##########################################################
  153. 'I2C CONFIG
  154. Config Clock = User
  155. Config Date = dmy , Separator = -
  156.  
  157.  
  158. '--------------------------------------------------------------------
  159. Const Bmp180_read = &HEF                                                        'Bmp180 Read Address
  160. Const Bmp180_write = &HD0                                                       'Bmp180 Write Address
  161.  
  162. '--------------------------------------------------------------------
  163. '****************************************************************
  164. '           KONFIGURACJA PORTÓW CONFIG PORT                                      *
  165. '****************************************************************
  166. Config portB.7 = Output : Set portb.7 : Led_Live Alias Portb.7
  167. Config Scl = PortD.0                                                            ' used i2c pins
  168. Config Sda = PortD.1
  169. Config Twi = 400000                                                             ' i2c speed
  170. Const Ds3231w = &HD0                                                            'B11010000
  171. Const Ds3231r = &HD1                                                            'B11010001
  172. I2cinit
  173.  
  174.  
  175. '****************************************************************
  176. Print "Scan start I2C"
  177. Wait 2
  178. For B = 0 To 254 Step 2
  179.    I2cstart
  180.    I2cwbyte B
  181.    If Err = 0 Then
  182.       Print "I2C        Adresse = " ; B
  183.       Print "I2C Hex Adresse= " ; Hex(B)
  184.       Print "I2C Bin Adresse= " ; Bin(B)
  185.    End If
  186. Next
  187. Print "End Scan I2C"
  188. Wait 2
  189. '****************************************************************
  190.  
  191.  
  192.  
  193. Call clock
  194. waitms 250
  195. 'Print #Debug_ , Godzinystr ; ":" ; Minutystr ; ":" ; Sekundystr
  196. Print #Debug_ , Godziny ; ":" ; Minuty ; ":" ; Sekundy
  197. '****************************************************************
  198. Do
  199. 'Call clock
  200. '=====================================================
  201.    If Timer_tikx10 >= 10 Then                                                   'jeśli uplyneło 100ms to
  202.       Flaga100ms = 1                                                            'ustaw flage upłyneło 100ms
  203.       Incr Timertikx100                                                         'zwiększaj Timertikx100
  204.       Timer_tikx10 = 0                                                          'zeruj liczenie
  205.    End If                                                                       'koniec warunku
  206.    If Timertikx100 >= 10 Then                                                   'jeśli uplynela sekunda
  207.       Flaga1s = 1                                                               'ustaw flage upłyneła sekunda
  208.       Incr Timertikx200                                                         'zwiększaj Timertikx200
  209.       Incr Timertikx500
  210.       Timertikx100 = 0                                                          'zeruj liczenie
  211.    End If                                                                       'koniec warunku
  212.    If Timertikx500 >= 5 Then
  213.       Flaga500ms = 1
  214.       Timertikx500 = 0
  215.    End If
  216.    If Timertikx200 >= 2 Then                                                    'jeśli upłyneły dwie sekundy
  217.       Flaga2s = 1                                                               'ustaw flagę upłyneły dwie sekundy
  218.       Timertikx200 = 0                                                          'zeruj liczenie
  219.    End If                                                                       'koniec warunku
  220.  
  221. '=====================================================
  222.    If Flaga10ms = 1 Then                                                        'jeśli Flaga10ms jest równa 1
  223.       Flaga10ms = 0                                                             'wyzeruj Flaga10ms
  224.    End If                                                                       'koniec warunku
  225. '-------------------------------------------------------------------------------------------
  226.    If Flaga100ms = 1 Then                                                       'jeśli Flaga100ms jest równa 1
  227.       Call clock
  228.       Flaga100ms = 0                                                            'wyzeruj Flaga100ms
  229.    End If                                                                       'koniec warunku
  230. '-------------------------------------------------------------------------------------------
  231.    If Flaga500ms = 1 Then                                                       'jeśli Flaga500ms jest równa 1
  232.       Flaga500ms = 0                                                            'wyzeruj Flaga500ms
  233.    End If                                                                       'koniec warunku
  234. '-------------------------------------------------------------------------------------------
  235.    If Flaga1s = 1 Then                                                          'jeśli Flaga1s jest równa 1                                                               '                                                               'wyzeruj Flaga1s
  236.       'Call clock
  237.       Call Mruganie
  238.       Print #Debug_ , "Czas  " ; Godzinystr ; ":" ; Minutystr ; ":" ; Sekundystr
  239.       Print #Debug_ , "Data  " ; Dzienstr ; "/" ; Miesiacstr ; "/" ; Rokstr
  240.       Flaga1s = 0
  241.    End If                                                                       'koniec warunku
  242. '-------------------------------------------------------------------------------------------
  243.    If Flaga2s = 1 Then                                                          'jeśli Flaga2s jest równa 1
  244.       Flaga2s = 0                                                               'wyzeruj Flaga
  245.    End If                                                                       'koniec warunku
  246. '****************************************************************
  247.  'ODBIÓR DANYCH UART0
  248.    If Ischarwaiting(#DEBUG_) > 0 Then                                           'calls _gotchar and use URXC
  249.       Lcount_0 = Inkey(#DEBUG_)                                                 'pobierz znak z bufora
  250.       If Lcount_0 = 13 Or Len(uart_command_0) > 20 Then                         '20 Then                        ' jeslii ENTER lub wiecej niz 20 znaków to call uartrx
  251.          Call Uartrx0()
  252.          'Print #Debug_ , Prompt                                                 'wywołaj podprogram Uartrx1
  253.          'Debug "czyszczenie bufora po odebranje komendzie"                      'Using a constant will let us change the prompt
  254.       'clear serialin  'nie sprawdzone
  255.          Uart_command_0 = ""                                                    ' koniecznie potrzenbe do czysczenia bufora
  256.       Else                                                                      'inaczej
  257.          Uart_command_0 = Uart_command_0 + Chr(Lcount_0)                        'kluczowe budowanie bufora
  258.       End If                                                                    'koniec warunku
  259.    End If                                                                       'koniec warunku
  260. '****************************************************************
  261.  
  262.  
  263. Loop
  264. End
  265.  
  266. '-------------------------------------------------------------------------------------------
  267. '            podprogram przerwań Timer1
  268. Przertimer1:
  269.    Timer1 = 45536                                                               'wstawienie do Timer1 wartości 45536
  270.  
  271.    Incr Timer_tikx10
  272.  
  273.    If Timer_tikx10 = 1 Then
  274.       Set Flaga10ms
  275.    End If
  276.  
  277. Return                                                                          'powrót
  278. '-------------------------------------------------------------------------------------------
ustawianie czasu i daty mam tymczasowo przez terminal
  1. $nocompile
  2. 'odbiór danych z uart0 DEBUG_
  3. Sub Uartrx0
  4.    Lcount_0 = Split(uart_command_0 , Getcommands_0(1) , ",")
  5.    Debug #Debug_ , "lcount_0= " ; Lcount_0
  6.    Debug #Debug_ , "debug uart_command_0= " ; Uart_command_0
  7.    Debug #Debug_ , "****************************"
  8.    Debug #Debug_ , "debug Getcommands_0(1)=" ; Getcommands_0(1)
  9.    Debug #Debug_ , "debug Getcommands_0(2)=" ; Getcommands_0(2)
  10.    Debug #Debug_ , "debug Getcommands_0(3)=" ; Getcommands_0(3)
  11.    Debug #Debug_ , "debug Getcommands_0(4)=" ; Getcommands_0(4)
  12.    'Debug #Debug_ , "debug Getcommands_1(5)=" ; Getcommands_1(5)
  13.    Debug #Debug_ , "****************************"
  14.    Komenda = Getcommands_0(1)
  15.    If Komenda = "set_time" Then
  16.  
  17.       New_Godziny = Val(Getcommands_0(2))
  18.       New_Minuty = Val(Getcommands_0(3))
  19.       New_Sekundy = Val(Getcommands_0(4))
  20.       Call Settime
  21.       Debug #Debug_ , "System Reboot "
  22.       Start Watchdog
  23.       do
  24.       loop
  25.       Debug #Debug_ , "Komenda " ; Komenda
  26.       Debug #Debug_ , "New_Godziny " ; Godziny
  27.       Debug #Debug_ , "New_Minuty " ; Minuty
  28.       Debug #Debug_ , "New_Sekundy " ; Sekundy
  29.    ElseIf Komenda = "set_date" Then
  30.       New_Dzien = Val(Getcommands_0(2))
  31.       New_Miesiac = Val(Getcommands_0(3))
  32.       New_Rok = Val(Getcommands_0(4))
  33.       Call Setdate
  34.       Debug #Debug_ , "System Reboot "
  35.       Start Watchdog
  36.       do
  37.       loop
  38.       Debug #Debug_ , "Komenda " ; Komenda
  39.       Debug #Debug_ , "New_Dzien " ; New_Dzien
  40.       Debug #Debug_ , "New_Miesiac " ; New_Miesiac
  41.       Debug #Debug_ , "New_Rok " ; New_Rok
  42.       Debug #Debug_ , "******************************"
  43.       Debug #Debug_ , "Dzien " ; Dzien
  44.       Debug #Debug_ , "Miesiac " ; Miesiac
  45.       Debug #Debug_ , "Rok " ; Rok
  46.    End If
  47. End Sub
musiałem ustawić restart atmegi bo mimo przyjęcia nowych wartości w terminalu widać było starą datę lub czas czy trzeba resetować mikrokontroler?
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega i DS3231

Post autor: niveasoft » 04 wrz 2022, 12:26

Jak dla mnie wygląda trochę na niepotrzebnie skomplikowane. Dlaczego nie uzyjesz wbudowanych w Bascom funkcji Datetime?

U mnie w Mega2560 tak to działa od lat:
  1. '*****************************************************************
  2. '*             CONFIG FOR HARDWARE TWI (I2C)                     *
  3. '*****************************************************************
  4.   $lib "i2c_twi.lbx"
  5.  
  6.   Config Scl = Portd.0
  7.   Config Sda = Portd.1
  8.    I2cinit
  9.   Config Twi = 100000
  10.  
  11.   Const _twi_stop_timeout = 1
  12. '*****************************************************************
  13. '*            CONFIG FOR DS1307 I2C CLOCK (RTC)                  *
  14. '*****************************************************************
  15.  Config Clock = User
  16.   Config Date = Dmy , Separator = Slash
  17.   'address of DS3231
  18.     Const Ds3231w = &HD0
  19.     Const Ds3231r = &HD1
  20.  
  21.   Dim Time_str As String * 8 , Date_str As String * 10 , Zima_lato As Byte
  22.   Dim Old_sec As Byte , Weekday As Byte , I2c_err As Byte , I2c_errors As Byte
  23.   Dim Wylacz_zima As Long , Wlacz_zima As Long
Tak wyglądają funkcje które sprzęgają funkcje Bascom z RTC DS3231:
  1. Dim Temp_sec , Temp_min , Temp_hour , Temp_day , Temp_month , Temp_year As Byte
  2.  
  3.  
  4. Getdatetime:
  5.  
  6. I2cstart                                                    ' Generate start code
  7. If Err = 0 Then
  8.  I2cwbyte Ds3231w                                           ' send address
  9.  If Err = 1 Then
  10.   I2c_err = 1 : Return
  11.  Else
  12.   I2c_err = 0
  13.  End If
  14.  I2cwbyte 0                                                 ' start address in 1307
  15.  
  16.   I2cstart                                                  ' Generate start code
  17.    If Err = 0 Then
  18.     I2cwbyte Ds3231r                                        ' send address
  19.     If Err = 0 Then
  20.        I2crbyte Temp_sec , Ack
  21.        I2crbyte Temp_min , Ack                              ' MINUTES
  22.        I2crbyte Temp_hour , Ack                             ' Hours
  23.        I2crbyte Helpb , Ack                                 ' Day of Week bedzie z Dayofweek()  tutaj Dummy
  24.        I2crbyte Temp_day , Ack                              ' Day of Month
  25.        I2crbyte Temp_month , Ack                            ' Month of Year
  26.        I2crbyte Temp_year , Nack                            ' Year
  27.  
  28.        _sec = Makedec(temp_sec) : _min = Makedec(temp_min) : _hour = Makedec(temp_hour)
  29.        _day = Makedec(temp_day) : _month = Makedec(temp_month) : _year = Makedec(temp_year)
  30.     End If
  31.    End If
  32.  
  33. End If
  34.  
  35.  I2cstop
  36. Return
  37.  
  38. Setdate:
  39.  Temp_day = Makebcd(_day) : Temp_month = Makebcd(_month) : Temp_year = Makebcd(_year)
  40. I2cstart                                                    ' Generate start code
  41. If Err = 0 Then
  42.  I2cwbyte Ds3231w                                           ' send address
  43.  If Err = 0 Then
  44.     I2cwbyte 4                                              ' starting address in 1307
  45.     I2cwbyte Temp_day                                       ' Send Data to SECONDS
  46.     I2cwbyte Temp_month                                     ' MINUTES
  47.     I2cwbyte Temp_year                                      ' Hours
  48.  End If
  49. End If
  50. I2cstop
  51.  
  52. Return
  53.  
  54. Settime:
  55.  Temp_sec = Makebcd(_sec) : Temp_min = Makebcd(_min) : Temp_hour = Makebcd(_hour)
  56. I2cstart                                                    ' Generate start code
  57. If Err = 0 Then
  58.  I2cwbyte Ds3231w                                           ' send address
  59.  If Err = 0 Then
  60.     I2cwbyte 0                                              ' starting address in 1307
  61.     I2cwbyte Temp_sec                                       ' Send Data to SECONDS
  62.     I2cwbyte Temp_min                                       ' MINUTES
  63.     I2cwbyte Temp_hour                                      ' Hours
  64.  End If
  65. End If
  66. I2cstop
  67. Return

Potem wysyłam tylko TIME=23:02:50 i gotowe albo DATE=04/09/22
  1. '-----------------------------------
  2.      If 0 < Instr(received , "TIME=") Then
  3.       If 13 = Len(received) Then
  4.        Helpstr = Mid(received , 6 , 8)                      'od piątej literki wzwyż wytnij osiem znaków
  5.         Time$ = Helpstr
  6.         Gosub Getdatetime
  7.          Old_min = _min
  8.       End If
  9.  
  10.          Goto Skip_the_rest                                 'dont test then rest because we have match
  11.      End If
  12.     '-----------------------------------
  13.      If 0 < Instr(received , "DATE=") Then                  'ustawione dd/mm/yy
  14.       If 13 = Len(received) Then
  15.        Helpstr = Mid(received , 6 , 8)                      'od piątej literki wzwyż wytnij osiem znaków
  16.         Date$ = Helpstr
  17.         Gosub Getdatetime
  18.       End If
  19.  
  20.          Goto Skip_the_rest                                 'dont test then rest because we have match
  21.      End If
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 04 wrz 2022, 15:49

Witam, received, Helpstr,Skip_the_rest to są zapewne zmienne czy u Ciebie ustawianie czasu i daty jest w programie głównym czy też w podprogramach includ.
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega i DS3231

Post autor: niveasoft » 04 wrz 2022, 15:54

Received to String który Atmega odbiera z tego Terminala
Helpstr to string pomocniczy np. Helpstr As String * 20
Skip_the_rest to label i tym bym się nie przejmował.

Najważniejsze tam jest to że se stringa "TIME=12:00:00" wycinasz "12:00:00" i to masz w zmiennej Helpstr i to wstawiasz do bascomowego Time$ = Helpstr i Bascom sam to wciśnie do zegarka.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 04 wrz 2022, 15:58

Ok Bartek zaraz będę próbował, i sorry że mam czasami głupie pytania które z czasem się wyjaśniają.
pozdrawiam Jace.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 04 wrz 2022, 17:16

Ok wymoczyłem rękę i porozciągałem ścięgna w "mydlinach", czy mogę prosić o sprawdzenie i poprawienie programu głównego
  1. $regfile = "m2560def.dat"
  2. $crystal = 16000000
  3. $hwstack = 255
  4. $swstack = 128
  5. $framesize = 128
  6. $baud = 9600
  7. $eeprom
  8. '****************************************************************
  9. 'Debug Off
  10. Debug On
  11. Const Max_nex_command_len = 50
  12.  
  13. '-------------------------------------------------------------------------------------------
  14. '****************************************************************
  15. $projecttime = 176
  16. $version 0 , 0 , 198
  17. Config Submode = New
  18. Config Watchdog = 2048
  19. Enable Interrupts
  20.  
  21. '****************************************************************
  22. '*         CONFIG BUFFERED USART FOR DEBUG via USB                       *
  23. '****************************************************************
  24. Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  25. Config Serialin0 = Buffered , Size = 100                                        'buforowoanie  pierwszy uart
  26. Config Serialout0 = Buffered , Size = 100                                       'buforowoanie  pierwszy uart
  27. Echo Off
  28. Open "COM1:" For Binary As #1
  29. Const Debug_ = 1
  30. '****************************************************************
  31. '*      CONFIG BUFFERED USART FOR RS485_1 FULL DUPLEX           *
  32. '****************************************************************
  33. Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  34. Config Serialin1 = Buffered , Size = 100                                        'buforowoanie  drugi uart
  35. Config Serialout1 = Buffered , Size = 100                                       'buforowoanie  drugi uart
  36. Open "COM2:" For Binary As #2
  37. Const RS485_1 = 2
  38. '****************************************************************
  39. '*      CONFIG BUFFERED USART FOR LCD          *
  40. '****************************************************************
  41. 'Config Com3 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  42. 'Config Serialin2 = Buffered , Size = 100                                        'buforowoanie  trzeci uart
  43. 'Config Serialout2 = Buffered , Size = 100                                       'buforowoanie  trzeci uart
  44. 'Dim Cmd_timeout As Byte
  45. 'Open "COM3:" For Binary As #3
  46. 'Const Nex = 3
  47. '-------------------------------------------------------------------------------------------
  48. Config Com3 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8       'Asynchroneous
  49. Dim Cmd_timeout As Byte , Got_str As Byte
  50.     'unnecessary
  51. Dim Command As String * Max_nex_command_len
  52. Config Serialin2 = Buffered , Size = Max_nex_command_len                        'RX
  53. 'Config Serialout6 = Buffered , Size = 128
  54. Open "COM3:" For Binary As #3
  55. Const Nex = 3
  56. '****************************************************************
  57. '*                           CONFIG BUFFERED USART DEBUG                           *
  58. '****************************************************************
  59. Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  60. Config Serialin3 = Buffered , Size = 100                                        'buforowoanie  czwarty uart
  61. Config Serialout3 = Buffered , Size = 100                                       'buforowoanie  czwarty uart
  62. Open "COM4:" For Binary As #4
  63. Const Usb = 4
  64. '****************************************************************
  65. '           KONFIGURACJA TIMERA        CONFIG TIMER'S                           *
  66. '****************************************************************
  67. Config Timer1 = Timer , Prescale = 8
  68. On Timer1 Przertimer1
  69. Enable Timer1
  70. Enable Interrupts
  71. '****************************************************************
  72. '****************************************************************
  73. '                                       BIBLIOTEKI       LIBRARY                                        *
  74. '****************************************************************
  75. '****************************************************************
  76. '*             CONFIG FOR HARDWARE TWI (I2C)                                            *
  77. '****************************************************************
  78. $lib "i2c_twi.lbx"
  79.  
  80. Config Scl = Portd.0
  81. Config Sda = Portd.1
  82. I2cinit
  83. Config Twi = 100000
  84.  
  85. Const _twi_stop_timeout = 1
  86. '****************************************************************
  87. '*            CONFIG FOR DS1307 I2C CLOCK (RTC)                  *
  88. '****************************************************************
  89. Config Clock = User
  90. Config Date = Dmy , Separator = Slash
  91.       'address of DS3231
  92. Const Ds3231w = &HD0
  93. Const Ds3231r = &HD1
  94.  
  95. Dim Time_str As String * 8 , Date_str As String * 10 , Zima_lato As Byte
  96. Dim Old_sec As Byte , Weekday As Byte , I2c_err As Byte , I2c_errors As Byte
  97. Dim Wylacz_zima As Long , Wlacz_zima As Long , Old_min As Byte
  98. Dim received as String * 20
  99. Dim Helpstr As String * 20
  100. dim Helpb As Byte
  101. Dim Temp_sec , Temp_min , Temp_hour , Temp_day , Temp_month , Temp_year As Byte
  102. '****************************************************************
  103. '                        PODPROGRAMY   INCLUD PROGRAMS                             *
  104. '****************************************************************
  105. $include "subs\mruganie.inc"
  106. $include "subs\Uartrx0.inc"
  107. Declare Sub Getdatetime
  108.  Declare Sub Setdate
  109. Declare Sub Settime
  110. '****************************************************************
  111. '##########################################################
  112. '                                                          ZMIENNE                                                 #
  113. '##########################################################
  114. '                                                   ZMIENNE CZASU                                          #
  115. '##########################################################
  116. Dim Timer_tikx10 As Byte                                                        'zmienna liczaca przepełnienie timera
  117. Dim Timertikx100 As Byte                                                        'zmienna liczaca przepełnienie timera x10
  118. Dim Timertikx200 As Byte                                                        'zmienna liczaca przepełnienie timera x 20
  119. Dim Timertikx500 As Byte                                                        'zmienna liczaca przepełnienie timera x 50
  120. Dim Timer_tik_flag As Byte
  121. Flaga10ms Alias Timer_tik_flag.0
  122. Flaga100ms Alias Timer_tik_flag.1
  123. Flaga500ms Alias Timer_tik_flag.2
  124. Flaga1s Alias Timer_tik_flag.3
  125. Flaga2s Alias Timer_tik_flag.4
  126.  
  127.  'zostaly jeszce trzy wolne flagi
  128.  ' a uzylem tylko jednego bajtu
  129.  'Pawer SP9DR
  130. '##########################################################
  131. '                  ZMIENNE POBIERANIA CZASU I DATY DS3231                    #
  132. '##########################################################
  133.  
  134. '##########################################################
  135. '                                         ZMIENNE UARTRX0                                              #
  136. '##########################################################                                                    '
  137. Dim Lcount_0 As Byte
  138. Dim Uart_command_0 As String * 20                                               'musi byc wystarczjaco dlugie
  139. Dim Getcommands_0(10) As String * 10                                            'tablica na pociete komendy
  140. Dim Komenda As String * 10
  141.  
  142. '##########################################################
  143. '                                        ZMIENNA SKANERA I2C                                       #
  144. '##########################################################
  145. Dim B As Byte
  146. '##########################################################
  147. '****************************************************************
  148. '           KONFIGURACJA PORTÓW CONFIG PORT                                      *
  149. '****************************************************************
  150. Config portB.7 = Output : Set portb.7 : Led_Live Alias Portb.7
  151.  
  152.  
  153.  
  154. '****************************************************************
  155. Print "Scan start I2C"
  156. Wait 2
  157. For B = 0 To 254 Step 2
  158.    I2cstart
  159.    I2cwbyte B
  160.    If Err = 0 Then
  161.       Print "I2C        Adresse = " ; B
  162.       Print "I2C Hex Adresse= " ; Hex(B)
  163.       Print "I2C Bin Adresse= " ; Bin(B)
  164.    End If
  165. Next
  166. Print "End Scan I2C"
  167. Wait 2
  168. '****************************************************************
  169.  
  170.  
  171.  
  172. Time$ = Helpstr
  173. '****************************************************************
  174. Do
  175.  
  176. '=====================================================
  177.    If Timer_tikx10 >= 10 Then                                                   'jeśli uplyneło 100ms to
  178.       Flaga100ms = 1                                                            'ustaw flage upłyneło 100ms
  179.       Incr Timertikx100                                                         'zwiększaj Timertikx100
  180.       Timer_tikx10 = 0                                                          'zeruj liczenie
  181.    End If                                                                       'koniec warunku
  182.    If Timertikx100 >= 10 Then                                                   'jeśli uplynela sekunda
  183.       Flaga1s = 1                                                               'ustaw flage upłyneła sekunda
  184.       Incr Timertikx200                                                         'zwiększaj Timertikx200
  185.       Incr Timertikx500
  186.       Timertikx100 = 0                                                          'zeruj liczenie
  187.    End If                                                                       'koniec warunku
  188.    If Timertikx500 >= 5 Then
  189.       Flaga500ms = 1
  190.       Timertikx500 = 0
  191.    End If
  192.    If Timertikx200 >= 2 Then                                                    'jeśli upłyneły dwie sekundy
  193.       Flaga2s = 1                                                               'ustaw flagę upłyneły dwie sekundy
  194.       Timertikx200 = 0                                                          'zeruj liczenie
  195.    End If                                                                       'koniec warunku
  196.  
  197. '=====================================================
  198.    If Flaga10ms = 1 Then                                                        'jeśli Flaga10ms jest równa 1
  199.       Flaga10ms = 0                                                             'wyzeruj Flaga10ms
  200.    End If                                                                       'koniec warunku
  201. '-------------------------------------------------------------------------------------------
  202.    If Flaga100ms = 1 Then                                                       'jeśli Flaga100ms jest równa 1
  203.  
  204.       Flaga100ms = 0                                                            'wyzeruj Flaga100ms
  205.    End If                                                                       'koniec warunku
  206. '-------------------------------------------------------------------------------------------
  207.    If Flaga500ms = 1 Then                                                       'jeśli Flaga500ms jest równa 1
  208.       Flaga500ms = 0                                                            'wyzeruj Flaga500ms
  209.    End If                                                                       'koniec warunku
  210. '-------------------------------------------------------------------------------------------
  211.    If Flaga1s = 1 Then                                                          'jeśli Flaga1s jest równa 1                                                               '                                                               'wyzeruj Flaga1s
  212.       Call Mruganie
  213.       Debug #Debug_ , Time$
  214.       Flaga1s = 0
  215.    End If                                                                       'koniec warunku
  216. '-------------------------------------------------------------------------------------------
  217.    If Flaga2s = 1 Then                                                          'jeśli Flaga2s jest równa 1
  218.       Flaga2s = 0                                                               'wyzeruj Flaga
  219.    End If                                                                       'koniec warunku
  220. '****************************************************************
  221.  'ODBIÓR DANYCH UART0
  222.    If Ischarwaiting(#DEBUG_) > 0 Then                                           'calls _gotchar and use URXC
  223.       Lcount_0 = Inkey(#DEBUG_)                                                 'pobierz znak z bufora
  224.       If Lcount_0 = 13 Or Len(uart_command_0) > 20 Then                         ' jeslii ENTER lub wiecej niz 20 znaków to call uartrx
  225.          Call Uartrx0()
  226.          Uart_command_0 = ""                                                    ' koniecznie potrzenbe do czysczenia bufora
  227.       Else                                                                      'inaczej
  228.          Uart_command_0 = Uart_command_0 + Chr(Lcount_0)                        'kluczowe budowanie bufora
  229.       End If                                                                    'koniec warunku
  230.    End If                                                                       'koniec warunku
  231. '****************************************************************
  232.  
  233.       If 0 < Instr(received , "TIME=") Then
  234.          If 13 = Len(received ) Then
  235.             Helpstr = Mid(received , 6 , 8)                                        'od piątej literki wzwyż wytnij osiem znaków
  236.             Time$ = Helpstr
  237.             Gosub Getdatetime
  238.             'Old_min = _min
  239.          End If
  240.  
  241.       'Goto Skip_the_rest                                                     'dont test then rest because we have match
  242.       End If
  243.     '-----------------------------------
  244.       If 0 < Instr(received , "DATE=") Then                                        'ustawione dd/mm/yy
  245.          If 13 = Len(received ) Then
  246.             Helpstr = Mid(received , 6 , 8)                                        'od piątej literki wzwyż wytnij osiem znaków
  247.             Date$ = Helpstr
  248.             Gosub Getdatetime
  249.          End If
  250.  
  251.       'Goto Skip_the_rest                                 'dont test then rest because we have match
  252.       End If
  253.  
  254.  
  255. Loop
  256. End
  257.  
  258. '-------------------------------------------------------------------------------------------
  259. '            podprogram przerwań Timer1
  260. Przertimer1:
  261.    Timer1 = 45536                                                               'wstawienie do Timer1 wartości 45536
  262.  
  263.    Incr Timer_tikx10
  264.  
  265.    If Timer_tikx10 = 1 Then
  266.       Set Flaga10ms
  267.    End If
  268.  
  269. Return                                                                          'powrót
  270. '-------------------------------------------------------------------------------------------
  271. Getdatetime:
  272.  
  273.    I2cstart                                                    ' Generate start code
  274.    If Err = 0 Then
  275.       I2cwbyte Ds3231w                                           ' send address
  276.       If Err = 1 Then
  277.          I2c_err = 1 : Return
  278.       Else
  279.          I2c_err = 0
  280.       End If
  281.       I2cwbyte 0                                                 ' start address in 1307
  282.  
  283.       I2cstart                                                  ' Generate start code
  284.       If Err = 0 Then
  285.          I2cwbyte Ds3231r                                        ' send address
  286.          If Err = 0 Then
  287.             I2crbyte Temp_sec , Ack
  288.             I2crbyte Temp_min , Ack                              ' MINUTES
  289.             I2crbyte Temp_hour , Ack                             ' Hours
  290.             I2crbyte Helpb , Ack                                                ' Day of Week bedzie z Dayofweek()  tutaj Dummy
  291.             I2crbyte Temp_day , Ack                              ' Day of Month
  292.             I2crbyte Temp_month , Ack                            ' Month of Year
  293.             I2crbyte Temp_year , Nack                            ' Year
  294.  
  295.             _sec = Makedec(temp_sec) : _min = Makedec(temp_min) : _hour = Makedec(temp_hour)
  296.             _day = Makedec(temp_day) : _month = Makedec(temp_month) : _year = Makedec(temp_year)
  297.          End If
  298.       End If
  299.  
  300.    End If
  301.  
  302.    I2cstop
  303. Return
  304.  
  305. Setdate:
  306.    Temp_day = Makebcd(_day) : Temp_month = Makebcd(_month) : Temp_year = Makebcd(_year)
  307.    I2cstart                                                    ' Generate start code
  308.    If Err = 0 Then
  309.       I2cwbyte Ds3231w                                           ' send address
  310.       If Err = 0 Then
  311.          I2cwbyte 4                                              ' starting address in 1307
  312.          I2cwbyte Temp_day                                       ' Send Data to SECONDS
  313.          I2cwbyte Temp_month                                     ' MINUTES
  314.          I2cwbyte Temp_year                                      ' Hours
  315.       End If
  316.    End If
  317.    I2cstop
  318.  
  319. Return
  320.  
  321. Settime:
  322.    Temp_sec = Makebcd(_sec) : Temp_min = Makebcd(_min) : Temp_hour = Makebcd(_hour)
  323.    I2cstart                                                    ' Generate start code
  324.    If Err = 0 Then
  325.       I2cwbyte Ds3231w                                           ' send address
  326.       If Err = 0 Then
  327.          I2cwbyte 0                                              ' starting address in 1307
  328.          I2cwbyte Temp_sec                                       ' Send Data to SECONDS
  329.          I2cwbyte Temp_min                                       ' MINUTES
  330.          I2cwbyte Temp_hour                                      ' Hours
  331.       End If
  332.    End If
  333.    I2cstop
  334. Return
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega i DS3231

Post autor: niveasoft » 04 wrz 2022, 18:29

Tam gdzie w tych moich IF`ach pisze "received" to wpisz "uart_command_0" i przenieś de IF`y do Sub`a Uartrx0()

Tak, że jak wpiszesz coś w Terminalu to to się znajdzie w stringu uart_command_0 a potem program wywoła Call Uartrx0()

Nie zapomnij w terminalu o Enter ;)

Tak poza tym to jak się czas sprawdza co sekundę to czasem wyglada jakby się zacinał. Lepiej czas sprawdzać co 100ms, ale wyświetlać tylko jak się zmienił. Dlatego ja bym zmienił ten kawałek na taki:
  1. '-------------------------------------------------------------------------------------------
  2.    If Flaga100ms = 1 Then                                                       'jeśli Flaga100ms jest równa 1
  3.     Gosub Getdatetime
  4.      Dim Prev_sec As Byte
  5.        If Prev_sec <> _sec Then
  6.         Prev_sec = _sec
  7.            Debug #Debug_ , Time(_sec)    'to już nie odczytuje ponownie RTC tylko działa na zmiennych _sec, _min i _hour
  8.       End if
  9.       Flaga100ms = 0                                                            'wyzeruj Flaga100ms
  10.    End If                                                                       'koniec warunku
  11. '-------------------------------------------------------------------------------------------
  12.    If Flaga500ms = 1 Then                                                       'jeśli Flaga500ms jest równa 1
  13.       Flaga500ms = 0                                                            'wyzeruj Flaga500ms
  14.    End If                                                                       'koniec warunku
  15. '-------------------------------------------------------------------------------------------
  16.    If Flaga1s = 1 Then                                                          'jeśli Flaga1s jest równa 1                                                               '                                                               'wyzeruj Flaga1s
  17.       Call Mruganie
  18.      
  19.       Flaga1s = 0
  20.    End If                                                                       'koniec warunku
  21. '-------------------------------------------------------------------------------------------
  22.    If Flaga2s = 1 Then                                                          'jeśli Flaga2s jest równa 1
  23.       Flaga2s = 0                                                               'wyzeruj Flaga
  24.    End If                                                                       'koniec warunku
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 04 wrz 2022, 18:56

Dziękuję po kolacji będę testował.
pozdrawiam Jacek.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 12 wrz 2022, 16:05

Witam po przerwie (goście, goście :o i załatwianie rehabilitacji :evil: )
mam tak w programie głównym odbiór z uart0
  1. '****************************************************************
  2. '                                        ODBIÓR DANYCH UART0                                     *
  3. '****************************************************************
  4.    If Ischarwaiting(#Debug__) > 0 Then
  5.       Call uartrx0
  6.    End If
  7. '****************************************************************
a w uartrx0 mam tak
  1. $nocompile
  2. 'odbiór danych z uart0 DEBUG_
  3. Sub Uartrx0
  4. '****************************************************************
  5.    If 0 < Instr(uart_command_0 , "TIME=") Then
  6.       If 13 = Len(uart_command_0) Then
  7.          Helpstr = Mid(uart_command_0 , 6 , 8)                                  'od piątej literki wzwyż wytnij osiem znaków
  8.          Time$ = Helpstr
  9.          Gosub Getdatetime
  10.          Old_min = _min
  11.       End If
  12.                      'Goto Skip_the_rest                                 'dont test then rest because we have match
  13.    End If
  14. '****************************************************************
  15.    If 0 < Instr(uart_command_0 , "DATE=") Then
  16.       If 13 = Len(uart_command_0) Then
  17.          Helpstr = Mid(uart_command_0 , 6 , 8)                                     'od piątej literki wzwyż wytnij osiem znaków
  18.          Date$ = Helpstr
  19.          Gosub Getdatetime
  20.       End If
  21.  
  22.              'Goto Skip_the_rest                                 'dont test then rest because we have match
  23.    End If
  24. '****************************************************************
  25.  
  26. End Sub
terminal wypluwa czas i datę
Clipboard01.jpg
czy to jest dobrze?
jak wpisuje w terminalu tak jak widać na obrazku, Enter na końcu z klawiatury oczywiście niestety nie mogę ustawić czasu :oops:
pozdrawiam Jacek.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega i DS3231

Post autor: niveasoft » 12 wrz 2022, 16:36

Zobacz sobie czy na pewno Uart coś tam dostaje do parsowania bo możesz czekać wiesz do kiedy ;)
Nie zapomnij o "Enable Interrupts" bo już niejeden na tym poległ.
  1. Sub uartx0
  2.  Print #twojCOM , "Parsuje-> " ; uart_command_0
  3.  
  4.  'i tu kod który szuka komend
  5. End Sub
ODPOWIEDZ