#include #include "3048f.h" #include "mtask.h" #include "itu.h" #include "wastloop.h" #include "sioregbt.h" #include "sio1.h" #include "debug.h" #define SEND_SIZE 250u /*SIO1送信バッファサイズ*/ #define RECV_SIZE 32u /*SIO1受信バッファサイズ*/ static volatile unsigned char Rs0SendBuffer[ SEND_SIZE ] ; /*SIO1送信バッファ*/ static volatile unsigned char Rs0RecvBuffer[ RECV_SIZE ] ; /*SIO1受信バッファ*/ static volatile unsigned char Rs0SendRetrievePnt ; /*SIO1送信ポインタ*/ static volatile unsigned char Rs0RecvRetrievePnt ;/*受信バッファ読み出し位置*/ static volatile unsigned char Rs0RecvEntryPnt ; /*SIO1受信ポインタ*/ 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 ; //送信割込み連続中か? static char inBlockUse ; /****************************************************************************** 機能要約 SIO0からの1文字入力。タイムアウトつき 機能 SIO0から1文字を取り出して、取り出した値を返す。ただし、タイムアウトになった場合には、0xffff を返す。 引数 戻り値 入力した文字を返す。上位8ビットのいずれかが 1 の場合には、受信エラー状態である(将来の拡張用)。 注意 ******************************************************************************/ unsigned int GetcSio1WithTimeOut( void ) { unsigned long LastTime ; for( LastTime = GetTimer() ; ( GetTimer() - LastTime ) < 100 ; ) { if( Rs0RecvLength != 0 ) { return( ( ( int )GetcSio1() ) & 0xff ) ; } SwitchTask() ; } return( 0xffff ) ; } /****************************************************************************** 機能要約 SIO1 初期化 機能 19200bps Parity-none 8-bit stop 1 で初期化する 引数 戻り値 注意 外部変数 ******************************************************************************/ void InitSioChannel1( void ) { SMR1 = 0 ; SCR1 = 0 ; /*19200bps*/ BRR1 = 25 ; /*38400bps*/ BRR1 = 19 ; Rs0SendRetrievePnt = 0 ; Rs0SendEntryPnt = 0 ; Rs0SendLength = 0 ; ClearRecieveBufSio1() ; Wait( 10 ) ; dummy = RDR1 ; dummy = RDR1 ; dummy = RDR1 ; BitSet( SCR1, bitp_RE ) ; BitSet( SCR1, bitp_TE ) ; BitSet( SCR1, bitp_RIE ) ; TransStreamCont = 0 ; inBlockUse = 0 ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 割込み禁止の状態でよびだすこと ******************************************************************************/ void ClearRecieveBufSio1( void ) { Rs0RecvEntryPnt = 0 ; Rs0RecvRetrievePnt = 0 ; Rs0RecvLength = 0 ; } /****************************************************************************** 機能要約 SIO1の送信待ち文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ unsigned int SendLength1( void ) { return( Rs0SendLength ) ; } /****************************************************************************** 機能要約 SIO1送信バッファの空き文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ unsigned int SendSpace1( void ) { return( SEND_SIZE - Rs0SendLength ) ; } /****************************************************************************** 機能要約 SIO1受信バッファにある文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ unsigned int RecvLength1( void ) { return( Rs0RecvLength ) ; } /****************************************************************************** 機能要約 SIO1受信バッファの空き文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ unsigned int RecvSpace1( void ) { return( RECV_SIZE - Rs0RecvLength ) ; } /****************************************************************************** 機能要約 SIO1からの1文字入力 機能 引数 戻り値 入力した文字を返す。 注意 ******************************************************************************/ char GetcSio1( void ) { char Charactor ; /*データを受信するまで待つ*/ while( Rs0RecvLength == 0 ) { SwitchTask() ; } DisableIRQ ; /*割り込み禁止*/ Charactor = Rs0RecvBuffer[ Rs0RecvRetrievePnt ] ; Rs0RecvRetrievePnt ++ ; Rs0RecvLength -- ; if( Rs0RecvRetrievePnt == RECV_SIZE ) { Rs0RecvRetrievePnt = 0 ; } EnableIRQ ; /*割り込み許可*/ return( Charactor ) ; } /****************************************************************************** 機能要約 SIO1への1文字出力 機能 引数 Character 出力する文字 戻り値 注意 ******************************************************************************/ void PutcSio1( char Character ) { //return; EnableIRQ ; while( Rs0SendLength == SEND_SIZE ) { SwitchTask() ; } DisableIRQ ; BitSet( SCR1, bitp_TIE ) ; if( TransStreamCont == 0 ) { TDR1 = Character ; BitClr( SSR1, bitp_TDRE ) ; TransStreamCont = 1 ; EnableIRQ ; return ; } Rs0SendBuffer[ Rs0SendEntryPnt ] = Character ; Rs0SendEntryPnt ++ ; Rs0SendLength ++ ; if( Rs0SendEntryPnt == SEND_SIZE ) { Rs0SendEntryPnt = 0 ; } EnableIRQ ; } /****************************************************************************** 機能要約 SIO1への文字列出力 機能 引数 String 出力する文字列 戻り値 注意 ******************************************************************************/ void PutsSio1( char* String ) { for(; *String != 0 ; String ++ ) { PutcSio1( *String ) ; } } /****************************************************************************** 機能要約 SIO1への文字列出力 機能 引数 String 出力する文字列 戻り値 注意 ******************************************************************************/ void BlockPutsSio1( char* String ) { unsigned int Length ; Length = strlen( String ) ; while( SendSpace1() < Length ) { SwitchTask() ; } for(; *String != 0 ; String ++ ) { PutcSio1( *String ) ; } } /****************************************************************************** 機能要約 SIO1への文字列出力 機能 引数 String 出力する文字列 戻り値 注意 ******************************************************************************/ void BlockPutsStrsSio1( char* String[] ) { unsigned int Length ; char* Strp ; int i ; Length = 0 ; for( i = 0 ; String[ i ] != 0 ; i ++ ) { Strp = String[ i ] ; Length += strlen( Strp ) ; } while( SendSpace1() < Length ) { SwitchTask() ; } for( i = 0 ; String[ i ] != 0 ; i ++ ) { Strp = String[ i ] ; for(; *Strp != 0 ; Strp ++ ) { PutcSio1( *Strp ) ; } } } /****************************************************************************** ***************** 以下、割込みルーチン **************************************** ******************************************************************************/ /****************************************************************************** 機能要約 SIO1ポートB外部/ステータス割り込みルーチン 機能 引数 戻り値 注意 割り込みルーチンの内部では AUTO 変数は使用できないのです。 また、アセンブルされたルーチンをみて、この関数の中に CALL 命令があった場合 にはなんとかして CALL 命令を取り除くようなプログラムにして下さい。 ******************************************************************************/ #pragma interrupt void ERI1( void ) { BitClr( SSR1, 6 ) ; BitClr( SSR1, 5 ) ; BitClr( SSR1, 4 ) ; BitClr( SSR1, 3 ) ; dummy = RDR1 ; } /****************************************************************************** 機能要約 SIO1ポートB受信割り込み関数 機能 引数 戻り値 注意 割り込みルーチンの内部では AUTO 変数は使用できないのです。 また、アセンブルされたルーチンをみて、この関数の中に CALL 命令があった場合 にはなんとかして CALL 命令を取り除くようなプログラムにして下さい。 ******************************************************************************/ #pragma interrupt void RXI1( void ) { Rs0RecvBuffer[ Rs0RecvEntryPnt ] = RDR1 ; Rs0RecvEntryPnt ++ ; if( Rs0RecvEntryPnt == RECV_SIZE ) { Rs0RecvEntryPnt = 0 ; } Rs0RecvLength ++ ; /*データ受信*/ BitClr( SSR1, 6 ) ; //RDR(recieve data register full) } /****************************************************************************** 機能要約 SIO1送信割り込みルーチン 機能 引数 戻り値 注意 割り込みルーチンの内部では AUTO 変数は使用できないのです。 また、アセンブルされたルーチンをみて、この関数の中に CALL 命令があった場合 にはなんとかして CALL 命令を取り除くようなプログラムにして下さい。 ******************************************************************************/ #pragma interrupt void TXI1( void ) { if( Rs0SendLength != 0 ) { TDR1 = Rs0SendBuffer[ Rs0SendRetrievePnt ] ; BitClr( SSR1, bitp_TDRE ) ; Rs0SendRetrievePnt ++ ; if( Rs0SendRetrievePnt == SEND_SIZE ) { Rs0SendRetrievePnt = 0 ; } Rs0SendLength -- ; /*データ送信*/ } else { BitClr( SCR1, bitp_TIE ) ; TransStreamCont = 0 ; } }