目次
前
次
パルス出力処理
パルス出力は、ステートマシンを利用して実現します。
H、Lの出力時間をステートマシンで制御します。
各チャネルのH、Lの出力時間は、変数chに保持している
値で、ステートマシンを回している間に確定します。
各ステートの処理内容を、次のように設定します。
- 0 -> 9 チャネル0〜7の出力レベルをsvbに設定
全チャネルにL出力
- 10 -> 19 チャネル8〜15の出力レベルをsvcに設定
全チャネルにL出力
- 20 -> 29 全チャネルにH出力
- 30 -> 39 svb、svcに応じたHかLレベル出力
- 40 ->199 全チャネルにL出力
ソースコードで記述すると、以下となります。
#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 ;
}
目次
前
次