; ; KBC−Z05サンプルプログラム (2) ; RS−485を使ったパーティラインでの通信例 ; ;******* I/Oアドレス CTC0 EQU 10H ;CTCチャネル0 SIOBD EQU 1AH ;SIO チャネルB データ SIOBC EQU 1BH ;SIO チャネルB コマンド ;******* ワークエリアと定数 MY_ID EQU 5 ;ボードに割り当てるID番号 ;同じライン上で重複しないこと ;******* プログラム本体 ORG 0 LD SP,0000H ;スタックポインタ設定 ;******* CTC(ボーレイト・ジェネレータに使用)の初期化 LD A,00010111B ;CTC0をタイマモードに設定 OUT (CTC0),A ;プリスケーラ 1/16 LD A,3 ;タイムコンスタント OUT (CTC0),A ;9600bps(×16モード) ;******* SIO チャネルBの初期化 LD HL,B_CMD ;コマンドのアドレス LD B,B_CLEN ;コマンドの長さ LD C,SIOBC ;出力ポート OTIR ;******* RS−485受信待ち LOOP: IN A,(SIOBC) ;RR0読みだし BIT 0,A ;受信キャラクタ有効か? JR Z,LOOP ;No,受信待ち IN A,(SIOBD) ;受信データを読み出す CP MY_ID ;自分のID番号か? JR NZ,LOOP ;No,受信待ち ;******* 自分のID番号を受け取ったのでアスキー文字にして送信する LD A,5 ;WR5選択 OUT (SIOBC),A LD A,01101010B ;RTSをONにすることで OUT (SIOBC),A ;送信準備ができる LD A,MY_ID+'0' OUT (SIOBD),A ;データ送信 LD A,5 ;WR5選択 OUT (SIOBC),A LD A,01101000B ;RTSをOFFにする OUT (SIOBC),A ;実際にはデータを送り終わるまで ;ONが続く(SIOの機能による) JP LOOP ;送信終了、再び受信待ちへ ;*******SIO チャネルB イニシャライズ・データテーブル B_CMD: DEFB 18H ;リセット DEFB 1,00000000B ;WR1,全割り込み禁止 DEFB 3,11000001B ;WR3,受信イネーブル Data=8bit DEFB 4,01000100B ;WR4, Clock=x16 Stop=1 DEFB 5,01101000B ;WR5,送信イネーブル RTS=OFF B_CLEN EQU $-B_CMD ;SIO チャネルBコマンドデータ数 END