マイコン独立大作戦
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
前へ
次へ
ホームページトップへ戻る