; ; KBC−Z05サンプルプログラム (3) ; RTCの時刻をRS−232で送信する ; (RTCの定周期割込みモード使用) ;******* I/Oアドレス RTC EQU 00H ;RTC 先頭番地 RTC_D EQU RTC+0DH ;RTC コントロールレジスタD RTC_E EQU RTC+0EH ;RTC コントロールレジスタE RTC_F EQU RTC+0FH ;RTC コントロールレジスタF CTC0 EQU 10H ;CTCチャネル0 SIOAD EQU 18H ;SIO チャネルA データ SIOAC EQU 19H ;SIO チャネルA コマンド PIOAD EQU 1CH ;PIO Aポート データ PIOAC EQU 1DH ;PIO Aポート コマンド ;******* プログラム本体 ORG 0 LD SP,0000H ;スタックポインタ設定 LD A,INTTBL/256 ;CTCの割込みテーブル上位を LD I,A ;Iレジスタに入れる IM 2 ;割込みモード2に設定 ;******* CTC(ボーレイト・ジェネレータに使用)の初期化 LD A,00010111B ;CTC0をタイマモードに設定 OUT (CTC0),A ;プリスケーラ 1/16 LD A,3 ;タイムコンスタント OUT (CTC0),A ;9600bps(×16モード) ;******* SIO チャネルAの初期化 LD HL,S_CMD ;コマンドのアドレス LD B,S_CLEN ;コマンドの長さ LD C,SIOAC ;出力ポート OTIR ;******* PIO Aポートの初期化 LD HL,P_CMD ;コマンドのアドレス LD B,P_CLEN ;コマンドの長さ LD C,PIOAC ;出力ポート OTIR ;******* RTCの初期化 LD A,0111B ;TEST=0, 24/12=24, OUT (RTC_F),A ;STOP=1, RESET=1 LD A,0110B ;t0,t1:1秒, INT/STD=INT, OUT (RTC_E),A ;MASK=0 CALL R_WAIT ;BUSY処理 ; ******* 時刻の設定 LD C,RTC+0CH ;Cを週桁に設定 LD HL,RTCDATA LD B,13 ;データの数 RTC_L1: OUTI ;RTCデータの設定 JR Z,RTC_L2 DEC C JR RTC_L1 ;週桁から1秒桁まで RTC_L2: EI LD A,10000111B ;PIO割込み許可 OUT (PIOAC),A LD A,0000B ;HOLD解除 OUT (RTC_D),A LD A,0100B ;TEST=0, 24/12=24, STOP=0, OUT (RTC_F),A ;RESET=0 計時を開始する LOOP: JR LOOP ;RTC→PIOの ;1秒間隔の割込み待ち ;******* メインプログラムはここで終わり ;******* PIO割込み処理ルーチン PIO_INT:PUSH AF PUSH BC LD C,RTC+0CH ;Cを週桁に設定 CALL R_WAIT ;BUSY処理 READ_L1:IN A,(C) AND 00001111B ;上位4ビットをマスク ADD A,'0' ;アスキー数字に変換 CALL SIOAOUT ;RS−232に出力する DEC C ;次の桁 LD A,C CP RTC-1 ;1秒桁を越えたか JR NZ,READ_L1 ;まだなら続ける LD A,0000B ;HOLD解除で計時再開 OUT (RTC_D),A ;IRQ FLAG=0でSTD.Pを ;開放にする LD A,0DH ;CR送出 CALL SIOAOUT LD A,0AH ;LF送出 CALL SIOAOUT POP BC POP AF EI RETI ;******* SIO データ送出ルーチン SIOAOUT:PUSH AF SIOA_L1:IN A,(SIOAC) ;RR0リード BIT 2,A ;送信バッファー空きか? JR Z,SIOA_L1 POP AF ;A=送出するデータ OUT (SIOAD),A ;レジスタへ書き込む RET ;******* RTC BUSYの処理ルーチン R_WAIT: PUSH AF R_L1: LD A,0001B ;30ADJ=0, IRQFLAG=0, OUT (RTC_D),A ;HOLDする IN A,(RTC_D) ;BUSYビットを読む BIT 1,A ;BUSYビットは0か? JR Z,WAITEND ;Yes,リターン LD A,0000B ;HOLD一時解除する OUT (RTC_D),A CALL WAIT190 ;190μS待つ JR R_L1 WAITEND:POP AF RET ;******* 約190μ秒 ウエイトのルーチン WAIT190:PUSH AF LD A,86 WAIT_L1:DEC A JR NZ,WAIT_L1 POP AF RET ;******* PIO 割込み処理ルーチンテーブル ORG ($ AND 0FFF0H)+16 INTTBL:DW PIO_INT ;******* SIO チャネルA イニシャライズ・データテーブル S_CMD: DEFB 18H ;リセット DEFB 1,00000000B ;WR1,全割り込み禁止 DEFB 3,11000001B ;WR3,受信イネーブル Data=8bit DEFB 4,01000100B ;WR4, Clock=x16 Stop=1 DEFB 5,01101010B ;WR5,送信イネーブル Data=8bit S_CLEN EQU $-S_CMD ;SIO チャネルAコマンドデータ数 ;******* PIO Aポート イニシャライズ・データテーブル P_CMD: DEFB 11001111B ;モード制御語(モード3) DEFB 00000001B ;データ入出力制御語(1=入力) DEFB 00010111B ;割り込み制御語 DEFB 11111110B ;割込みマスク語 PA0のみ有効 DEFB INTTBL AND 0FFH ;割込みテーブル P_CLEN EQU $-P_CMD ;PIO コマンド数 ;******* RTC初期データ(1993年1月1日金曜日 12時34分56秒) RTCDATA:DEFB 5,9,3,0,1,0,1,1,2,3,4,5,6 END