#include "3048f.h" #include "mtask.h" #include "itu.h" #include "wastloop.h" #include "sioregbt.h" #include "sio0.h" #include "debug.h" #define SEND_SIZE 16u /*SIO0送信バッファサイズ*/ #define RECV_SIZE 32u /*SIO0受信バッファサイズ*/ static volatile unsigned char Rs0SendBuffer[ SEND_SIZE ] ; /*SIO0送信バッファ*/ static volatile unsigned char Rs0RecvBuffer[ RECV_SIZE ] ; /*SIO0受信バッファ*/ static volatile unsigned int Rs0SendRetrievePnt ; /*SIO0送信ポインタ*/ static volatile unsigned char Rs0RecvRetrievePnt ;/*受信バッファ読み出し位置*/ static volatile unsigned char Rs0RecvEntryPnt ; /*SIO0受信ポインタ*/ static volatile unsigned char Rs0SendEntryPnt ; /*送信バッファ書き込み位置*/ static volatile unsigned char Rs0SendLength ; /*未送信のバイト数*/ static volatile unsigned char Rs0RecvLength ; /*受信バッファにある文字数*/ static volatile unsigned char dummy ; static volatile unsigned char TransStreamCont ; //送信割込み連続中か? /****************************************************************************** 機能要約 SIO0 初期化 機能 引数 戻り値 注意 外部変数 ******************************************************************************/ void InitSioChannel0( void ) { // 9600 data-8 stop-1 pe // 0 0 1 0 0 0 0 0 SMR0 = 0x00 ; SCR0 = 0 ; /*38400bps*/ BRR0 = 19 ; Rs0SendRetrievePnt = 0 ; Rs0SendEntryPnt = 0 ; Rs0SendLength = 0 ; Rs0RecvEntryPnt = 0 ; Rs0RecvRetrievePnt = 0 ; Rs0RecvLength = 0 ; Wait( 10 ) ; dummy = RDR0 ; dummy = RDR0 ; dummy = RDR0 ; BitSet( SCR0, bitp_RE ) ; BitSet( SCR0, bitp_TE ) ; BitSet( SCR0, bitp_RIE ) ; TransStreamCont = 0 ; } /****************************************************************************** 機能要約 SIO0の送信待ち文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ unsigned int SendLength0( void ) { return( Rs0SendLength ) ; } /****************************************************************************** 機能要約 SIO0送信バッファの空き文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ unsigned int SendSpace0( void ) { return( SEND_SIZE - Rs0SendLength ) ; } /****************************************************************************** 機能要約 SIO0受信バッファにある文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ unsigned int RecvLength0( void ) { return( Rs0RecvLength ) ; } /****************************************************************************** 機能要約 SIO0受信バッファの空き文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ unsigned int RecvSpace0( void ) { return( RECV_SIZE - Rs0RecvLength ) ; } /****************************************************************************** 機能要約 SIO0からの1文字入力 機能 引数 戻り値 入力した文字を返す。 注意 ******************************************************************************/ char GetcSio0( void ) { char Charactor ; /*データを受信するまで待つ*/ while( Rs0RecvLength == 0 ){ Sleep( 0 ) ; } DisableIRQ ; /*割り込み禁止*/ Charactor = Rs0RecvBuffer[ Rs0RecvRetrievePnt ++ ] ; Rs0RecvLength -- ; if( Rs0RecvRetrievePnt == RECV_SIZE ) { Rs0RecvRetrievePnt = 0 ; } EnableIRQ ; /*割り込み許可*/ return( Charactor ) ; } /****************************************************************************** 機能要約 SIO0からの1文字入力 機能 引数 戻り値 入力した文字を返す。 注意 ******************************************************************************/ int GetcSio0WithTimeOut( unsigned long TimeOut ) { char Charactor ; unsigned long OrgTime ; OrgTime = GetTimer() ; /*データを受信するまで待つ*/ while( Rs0RecvLength == 0 ){ Sleep( 0 ) ; if( isTimeOut( OrgTime, TimeOut ) ) { return( -1 ) ; } } DisableIRQ ; /*割り込み禁止*/ Charactor = Rs0RecvBuffer[ Rs0RecvRetrievePnt ++ ] ; Rs0RecvLength -- ; if( Rs0RecvRetrievePnt == RECV_SIZE ) { Rs0RecvRetrievePnt = 0 ; } EnableIRQ ; /*割り込み許可*/ return( ( ( int )Charactor ) & 0xff ) ; } /****************************************************************************** 機能要約 SIO0への1文字出力 機能 引数 Character 出力する文字 戻り値 注意 ******************************************************************************/ void PutcSio0( char Character ) { EnableIRQ ; while( Rs0SendLength == SEND_SIZE ) { Sleep( 0 ) ; } DisableIRQ ; BitSet( SCR0, bitp_TIE ) ; if( TransStreamCont == 0 ) { TDR0 = Character ; BitClr( SSR0, bitp_TDRE ) ; TransStreamCont = 1 ; EnableIRQ ; return ; } Rs0SendBuffer[ Rs0SendEntryPnt ] = Character ; Rs0SendEntryPnt ++ ; Rs0SendLength ++ ; if( Rs0SendEntryPnt == SEND_SIZE ) { Rs0SendEntryPnt = 0 ; } EnableIRQ ; } /****************************************************************************** 機能要約 SIO0への文字列出力 機能 引数 String 出力する文字列 戻り値 注意 ******************************************************************************/ void PutsSio0( char* String ) { for(; *String != 0 ; String ++ ) { PutcSio0( *String ) ; } } /****************************************************************************** ***************** 以下、割込みルーチン **************************************** ******************************************************************************/ /****************************************************************************** 機能要約 SIO0ポートB外部/ステータス割り込みルーチン 機能 引数 戻り値 注意 割り込みルーチンの内部では AUTO 変数は使用できないのです。 また、アセンブルされたルーチンをみて、この関数の中に CALL 命令があった場合 にはなんとかして CALL 命令を取り除くようなプログラムにして下さい。 ******************************************************************************/ #pragma interrupt void ERI0( void ) { BitClr( SSR0, 6 ) ; BitClr( SSR0, 5 ) ; BitClr( SSR0, 4 ) ; BitClr( SSR0, 3 ) ; dummy = RDR0 ; } /****************************************************************************** 機能要約 SIO0ポートB受信割り込み関数 機能 引数 戻り値 注意 割り込みルーチンの内部では AUTO 変数は使用できないのです。 また、アセンブルされたルーチンをみて、この関数の中に CALL 命令があった場合 にはなんとかして CALL 命令を取り除くようなプログラムにして下さい。 ******************************************************************************/ #pragma interrupt void RXI0( void ) { Rs0RecvBuffer[ Rs0RecvEntryPnt ++ ] = RDR0 ; Rs0RecvLength ++ ; /*データ受信*/ //debug //for(;;); BitClr( SSR0, 6 ) ; //RDR(recieve data register full) if( Rs0RecvEntryPnt == RECV_SIZE ) { Rs0RecvEntryPnt = 0 ; } } /****************************************************************************** 機能要約 SIO0送信割り込みルーチン 機能 引数 戻り値 注意 割り込みルーチンの内部では AUTO 変数は使用できないのです。 また、アセンブルされたルーチンをみて、この関数の中に CALL 命令があった場合 にはなんとかして CALL 命令を取り除くようなプログラムにして下さい。 ******************************************************************************/ #pragma interrupt void TXI0( void ) { if( Rs0SendLength != 0 ) { TDR0 = Rs0SendBuffer[ Rs0SendRetrievePnt ] ; BitClr( SSR0, bitp_TDRE ) ; Rs0SendRetrievePnt ++ ; if( Rs0SendRetrievePnt == SEND_SIZE ) { Rs0SendRetrievePnt = 0 ; } Rs0SendLength -- ; /*データ送信*/ } else { BitClr( SCR0, bitp_TIE ) ; TransStreamCont = 0 ; } }