2023年3月9日木曜日

FM-7にRTCとSDを接続する試み(RTC編)

 FM-7用のRTC&SDカード基板を製作してみました

【修正】OneDriveのリンク先が間違っていましたので、正しいリンク先に変更しました。

以前、6821PIAを用いてI2CでRTCを、SPIでSDカードを読み書きする試みを紹介しました。

「アセンブラでのPIAとRTCの間のI2C通信に成功しました(2018年10月27日)」
https://flexonsbd.blogspot.com/2018/10/piartci2c.html)
「SDカードを6809のアセンブラで読み書きしてみる(2022年6月12日)」
(https://flexonsbd.blogspot.com/2022/06/sd6809.html)

最終の目的は、FM-7にRTC(リアルタイムクロック)とSDカードを実装することなのですが、RTCはともかく、SDカードを実装するのはそれ程簡単ではありません。
しかし、あれこれ考えているだけでは進まないので、とりあえず基板を作成してみることにしました。

作成した基板です。

製作したRTC&SDカード基板


その回路図を示します。

回路図


基本的には以前紹介したものと同じで、68B21のAポートを使用してI2CでRTCを、Bポートを使用してSPIでSDカードを制御しています。なお、RTCは5V駆動ですので68B21と直結していますが、SDカードは3.3V駆動ですので、レベル変換モジュールを通しており、その3.3V電源はSDカードから供給しています。
使用しているRTC基板はDS3231チップを使用しているZS-042で、バッテリを充電しないようにパターンカットを施しています。またSDカード基板は画像のものの他に、以前秋月電子で販売されていた基板も使えるように両方のパターンを用意してあります。(下のマイコン用基板に装着されています。)

同時に、自作6809/6802ボードマイコン用の基板も製作しました。
この基板はFlex9の起動時に自動的に日付を読み込むために使用しています。


マイコン用基板


今回は、RTC部分についてのみ紹介します。


FM-7に装着した状態です。

動作風景


実行中の様子です。

実行画面


FM-7のF-BASIC V3.0用に制作したソフトは、RTCから読み出すRTC_RDと書き込むRTC_WRの2本です。
RTC_WRでは日付と時刻をF-BASICのワークエリアに直接書き込んでいますので、RTC_WRはV3.0専用です。
画像にありますように、書き込んだデータがPRINT文で表示できており、正しく設定されていることが確認できます。

参考までに、RTC_WRのリストを示します。

  1. 0001 *
  2. 0002 * RTC_WR.CMD for F-BASIC V3.0
  3. 0003 *
  4. 0004 * WRITE DATE to RTC3231 by I2C on F-BASIC
  5. 0005 *
  6. 0006 * 6821(PIA) Port A <--> RTC3231
  7. 0007 *
  8. 0008 * Applied to F-BASIC '2023.03.09
  9. 0009 * Original version '2018.11.03
  10. 0010 * Copyright by Y.Yamamoto
  11. 0011 *
  12. 0012 FBB8 INCHA EQU $FBB8
  13. 0013 FBBB OUTCHA EQU $FBBB
  14. 0014 E2E9 SETIME EQU $E2E9 set time data routine
  15. 0015 02FA WKDATE EQU $02FA work area for date
  16. 0016
  17. 0017 FD9C PADAT EQU $FD9C
  18. 0018 FD9D PACTL EQU PADAT+1
  19. 0019
  20. 0020 000D CR EQU $0D
  21. 0021 000A LF EQU $0A
  22. 0022
  23. 0023 00D0 SADRW EQU $D0 (01101000+0)
  24. 0024 00D1 SADRR EQU $D1 (01101000+1)
  25. 0025
  26. 0026 6000 ORG $6000
  27. 0027
  28. 0028 6000 20 03 START BRA MAIN
  29. 0029 6002 01 VN FCB 1
  30. 0030 6003 FF ODAT FCB $FF
  31. 0031 6004 00 WK FCB 00
  32. 0032
  33. 0033 6005 MAIN EQU *
  34. 0034 6005 BD 619A JSR PCRLF
  35. 0035 *get date data
  36. 0036 6008 8E 61CC LDX #MDAT
  37. 0037 600B BD 618A JSR PSTRNG
  38. 0038
  39. 0039 600E 8E 621F LDX #INBUF+20
  40. 0040 6011 4F CLRA
  41. 0041 6012 C6 14 LDB #20
  42. 0042 6014 A7 82 CLLOP STA ,-X
  43. 0043 6016 5A DECB
  44. 0044 6017 26 FB BNE CLLOP
  45. 0045 6019 BD FBB8 INDLOP JSR INCHA
  46. 0046 601C BD FBBB JSR OUTCHA
  47. 0047 601F A7 80 STA ,X+
  48. 0048 6021 81 0D CMPA #CR
  49. 0049 6023 26 F4 BNE INDLOP
  50. 0050 6025 6F 1F CLR -1,X
  51. 0051 6027 8E 620B LDX #INBUF
  52. 0052
  53. 0053 602A C6 07 LDB #7
  54. 0054 602C 108E 61FE LDY #WRDATA
  55. 0055 6030 34 04 INLOP PSHS B
  56. 0056 6032 EC 81 LDD ,X++
  57. 0057 *if B is sep. not 2dec
  58. 0058 6034 C1 30 CMPB #'0
  59. 0059 6036 25 04 BLO INL1
  60. 0060 6038 C1 39 CMPB #'9
  61. 0061 603A 23 06 BLS INL2
  62. 0062 603C 1F 89 INL1 TFR A,B
  63. 0063 603E 86 30 LDA #'0
  64. 0064 6040 30 1F LEAX -1,X
  65. 0065 6042 48 INL2 ASLA
  66. 0066 6043 48 ASLA
  67. 0067 6044 48 ASLA
  68. 0068 6045 48 ASLA
  69. 0069 6046 C4 0F ANDB #$0F
  70. 0070 6048 F7 6004 STB WK
  71. 0071 604B BB 6004 ADDA WK
  72. 0072 604E A7 A0 STA ,Y+
  73. 0073 6050 30 01 LEAX 1,X skip separator
  74. 0074 6052 35 04 PULS B
  75. 0075 6054 5A DECB
  76. 0076 6055 27 0A BEQ INEND
  77. 0077 6057 C1 04 CMPB #4
  78. 0078 6059 26 D5 BNE INLOP
  79. 0079 605B 86 01 LDA #$01 add week data
  80. 0080 605D A7 A0 STA ,Y+
  81. 0081 605F 20 CF BRA INLOP
  82. 0082 6061 INEND EQU *
  83. 0083
  84. 0084 *reset pia
  85. 0085 *port A,B:output, data $ff:out
  86. 0086 6061 4F CLRA
  87. 0087 6062 B7 FD9D STA PACTL select ddra
  88. 0088 6065 86 FF LDA #$FF
  89. 0089 6067 B7 FD9C STA PADAT set output mode
  90. 0090 606A 86 36 LDA #$36
  91. 0091 606C B7 FD9D STA PACTL select peripheral
  92. 0092 *out High = bus release (set input mode)
  93. 0093 606F 86 FF LDA #$FF
  94. 0094 6071 B7 6003 STA ODAT save out data
  95. 0095 6074 B7 FD9C STA PADAT
  96. 0096
  97. 0097 *start cond. (scl=H,sda=H->L)
  98. 0098 6077 17 00B7 LBSR SETDTL
  99. 0099 607A 17 0096 LBSR SETCKL
  100. 0100
  101. 0101 *send slave adr+W ($D0)
  102. 0102 607D 86 D0 LDA #SADRW
  103. 0103 607F 17 00CD LBSR WRDAT
  104. 0104
  105. 0105 *wait ACK
  106. 0106 6082 17 00E5 LBSR WACK
  107. 0107
  108. 0108 *send reg top adr ($00)
  109. 0109 6085 86 00 LDA #$00 reg adr:00-06
  110. 0110 6087 17 00C5 LBSR WRDAT
  111. 0111
  112. 0112 *wait ACK
  113. 0113 608A 17 00DD LBSR WACK
  114. 0114
  115. 0115 *write data
  116. 0116 608D 8E 6205 LDX #WRDATA+7
  117. 0117 6090 C6 07 LDB #7
  118. 0118 6092 34 04 WRLOP PSHS B
  119. 0119 6094 A6 82 LDA ,-X
  120. 0120 6096 17 00B6 LBSR WRDAT
  121. 0121 6099 17 00CE LBSR WACK
  122. 0122 609C 35 04 PULS B
  123. 0123 609E 5A DECB
  124. 0124 609F 26 F1 BNE WRLOP
  125. 0125
  126. 0126 *stop
  127. 0127 *scl=H,sda=L->H
  128. 0128 60A1 8D 7F BSR SETCKH
  129. 0129 60A3 17 009A LBSR SETDTH
  130. 0130
  131. 0131 *display data
  132. 0132 60A6 BD 619A JSR PCRLF
  133. 0133 60A9 8E 61ED LDX #MDATE
  134. 0134 60AC 17 00D1 LBSR DSPMSG
  135. 0135 60AF 108E 61F7 LDY #MDELM
  136. 0136 60B3 8E 61FE LDX #WRDATA year month day week hour min sec
  137. 0137 60B6 8C 6201 DLOP CMPX #WRDATA+3
  138. 0138 60B9 27 08 BEQ DLOP2
  139. 0139 60BB BD 61A9 JSR OUTHEX
  140. 0140 60BE A6 A4 LDA ,Y
  141. 0141 60C0 BD FBBB JSR OUTCHA
  142. 0142 60C3 31 21 DLOP2 LEAY 1,Y
  143. 0143 60C5 30 01 LEAX 1,X
  144. 0144 60C7 8C 6205 CMPX #WRDATA+7
  145. 0145 60CA 26 EA BNE DLOP
  146. 0146 60CC BD 619A JSR PCRLF
  147. 0147
  148. 0148 *set time to F-BASIC
  149. 0149 *set to work area using F-BASIC routine
  150. 0150 60CF CE 6205 LDU #WKTIME
  151. 0151 60D2 8E 6202 LDX #WRDATA+4
  152. 0152 60D5 C6 03 LDB #3
  153. 0153 60D7 34 04 STLOP PSHS B
  154. 0154 60D9 A6 80 LDA ,X+
  155. 0155 60DB 1F 89 TFR A,B
  156. 0156 60DD 44 LSRA
  157. 0157 60DE 44 LSRA
  158. 0158 60DF 44 LSRA
  159. 0159 60E0 44 LSRA
  160. 0160 60E1 A7 C0 STA ,U+
  161. 0161 60E3 1F 98 TFR B,A
  162. 0162 60E5 84 0F ANDA #$0F
  163. 0163 60E7 A7 C0 STA ,U+
  164. 0164 60E9 35 04 PULS B
  165. 0165 60EB 5A DECB
  166. 0166 60EC 26 E9 BNE STLOP
  167. 0167 60EE 33 5A LEAU -6,U
  168. 0168 60F0 BD E2E9 JSR SETIME
  169. 0169 *set date to F-BASIC
  170. 0170 *set to work area directly
  171. 0171 60F3 CE 02FA LDU #WKDATE
  172. 0172 60F6 8E 61FE LDX #WRDATA
  173. 0173 60F9 C6 03 LDB #3
  174. 0174 60FB 34 04 SDLOP PSHS B
  175. 0175 60FD A6 80 LDA ,X+
  176. 0176 60FF 1F 89 TFR A,B
  177. 0177 6101 44 LSRA
  178. 0178 6102 44 LSRA
  179. 0179 6103 44 LSRA
  180. 0180 6104 44 LSRA
  181. 0181 6105 A7 C0 STA ,U+
  182. 0182 6107 1F 98 TFR B,A
  183. 0183 6109 84 0F ANDA #$0F
  184. 0184 610B A7 C0 STA ,U+
  185. 0185 610D 35 04 PULS B
  186. 0186 610F 5A DECB
  187. 0187 6110 26 E9 BNE SDLOP
  188. 0188 6112 39 RTS
  189. 0189
  190. 0190 ***************************************
  191. 0191 *set clk low(out b0=0)
  192. 0192 6113 SETCKL EQU *
  193. 0193 6113 34 04 PSHS B
  194. 0194 6115 F6 6003 LDB ODAT
  195. 0195 6118 C4 FE ANDB #$FE b0=0
  196. 0196 611A F7 FD9C STB PADAT
  197. 0197 611D F7 6003 STB ODAT
  198. 0198 6120 35 84 PULS B,PC
  199. 0199
  200. 0200 *set clk Hi = bus release (set input mode)
  201. 0201 6122 SETCKH EQU *
  202. 0202 6122 34 04 PSHS B
  203. 0203 6124 F6 6003 LDB ODAT
  204. 0204 6127 CA 01 ORB #$01 b0=1
  205. 0205 6129 F7 FD9C STB PADAT
  206. 0206 612C F7 6003 STB ODAT
  207. 0207 612F 35 84 PULS B,PC
  208. 0208
  209. 0209 *set data low(out b7=0)
  210. 0210 6131 SETDTL EQU *
  211. 0211 6131 34 04 PSHS B
  212. 0212 6133 F6 6003 LDB ODAT
  213. 0213 6136 C4 7F ANDB #$7F b7=0
  214. 0214 6138 F7 FD9C STB PADAT
  215. 0215 613B F7 6003 STB ODAT
  216. 0216 613E 35 84 PULS B,PC
  217. 0217
  218. 0218 *set data Hi = bus release (set input mode)
  219. 0219 6140 SETDTH EQU *
  220. 0220 6140 34 04 PSHS B
  221. 0221 6142 F6 6003 LDB ODAT
  222. 0222 6145 CA 80 ORB #$80 b7=1
  223. 0223 6147 F7 FD9C STB PADAT
  224. 0224 614A F7 6003 STB ODAT
  225. 0225 614D 35 84 PULS B,PC
  226. 0226
  227. 0227 *write data or adr
  228. 0228 *A:data or adr
  229. 0229 614F WRDAT EQU *
  230. 0230 614F C6 08 LDB #8
  231. 0231 6151 8D C0 WLOP BSR SETCKL
  232. 0232 6153 34 04 PSHS B
  233. 0233 6155 48 ASLA b7->C
  234. 0234 6156 24 04 BCC WL1
  235. 0235 6158 8D E6 BSR SETDTH
  236. 0236 615A 20 02 BRA WL2
  237. 0237 615C 8D D3 WL1 BSR SETDTL
  238. 0238 615E 8D C2 WL2 BSR SETCKH
  239. 0239 6160 8D B1 BSR SETCKL
  240. 0240 6162 8D CD BSR SETDTL
  241. 0241 6164 35 04 PULS B
  242. 0242 6166 5A DECB
  243. 0243 6167 26 E8 BNE WLOP
  244. 0244 6169 39 RTS
  245. 0245
  246. 0246 *wait ACK
  247. 0247 *ACK:sda=L
  248. 0248 616A WACK EQU *
  249. 0249 616A 8D B6 BSR SETCKH
  250. 0250 616C F6 FD9C WALOP LDB PADAT
  251. 0251 616F 58 ASLB data->C
  252. 0252 6170 25 FA BCS WALOP
  253. 0253 6172 8D 9F BSR SETCKL
  254. 0254 6174 8D CA BSR SETDTH sda release
  255. 0255 6176 39 RTS
  256. 0256
  257. 0257 *set ACK
  258. 0258 6177 SACK EQU *
  259. 0259 6177 8D B8 BSR SETDTL
  260. 0260 6179 8D A7 BSR SETCKH
  261. 0261 617B 8D 96 BSR SETCKL
  262. 0262 617D 8D C1 BSR SETDTH sda release
  263. 0263 617F 39 RTS
  264. 0264
  265. 0265 *disp message
  266. 0266 6180 DSPMSG EQU *
  267. 0267 6180 A6 80 DSPLOP LDA ,X+
  268. 0268 6182 27 05 BEQ DSPEND
  269. 0269 6184 BD FBBB JSR OUTCHA
  270. 0270 6187 20 F7 BRA DSPLOP
  271. 0271 6189 39 DSPEND RTS
  272. 0272
  273. 0273 *pstring
  274. 0274 618A PSTRNG EQU *
  275. 0275 618A 34 02 PSHS A
  276. 0276 618C A6 80 PSLOP LDA ,X+
  277. 0277 618E 81 04 CMPA #4
  278. 0278 6190 27 05 BEQ PSEND
  279. 0279 6192 BD FBBB JSR OUTCHA
  280. 0280 6195 20 F5 BRA PSLOP
  281. 0281 6197 35 02 PSEND PULS A
  282. 0282 6199 39 RTS
  283. 0283
  284. 0284 *print CR,LF
  285. 0285 619A PCRLF EQU *
  286. 0286 619A 34 02 PSHS A
  287. 0287 619C 86 0D LDA #CR
  288. 0288 619E BD FBBB JSR OUTCHA
  289. 0289 61A1 86 0A LDA #LF
  290. 0290 61A3 BD FBBB JSR OUTCHA
  291. 0291 61A6 35 02 PULS A
  292. 0292 61A8 39 RTS
  293. 0293
  294. 0294 *print hex
  295. 0295 61A9 OUTHEX EQU *
  296. 0296 61A9 34 06 PSHS A,B
  297. 0297 61AB A6 84 LDA ,X
  298. 0298 61AD 1F 89 TFR A,B
  299. 0299 61AF 44 LSRA
  300. 0300 61B0 44 LSRA
  301. 0301 61B1 44 LSRA
  302. 0302 61B2 44 LSRA
  303. 0303 61B3 8D 0E BSR OUTS
  304. 0304 61B5 BD FBBB JSR OUTCHA
  305. 0305 61B8 1F 98 TFR B,A
  306. 0306 61BA 84 0F ANDA #$0F
  307. 0307 61BC 8D 05 BSR OUTS
  308. 0308 61BE BD FBBB JSR OUTCHA
  309. 0309 61C1 35 86 PULS A,B,PC
  310. 0310
  311. 0311 61C3 8B 30 OUTS ADDA #$30
  312. 0312 61C5 81 39 CMPA #$39
  313. 0313 61C7 23 02 BLS OUTSE
  314. 0314 61C9 8B 07 ADDA #$7
  315. 0315 61CB 39 OUTSE RTS
  316. 0316
  317. 0317 *
  318. 0318 61CC 69 MDAT FCC "input date (YY/MM/DD HH:MM:SS): "
  319. 0319 61EC 04 FCB 4
  320. 0320 61ED 54 MDATE FCC /Time : 20/
  321. 0321 61F6 00 FCB 0
  322. 0322 61F7 2F MDELM FCC "// ::."
  323. 0323 ***************************************
  324. 0324 *
  325. 0325 61FE FF WRDATA RMB 7
  326. 0326 6205 FF WKTIME RMB 6
  327. 0327
  328. 0328 620B INBUF EQU *
  329. 0329
  330. 0330 END START
  331.  
  332. 0 error(s), 0 warning(s) is detected.
  333.  
  334. Label address
  335. CLLOP 6014 CR 000D DLOP 60B6 DLOP2 60C3 DSPEND 6189
  336. DSPLOP 6180 DSPMSG 6180 INBUF 620B INCHA FBB8 INDLOP 6019
  337. INEND 6061 INL1 603C INL2 6042 INLOP 6030 LF 000A
  338. MAIN 6005 MDAT 61CC MDATE 61ED MDELM 61F7 ODAT 6003
  339. OUTCHA FBBB OUTHEX 61A9 OUTS 61C3 OUTSE 61CB PACTL FD9D
  340. PADAT FD9C PCRLF 619A PSEND 6197 PSLOP 618C PSTRNG 618A
  341. SACK 6177 SADRR 00D1 SADRW 00D0 SDLOP 60FB SETCKH 6122
  342. SETCKL 6113 SETDTH 6140 SETDTL 6131 SETIME E2E9 START 6000
  343. STLOP 60D7 VN 6002 WACK 616A WALOP 616C WK 6004
  344. WKDATE 02FA WKTIME 6205 WL1 615C WL2 615E WLOP 6151
  345. WRDAT 614F WRDATA 61FE WRLOP 6092
 

F-BASICの起動時にRTC_WRを実行して日付・時刻を設定することで、以降はF-BASICから日付・時刻を参照することができます。

以上でFM-7にRTCを搭載することができましたが、問題はSDカードです。
独自のフォーマットでSDカードにファイルを保存・読み出しをするのであれば、今回作成した基板でも可能かと思いますが、Windows PCと共通のフォーマット(FAT16/32)でと考えると、FM-7と6821の機械語だけでは無理があるようです。
ネット検索をしても、ほとんどがマイコン用に用意されているFATライブラリを使用しているようです。
しかし、困難かもしれませんが、マイコンを使用せずにやれるところまでやってみようと思います。
うまくファイルの読み書きができましたら紹介させていただきます。
(ネット検索をしても、FM系にSDカードを装着した記事が見当たらないようですが、私が見つけられないだけでしょうか? 見つかるのは80系ばかりのような。。。)

紹介しましたRTC用に制作した2本のソフト(RTC_WRとRTC_RD)のソースとバイナリをOneDriveに上げておきます。なお、これらのソースのアセンブリには以前紹介した自作のクロスアセンブラ6809AsmWin.exeを使用しています。

0 件のコメント:

コメントを投稿