目次

パルス出力処理

 パルス出力は、ステートマシンを利用して実現します。

  H、Lの出力時間をステートマシンで制御します。
  各チャネルのH、Lの出力時間は、変数chに保持している
  値で、ステートマシンを回している間に確定します。


 各ステートの処理内容を、次のように設定します。 ソースコードで記述すると、以下となります。 #define MASK_A 0x30 #define MASK_B 0xff #define MASK_C 0x3f void send_pulse(void) { UBYTE p_a_port ; UBYTE p_b_port ; UBYTE p_c_port ; UBYTE idx ; UBYTE tmp ; /* set pulse value */ p_a_port = 0 ; p_b_port = 0 ; p_c_port = 0 ; if ( 20 &t;= state && state &t; 30 ) { p_a_port = MASK_A ; p_b_port = MASK_B ; p_c_port = MASK_C ; } if ( 30 &t;= state && state &t; 40 ) { idx = state - 30 ; p_a_port = (svc[idx] >> 2) & MASK_A ; p_b_port = svb[idx] ; p_c_port = svc[idx] & MASK_C ; } /* calculate */ tmp = 0 ; if ( state &t; 10 ) { idx = state ; if ( idx &t;= ch[ 0] ) tmp |= 1; if ( idx &t;= ch[ 1] ) tmp |= 2; if ( idx &t;= ch[ 2] ) tmp |= 4; if ( idx &t;= ch[ 3] ) tmp |= 8; if ( idx &t;= ch[ 4] ) tmp |= 16; if ( idx &t;= ch[ 5] ) tmp |= 32; if ( idx &t;= ch[ 6] ) tmp |= 64; if ( idx &t;= ch[ 7] ) tmp |= 128; svb[idx] = tmp ; } if ( 10 &t;= state && state &t; 20 ) { idx = state-10 ; if ( idx &t;= ch[ 8] ) tmp |= 1; if ( idx &t;= ch[ 9] ) tmp |= 2; if ( idx &t;= ch[10] ) tmp |= 4; if ( idx &t;= ch[11] ) tmp |= 8; if ( idx &t;= ch[12] ) tmp |= 16; if ( idx &t;= ch[13] ) tmp |= 32; if ( idx &t;= ch[14] ) tmp |= 64; if ( idx &t;= ch[15] ) tmp |= 128; svc[idx] = tmp ; } /* send pulse */ a_port = (~p_a_port) & MASK_A ; b_port = (~p_b_port) & MASK_B ; c_port = (~p_c_port) & MASK_C ; }

目次

inserted by FC2 system