Xmega i DS3231

Rodzina procesorów bogatszych w wiele nowych rozwiązań i dlatego warto po nie sięgnąć.
ODPOWIEDZ
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Xmega i DS3231

Post autor: Jacek » 06 sty 2021, 11:04

Witam czytających :) ponieważ utknąłem z pisaniem dalszego programu do sterownika tokarki z braku wiedzy postanowiłem popróbować oprogramowania zegara DS3231 który mam zainstalowany na płycie sterownika tokarki.
Przy pomocy helpa Bascom'a oraz znalezionych informacji w internecie napisałem taki programik:
  1. '------------------------------------------------------------------
  2. '                    (c) 1995-2020 MCS
  3. '                      xmega-scanner.bas
  4. 'purpose : scan all i2c addresses to find slave chips
  5. 'Micro: Xmega128A1
  6. '------------------------------------------------------------------
  7. $regfile = "xm256a3udef.dat"                                ' the used chip
  8. $crystal = 32000000                                         ' frequency used
  9. $hwstack = 40
  10. $swstack = 40
  11. $framesize = 40
  12. Config Submode = New
  13. 'first enable the osc of your choice
  14. Config Osc = Enabled , 32mhzosc = Enabled
  15.  
  16. 'configure the systemclock
  17. Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
  18.  
  19. '*******************************************************************************
  20. '************ CONFIGURATION FOR COM1 UART_C0************************************
  21. '                ' TX-PORTC.3  RX-PORTC.2   com 2 tcp
  22. Config Com1 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  23. 'Open "COM1:" For Binary As #buart_channel                   'no need to open any more
  24. Config Serialin0 = Buffered , Size = 128 , Bytematch = None 'for COM1
  25. Config Serialout0 = Buffered , Size = 128
  26. Open "COM1:" For Binary As #1
  27.    'Config Input1 = Crlf , Echo = Cr
  28.   'Echo On
  29. '
  30. '*******************************************************************************
  31. '*********** CONFIGURATION FOR COM2 UART_C1*************************************
  32. '              ' TX-PORTC.7 RX-PORTC.6  (udp com 1 )
  33. 'Config Com2 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  34. 'Open "COM2:" For Binary As #buart_channel
  35.                                'no need to open any more
  36. 'Config Serialin1 = Buffered , Size = 128 , Bytematch = None 'for COM2
  37. 'Config Serialout1 = Buffered , Size = 128
  38. 'Open "COM2:" For Binary As #1
  39. ' Config Input2 = Cr , Echo = Cr
  40.   'Echo On
  41. '*******************************************************************************
  42. '************ CONFIGURATION FOR COM3 UART_D0************************************
  43. '             ' TX-PORTD.3 RX-PORTD.2    wifi
  44. 'Config Com3 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  45. 'Open "COM3:" For Binary As #buart_channel                   'no need to open any more
  46. 'Config Serialin2 = Buffered , Size = 128 , Bytematch = None 'for COM1
  47. 'Config Serialout2 = Buffered , Size = 128
  48. 'Open "COM3:" For Binary As #2
  49. 'Echo On
  50. '
  51. '*******************************************************************************
  52. '************ CONFIGURATION FOR COM4 UART_D1************************************
  53. '             ' TX-PORTD.3 RX-PORTD.2    wifi
  54. 'Config Com4 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  55. 'Open "COM3:" For Binary As #buart_channel                   'no need to open any more
  56. 'Config Serialin3 = Buffered , Size = 128 , Bytematch = None 'for COM1
  57. 'Config Serialout3 = Buffered , Size = 128
  58. 'Open "COM4:" For Binary As #3
  59. 'Echo On
  60. '
  61. '*******************************************************************************
  62. '************ CONFIGURATION 'COM5 UART_E0 **************************************
  63. '              ' TX-PORTE.3 ' RX-PORTE.2   debug
  64. Config Com5 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  65.  'Open "COM5:" For Binary As #buart_channel                  'channel 4
  66. Config Serialin4 = Buffered , Size = 128 , Bytematch = None 'for COM4
  67. Config Serialout4 = Buffered , Size = 128
  68. Open "COM5:" For Binary As #4
  69.    'Config Input1 = Crlf , Echo = Cr
  70.   ' Echo on
  71. '
  72. '*******************************************************************************
  73. '************ CONFIGURATION 'COM6 UART_E1 **************************************
  74. '              ' TX-PORTE.3 ' RX-PORTE.2   Xmega_2_SLAVE
  75. 'Config Com6 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  76.  'Open "COM5:" For Binary As #buart_channel                  'channel 4
  77. 'Config Serialin5 = Buffered , Size = 128 , Bytematch = None 'for COM4
  78. 'Config Serialout5 = Buffered , Size = 128
  79. 'Open "COM6:" For Binary As #5
  80.    'Config Input1 = Crlf , Echo = Cr
  81.   ' Echo on
  82. '
  83. '*******************************************************************************
  84. '************ CONFIGURATION 'COM5 UART_F0 **************************************
  85. '              ' TX-PORTE.3 ' RX-PORTE.2   dwin
  86. Config Com7 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
  87.  'Open "COM5:" For Binary As #buart_channel                  'channel 4
  88. Config Serialin6 = Buffered , Size = 128 , Bytematch = None 'for COM4
  89. Config Serialout6 = Buffered , Size = 128
  90. Open "COM7:" For Binary As #6
  91.    'Config Input1 = Crlf , Echo = Cr
  92.   ' Echo on
  93. '
  94. '*******************************************************************************
  95. '*********************************I2C_HARWARE*****************************
  96. Config Sda = Porte.0
  97. Config Scl = Porte.1
  98.  
  99. '*******************************************************************************
  100. Enable Interrupts
  101. Const Usechannel = 1
  102. Config Twie = 100000                                        'CONFIG TWI will ENABLE the TWI master interface
  103. Open "twie" For Binary As #3
  104.  
  105. I2cinit #3
  106.  
  107. Dim Twi_start As Byte , J As Byte , B As Byte
  108. Do
  109.    Print #4 , "Scan start"
  110.    For B = 0 To 254 Step 2                                  'for all odd addresses
  111.       I2cstart #3                                           'send start
  112.       I2cwbyte B , #3                                       'send address
  113.       If Err = 0 Then                                       'we got an ack
  114.          Print #4 , "Slave at : " ; B
  115.          Print #4 , "HEX : " ; Hex(b)
  116.          Print #4 , "BIN : " ; Bin(b)
  117.       End If
  118.       I2cstop #3                                            'free bus
  119.    Next
  120.    Print #4 , "End Scan"
  121.    End
  122.  
  123. Loop
  124. End
