2017.7.12
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
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

前へ
次へ
ホームページトップへ戻る