目次
前
次
時間待ち処理
LCDのようなデバイスは、初期化に時間待ちが必要になる。
タイマー割込みの中に、ステートマシンを入れ、時間待ちを
任せるのが簡単でよい。
フラグとカウンタを用意し、タイマー割込み処理は、以下とする。
(H8/Tinyを利用し、0.1ms割込みと仮定)
void int_timerv(void)
{
UBYTE dummy ;
/* dummy read */
dummy = TV.TCSRV.BIT.CMFA;
TV.TCSRV.BIT.CMFA = OFF ;
/*----------------------------*/
/* 0.1 ms x N timer primitive */
/*----------------------------*/
switch ( wait_state ) {
case 0 :
wait_state = 0 ;
if ( WAIT_FLAG == ON ) { wait_state = 1 ;}
break ;
case 1 :
wait_cnt-- ;
if ( wait_cnt == 0 ) { wait_state = 2 ; WAIT_FLAG = OFF ; }
break ;
case 2 :
default :
wait_state = 0 ;
break ;
}
}
1msの時間待ちは、カウンタに10を設定後、フラグをセットし
そのフラグがリセットされるまで、監視を続けるとよい。
void mwait(void)
{
/* set time counter */
wait_cnt = 10 ;
/* enable timer processing */
WAIT_FLAG = ON ;
/* wait */
while ( WAIT_FLAG == ON ) ;
}
Nmsの時間待ち(Nは2以上)は、mwaitをループ内で呼出し
実現する。
void mwait_by(UWORD x)
{
volatile UWORD i ;
for ( i = 0 ; i < x ; i++ ) { mwait(); }
}
目次
前
次