FM-7用のRTC&SDカード基板を製作してみました
【修正】OneDriveのリンク先が間違っていましたので、正しいリンク先に変更しました。
以前、6821PIAを用いてI2CでRTCを、SPIでSDカードを読み書きする試みを紹介しました。
「アセンブラでのPIAとRTCの間のI2C通信に成功しました(2018年10月27日)」
(https://flexonsbd.blogspot.com/2018/10/piartci2c.html)
(https://flexonsbd.blogspot.com/2018/10/piartci2c.html)
「SDカードを6809のアセンブラで読み書きしてみる(2022年6月12日)」
(https://flexonsbd.blogspot.com/2022/06/sd6809.html)
(https://flexonsbd.blogspot.com/2022/06/sd6809.html)
最終の目的は、FM-7に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のリストを示します。
- 0001 *
- 0002 * RTC_WR.CMD for F-BASIC V3.0
- 0003 *
- 0004 * WRITE DATE to RTC3231 by I2C on F-BASIC
- 0005 *
- 0006 * 6821(PIA) Port A <--> RTC3231
- 0007 *
- 0008 * Applied to F-BASIC '2023.03.09
- 0009 * Original version '2018.11.03
- 0010 * Copyright by Y.Yamamoto
- 0011 *
- 0012 FBB8 INCHA EQU $FBB8
- 0013 FBBB OUTCHA EQU $FBBB
- 0014 E2E9 SETIME EQU $E2E9 set time data routine
- 0015 02FA WKDATE EQU $02FA work area for date
- 0016
- 0017 FD9C PADAT EQU $FD9C
- 0018 FD9D PACTL EQU PADAT+1
- 0019
- 0020 000D CR EQU $0D
- 0021 000A LF EQU $0A
- 0022
- 0023 00D0 SADRW EQU $D0 (01101000+0)
- 0024 00D1 SADRR EQU $D1 (01101000+1)
- 0025
- 0026 6000 ORG $6000
- 0027
- 0028 6000 20 03 START BRA MAIN
- 0029 6002 01 VN FCB 1
- 0030 6003 FF ODAT FCB $FF
- 0031 6004 00 WK FCB 00
- 0032
- 0033 6005 MAIN EQU *
- 0034 6005 BD 619A JSR PCRLF
- 0035 *get date data
- 0036 6008 8E 61CC LDX #MDAT
- 0037 600B BD 618A JSR PSTRNG
- 0038
- 0039 600E 8E 621F LDX #INBUF+20
- 0040 6011 4F CLRA
- 0041 6012 C6 14 LDB #20
- 0042 6014 A7 82 CLLOP STA ,-X
- 0043 6016 5A DECB
- 0044 6017 26 FB BNE CLLOP
- 0045 6019 BD FBB8 INDLOP JSR INCHA
- 0046 601C BD FBBB JSR OUTCHA
- 0047 601F A7 80 STA ,X+
- 0048 6021 81 0D CMPA #CR
- 0049 6023 26 F4 BNE INDLOP
- 0050 6025 6F 1F CLR -1,X
- 0051 6027 8E 620B LDX #INBUF
- 0052
- 0053 602A C6 07 LDB #7
- 0054 602C 108E 61FE LDY #WRDATA
- 0055 6030 34 04 INLOP PSHS B
- 0056 6032 EC 81 LDD ,X++
- 0057 *if B is sep. not 2dec
- 0058 6034 C1 30 CMPB #'0
- 0059 6036 25 04 BLO INL1
- 0060 6038 C1 39 CMPB #'9
- 0061 603A 23 06 BLS INL2
- 0062 603C 1F 89 INL1 TFR A,B
- 0063 603E 86 30 LDA #'0
- 0064 6040 30 1F LEAX -1,X
- 0065 6042 48 INL2 ASLA
- 0066 6043 48 ASLA
- 0067 6044 48 ASLA
- 0068 6045 48 ASLA
- 0069 6046 C4 0F ANDB #$0F
- 0070 6048 F7 6004 STB WK
- 0071 604B BB 6004 ADDA WK
- 0072 604E A7 A0 STA ,Y+
- 0073 6050 30 01 LEAX 1,X skip separator
- 0074 6052 35 04 PULS B
- 0075 6054 5A DECB
- 0076 6055 27 0A BEQ INEND
- 0077 6057 C1 04 CMPB #4
- 0078 6059 26 D5 BNE INLOP
- 0079 605B 86 01 LDA #$01 add week data
- 0080 605D A7 A0 STA ,Y+
- 0081 605F 20 CF BRA INLOP
- 0082 6061 INEND EQU *
- 0083
- 0084 *reset pia
- 0085 *port A,B:output, data $ff:out
- 0086 6061 4F CLRA
- 0087 6062 B7 FD9D STA PACTL select ddra
- 0088 6065 86 FF LDA #$FF
- 0089 6067 B7 FD9C STA PADAT set output mode
- 0090 606A 86 36 LDA #$36
- 0091 606C B7 FD9D STA PACTL select peripheral
- 0092 *out High = bus release (set input mode)
- 0093 606F 86 FF LDA #$FF
- 0094 6071 B7 6003 STA ODAT save out data
- 0095 6074 B7 FD9C STA PADAT
- 0096
- 0097 *start cond. (scl=H,sda=H->L)
- 0098 6077 17 00B7 LBSR SETDTL
- 0099 607A 17 0096 LBSR SETCKL
- 0100
- 0101 *send slave adr+W ($D0)
- 0102 607D 86 D0 LDA #SADRW
- 0103 607F 17 00CD LBSR WRDAT
- 0104
- 0105 *wait ACK
- 0106 6082 17 00E5 LBSR WACK
- 0107
- 0108 *send reg top adr ($00)
- 0109 6085 86 00 LDA #$00 reg adr:00-06
- 0110 6087 17 00C5 LBSR WRDAT
- 0111
- 0112 *wait ACK
- 0113 608A 17 00DD LBSR WACK
- 0114
- 0115 *write data
- 0116 608D 8E 6205 LDX #WRDATA+7
- 0117 6090 C6 07 LDB #7
- 0118 6092 34 04 WRLOP PSHS B
- 0119 6094 A6 82 LDA ,-X
- 0120 6096 17 00B6 LBSR WRDAT
- 0121 6099 17 00CE LBSR WACK
- 0122 609C 35 04 PULS B
- 0123 609E 5A DECB
- 0124 609F 26 F1 BNE WRLOP
- 0125
- 0126 *stop
- 0127 *scl=H,sda=L->H
- 0128 60A1 8D 7F BSR SETCKH
- 0129 60A3 17 009A LBSR SETDTH
- 0130
- 0131 *display data
- 0132 60A6 BD 619A JSR PCRLF
- 0133 60A9 8E 61ED LDX #MDATE
- 0134 60AC 17 00D1 LBSR DSPMSG
- 0135 60AF 108E 61F7 LDY #MDELM
- 0136 60B3 8E 61FE LDX #WRDATA year month day week hour min sec
- 0137 60B6 8C 6201 DLOP CMPX #WRDATA+3
- 0138 60B9 27 08 BEQ DLOP2
- 0139 60BB BD 61A9 JSR OUTHEX
- 0140 60BE A6 A4 LDA ,Y
- 0141 60C0 BD FBBB JSR OUTCHA
- 0142 60C3 31 21 DLOP2 LEAY 1,Y
- 0143 60C5 30 01 LEAX 1,X
- 0144 60C7 8C 6205 CMPX #WRDATA+7
- 0145 60CA 26 EA BNE DLOP
- 0146 60CC BD 619A JSR PCRLF
- 0147
- 0148 *set time to F-BASIC
- 0149 *set to work area using F-BASIC routine
- 0150 60CF CE 6205 LDU #WKTIME
- 0151 60D2 8E 6202 LDX #WRDATA+4
- 0152 60D5 C6 03 LDB #3
- 0153 60D7 34 04 STLOP PSHS B
- 0154 60D9 A6 80 LDA ,X+
- 0155 60DB 1F 89 TFR A,B
- 0156 60DD 44 LSRA
- 0157 60DE 44 LSRA
- 0158 60DF 44 LSRA
- 0159 60E0 44 LSRA
- 0160 60E1 A7 C0 STA ,U+
- 0161 60E3 1F 98 TFR B,A
- 0162 60E5 84 0F ANDA #$0F
- 0163 60E7 A7 C0 STA ,U+
- 0164 60E9 35 04 PULS B
- 0165 60EB 5A DECB
- 0166 60EC 26 E9 BNE STLOP
- 0167 60EE 33 5A LEAU -6,U
- 0168 60F0 BD E2E9 JSR SETIME
- 0169 *set date to F-BASIC
- 0170 *set to work area directly
- 0171 60F3 CE 02FA LDU #WKDATE
- 0172 60F6 8E 61FE LDX #WRDATA
- 0173 60F9 C6 03 LDB #3
- 0174 60FB 34 04 SDLOP PSHS B
- 0175 60FD A6 80 LDA ,X+
- 0176 60FF 1F 89 TFR A,B
- 0177 6101 44 LSRA
- 0178 6102 44 LSRA
- 0179 6103 44 LSRA
- 0180 6104 44 LSRA
- 0181 6105 A7 C0 STA ,U+
- 0182 6107 1F 98 TFR B,A
- 0183 6109 84 0F ANDA #$0F
- 0184 610B A7 C0 STA ,U+
- 0185 610D 35 04 PULS B
- 0186 610F 5A DECB
- 0187 6110 26 E9 BNE SDLOP
- 0188 6112 39 RTS
- 0189
- 0190 ***************************************
- 0191 *set clk low(out b0=0)
- 0192 6113 SETCKL EQU *
- 0193 6113 34 04 PSHS B
- 0194 6115 F6 6003 LDB ODAT
- 0195 6118 C4 FE ANDB #$FE b0=0
- 0196 611A F7 FD9C STB PADAT
- 0197 611D F7 6003 STB ODAT
- 0198 6120 35 84 PULS B,PC
- 0199
- 0200 *set clk Hi = bus release (set input mode)
- 0201 6122 SETCKH EQU *
- 0202 6122 34 04 PSHS B
- 0203 6124 F6 6003 LDB ODAT
- 0204 6127 CA 01 ORB #$01 b0=1
- 0205 6129 F7 FD9C STB PADAT
- 0206 612C F7 6003 STB ODAT
- 0207 612F 35 84 PULS B,PC
- 0208
- 0209 *set data low(out b7=0)
- 0210 6131 SETDTL EQU *
- 0211 6131 34 04 PSHS B
- 0212 6133 F6 6003 LDB ODAT
- 0213 6136 C4 7F ANDB #$7F b7=0
- 0214 6138 F7 FD9C STB PADAT
- 0215 613B F7 6003 STB ODAT
- 0216 613E 35 84 PULS B,PC
- 0217
- 0218 *set data Hi = bus release (set input mode)
- 0219 6140 SETDTH EQU *
- 0220 6140 34 04 PSHS B
- 0221 6142 F6 6003 LDB ODAT
- 0222 6145 CA 80 ORB #$80 b7=1
- 0223 6147 F7 FD9C STB PADAT
- 0224 614A F7 6003 STB ODAT
- 0225 614D 35 84 PULS B,PC
- 0226
- 0227 *write data or adr
- 0228 *A:data or adr
- 0229 614F WRDAT EQU *
- 0230 614F C6 08 LDB #8
- 0231 6151 8D C0 WLOP BSR SETCKL
- 0232 6153 34 04 PSHS B
- 0233 6155 48 ASLA b7->C
- 0234 6156 24 04 BCC WL1
- 0235 6158 8D E6 BSR SETDTH
- 0236 615A 20 02 BRA WL2
- 0237 615C 8D D3 WL1 BSR SETDTL
- 0238 615E 8D C2 WL2 BSR SETCKH
- 0239 6160 8D B1 BSR SETCKL
- 0240 6162 8D CD BSR SETDTL
- 0241 6164 35 04 PULS B
- 0242 6166 5A DECB
- 0243 6167 26 E8 BNE WLOP
- 0244 6169 39 RTS
- 0245
- 0246 *wait ACK
- 0247 *ACK:sda=L
- 0248 616A WACK EQU *
- 0249 616A 8D B6 BSR SETCKH
- 0250 616C F6 FD9C WALOP LDB PADAT
- 0251 616F 58 ASLB data->C
- 0252 6170 25 FA BCS WALOP
- 0253 6172 8D 9F BSR SETCKL
- 0254 6174 8D CA BSR SETDTH sda release
- 0255 6176 39 RTS
- 0256
- 0257 *set ACK
- 0258 6177 SACK EQU *
- 0259 6177 8D B8 BSR SETDTL
- 0260 6179 8D A7 BSR SETCKH
- 0261 617B 8D 96 BSR SETCKL
- 0262 617D 8D C1 BSR SETDTH sda release
- 0263 617F 39 RTS
- 0264
- 0265 *disp message
- 0266 6180 DSPMSG EQU *
- 0267 6180 A6 80 DSPLOP LDA ,X+
- 0268 6182 27 05 BEQ DSPEND
- 0269 6184 BD FBBB JSR OUTCHA
- 0270 6187 20 F7 BRA DSPLOP
- 0271 6189 39 DSPEND RTS
- 0272
- 0273 *pstring
- 0274 618A PSTRNG EQU *
- 0275 618A 34 02 PSHS A
- 0276 618C A6 80 PSLOP LDA ,X+
- 0277 618E 81 04 CMPA #4
- 0278 6190 27 05 BEQ PSEND
- 0279 6192 BD FBBB JSR OUTCHA
- 0280 6195 20 F5 BRA PSLOP
- 0281 6197 35 02 PSEND PULS A
- 0282 6199 39 RTS
- 0283
- 0284 *print CR,LF
- 0285 619A PCRLF EQU *
- 0286 619A 34 02 PSHS A
- 0287 619C 86 0D LDA #CR
- 0288 619E BD FBBB JSR OUTCHA
- 0289 61A1 86 0A LDA #LF
- 0290 61A3 BD FBBB JSR OUTCHA
- 0291 61A6 35 02 PULS A
- 0292 61A8 39 RTS
- 0293
- 0294 *print hex
- 0295 61A9 OUTHEX EQU *
- 0296 61A9 34 06 PSHS A,B
- 0297 61AB A6 84 LDA ,X
- 0298 61AD 1F 89 TFR A,B
- 0299 61AF 44 LSRA
- 0300 61B0 44 LSRA
- 0301 61B1 44 LSRA
- 0302 61B2 44 LSRA
- 0303 61B3 8D 0E BSR OUTS
- 0304 61B5 BD FBBB JSR OUTCHA
- 0305 61B8 1F 98 TFR B,A
- 0306 61BA 84 0F ANDA #$0F
- 0307 61BC 8D 05 BSR OUTS
- 0308 61BE BD FBBB JSR OUTCHA
- 0309 61C1 35 86 PULS A,B,PC
- 0310
- 0311 61C3 8B 30 OUTS ADDA #$30
- 0312 61C5 81 39 CMPA #$39
- 0313 61C7 23 02 BLS OUTSE
- 0314 61C9 8B 07 ADDA #$7
- 0315 61CB 39 OUTSE RTS
- 0316
- 0317 *
- 0318 61CC 69 MDAT FCC "input date (YY/MM/DD HH:MM:SS): "
- 0319 61EC 04 FCB 4
- 0320 61ED 54 MDATE FCC /Time : 20/
- 0321 61F6 00 FCB 0
- 0322 61F7 2F MDELM FCC "// ::."
- 0323 ***************************************
- 0324 *
- 0325 61FE FF WRDATA RMB 7
- 0326 6205 FF WKTIME RMB 6
- 0327
- 0328 620B INBUF EQU *
- 0329
- 0330 END START
- 0 error(s), 0 warning(s) is detected.
- Label address
- CLLOP 6014 CR 000D DLOP 60B6 DLOP2 60C3 DSPEND 6189
- DSPLOP 6180 DSPMSG 6180 INBUF 620B INCHA FBB8 INDLOP 6019
- INEND 6061 INL1 603C INL2 6042 INLOP 6030 LF 000A
- MAIN 6005 MDAT 61CC MDATE 61ED MDELM 61F7 ODAT 6003
- OUTCHA FBBB OUTHEX 61A9 OUTS 61C3 OUTSE 61CB PACTL FD9D
- PADAT FD9C PCRLF 619A PSEND 6197 PSLOP 618C PSTRNG 618A
- SACK 6177 SADRR 00D1 SADRW 00D0 SDLOP 60FB SETCKH 6122
- SETCKL 6113 SETDTH 6140 SETDTL 6131 SETIME E2E9 START 6000
- STLOP 60D7 VN 6002 WACK 616A WALOP 616C WK 6004
- WKDATE 02FA WKTIME 6205 WL1 615C WL2 615E WLOP 6151
- 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 件のコメント:
コメントを投稿