シリアルインターフェイス関係サンプル

(Mini-c 関数の作成)

このファイルには、シリアルポート関係の関数が集められています。 SIO_AのクロックはCTC_2に接続、SIO_Bのクロックは CTC_1に接続する必要が有ります。これを、変更したい場合は、 下記のOUT命令のポートを変更すればできます。CTCについては、 AKI80でクロック周波数が、7.37MHZ(水晶は倍の周波数)に 合わせてあります。
CTC_1_INIT:
	PUSH	AF
	LD	A,00010111B
	OUT	(IO_CTC_C1),A
	POP	AF
	OUT	(IO_CTC_C1),A
	RET

CTC_2_INIT:
	PUSH	AF
	LD	A,00010111B
	OUT	(IO_CTC_C2),A
	POP	AF
	OUT	(IO_CTC_C2),A
	RET

 続いて、各関数の説明を書いておきます。

"void sio_a_init(SP_9600,DT_8,ST_1,PR_N)"

この関数は、シリアルポート初期化を行います。 引数は、通信速度,データビット,ストップビット,パリティビットとなっています。

第一引数(通信速度)

記入例通信速度
SP_9600 9600BPS
SP_4800 4800BPS
SP_2400 2400BPS
SP_1200 1200BPS
SP_300 300BPS

第二引数(データビット)

記入例データビット
DT_8 8bit
DT_7 7bit

第三引数(ストップビット)

記入例ストップビット
ST_1 1bit
ST_15 1.5bit
ST_2 2bit

第四引数(パリテイビット)

記入例パリテイビット
PR_N 無し
PR_O 奇数
PR_E 偶数



"void sio_a_reset( )"

シリアルポートのリセットを行います。


"int sio_a_rx_check( )"

受信データの有無をチェックします、戻り値は "0" 受信データ無し  "1" 受信データ有り。


"int sio_a_getchar( )"

受信データの読み込みを行います、戻り値は受信データです。


"int sio_a_putchar(char data)"

データを送信します、実際には送信バッファーにロードするだけです。 戻り値は "0" 送信不可,"1" 送信済みです、"0"の場合送信バッファーに ロードできていないため"1"が戻るまで繰り返す必要が有ります。 しかし、回数制限を行なうか、CTCで割り込みをかけて時間制限をし、 エラーとしなければケーブルがはずれていた場合等に、 永遠に繰り返す事となります。


"int sio_a_geterr( )"

エラーフラグを取得します。戻り値は次のようになります。

ビットhighの意味
bit"0"  パリテーerr
bit"1"  オーバーランerr
bit"2"  フレーミングerr


"void sio_a_erreset( )"

エラーフラグのリセットを行います。

目次に戻る


/*======================================================================*/
/*									*/
/*	"AKI80"  7.37MHZ SIOドライバープログラム		*/
/*	(ポートアドレスは、Z84C015 にあわせてあります。)		*/
/*		( sio_a == ctc_2  sio_b == ctc_1 )			*/
/*									*/
/*		sio_drv.h	Vr1.00		96/07/10		*/
/*									*/
/*	void	sio_a_init(int sped,int datbit,int stpbit,int parit)	*/
/*	void	sio_b_init(int sped,int datbit,int stpbit,int parit)	*/
/*		("sio_a_init(SP_9600,DT_8,ST_1,PR_N)")		*/
/*	void	sio_a_reset( )						*/
/*	void	sio_b_reset( )						*/
/*	int	sio_a_rx_check( )					*/
/*	int	sio_b_rx_check( )					*/
/*		("0" 受信データ無し	"1" 受信データ有り)		*/
/*	int	sio_a_getchar( )					*/
/*	int	sio_b_getchar( )					*/
/*	int	sio_a_putchar(char data)				*/
/*	int	sio_b_putchar(char data)				*/
/*		("0" 送信不可		"1" 送信済み)			*/
/*	int	sio_a_geterr( )						*/
/*	int	sio_b_geterr( )						*/
/*	( bit"0"=パリテーerr  bit"1"=オーバーランerr  bit"2"=フレーミングerr )	*/
/*	void	sio_a_erreset( )					*/
/*	void	sio_b_erreset( )					*/
/*									*/
/*======================================================================*/

#define SP_300		96	// SIO  300Bps
#define SP_1200		24	// SIO 1200Bps
#define SP_2400		12	// SIO 2400Bps
#define SP_4800		 6	// SIO 4800Bps
#define SP_9600		 3	// SIO 9600Bps

#define DT_7		 0x81	// SIO Data 7bit
#define DT_8		 0xc1	// SIO Data 8bit

#define ST_1		 0x74	// SIO Stop Bit 1bit
#define ST_15		 0x78	// SIO Stop Bit 1.5bit
#define ST_2		 0x7c	// SIO Stop Bit 2bit

#define PR_N		 0	// SIO Non Parity
#define PR_O		 0x01	// SIO Parity odd
#define PR_E		 0x03	// SIO Parity even

#asm

CTC_1_INIT:
	PUSH	AF
	LD	A,00010111B
	OUT	(IO_CTC_C1),A
	POP	AF
	OUT	(IO_CTC_C1),A
	RET