program działa i terminal wypluwa takie coś:

Obrazek

czy może ktoś wytłumaczyć mi w łopatologiczny sposób ( łopatologiczny :oops: ) czego jest to adres na liniach jest tylko na tą chwilę ten jeden DS3231 i jak pobierać dane i zapisywać ustawienia daty, godziny itp.
Może by się czegoś znowu nauczył bo mam coraz więcej bad sektorów w starej głowie :oops: .
pozdrawiam Jacek.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega i DS3231

Post autor: niveasoft » 06 sty 2021, 11:08

hahaha z tymi badsektorami to trafiłes z żartem :D Mi sie podoba. Jestem rocznik 78 , mam nadzieję, że na razie mnie problem badsectorów nie dotyczy :D
Pomyślę i postaram się pomóc :P
Awatar użytkownika
Karlos128@nos
Posty: 54
Rejestracja: 18 sie 2015, 13:32

Re: Xmega i DS3231

Post autor: Karlos128@nos » 12 lut 2021, 17:48

Witaj, te badsectory to chyba coraz więcej ludzi dotyka :lol:
Tu masz gotowy odczyt tego zegara.
  1. Sub Zegar
  2.    I2cstart #3
  3.    I2cwbyte Ds3231w , #3    ' Tu wstaw - DEC 208 lub hex &HD0
  4.    I2cwbyte &H00 , #3
  5.    'I2cstop
  6.    I2cstart #3
  7.    I2cwbyte Ds3231r , #3   ' Tutaj jest adres READ - DEC 209
  8.    I2crbyte Sekundy , Ack , #3                              ' 60
  9.    I2crbyte Minuty , Ack , #3                               ' 60
  10.    I2crbyte Godziny , Ack , #3                              ' 12 / 24
  11.    I2crbyte Dni , Ack , #3                                  ' 1-31
  12.    I2crbyte Dzien , Ack , #3                                ' dzien tygodnia 1-7
  13.    I2crbyte Miesiac , Ack , #3                              ' miesiąc 12
  14.    I2crbyte Rok , Nack , #3                                 '4 rok do 2099
  15.    I2cstop #3
  16.    Sekundy = Makedec(sekundy)
  17.    Minuty = Makedec(minuty)
  18.    Godziny = Makedec(godziny)
  19.    Dni = Makedec(dni)
  20.    Dzien = Makedec(dzien)
  21.    Miesiac = Makedec(miesiac)
  22.    Rok = Makedec(rok)
  23.    Godzinystr = Str(godziny)
  24.    Restore Font16x24
  25.    Godzinystr = Format(godzinystr , "00")
  26.    Lcd_text Godzinystr + ":" , 5 , 213 , White , Red
  27.    Minutystr = Str(minuty)
  28.    Minutystr = Format(minutystr , "00")
  29.    Restore Font16x24
  30.    Lcd_text Minutystr + ":" , 53 , 213 , White , Red
  31.    Sekundystr = Str(sekundy)
  32.    Sekundystr = Format(sekundystr , "00")
  33.    Restore Font16x24
  34.    Lcd_text Sekundystr , 101 , 213 , White , Red
  35.    Rem ******************** DATA *****************************************
  36.    Rokstr = Str(rok)
  37.    Rokstr = Format(rokstr , "00")
  38.    Restore Font10x16
  39.    Lcd_text "20" + Rokstr + "-" , 138 , 219 , Yellow , Red
  40.    Miesiacstr = Str(miesiac)
  41.    Miesiacstr = Format(miesiacstr , "00")
  42.    Restore Font10x16
  43.    Lcd_text Miesiacstr + "-" , 188 , 219 , Yellow , Red
  44.    Dzienstr = Str(dzien)
  45.    Dzienstr = Format(dzienstr , "00")
  46.    Restore Font10x16
  47.    Lcd_text Dzienstr , 218 , 219 , Yellow , Red
  48.  '  Select Case Dni
  49. '      Case 1 :
  50. '         Restore Font10x16
  51. '         Lcd_text "Niedziela" , 138 , 202 , White , Red
  52. '      Case 2 :
  53. '         Restore Font10x16
  54. '         Lcd_text "Poniedzialek" , 138 , 202 , White , Red
  55. '      Case 3 :
  56. '         Restore Font10x16
  57. '         Lcd_text "Wtorek      " , 138 , 202 , White , Red
  58. '      Case 4:
  59. '         Restore Font10x16
  60. '         Lcd_text "Sroda" , 138 , 202 , White , Red
  61. '      Case 5:
  62. '         Restore Font10x16
  63. '         Lcd_text "Czwartek" , 138 , 202 , White , Red
  64. '      Case 6 :
  65. '         Restore Font10x16
  66. '         Lcd_text "Piatek  " , 138 , 202 , White , Red
  67. '      Case 7 :
  68. '         Restore Font10x16
  69. '         Lcd_text "Sobota  " , 138 , 202 , White , Red
  70. '   End Select
  71. End Sub
