マイコン独立大作戦
ROM/RAM/RTCボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
作戦その3は、SDカードインターフェースです。
作戦その4は、ROM/RAM/RTCボードです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第9回]
●DS1307テストプログラム
ND80Z3.5(ND80ZV)用のプログラムです。
ND8080、MYCPU80用も基本的には同じですが、Z80専用の命令を使っているところや、動作クロックの相違を考慮したプログラムになります。
DS1307と通信を行なう部分はマシン語のサブルーチンです。
日時データの書き込みや読み出しにはBASICのほうが都合がよいので、ここで作成したマシン語サブルーチンをZB3BASICがコールするようにしました。
最終的には今まで実行できなかったZB3BASICのTIME$、DATE$に組み込むつもりです。
2017/6/25 15:51 ds1307t1.txt
END=8111
;rtc DS1307test for ND80Z3
;17/6/24 6/25
;
ORG $8004
;
PA=$F440;AL=CH(bit7,1=stop)+SEC,00-59
;AH=MIN,00-59
PB=$F442;BL=HOUR,00-23
;BH=DAY(SUN=1),00-07
PC=$F444;CL=DATE,01-31
;CH=MONTH,01-12
PD=$F446;DL=YEAR,00-99
;DH=cntrl,=10(1sec pulse out)
PE=$F448;=1:if error,=0 no error
;
8004 C30A80 JP WR
8007 C34980 JP RD
;
;time data write
800A 3EF0 WR:LD A,F0;scl=H,sdt=H
800C D390 OUT (90),A
800E CD1081 CALL T5US
8011 3EE0 LD A,E0;scl=H,sdt=L;start
8013 D390 OUT (90),A
8015 CD1081 CALL T5US
8018 E6D0 AND D0;scl=L
801A D390 OUT (90),A
801C CD1081 CALL T5US
801F 16D0 LD D,D0;DS1357ID+WR
8021 CD9C80 CALL SOUT8
8024 1600 LD D,00;register address
8026 CD9C80 CALL SOUT8
8029 2140F4 LD HL,PA
802C 0608 LD B,08
802E 56 WR1:LD D,(HL)
802F CD9C80 CALL SOUT8
8032 23 INC HL
8033 05 DEC B
8034 C22E80 JP NZ,WR1
;stop
8037 3EE0 LD A,E0;scl=H,sdt=L
8039 D390 OUT (90),A
803B CD1081 CALL T5US
803E 3EF0 LD A,F0;sdt=H
8040 D390 OUT (90),A
8042 210000 LD HL,$0000
8045 2248F4 LD (PE),HL
8048 C9 RET
;
8049 3EF0 RD:LD A,F0;scl=H,sdt=H
804B D390 OUT (90),A
804D CD1081 CALL T5US
8050 3EE0 LD A,E0;scl=H,sdt=L;start
8052 D390 OUT (90),A
8054 CD1081 CALL T5US
8057 E6D0 AND D0;scl=L
8059 D390 OUT (90),A
805B CD1081 CALL T5US
805E 16D0 LD D,D0;DS1357ID+WR
8060 CD9C80 CALL SOUT8
8063 1600 LD D,00;register address
8065 CD9C80 CALL SOUT8
8068 3EF0 LD A,F0;scl=H,sdt=H
806A D390 OUT (90),A
806C CD1081 CALL T5US
806F 3EE0 LD A,E0;scl=H,sdt=L;restart
8071 D390 OUT (90),A
8073 CD1081 CALL T5US
8076 E6D0 AND D0;scl=L
8078 D390 OUT (90),A
807A CD1081 CALL T5US
807D 16D1 LD D,D1;DS1357ID+RD
807F CD9C80 CALL SOUT8
8082 2140F4 LD HL,PA
8085 0608 LD B,08
8087 CDE180 RD1:CALL SIN8
808A 72 LD (HL),D
808B 23 INC HL
808C 05 DEC B
808D C28780 JP NZ,RD1
;stop
8090 3EE0 LD A,E0;scl=H,sdt=L
8092 D390 OUT (90),A
8094 CD1081 CALL T5US
8097 3EF0 LD A,F0;sdt=H
8099 D390 OUT (90),A
809B C9 RET
;
; 8bit DATA OUT
; D outdata
809C C5 SOUT8:PUSH BC
809D 0608 LD B,08
809F CB02 SOUT81:RLC D
80A1 DAA980 JP C,SOUTH
80A4 E6E0 AND E0
80A6 C3AB80 JP SOUT82
80A9 F610 SOUTH:OR 10
80AB D390 SOUT82:OUT (90),A
80AD F620 OR 20;scl=H
80AF D390 OUT (90),A
80B1 CD1081 CALL T5US
80B4 E6D0 AND D0;scl=L
80B6 D390 OUT (90),A
80B8 CD1081 CALL T5US
80BB 10E2 DJNZ SOUT81
80BD F610 OR 10;sdt=H
80BF D390 OUT (90),A
80C1 F620 OR 20;scl=H
80C3 D390 OUT (90),A
80C5 DB90 IN A,(90);ACK
80C7 E601 AND 01
80C9 C2D880 JP NZ,ERR
80CC CD1081 CALL T5US
80CF E6D0 AND D0;scl=L
80D1 D390 OUT (90),A
80D3 CD1081 CALL T5US
80D6 C1 POP BC
80D7 C9 RET
80D8 C1 ERR:POP BC
80D9 E1 POP HL;dummy
80DA 210100 LD HL,$0001
80DD 2248F4 LD (PE),HL
80E0 C9 RET
;
; 8bit DATA IN
; D in data
80E1 C5 SIN8:PUSH BC
80E2 0608 LD B,08
80E4 CD1081 SIN81:CALL T5US
80E7 DB90 IN A,(90)
80E9 0F RRCA
80EA CB12 RL D
80EC 3EF0 LD A,F0;scl=H,sdt=H
80EE D390 OUT (90),A
80F0 CD1081 CALL T5US
80F3 E6D0 AND D0;scl=L
80F5 D390 OUT (90),A
80F7 10EB DJNZ SIN81
80F9 3EC0 LD A,C0;scl=L,sdt=L ACK
80FB D390 OUT (90),A
80FD CD1081 CALL T5US
8100 F620 OR 20;scl=H
8102 D390 OUT (90),A
8104 CD1081 CALL T5US
8107 E6D0 AND D0;scl=L
8109 D390 OUT (90),A
810B CD1081 CALL T5US
810E C1 POP BC
810F C9 RET
;
;5us timer clock 6MHz
8110 00 T5US:NOP
8111 C9 RET
;
;9
ERR =80D8 PA =F440 PB =F442
PC =F444 PD =F446 PE =F448
RD =8049 RD1 =8087 SIN8 =80E1
SIN81 =80E4 SOUT8 =809C SOUT81 =809F
SOUT82 =80AB SOUTH =80A9 T5US =8110
WR =800A WR1 =802E
|
プログラムはDS1307に日時データを書き込むWRサブルーチンと日時データを読み出すRDサブルーチンからできています。
WRサブルーチンはさらに8ビットの値をシリアルに変換して送出するサブルーチンをコールします。
RDサブルーチンはそれとは逆にシリアル入力したデータを8ビットパラレルに変換するサブルーチンをコールします。
I/Oアドレス90のビット5がSCL出力で、ビット4がSDA出力です。
SDA入力はI/Oアドレス90のビット0です。
そのようにすることでシリアル→パラレル変換プログラムが簡単になります。
上で書きましたように最終的にはDATE$、TIME$に組み込むつもりですが、まずはテストとしてBASIC変数のA%〜D%を日時データの格納用に使います。
ZB3BASICの整数変数A%〜Z%はRAMの固定領域に割り当ててありますから、マシン語サブルーチンとBASICメインプログラムの間でデータの受け渡しが簡単に行なえます。
上のプログラムにもあるように
A%はF440、F441
B%はF442、F443
C%はF444、F445
D%はF446、F447
に常に割り当てられています。
下はBASICのメインプログラムです。
10 'ds1307test
20 '17/6/25
30 A%=$1234
40 B%=$0109
50 C%=$0625
60 D%=$1017
70 E%=0
80 USR($8004)
90 PRINT E%
100 IF E%=1 THEN STOP
110 USR($8007)
120 PRINT HEX$(D%)
130 PRINT HEX$(C%)
140 PRINT HEX$(B%)
150 PRINT HEX$(A%)
160 PRINT "end"
|
DS1307に送るデータはBCDです。
設定値は
D% 下位8ビットが西暦年の下2桁(上位8ビットは制御用)
C% 月日
B% 上位8ビットは曜日(01〜07)、下位8ビットは時
A% 上位8ビットは分、下位8ビットは秒
です。
テストですので、ここでは日時データとして固定値を設定しています。
BASICプログラムによってDS1307に設定する日時は
2017年6月25日9時12分34秒です。
このプログラムを実行した結果の写真が[第2回]にあります。
ROM/RAM/RTCボードの製作[第9回]
2017.7.12upload
前へ
次へ
ホームページトップへ戻る