CTC_2_INIT:
	PUSH	AF
	LD	A,00010111B
	OUT	(IO_CTC_C2),A
	POP	AF
	OUT	(IO_CTC_C2),A
	RET

#endasm

void	sio_a_init(int sped,int datbit,int stpbit,int parit)
{
#asm

	ld	hl,8
	add	hl,sp
	ld	a,(hl)
	call	ctc_2_init
	ld	a,00011000b
	out	(io_sio_ac),a		;SIOリセット
	ld	a,4
	out	(io_sio_ac),a
	ld	hl,4
	add	hl,sp
	ld	a,(hl)
	ld	hl,2
	add	hl,sp
	ld	h,(hl)
	or	h
	out	(io_sio_ac),a		;WR4設定
	ld	a,1
	out	(io_sio_ac),a
	ld	a,00h
	out	(io_sio_ac),a		;WR1設定
	ld	a,3
	out	(io_sio_ac),a
	ld	hl,6
	add	hl,sp
	ld	a,(hl)
	ld	h,a
	out	(io_sio_ac),a		;WR3設定
	ld	a,5
	out	(io_sio_ac),a
	ld	a,h
	srl	a
	or	10001010b		;RTS,DTR ON
	out	(io_sio_ac),a		;WR5設定

#endasm
}

void	sio_b_init(int sped,int datbit,int stpbit,int parit)
{
#asm

	ld	hl,8
	add	hl,sp
	ld	a,(hl)
	call	ctc_1_init
	ld	a,00011000b
	out	(io_sio_bc),a		;SIOリセット
	ld	a,4
	out	(io_sio_bc),a
	ld	hl,4
	add	hl,sp
	ld	a,(hl)
	ld	hl,2
	add	hl,sp
	ld	h,(hl)
	or	h
	out	(io_sio_bc),a		;WR4設定
	ld	a,1
	out	(io_sio_bc),a
	ld	a,00h
	out	(io_sio_bc),a		;WR1設定
	ld	a,3
	out	(io_sio_bc),a
	ld	hl,6
	add	hl,sp
	ld	a,(hl)
	ld	h,a
	out	(io_sio_bc),a		;WR3設定
	ld	a,5
	out	(io_sio_bc),a
	ld	a,h
	srl	a
	or	10001010b		;RTS,DTR ON
	out	(io_sio_bc),a		;WR5設定

#endasm
}

void	sio_a_reset( )
{
#asm

	ld	a,00011000b
	out	(io_sio_ac),a		;SIOリセット

#endasm
}

void	sio_b_reset( )
{
#asm

	ld	a,00011000b
	out	(io_sio_bc),a		;SIOリセット

#endasm
}

int	sio_a_rx_check( )
{
#asm

	in	a,(io_sio_ac)
	and	00000001b
	jr	nz,sio_a_rx_check_1
	ld	hl,0
	ret
sio_a_rx_check_1:
	ld	hl,1

#endasm
}

int	sio_b_rx_check( )
{
#asm

	in	a,(io_sio_bc)
	and	00000001b
	jr	nz,sio_b_rx_check_1
	ld	hl,0
	ret
sio_b_rx_check_1:
	ld	hl,1

#endasm
}

int	sio_a_getchar( )
{
#asm
	in	a,(io_sio_ad)
	ld	l,a
	ld	h,0

#endasm
}

int	sio_b_getchar( )
{
#asm
	in	a,(io_sio_bd)
	ld	l,a
	ld	h,0

#endasm
}

int	sio_a_putchar(char data)
{
#asm
	in	a,(io_sio_ac)
	and	00000100b
	jr	nz,sio_a_tx_check_1
	ld	hl,0
	ret
sio_a_tx_check_1:
	ld	hl,2
	add	hl,sp
	ld	a,(hl)
	out	(io_sio_ad),a
	ld	hl,1
#endasm
}

int	sio_b_putchar(char data)
{
#asm
	in	a,(io_sio_bc)
	and	00000100b
	jr	nz,sio_b_tx_check_1
	ld	hl,0
	ret
sio_b_tx_check_1:
	ld	hl,2
	add	hl,sp
	ld	a,(hl)
	out	(io_sio_bd),a
	ld	hl,1
#endasm
}

int	sio_a_geterr( )
{
#asm
	ld	a,1
	out	(io_sio_ac),a
	in	a,(io_sio_ac)
	and	01110000b
	srl	a
	srl	a
	srl	a
	srl	a
	ld	l,a
	ld	h,0
#endasm
}

int	sio_b_geterr( )
{
#asm
	ld	a,1
	out	(io_sio_bc),a
	in	a,(io_sio_bc)
	and	01110000b
	srl	a
	srl	a
	srl	a
	srl	a
	ld	l,a
	ld	h,0
#endasm
}

void	sio_a_erreset( )
{
#asm
	ld	a,00110000b
	out	(io_sio_ac),a
#endasm
}

void	sio_b_erreset( )
{
#asm
	ld	a,00110000b
	out	(io_sio_bc),a
#endasm
}







目次に戻る