A tutaj zapis nowych danych zegara:
  1. Sub Settime
  2.    Sekundy = Makebcd(sekundy)
  3.    I2cstart #3
  4.    I2cwbyte Ds3231w , #3
  5.    I2cwbyte 0 , #3
  6.    I2cwbyte Sekundy , #3
  7.    I2cstop #3
  8.    Minuty = Makebcd(minuty)
  9.    I2cstart #3
  10.    I2cwbyte Ds3231w , #3
  11.    I2cwbyte 1 , #3
  12.    I2cwbyte Minuty , #3
  13.    I2cstop #3
  14.    Godziny = Makebcd(godziny)
  15.    I2cstart #3
  16.    I2cwbyte Ds3231w , #3
  17.    I2cwbyte 2 , #3
  18.    I2cwbyte Godziny , #3
  19.    I2cstop #3
  20. End Sub
A tutaj zapis daty:
  1. Sub Setdate
  2.    Dni = Makebcd(dni)    ' < od 1 to niedziela do 7 to sobota
  3.    I2cstart #3
  4.    I2cwbyte Ds3231w , #3
  5.    I2cwbyte &H03 , #3
  6.    I2cwbyte Dni , #3
  7.    I2cstop #3
  8.    Dzien = Makebcd(dzien)
  9.    I2cstart #3
  10.    I2cwbyte Ds3231w , #3
  11.    I2cwbyte &H04 , #3
  12.    I2cwbyte Dzien , #3
  13.    I2cstop #3
  14.    Miesiac = Makebcd(miesiac)
  15.    I2cstart #3
  16.    I2cwbyte Ds3231w , #3
  17.    I2cwbyte &H05 , #3
  18.    I2cwbyte Miesiac , #3
  19.    I2cstop #3
  20.    Rok = Makebcd(rok)
  21.    I2cstart #3
  22.    I2cwbyte Ds3231w , #3
  23.    I2cwbyte &H06 , #3
  24.    I2cwbyte Rok , #3
  25.    I2cstop #3
  26. End Sub
