目次
前
次
システムシーケンサ見直し
これまでのシステム動作は、ひとつのシーケンサで
すべてを取り仕切ってきましたが、上位から下位に
向けて、より専門内容を担当するシーケンサへと
規模を小さくした方が扱いやすいと指摘されました。
システムシーケンサを見直して、専門内容を担当する
シーケンサで、実現できるかを検討してみます。
最上位のシーケンサは、以下としてみました。
このシーケンサを、Cで記述すると次のようになります。
switch ( state ) {
/* trigger handling */
case 0 :
/* now state */
state = 0 ;
/* get start trigger */
sflag = get_start_trigger();
/* judge */
if ( sflag == ON ) {
sflag = OFF ;
/* next state */
state = 1 ;
}
/* */
break ;
/* set timer */
case 1 :
/* get current time */
begin_time = millis();
/* calculate exit time */
exit_time = begin_time + XINTERVAL ;
/* next state */
state = 2 ;
/* */
break ;
/* enable move sequencer */
case 2 :
/* set flag */
eflag = ON ;
/* set counter */
ecnt = 0 ;
/* next state */
state = 3 ;
/* */
break ;
/* check timeout */
case 3 :
/* now state */
state = 3 ;
/* get current time */
current_time = millis();
/* compare */
if ( current_time > exit_time ) {
/* next state */
state = 4 ;
}
/* */
break ;
/* disable move sequencer */
case 4 :
/* reset flag */
eflag = OFF ;
/* stop */
motor_stop();
/* next state */
state = 5 ;
/* */
break ;
/* return */
case 5 :
/* first state */
state = 0 ;
/* */
break ;
/* others */
default :
break ;
}
最上位のシーケンサが担当しているのは
スタート合図の検出と走行シーケンサの
起動と停止、タイムアウトの3処理だけ
となっています。
走行シーケンサは、最上位のシーケンサからの
指示で動作するように設計すればよく、他の
ことを考えないでよくなります。
センサーからの情報取得は、常にやっておけば
よいので、走行シーケンサは、次のように単純
処理で実現可能。
このシーケンサは、タイマー割り込みを利用した方が
わかりやすいので、コードにしてみると次のように
記述できます。
if ( tflag == ON ) {
/* clear flag */
tflag = OFF ;
/* move sequencer */
if ( eflag == ON ) {
escan( ecnt );
ecnt++ ;
ecnt &= 3 ;
}
}
void escan(byte x)
{
switch (x) {
/* get sensor information */
case 0 :
/* get */
sensor = get_sensor_info();
/* */
break ;
/* judge move mode */
case 1 :
/* get mode */
mode = get_mode();
/* judge */
if ( mode == NORMAL ) {
if ( sensor == CENTER ) {
xleft = 50 ;
xright = 50 ;
}
:
:
}
if ( mode == CRANK ) {
if ( sensor == CENTER ) {
xleft = 30 ;
xright = 30 ;
}
:
:
}
/* */
break ;
/* set duty */
case 2 :
/* set */
update_motor(xleft,xright);
/* */
break ;
}
}
(under construction)
目次
前
次