#include "3048f.h" #include "mtask.h" #include "itu.h" static volatile unsigned long Timer ; static void InitPulseCounter( void ) ; void initITU( void ) { Timer = 0 ; TCR0 = 0x20 ; TIOR0 = 0 ; BitSet( TIER0, 0 ) ; GRA0 = 25000 - 1 ; BitClr( TSR0, 0 ) ; InitPulseCounter() ; TSTR = 3 ; } static void InitPulseCounter( void ) { InitDataBuffer() ; //入力ソース TCLKA(93)〜TCLKD(96) //TCR1 = 0x4 ;//TCLKA:位相差 PA0 //TCR1 = 0x5 ;//TCLKB:位相差 PA1 TCR1 = 0x6 ;//TCLKC:PA2(CN1-10) //TCR1 = 0x7 ;//TCLKD:PA3(CN1-11) TIOR1 = 0 ; } int GetPulse( void ) { return( TCNT1 ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ unsigned long GetTimer( void ) { return( Timer ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void Sleep( unsigned long TimeUp ) { //void tprintf( char* Format, ... ) ; unsigned long LastTime ; int TaskNo ; TaskNo = SwitchTask(); //tprintf( "%c",TaskNo); for( LastTime = Timer ; ( Timer - LastTime ) < TimeUp ; ) { SwitchTask() ; } return ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ char isTimeOut( unsigned long OrgTime, unsigned long TimeUp ) { if( ( Timer - OrgTime ) > TimeUp ) { return( 1 ) ; } return( 0 ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ char isPastTime( unsigned long OrgTime ) { //void tprintf( char* Format, ... ) ; //tprintf( "%ld - %ld\n", Timer, OrgTime ) ; if( ( long )( Timer - OrgTime ) > 0 ) { return( 1 ) ; } return( 0 ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void WaitTimeUp( unsigned long OrgTime, unsigned long TimeUp ) { for(;;) { if( ( Timer - OrgTime ) > TimeUp ) { return ; } } } /****************************************************************************** ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************/ #define RECV_SIZE 128u /*SIO0送信バッファサイズ*/ static volatile int RsRecvBuffer[ RECV_SIZE ] ;/*SIO0受信バッファ*/ static int RsRecvRetrievePnt ;/*受信バッファ読み出し位置*/ static int RsRecvEntryPnt ; /*SIO受信ポインタ*/ static volatile int RsRecvLength ; /*受信バッファにある文字数*/ static int LastData ; /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void InitDataBuffer( void ) { RsRecvRetrievePnt = 0 ; RsRecvEntryPnt = 0 ; RsRecvLength = 0 ; LastData = 0 ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void InitDataBufferWithDi( void ) { DisableIRQ ; InitDataBuffer() ; EnableIRQ ; } /****************************************************************************** 機能要約 SIO受信バッファにある文字数を求める。 機能 引数 戻り値 文字数を返す。 注意 ******************************************************************************/ int RecvDataLength( void ) { return( RsRecvLength ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ #pragma interrupt /* 割り込みルーチン指定 */ void IMIA0( void ) /* タイマー割り込みルーチン */ { int Data ; BitClr( TSR0, 0 ) ; Timer ++; Data = TCNT1 ; RsRecvBuffer[ RsRecvEntryPnt ] = Data - LastData ; LastData = Data ; RsRecvEntryPnt ++ ; if( RsRecvEntryPnt == RECV_SIZE ) { RsRecvEntryPnt = 0 ; } RsRecvLength ++ ; } /****************************************************************************** 機能要約 SIOからの1文字入力 機能 引数 戻り値 入力した文字を返す。 注意 ******************************************************************************/ int GetData( void ) { int Charactor ; /*データを受信するまで待つ*/ while( RsRecvLength == 0 ) { Sleep( 0 ) ; } DisableIRQ ; Charactor = RsRecvBuffer[ RsRecvRetrievePnt ] ; RsRecvRetrievePnt ++ ; RsRecvLength -- ; if( RsRecvRetrievePnt == RECV_SIZE ) { RsRecvRetrievePnt = 0 ; } EnableIRQ ; return( Charactor ) ; } int Get10msData( void ) { int i ; int Data ; Data = 0 ; for( i = 0 ; i < 10 ; i ++ ) { Data += GetData() ; } return( Data ) ; }