Zegar rtc DS3221

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Rafał Piwowarczyk
Posty: 8
Rejestracja: 18 gru 2016, 17:36

Zegar rtc DS3221

Post autor: Rafał Piwowarczyk » 06 paź 2017, 15:39

Proszę o pomoc forumowiczów w dokończeniu poniższego wsadu do zegarka RTC. Kontroler M16, zegar DS3221. Problem polega na wyświetlaniu dużych fontów na LCD 4*20. Czytałem poradnik na powyższej stronie lecz nie do końca rozumię o co tam chodzi. Napisałem część kodu lecz nie wiem co dalej. Chciałbym również dorobić zdalny odczyt temperatury na odbiorniku RF, odbiornik RF podpięty do wyjścia TX. Czy ma ktoś jakiś pomysł jak to zrobić. Za pomoc serdecznie dziękuję.



  1. $regfile = "m16def.dat"
  2. $crystal = 8000000
  3. $hwstack = 40
  4. $swstack = 16
  5. $framesize = 32
  6.  
  7. Config Submode = New
  8.  
  9. '**************************
  10. 'Konfiguracja wejsc i wyjsc
  11. '**************************
  12.  
  13. Config Lcdpin = Pin , Db4 = Porta.5 , Db5 = Porta.4 , Db6 = Porta.3 , Db7 = Porta.2 , E = Porta.6 , Rs = Porta.7
  14. Config Lcd = 20x4
  15. Cursor Off , Noblink
  16. Cls
  17.  
  18. Deflcdchar 0 , 31 , 31 , 31 , 32 , 32 , 32 , 32 , 32        'górna belka
  19. Deflcdchar 1 , 28 , 30 , 31 , 31 , 31 , 31 , 31 , 31        'prawy górny narożnik
  20. Deflcdchar 2 , 31 , 31 , 31 , 31 , 31 , 31 , 30 , 28        'prawy dolny narożnik
  21. Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31        'dolna kreska
  22. Deflcdchar 4 , 31 , 31 , 31 , 31 , 31 , 31 , 15 , 7         'lewy dolny narożnik
  23. Deflcdchar 5 , 7 , 15 , 31 , 31 , 31 , 31 , 31 , 31         'lewy górny narożnik
  24. Deflcdchar 6 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31        'środkowa kreska
  25.  
  26. Config 1wire = Portb.4
  27. Config Sda = Portc.1
  28. Config Scl = Portc.0
  29. I2cinit
  30.  
  31. Const Ds1307w = 208
  32. Const Ds1307r = 209
  33.  
  34. Config Timer1 = Timer , Prescale = 8                        'Konfiguracja TIMER1
  35. On Timer1 Przerwanie_30s
  36.  
  37. Config Pinc.4 = Input : Portc.4 = 1                         'podciągnięcie do vcc
  38. Config Pinc.5 = Input : Portc.5 = 1
  39. Config Pinc.6 = Input : Portc.6 = 1
  40. Config Pinc.7 = Input : Portc.7 = 1
  41.  
  42. Config Porta.1 = Output : Porta.1 = 0                       'stan poczatkowy portu niski
  43. Config Portd.1 = Output : Portd.1 = 0
  44. Config Portd.2 = Output : Portd.2 = 0
  45.  
  46. '*******
  47. 'Zmienne
  48. '*******
  49.  
  50. Dim Time_sek As Byte
  51. Dim Time_min As Byte
  52. Dim Time_godz As Byte
  53. Dim Date_dzi_tyg As Byte
  54. Dim Date_m As Byte
  55. Dim Date_d As Byte
  56. Dim Date_r As Byte
  57. Dim Old_sec As Byte
  58. Dim Timeout As Word
  59. Dim Get_timeout As Byte
  60. Dim Temp_wew As String * 5
  61. Dim Dsid1(8) As Byte
  62. Dim T As Integer
  63. Dim Get_temp As Byte
  64. Dim Licznik_temper As Word
  65.  
  66. Declare Sub Set_time
  67. Declare Sub Ustaw_czas
  68. Declare Sub Ustaw_data
  69. Declare Sub Pomiar_ds18b20
  70.  
  71. '************
  72. 'Nazwy portów
  73. '************
  74.  
  75. Sw1_mode Alias Pinc.4
  76. Sw2_up Alias Pinc.5
  77. Sw3_down Alias Pinc.6
  78. Sw4_write Alias Pinc.7
  79.  
  80. Led Alias Porta.1
  81. Data_ Alias Portd.0
  82. Buzzer Alias Portd.2
  83.  
  84. Locate 1 , 4
  85. Lcd "RADIO ZEGAR RTC "
  86. Lowerline
  87. Locate 2 , 1
  88. Lcd "ELECTRONICSS SERWICE"
  89. Thirdline
  90. Locate 3 , 4
  91. Lcd "ELESTER - PKP &"
  92. Fourthline
  93. Locate 4 , 3
  94. Lcd "RAFAL PIWOWARCZYK"
  95. Set Led
  96. Set Buzzer
  97. Wait 1
  98. Reset Led
  99. Reset Buzzer
  100. Wait 1
  101. Set Led
  102. Set Buzzer
  103. Wait 1
  104. Reset Led
  105. Reset Buzzer
  106. Wait 1
  107. Set Led
  108. Wait 3
  109. Cls
  110.  
  111. '*********************
  112. 'Petla glowna programu
  113. '*********************
  114.  
  115. Enable Interrupts
  116.  
  117. Do
  118.  
  119. Gosub Get_time
  120.  
  121. If Old_sec <> Time_sek Then
  122. Old_sec = Time_sek
  123.  
  124. Locate 1 , 1
  125. Lcd "CZAS:       " ; Bcd(time_godz) ; ":" ; Bcd(time_min) ; ":" ; Bcd(time_sek) ;
  126. Fourthline
  127. Locate 4 , 1
  128. Lcd "DATA:     " ; Bcd(date_d) ; "/" ; Bcd(date_m) ; "/20" ; Bcd(date_r) ;
  129. End If
  130. Home
  131.  
  132. Enable Timer1
  133. Reset Buzzer
  134. Set Led
  135.  
  136. If Sw1_mode = 0 Then
  137. Call Ustaw_czas
  138. End If
  139.  
  140. If Sw2_up = 0 Then
  141. Call Ustaw_data
  142. End If
  143.  
  144. If Get_temp = 1 Then
  145. Get_temp = 0
  146. Call Pomiar_ds18b20
  147. End If
  148.  
  149. Loop
  150. End
  151.  
  152. '*******************
  153. 'Odczyt czasu DS3221
  154. '*******************
  155.  
  156. Get_time:
  157.  
  158. I2cstart
  159. I2cwbyte Ds1307w
  160. I2cwbyte 0
  161. I2cstart
  162. I2cwbyte Ds1307r
  163. I2crbyte Time_sek , Ack
  164. I2crbyte Time_min , Ack
  165. I2crbyte Time_godz , Ack
  166. I2crbyte Date_dzi_tyg , Ack
  167. I2crbyte Date_d , Ack
  168. I2crbyte Date_m , Ack
  169. I2crbyte Date_r , Nack
  170. I2cstop
  171. Return
  172.  
  173. '******************
  174. 'Zapis czasu DS3221
  175. '******************
  176.  
  177. Sub Set_time:
  178.  
  179. I2cstart
  180. I2cwbyte Ds1307w
  181. I2cwbyte 0
  182. I2cwbyte Time_sek
  183. I2cwbyte Time_min
  184. I2cwbyte Time_godz
  185. I2cwbyte Date_dzi_tyg
  186. I2cwbyte Date_d
  187. I2cwbyte Date_m
  188. I2cwbyte Date_r
  189. I2cstop
  190. End Sub
  191.  
  192. '*********************
  193. 'Podprogram ustaw_czas
  194. '*********************
  195.  
  196. Sub Ustaw_czas:
  197. Timeout = 0                                                 'wyzerowanie Timeoutu przy wejściu w Sub
  198. Cls
  199. Wait 1
  200.  
  201. Do
  202.  
  203. Locate 1 , 6
  204. Lcd "USTAW CZAS:"
  205. Thirdline
  206. Locate 3 , 9
  207. Lcd ; Bcd(time_godz) ; ":" ; Bcd(time_min) ;
  208.  
  209. If Sw2_up = 0 Then                                          'ustaw godziny
  210. Timeout = 0                                                 'odwleka czas do automatycznego wyjścia
  211. Time_godz = Makedec(time_godz)
  212. Incr Time_godz
  213. If Time_godz > 23 Then
  214. Time_godz = 0
  215. End If
  216. Waitms 250
  217. Time_godz = Makebcd(time_godz)
  218. End If
  219.  
  220. If Sw3_down = 0 Then                                        'ustaw minuty
  221. Timeout = 0                                                 'odwleka czas do automatycznego wyjścia
  222. Time_min = Makedec(time_min)
  223. Incr Time_min
  224. If Time_min > 59 Then
  225. Time_min = 0
  226. End If
  227. Waitms 250
  228. Time_min = Makebcd(time_min)
  229. End If
  230.  
  231. If Sw4_write = 0 Then                                       'wyjście i zapis czasu
  232. Time_sek = 0
  233. Timeout = 0                                                 'odwleka czas do automatycznego wyjścia
  234. Waitms 250
  235. Call Set_time
  236. Exit Do
  237. End If
  238.  
  239. If Get_timeout = 1 Then                                     'samoczynne wyjście z menu po 30 sek.
  240. Get_timeout = 0
  241. Set Buzzer
  242. Reset Led
  243. Waitms 500
  244. Cls
  245. Exit Do
  246. End If
  247. Loop
  248. End Sub
  249.  
  250. '*********************
  251. 'Podprogram ustaw_data
  252. '*********************
  253.  
  254. Sub Ustaw_data:
  255. Timeout = 0
  256. Cls
  257. Wait 1
  258.  
  259. Do
  260.  
  261. Locate 1 , 6
  262. Lcd "USTAW DATE:"
  263. Thirdline
  264. Locate 3 , 7
  265. Lcd ; Bcd(date_d) ; "/" ; Bcd(date_m) ; "/20" ; Bcd(date_r) ;
  266.  
  267. If Sw1_mode = 0 Then                                        'ustaw dzień
  268. Timeout = 0                                                 'odwleka czas do automatycznego wyjścia
  269. Date_d = Makedec(date_d)
  270. Incr Date_d
  271. If Date_d > 31 Then
  272. Date_d = 1
  273. End If
  274. Waitms 250
  275. Date_d = Makebcd(date_d)
  276. End If
  277.  
  278. If Sw2_up = 0 Then                                          'ustaw miesiąc
  279. Timeout = 0                                                 'odwleka czas do automatycznego wyjścia
  280. Date_m = Makedec(date_m)
  281. Incr Date_m
  282. If Date_m > 12 Then
  283. Date_m = 1
  284. End If
  285. Waitms 250
  286. Date_m = Makebcd(date_m)
  287. End If
  288.  
  289. If Sw3_down = 0 Then                                        'ustaw rok
  290. Timeout = 0                                                 'odwleka czas do automatycznego wyjścia
  291. Date_r = Makedec(date_r)
  292. Incr Date_r
  293. If Date_r > 99 Then
  294. Date_r = 1
  295. End If
  296. Waitms 250
  297. Date_r = Makebcd(date_r)
  298. End If
  299.  
  300. If Sw4_write = 0 Then
  301. Waitms 250
  302. Call Set_time
  303. Exit Do
  304. End If
  305.  
  306. If Get_timeout = 1 Then                                     'samoczynne wyjście z menu po 30 sek.
  307. Get_timeout = 0
  308. Set Buzzer
  309. Reset Led
  310. Waitms 500
  311. Cls
  312. Exit Do
  313. End If
  314. Loop
  315. End Sub
  316.  
  317. '******************
  318. 'Odczyt temperatury
  319. '******************
  320.  
  321. Sub Pomiar_ds18b20:
  322. Disable Timer1
  323. Dsid1(1) = 1wsearchfirst()
  324. 1wreset
  325. 1wwrite &HCC
  326. 1wwrite &H44
  327. Waitms 750
  328. 1wreset
  329. 1wwrite &H55
  330. 1wverify Dsid1(1)
  331. 1wwrite &HBE
  332. T = 1wread(2)
  333. T = T * 8
  334. T = T / 16
  335. Temp_wew = Str(t)
  336. Temp_wew = Format(temp_wew , "+0.0")
  337.  
  338. Cls
  339. Cursor Off
  340. Locate 1 , 6
  341. Lcd "TEMPERATURA"
  342. Thirdline
  343. Locate 3 , 8
  344. Lcd ; Temp_wew ; Chr(223) ; "C "
  345. Wait 5
  346. Cls
  347. End Sub
  348.  
  349. '********************
  350. 'Przerwanie od timer1
  351. '********************
  352.  
  353. Przerwanie_30s:
  354. Incr Timeout
  355. If Timeout > 458 Then                                       ' odlicz do 30 sek.
  356. Timeout = 0
  357. Get_timeout = 1
  358. End If
  359.  
  360. Incr Licznik_temper
  361. If Licznik_temper > 305 Then                                'odlicz do 20 sek.
  362. Licznik_temper = 0
  363. Get_temp = 1
  364. End If
  365. Return
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Zegar rtc DS3221

