目次

CUIテストデバッグ

 マイコンへの書込み回数に上限があるときは、走行する前に
 記述内容が正しいかを、パーソナルコンピュータ上のCUIで
 テストし、デバッグします。

 AVRを利用する場合は、書込み回数の下限は1万回なので
 気にする必要はありません。しかし、動作を確認しておく
 方が、トラブルを減らすことになるので、GUIで動作する
 プログラムを作成しておきます。

 GBCから画像データを取得し、センサーデータに変換する
 ことができないと、モータを動かせません。
 GBCから画像データを入力し、センサーデータに変換する
 関数は、get_sensorなので、これからテストデバッグします。

 関数get_sensorが、データをどう料理しているのかの途中
 経過と結果をファイルに出力します。ファイルに処理内容
 が入っているので、ゆっくりと動作をトレースできます。

 関数get_sensorの動作シーケンスを、見直します。
  1. STARTトリガー出力
  2. READがHであることを確認して、3以下のループを実行
  3. 128x128回処理すれば、終了
  4. A/D変換開始
  5. A/D変換終了待ち
  6. 2値化
  7. 16ビットデータ生成
  8. 1ライン分データ取得していれば、センサーデータに変換
  9. 3に戻る
 動作シーケンスから、CUIでテストするためには、画像データを  予めファイルから入力しておきます。  ファイルから入力した画像データは、配列に入れておきます。  入力済画像データを、関数get_sensorで1バイトごと取得する  ためには、A/D変換開始で、配列から読み出します。そのまま  では、同じデータばかりを参照するので、配列データを参照  するインデックスをA/D変換終了待ちで、更新します。  A/D変換開始は、関数start_adcで、A/D変換終了待ちは  関数wai_adcで定義します。 void start_adc(void) { UBYTE tmp ; /* get 1 data */ tmp = *(gdata+index); /* separate */ ad_dat = tmp ; /* shift */ ad_dat <<= 2 ; } void wai_adc(void) { index++ ; }  関数get_sensorの中で、16ビットを合成してから、センサー  データに変換しているので、16ビットと8ビットを2進数で  表示して、判断しやすくします。  16ビットの2進数表示、8ビットの2進数表示を担当する  関数を定義します。 void binary_display(UBYTE x) { int i ; for ( i = 7 ; i > -1 ; i-- ) { putchar('0'+((x >> i) & 1)); } } void binary_display16(UWORD x) { int i ; for ( i = 15 ; i > -1 ; i-- ) { putchar('0'+((x >> i) & 1)); } }  関数get_sensorの中で、上記2つの関数を呼出して  ファイルに動作内容を出力します。  I/Oリダイレクトで、途中経過をファイルに出力する  ことにして、CUIのソースコードを定義します。 #include <stdio.h> typedef unsigned char UBYTE ; typedef unsigned short UWORD ; #define GBSIZE 16384 #define BBSIZE 64 #define NO 0 #define YES NO+1 UBYTE gdata[GBSIZE] ; UBYTE bdata[BBSIZE] ; void binary_display(UBYTE x) { int i ; for ( i = 7 ; i > -1 ; i-- ) { putchar('0'+((x >> i) & 1)); } } void binary_display16(UWORD x) { int i ; for ( i = 15 ; i > -1 ; i-- ) { putchar('0'+((x >> i) & 1)); } } #define OFF 0 #define ON OFF+1 #define MAX_SIZE 16384 UWORD img_cnt ; UBYTE rdat[8] ; UBYTE threshold ; UWORD index ; UBYTE pc_sig ; UWORD ad_dat ; void send_start(void) { } void set_xck(UBYTE x) { } void start_adc(void) { UBYTE tmp ; /* get 1 data */ tmp = *(gdata+index); /* separate */ ad_dat = tmp ; /* shift */ ad_dat <<= 2 ; } void wai_adc(void) { index++ ; } UBYTE b1_cnt[16] ; void make_code(void) { UBYTE i ; UBYTE cnt ; for ( i = 0 ; i < 16 ; i++ ) { cnt = 0 ; if ( i & 1 ) { cnt++ ; } if ( i & 2 ) { cnt++ ; } if ( i & 4 ) { cnt++ ; } if ( i & 8 ) { cnt++ ; } *(b1_cnt+i) = cnt ; } } UBYTE get_1_cnt(UBYTE x) { UBYTE bh; UBYTE bl; UBYTE result ; /* separate */ bl = x & 15 ; x >>= 4 ; bh = x & 15 ; /* sum */ result = 0 ; result += b1_cnt[bh] ; result += b1_cnt[bl] ; return result ; } UBYTE get_1_count(UWORD x) { UBYTE bh; UBYTE bl; UBYTE result ; /* separate */ bl = x & 255 ; x >>= 8 ; bh = x & 255 ; /* sum */ result = 0 ; result += get_1_cnt(bl) ; result += get_1_cnt(bh) ; return result ; } #define PINC pc_sig #define ADCL (ad_dat & 0xff) #define ADCH ((ad_dat >> 8) & 0xff) UBYTE sdat[128] ; void get_sensor(void) { UWORD result ; UBYTE index ; UWORD res ; UBYTE i ; UBYTE sensor ; UBYTE avr ; UBYTE dh ; UBYTE dl ; UBYTE max; UBYTE min; /* send start */ send_start(); /* READ data and show*/ img_cnt = 0 ; index = 0 ; i = 0 ; res = 0 ; avr = 0 ; max = 0 ; min = 16 ; dl = dh = 0 ; while ( img_cnt < MAX_SIZE ) { /* impress XCK:H */ set_xck(ON); /* impress XCK:L */ set_xck(OFF) ; /* judge */ if ( PINC & 2 ) { /* start conversion */ start_adc(); /* wait */ wai_adc() ; /* get data */ dl = ADCL ; dh = ADCH ; result = (dh << 8) + dl ; /* shift */ result >>= 2 ; /* judge */ res <<= 1 ; if ( result > threshold ) { res |= 1 ; } /* generate line code */ if ( (img_cnt % 16) == 15 ) { *(rdat+i) = get_1_count(res) ; /* judge */ if ( max < *(rdat+i) ) { max = *(rdat+i); } if ( min > *(rdat+i) ) { min = *(rdat+i); } binary_display16( res ); printf(" max(%3d) min(%3d)\n",max,min); /* clear */ res = 0 ; /* update pointer */ i++ ; i %= 8 ; } /* generate sensor data */ if ( (img_cnt % 128) == 127 ) { /* calculate threshold */ avr = ((max+min) >> 2) ; if ( avr < min ) { avr = min ; } printf("\tmax(%3d) min(%3d) avr(%3d) ",max,min,avr); /* compare */ sensor = 0 ; if ( *(rdat+0) > avr ) { sensor |= 0x80 ; } if ( *(rdat+1) > avr ) { sensor |= 0x40 ; } if ( *(rdat+2) > avr ) { sensor |= 0x20 ; } if ( *(rdat+3) > avr ) { sensor |= 0x10 ; } if ( *(rdat+4) > avr ) { sensor |= 0x08 ; } if ( *(rdat+5) > avr ) { sensor |= 0x04 ; } if ( *(rdat+6) > avr ) { sensor |= 0x02 ; } if ( *(rdat+7) > avr ) { sensor |= 0x01 ; } putchar('\t'); binary_display( sensor ); putchar('\n'); /* store */ *(sdat+index) = sensor ; /* increment */ index++ ; /* initialize max and min */ max = 0 ; min = 16 ; } /* increment */ img_cnt++ ; } } } void main(void) { UBYTE i ; UBYTE j ; /* */ make_code(); /* generate graphic data */ for ( j = 0 ; j < 128 ; j++ ) { for ( i = 0 ; i < 128 ; i++ ) { *(gdata+j*128+i) = (j*128+2*i-1) % 256 ; printf("%3d ",*(gdata+j*128+i)); if ( (i % 15) == 15 ) putchar('\n') ; } putchar('\n') ; } /* */ pc_sig = 2 ; index = 0 ; threshold = 85 ; /* */ get_sensor() ; /* */ for ( j = 0 ; j < 128 ; j++ ) { binary_display( *(sdat+j) ) ; putchar('\n') ; } }  I/Oリダイレクトで作ったファイルの内容を  表示して、2値化と1ラインからの8ビット  データ生成が正しいかを目視します。 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001 1000000000000000 max( 1) min( 1) 0000000000000000 max( 1) min( 0) 0000000000001111 max( 4) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 00011111 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1111111111111111 max( 16) min( 16) 1000000000000000 max( 16) min( 1) 0000000000000000 max( 16) min( 0) 0000000000001111 max( 16) min( 0) 1111111111111111 max( 16) min( 0) max( 16) min( 0) avr( 4) 11110001  1ライン=128バイトが2値化され、8ビットの  センサーデータに変換される様子から、処理に問題  ないことがわかりました。  センサーデータが生成された後で、NORMAL、CRANK、LANEの  3状態を判定し、モータを制御しながら、移動します。  この状態遷移が、うまくいっているかテストします。  最初に作成したファームウエアでは、センサーデータから  3状態を判定し、モータを制御する処理を、一つのタスク  で実現していました。  実際に走らせてみると、おかしな動きばかりします。  3日くらいデバッグに費やしましたが、結局無駄でした。  そこで、センサーデータから3状態を判定して動作を確定  するタスクとモータを動かすタスクに分割しました。  1つのタスクで処理して駄目なときは、複数のタスクに分割する  ことで対処できることが多いと経験でわかっていたので、この  方式に変更しました。  センサーデータから、動作を確定するのは、関数tsk3_proc()  実際にモータを制御するのは、関数tsk4_proc()です。  タスクに分けたので、2関数の動作シーケンスを考えます。  関数tsk3_procのシーケンス   センサーデータを入力し、動作を確定するのが仕事です。   センサーデータを入力し、現在の状態(NORMAL、CRANK、LANE)と   つき合わせ、動作を確定します。   センサーデータには、状態遷移させるパターンと各状態で動作を   指定するパターンがあります。この判定をした後、動作を変数   actionに入れて、モータ制御のタスクに渡します。   関数にまとめると、次のようになります。 void tsk3_proc(void) { /* get sensor data */ get_sensor(); /* get sensor data */ sensor_data = convert_code(*(sdat+63)); /* judge */ if ( sensor_data == ALL_WHITE ) { action = 100 ; mode = MODE_CRANK ; } if ( sensor_data == LEFT_WHITE ) { action = 200 ; mode = MODE_LANE ; lane = LANE_LEFT ; } if ( sensor_data == RIGHT_WHITE ) { action = 200 ; mode = MODE_LANE ; lane = LANE_RIGHT; } if ( mode == MODE_NORMAL ) { if ( sensor_data == CENTER ) { action = 10 ; } if ( sensor_data == LITTLE_LEFT ) { action = 20 ; } if ( sensor_data == LEFT ) { action = 30 ; } if ( sensor_data == BIG_LEFT ) { action = 40 ; } if ( sensor_data == LITTLE_RIGHT ) { action = 50 ; } if ( sensor_data == RIGHT ) { action = 60 ; } if ( sensor_data == BIG_RIGHT ) { action = 70 ; } } }   動作を確認するために、printfを利用したコメントと数値を   表示します。 void tsk3_proc(void) { /* get sensor data */ get_sensor(); /* get sensor data */ sensor_data = convert_code(*(sdat+63)); /* action machine */ printf("TASK action(%d) ",action); /* show action */ if ( action < 100 ) { printf("judge(NORMAL) "); } if ( 99 < action && action < 200 ) { printf("judge(CRANK) "); } if ( 199 < action ) { printf("judge(LANE) "); } /* judge */ if ( sensor_data == ALL_WHITE ) { action = 100 ; mode = MODE_CRANK ; } if ( sensor_data == LEFT_WHITE ) { action = 200 ; mode = MODE_LANE ; lane = LANE_LEFT ; } if ( sensor_data == RIGHT_WHITE ) { action = 200 ; mode = MODE_LANE ; lane = LANE_RIGHT; } if ( mode == MODE_NORMAL ) { if ( sensor_data == CENTER ) { action = 10 ; } if ( sensor_data == LITTLE_LEFT ) { action = 20 ; } if ( sensor_data == LEFT ) { action = 30 ; } if ( sensor_data == BIG_LEFT ) { action = 40 ; } if ( sensor_data == LITTLE_RIGHT ) { action = 50 ; } if ( sensor_data == RIGHT ) { action = 60 ; } if ( sensor_data == BIG_RIGHT ) { action = 70 ; } } /* show action */ printf("=> action(%d) ",action); if ( action < 100 ) { printf("judge(NORMAL) "); } if ( 99 < action && action < 200 ) { printf("judge(CRANK) "); } if ( 199 < action ) { printf("judge(LANE) "); } putchar('\n'); }  関数tsk4_procのシーケンス   関数tsk3_procが生成した変数actionの数値を利用して   PWMのDUTY比を確定します。   テストするには、状態(NORMAL、CRANK、LANE)とモータに与えた   DUTY比を表示すればよいと考えました。   DUTY比の設定は、関数crank_moveが一手に扱っているので   この関数の中に、printfを入れてテストします。 void crank_move(UBYTE xa,UBYTE xb,UBYTE xc) { /* param.direction = xa; param.rlduty = xb; param.duty = xc; update_motor( param ); */ /* show direction */ putchar(' '); putchar('>'); putchar(' '); if ( xa == DIR_CENTER ) { printf("direction: CENTER "); } else { if ( xa == DIR_RIGHT ) { printf("direction: RIGHT "); } else { printf("direction: LEFT "); } } printf("/ DUTY front(%d) rear(%d) ",xb,xc); /* show direction */ printf("index(%d)\n",index); }  ここまで準備してから、動作テストのためのコードを作成します。 #include <stdio.h> typedef unsigned char UBYTE ; typedef unsigned short UWORD ; #define NO 0 #define YES NO+1 #define OFF 0 #define ON OFF+1 #define MAX_SIZE 16384 #define RSIZE 32 UBYTE road[RSIZE] ; UWORD index ; UBYTE sdat[128] ; void init_road1(void) { UBYTE i ; /* initialize */ for ( i = 0 ; i < RSIZE ; i++ ) { *(road+i) = 0x00 ; } /* store data */ *(road+ 0) = 0x18 ; /* CENTER */ *(road+ 1) = 0x18 ; /* CENTER */ *(road+ 2) = 0x30 ; /* LITTLE_LEFT */ *(road+ 3) = 0x70 ; /* LEFT */ *(road+ 4) = 0x10 ; /* LITTLE_LEFT */ *(road+ 5) = 0x18 ; /* CENTER */ *(road+ 6) = 0xff ; /* ALL_WHITE */ *(road+ 7) = 0x18 ; /* CENTER */ *(road+ 8) = 0x1c ; /* CENTER */ *(road+ 9) = 0xf0 ; /* LEFT_WHITE */ *(road+10) = 0x00 ; /* ALL_BLACK */ *(road+11) = 0xc0 ; /* BIG_LEFT */ *(road+12) = 0x70 ; /* LEFT */ *(road+13) = 0x30 ; /* LITTLE_LEFT */ *(road+14) = 0x1c ; /* CENTER */ *(road+15) = 0x18 ; /* CENTER */ *(road+16) = 0xff ; /* ALL_WHITE */ *(road+17) = 0x38 ; /* CENTER */ *(road+18) = 0x1c ; /* CENTER */ *(road+19) = 0x1f ; /* RIGHT_WHITE */ *(road+20) = 0x00 ; /* ALL_BLACK */ *(road+21) = 0x07 ; /* BIG_RIGHT */ *(road+22) = 0x0e ; /* RIGHT */ *(road+23) = 0x0c ; /* LITTLE_RIGHT */ *(road+24) = 0x38 ; /* CENTER */ *(road+25) = 0x38 ; /* CENTER */ } void init_road0(void) { UBYTE i ; /* initialize */ for ( i = 0 ; i < RSIZE ; i++ ) { *(road+i) = 0x00 ; } /* store data */ *(road+ 0) = 0x38 ; /* CENTER */ *(road+ 1) = 0x38 ; /* CENTER */ *(road+ 2) = 0x38 ; /* CENTER */ *(road+ 3) = 0x10 ; /* LITTLE_LEFT */ *(road+ 4) = 0x60 ; /* LEFT */ *(road+ 5) = 0x70 ; /* LEFT */ *(road+ 6) = 0xc0 ; /* BIG_LEFT */ *(road+ 7) = 0x60 ; /* LEFT */ *(road+ 8) = 0x60 ; /* LEFT */ *(road+ 9) = 0x10 ; /* LITTLE_LEFT */ *(road+10) = 0x38 ; /* CENTER */ *(road+11) = 0x38 ; /* CENTER */ *(road+12) = 0x38 ; /* CENTER */ *(road+13) = 0x08 ; /* LITTLE_RIGHT */ *(road+14) = 0x06 ; /* RIGHT */ *(road+15) = 0x06 ; /* RIGHT */ *(road+16) = 0x03 ; /* BIG_RIGHT */ *(road+17) = 0x06 ; /* RIGHT */ *(road+18) = 0x06 ; /* RIGHT */ *(road+19) = 0x08 ; /* LITTLE_RIGHT */ *(road+20) = 0x38 ; /* CENTER */ *(road+21) = 0x38 ; /* CENTER */ *(road+22) = 0x38 ; /* CENTER */ *(road+23) = 0xf0 ; /* LEFT_WHITE */ *(road+24) = 0x38 ; /* CENTER */ *(road+25) = 0x38 ; /* CENTER */ *(road+26) = 0x00 ; /* ALL_BLACK */ *(road+27) = 0x00 ; /* ALL_BLACK */ *(road+28) = 0x00 ; /* ALL_BLACK */ *(road+29) = 0x38 ; /* CENTER */ *(road+30) = 0x38 ; /* CENTER */ *(road+31) = 0x38 ; /* CENTER */ } void get_sensor(void) { /* get data */ *(sdat+63) = *(road+index); /* update */ index++ ; index %= RSIZE ; } #define DIR_CENTER 0 #define DIR_RIGHT 1 #define DIR_LEFT 2 #define ALL_BLACK 0 #define ALL_WHITE 1 #define LEFT_WHITE 2 #define RIGHT_WHITE 3 #define CENTER 4 #define LITTLE_LEFT 5 #define LEFT 6 #define BIG_LEFT 7 #define LITTLE_RIGHT 8 #define RIGHT 9 #define BIG_RIGHT 10 #define CRANK_RIGHT 11 #define CRANK_LEFT 12 #define ILLEAGAL 13 #define LANE_NONE 0 #define LANE_RIGHT 1 #define LANE_LEFT 2 #define MODE_NORMAL 0 #define MODE_CRANK 1 #define MODE_LANE 2 UBYTE mode ; UBYTE action ; UBYTE lane ; UBYTE dir ; UBYTE convert_code(UBYTE x) { UBYTE result ; /* default */ result = ILLEAGAL ; /* judge */ if ( x == 0x00 ) { result = ALL_BLACK ; } if ( x == 0xff ) { result = ALL_WHITE ; } if ( x == 0x38 || x == 0x18 || x == 0x1c ) { result = CENTER ; } if ( x == 0xf0 || x == 0xf8 ) { result = LEFT_WHITE ; } if ( x == 0x0f || x == 0x1f ) { result = RIGHT_WHITE ; } if ( x == 0x10 || x == 0x30 ) { result = LITTLE_LEFT ; } if ( x == 0x60 || x == 0x70 ) { result = LEFT ; } if ( x == 0xc0 || x == 0xe0 ) { result = BIG_LEFT ; } if ( x == 0x08 || x == 0x0c ) { result = LITTLE_RIGHT ; } if ( x == 0x06 || x == 0x0e ) { result = RIGHT ; } if ( x == 0x03 || x == 0x07 ) { result = BIG_RIGHT ; } if ( 99 < action && action < 200 ) { if ( x == 0x0e || x == 0x0f || x == 0x1f || x == 0x3f ) { result = CRANK_RIGHT ; } if ( x == 0xe0 || x == 0xf0 || x == 0xf8 || x == 0xfc ) { result = CRANK_LEFT ; } } return result ; } void delay_ms(UWORD x) { printf(" >>> delay(%d)\n",x); } UBYTE is_crank_center(UBYTE x) { UBYTE result ; /* judge */ switch ( x ) { case CENTER : case LITTLE_LEFT : case LITTLE_RIGHT : result = ON ; break ; default : result = OFF; break ; } return result ; } UBYTE is_lane_edge(UBYTE x) { UBYTE result ; /* judge */ switch ( x ) { case CENTER : case LITTLE_LEFT : case LEFT : case BIG_LEFT : case LITTLE_RIGHT : case RIGHT : case BIG_RIGHT : result = ON ; break ; default : result = OFF; break ; } return result ; } void update_frq(UBYTE x) { printf(" >> freq(%d)\n",x); } void crank_move(UBYTE xa,UBYTE xb,UBYTE xc) { /* param.direction = xa; param.rlduty = xb; param.duty = xc; update_motor( param ); */ /* show direction */ putchar(' '); putchar('>'); putchar(' '); if ( xa == DIR_CENTER ) { printf("direction: CENTER "); } else { if ( xa == DIR_RIGHT ) { printf("direction: RIGHT "); } else { printf("direction: LEFT "); } } printf("/ DUTY front(%d) rear(%d) ",xb,xc); /* show direction */ printf("index(%d)\n",index); } void straight_move(UBYTE x,UWORD tx) { crank_move(DIR_CENTER,0,x); if ( tx ) { delay_ms(tx) ; } } void right_move(UBYTE x) { crank_move(DIR_RIGHT,x,10); } void left_move(UBYTE x) { crank_move(DIR_LEFT,x,10); } void lane_move(UBYTE xa,UBYTE xb,UBYTE xc) { crank_move(xa,xb,xc); } UBYTE sensor_data ; void tsk3_proc(void) { /* get sensor data */ get_sensor(); /* get sensor data */ sensor_data = convert_code(*(sdat+63)); /* action machine */ printf("TASK action(%d) ",action); /* show action */ if ( action < 100 ) { printf("judge(NORMAL) "); } if ( 99 < action && action < 200 ) { printf("judge(CRANK) "); } if ( 199 < action ) { printf("judge(LANE) "); } /* judge */ if ( sensor_data == ALL_WHITE ) { action = 100 ; mode = MODE_CRANK ; } if ( sensor_data == LEFT_WHITE ) { action = 200 ; mode = MODE_LANE ; lane = LANE_LEFT ; } if ( sensor_data == RIGHT_WHITE ) { action = 200 ; mode = MODE_LANE ; lane = LANE_RIGHT; } if ( mode == MODE_NORMAL ) { if ( sensor_data == CENTER ) { action = 10 ; } if ( sensor_data == LITTLE_LEFT ) { action = 20 ; } if ( sensor_data == LEFT ) { action = 30 ; } if ( sensor_data == BIG_LEFT ) { action = 40 ; } if ( sensor_data == LITTLE_RIGHT ) { action = 50 ; } if ( sensor_data == RIGHT ) { action = 60 ; } if ( sensor_data == BIG_RIGHT ) { action = 70 ; } } /* show action */ printf("=> action(%d) ",action); if ( action < 100 ) { printf("judge(NORMAL) "); } if ( 99 < action && action < 200 ) { printf("judge(CRANK) "); } if ( 199 < action ) { printf("judge(LANE) "); } putchar('\n'); } void tsk4_proc(void) { switch ( action ) { /* NORMAL */ /* CENTER */ case 10 : straight_move(20,0); update_frq(100); delay_ms(1000); break ; /* LITTLE_LEFT (move center) */ case 20 : right_move( 5 ); update_frq(102); delay_ms(1000); straight_move(20,0); update_frq(100); break ; /* LEFT (move center) */ case 30 : right_move( 10); update_frq(104); delay_ms(1000); straight_move(20,0); update_frq(100); break ; /* BIG_LEFT (move center) */ case 40 : right_move( 15); update_frq(106); delay_ms(1000); straight_move(20,0); update_frq(100); break ; /* LITTLE_RIGHT (move center) */ case 50 : left_move( 5 ); update_frq(108); delay_ms(1000); straight_move(20,0); update_frq(100); break ; /* RIGHT (move center) */ case 60 : left_move( 10); update_frq(110); delay_ms(1000); straight_move(20,0); update_frq(100); break ; /* BIG_RIGHT (move center) */ case 70 : left_move( 15); update_frq(112); delay_ms(1000); straight_move(20,0); update_frq(100); break ; /* CRANK */ /* crank slow move */ case 100 : if ( sensor_data == CRANK_RIGHT ) { action = 110 ; dir = DIR_RIGHT ; } else if ( sensor_data == CRANK_LEFT ) { action = 110 ; dir = DIR_LEFT ; } else { straight_move(10,1000); update_frq(50); } break ; /* crank rotate */ case 110 : action = 120 ; crank_move(dir,10,5); delay_ms(3000); break ; /* crank rotate right (bit by bit) */ case 120 : if ( is_crank_center(sensor_data) == ON ) { action = 130 ; } else { crank_move(dir,5,5); update_frq(52); delay_ms(100); } break ; /* crank slow move */ case 130 : action = 140 ; straight_move(10,1000); update_frq(54) ; break ; /* return */ case 140 : straight_move(20,0); update_frq(100); mode = MODE_NORMAL; break ; /* LANE */ /* lane slow move */ case 200 : if ( sensor_data == ALL_BLACK ) { action = 210 ; dir = DIR_RIGHT; if ( lane == LANE_LEFT ) { dir = DIR_LEFT ; } } else { straight_move(10,1000); update_frq(30); } break ; /* lane change */ case 210 : action = 220 ; lane_move(dir,10,5); update_frq(32); delay_ms(1000); break ; /* lane moving */ case 220 : if ( is_lane_edge(sensor_data) == ON ) { action = 230 ; } else { straight_move(10,1000); update_frq(34); } break ; /* lane change completed */ case 230 : action = 240 ; if ( dir == DIR_RIGHT ) { dir = DIR_LEFT ; } else { dir = DIR_RIGHT ; } lane_move(dir,10,5); update_frq(36); delay_ms(1000); break ; /* lane slow move */ case 240 : action = 250 ; straight_move(10,1000); update_frq(38); break ; /* return */ case 250 : straight_move(20,0); update_frq(100); mode = MODE_NORMAL; break ; } } void main(void) { int i ; /* initialize */ index = 0 ; action = 0 ; /* init_road0(); */ init_road1(); mode = MODE_NORMAL ; /* */ for ( i = 0 ; i < 64 ; i++ ) { tsk3_proc(); tsk4_proc(); } }  テキストファイルに、動作内容を保存して解析します。 TASK action(0) judge(NORMAL) => action(10) judge(NORMAL) > direction: CENTER / DUTY front(0) rear(20) index(1) >> freq(100) >>> delay(1000) TASK action(10) judge(NORMAL) => action(10) judge(NORMAL) > direction: CENTER / DUTY front(0) rear(20) index(2) >> freq(100) >>> delay(1000) TASK action(10) judge(NORMAL) => action(20) judge(NORMAL) > direction: RIGHT / DUTY front(5) rear(10) index(3) >> freq(102) >>> delay(1000) > direction: CENTER / DUTY front(0) rear(20) index(3) >> freq(100) TASK action(20) judge(NORMAL) => action(30) judge(NORMAL) > direction: RIGHT / DUTY front(10) rear(10) index(4) >> freq(104) >>> delay(1000) > direction: CENTER / DUTY front(0) rear(20) index(4) >> freq(100) TASK action(30) judge(NORMAL) => action(20) judge(NORMAL) > direction: RIGHT / DUTY front(5) rear(10) index(5) >> freq(102) >>> delay(1000) > direction: CENTER / DUTY front(0) rear(20) index(5) >> freq(100) TASK action(20) judge(NORMAL) => action(10) judge(NORMAL) > direction: CENTER / DUTY front(0) rear(20) index(6) >> freq(100) >>> delay(1000) TASK action(10) judge(NORMAL) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(7) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(8) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(9) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) TASK action(110) judge(CRANK) => action(110) judge(CRANK) > direction: LEFT / DUTY front(10) rear(5) index(11) >>> delay(3000) TASK action(120) judge(CRANK) => action(120) judge(CRANK) > direction: LEFT / DUTY front(5) rear(5) index(12) >> freq(52) >>> delay(100) TASK action(120) judge(CRANK) => action(120) judge(CRANK) > direction: LEFT / DUTY front(5) rear(5) index(13) >> freq(52) >>> delay(100) TASK action(120) judge(CRANK) => action(120) judge(CRANK) TASK action(130) judge(CRANK) => action(130) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(15) >>> delay(1000) >> freq(54) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(16) >> freq(100) TASK action(140) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(17) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(18) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(19) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) TASK action(110) judge(CRANK) => action(110) judge(CRANK) > direction: RIGHT / DUTY front(10) rear(5) index(21) >>> delay(3000) TASK action(120) judge(CRANK) => action(120) judge(CRANK) > direction: RIGHT / DUTY front(5) rear(5) index(22) >> freq(52) >>> delay(100) TASK action(120) judge(CRANK) => action(120) judge(CRANK) > direction: RIGHT / DUTY front(5) rear(5) index(23) >> freq(52) >>> delay(100) TASK action(120) judge(CRANK) => action(120) judge(CRANK) TASK action(130) judge(CRANK) => action(130) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(25) >>> delay(1000) >> freq(54) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(26) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(27) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(28) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(29) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(30) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(31) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(0) >> freq(100) TASK action(140) judge(CRANK) => action(10) judge(NORMAL) > direction: CENTER / DUTY front(0) rear(20) index(1) >> freq(100) >>> delay(1000) TASK action(10) judge(NORMAL) => action(10) judge(NORMAL) > direction: CENTER / DUTY front(0) rear(20) index(2) >> freq(100) >>> delay(1000) TASK action(10) judge(NORMAL) => action(20) judge(NORMAL) > direction: RIGHT / DUTY front(5) rear(10) index(3) >> freq(102) >>> delay(1000) > direction: CENTER / DUTY front(0) rear(20) index(3) >> freq(100) TASK action(20) judge(NORMAL) => action(30) judge(NORMAL) > direction: RIGHT / DUTY front(10) rear(10) index(4) >> freq(104) >>> delay(1000) > direction: CENTER / DUTY front(0) rear(20) index(4) >> freq(100) TASK action(30) judge(NORMAL) => action(20) judge(NORMAL) > direction: RIGHT / DUTY front(5) rear(10) index(5) >> freq(102) >>> delay(1000) > direction: CENTER / DUTY front(0) rear(20) index(5) >> freq(100) TASK action(20) judge(NORMAL) => action(10) judge(NORMAL) > direction: CENTER / DUTY front(0) rear(20) index(6) >> freq(100) >>> delay(1000) TASK action(10) judge(NORMAL) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(7) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(8) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(9) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) TASK action(110) judge(CRANK) => action(110) judge(CRANK) > direction: LEFT / DUTY front(10) rear(5) index(11) >>> delay(3000) TASK action(120) judge(CRANK) => action(120) judge(CRANK) > direction: LEFT / DUTY front(5) rear(5) index(12) >> freq(52) >>> delay(100) TASK action(120) judge(CRANK) => action(120) judge(CRANK) > direction: LEFT / DUTY front(5) rear(5) index(13) >> freq(52) >>> delay(100) TASK action(120) judge(CRANK) => action(120) judge(CRANK) TASK action(130) judge(CRANK) => action(130) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(15) >>> delay(1000) >> freq(54) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(16) >> freq(100) TASK action(140) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(17) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(18) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(19) >>> delay(1000) >> freq(50) TASK action(100) judge(CRANK) => action(100) judge(CRANK) TASK action(110) judge(CRANK) => action(110) judge(CRANK) > direction: RIGHT / DUTY front(10) rear(5) index(21) >>> delay(3000) TASK action(120) judge(CRANK) => action(120) judge(CRANK) > direction: RIGHT / DUTY front(5) rear(5) index(22) >> freq(52) >>> delay(100) TASK action(120) judge(CRANK) => action(120) judge(CRANK) > direction: RIGHT / DUTY front(5) rear(5) index(23) >> freq(52) >>> delay(100) TASK action(120) judge(CRANK) => action(120) judge(CRANK) TASK action(130) judge(CRANK) => action(130) judge(CRANK) > direction: CENTER / DUTY front(0) rear(10) index(25) >>> delay(1000) >> freq(54) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(26) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(27) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(28) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(29) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(30) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(31) >> freq(100) TASK action(140) judge(CRANK) => action(140) judge(CRANK) > direction: CENTER / DUTY front(0) rear(20) index(0) >> freq(100)  この結果から、作成した2つの関数に問題がないこと  がわかりました。  ただし、この結果を出すまでに、関数tsk3_procは3回  修正してあります。単純に、if文の書き方がまずかった  だけのミスでしたが、そのままファームウエアにすると  マシンのおかしな挙動が発生していたでしょう。  CUIを利用したテスト方法は、非常に単純ですが  事前テストにより、ファームウエアの信頼度が  上がります。
目次

inserted by FC2 system