Dodatkowo polecam jeszcze pomiar temperatury:
Sub Temp_obudowa ' Temp DS3231 10bit w obudowie
I2cstart #3 ' start magistrali
I2cwbyte Ds3231w , #3 ' wysłanie adresu RTC do zapisu
I2cwbyte &H11 , #3 ' adres rejestru
I2crepstart #3 ' Generate start code
I2cwbyte Ds3231r , #3 ' wysłanie adresu RTC do odczytu
I2crbyte Temp_ds(1) , Ack , #3 ' odczyt rejestru temperatury
I2crbyte Temp_ds(2) , Nack , #3
I2cstop #3
Minusds = Temp_ds(1).7 ' 1-ujemna, 0-dodatnia
If Minusds = 1 Then
Temp_ds(1) = Not Temp_ds(1)
Incr Temp_ds(1)
End If
' Print "minus: " ; Minus
Shift Temp_ds(2) , Right , 6
Temp_u = Temp_ds(2) * 25
Czujnik_ds = Str(temp_ds(1)) + "." + Str(temp_u)
If Minusds = 1 Then Czujnik_ds = "-" + Czujnik_ds
Czujnik_ds = Czujnik_ds
Restore Font10x16
Lcd_text Czujnik_ds + "C" , 3 , 4 , Yellow , Black
End Sub
U mnie te wskazania są wyświetlane na kolorowym wyświetlaczu TFT, ale możesz ich sobie wyświetlić gdzie tylko chcesz.
Tak wyglądają te sektory podzielone na suby. :ugeek:
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 12 lut 2021, 22:49

Witam - wielkie dzięki za kod jak tylko uporam się z malowaniem shack'u to sprawdzę.
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega i DS3231

Post autor: niveasoft » 09 mar 2021, 19:33

Tak mi jakoś umknęło a chciałbym kolegów przestrzec, że jak tak jak wyżej ustawicie czas lub datę to potem koniecznie trzeba ją odczytać bo Sekundy zamienione na BCD to już nie Sekundy.
Dlatego przy ustawianiu korzystam z pomocniczych zmiennych (to mogą być ogólnodostępne "multipurpose" a nie dedykowane). Niemniej po wywołaniu funkcji Settime albo Setdate, spokojnie można testować dalej czas funkcjami TimeLong = Time(_sec) albo wyświetlać TimeString = Time(_sec) bez obawy ;)