Post autor: niveasoft » 06 paź 2017, 17:07

Narysuj, chociażby w Paint, gdzie chciałbyś mieć te duże cyfry (jakiś pożądany rozkład danych na wyświetlaczu).
Kiedyś napisałem taką bibliotekę która pozwala umieszczać te duże cyfry gdzie chcesz tylko to było na forum Atnela na które nie zaglądam od dawna.
Wszystko jednak skrzętnie kataloguję u siebie na dyskach z dość dużym porządkiem i pewnie się znajdzie ;)
Rafał Piwowarczyk
Posty: 8
Rejestracja: 18 gru 2016, 17:36

Re: Zegar rtc DS3221

Post autor: Rafał Piwowarczyk » 10 paź 2017, 11:49

Wyświetlacz ma 4 wiersze po 20 znaków, więc cyfry godzin i minut mają mieć wysokość 4 wierszów zaś sekund dwóch wierszów. Obojętnie w jakiej części ekranu wyświetlacza będą się znajdować. Chodzi mi o to żeby napisać kod który będzie wyświetlał duże fonty a ja sobie sam wprowadzę poprawki do wsadu i sam sobie je rozmieszczę. Chodzi mi tylko o zasadę działania kodu. Rozmieszczenie cyfr poprawię sobie w kodzie. I druga rzecz chodzi mi o dorobienie kodu odczytu temperatury za pomocą odbiornika RF który jest podłączony do portu UART, RX atmega16. Za pomoc serdeczne dzięki. Pozdrawiam
ODPOWIEDZ