Chodzi o to by nie robić _sec = Makebcd(_sec) i potem to wpisywać do RTC.
A w ogóle to to jest w pełni kompatybilne z wbudowanymi funkcjami Bascom na temat czasu/daty. Wystarczy napisać Config Clock = User ;)
  1. Getdatetime:
  2.  
  3. I2cstart                                                    ' Generate start code
  4. If Err = 0 Then
  5.  I2cwbyte Ds3231w                                           ' send address
  6.  If Err = 1 Then
  7.   I2c_err = 1 : Return
  8.  Else
  9.   I2c_err = 0
  10.  End If
  11.  I2cwbyte 0                                                 ' start address in 1307
  12.  
  13.   I2cstart                                                  ' Generate start code
  14.    If Err = 0 Then
  15.     I2cwbyte Ds3231r                                        ' send address
  16.     If Err = 0 Then
  17.        I2crbyte Temp_sec , Ack
  18.        I2crbyte Temp_min , Ack                              ' MINUTES
  19.        I2crbyte Temp_hour , Ack                             ' Hours
  20.        I2crbyte Weekday , Ack                               ' Day of Week
  21.        I2crbyte Temp_day , Ack                              ' Day of Month
  22.        I2crbyte Temp_month , Ack                            ' Month of Year
  23.        I2crbyte Temp_year , Nack                            ' Year
  24.  
  25.        _sec = Makedec(temp_sec) : _min = Makedec(temp_min) : _hour = Makedec(temp_hour)
  26.        _day = Makedec(temp_day) : _month = Makedec(temp_month) : _year = Makedec(temp_year)
  27.     End If
  28.    End If
  29.  
  30. End If
  31.  
  32.  I2cstop
  33. Return
  34.  
  35. Setdate:
  36.  Temp_day = Makebcd(_day) : Temp_month = Makebcd(_month) : Temp_year = Makebcd(_year)
  37. I2cstart                                                    ' Generate start code
  38. If Err = 0 Then
  39.  I2cwbyte Ds3231w                                           ' send address
  40.  If Err = 0 Then
  41.     I2cwbyte 4                                              ' starting address in 1307
  42.     I2cwbyte Temp_day                                       ' Send Data to SECONDS
  43.     I2cwbyte Temp_month                                     ' MINUTES
  44.     I2cwbyte Temp_year                                      ' Hours
  45.  End If
  46. End If
  47. I2cstop
  48.  
  49. Return
  50.  
  51. Settime:
  52.  Temp_sec = Makebcd(_sec) : Temp_min = Makebcd(_min) : Temp_hour = Makebcd(_hour)
  53. I2cstart                                                    ' Generate start code
  54. If Err = 0 Then
  55.  I2cwbyte Ds3231w                                           ' send address
  56.  If Err = 0 Then
  57.     I2cwbyte 0                                              ' starting address in 1307
  58.     I2cwbyte Temp_sec                                       ' Send Data to SECONDS
  59.     I2cwbyte Temp_min                                       ' MINUTES
  60.     I2cwbyte Temp_hour                                      ' Hours
  61.  End If
  62. End If
  63. I2cstop
  64. Return
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 28 sie 2022, 18:03

Witam - Bartek czy możesz napisać jakiego typu są zmienne:
  1.  
  2.  
  3. I2cwbyte Ds3231w
  4. I2c_err = 1
  5. I2crbyte Temp_sec , Ack
  6. I2crbyte Temp_min , Ack                              ' MINUTES
  7. I2crbyte Temp_hour , Ack                             ' Hours
  8. I2crbyte Weekday , Ack                               ' Day of Week
  9. I2crbyte Temp_day , Ack                              ' Day of Month
  10. I2crbyte Temp_month , Ack                            ' Month of Year
  11. I2crbyte Temp_year , Nack                                           ' Year    
  12.  
  13.  
chodzi mi o kod który wstawiłeś wyżej.
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega i DS3231

Post autor: niveasoft » 28 sie 2022, 19:54

A nie daje do myślenia napis "I2crbyte" ?
W I2C czyta się po jednym bajcie bo taka jest specyfikacja protokołu. Tam się co bajt potwierdza "ACK", że chcemy dalej czytać a jak wystawiasz "NACK" to slave wie, że już nic więcej nie chcesz.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 28 sie 2022, 20:46

:oops: jasne Bartek.
pozdrawiam Jacek.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega i DS3231

Post autor: Jacek » 30 sie 2022, 22:45

Witam działa już odczyt czasu i daty jeszcze muszę popracowć nad ustawianiem bo coś źle działa.
https://www.youtube.com/watch?v=OUIv1dzdUFA
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega i DS3231

Post autor: niveasoft » 30 sie 2022, 22:55

No i bajka jak tak loguje :P
Ostatnio po koledze @pikczu to przy każdym projekcie uruchamiam @projecttime. Bascom mi ostatnio powiedział że nad czyms co pisze siedziałem juz osiem godzin - jeden projekt - osiem godzin pisania - nie czytania tylko klepania w klawiaturę - nie wlicza się myślenia - tylko osiem godzin pisania - spróbujcie książke czytać osiem godzin - a potem pomyślcie ile zajęło jej pisanie :D

Fajnie jak system wstaje :D Jacek :D
ODPOWIEDZ