第十章 ロボットサッカーにチャレンジ


10-2-1 信号を受信しパルス幅を計測する

I2Cセンサモジュールで使う関数です。


spanMeasure
void spanMeasure(unsigned char x)
{
  int i;
  unsigned char val,p;
  Data[3] = 255;  // portc bit番号
  p = 1<<x;
  Data[0] = inWork = 0xff;
  Busy=1;
  Data[1] = 0;
  OPTION_REG.T0CS=0;  // なぜ必要か原因不明
  i = 0;
  val = PORTC&p;
  if(!val) while(i++<TLIMIT){
    val = PORTC;
    if((val & p) !=0) break;
  }
  if(i>=TLIMIT) goto end;
  i=0;
  while(i++<TLIMIT){
    val = PORTC;
    if((val & p)==0) break;
  }
  if(i>=TLIMIT) goto end;
  TMR0=0;
  timer=0;
  i=0;
  while(i++<TLIMIT){
    val = PORTC;
    if((val & p)!=0) break;
  }
  if(i>=TLIMIT) goto end;
  Data[x+4]=timer;
  Data[3] = x;  // portc bit番号
  Data[2] = TMR0;
  Data[1] = timer;
  Data[0] = inWork = 0;
  Busy=0;
  return;
end:
  Data[3] = x;  // portc bit番号
  Data[2] = 255;
  Data[1] = 0;
  Data[0] = inWork = 0;
  Busy=0;
  return;
}

 1 x番のセンサーのパルス幅を求める
 2 
 3 
 4 
 5 busyフラグ
 6 センサーを特定する
 7 ソフト的に仕事中にする
 8 ハード的に仕事中にする
 9 sbit Busy at PORTB.B5;
10 
11 
12 
13 すでにLowになっていたらHigh
14 になるまで待つ
15 
16
17 Lowになりっぱなしだったら終了
18 
19 
20
21 Lowになるのを待つ
22
23
24 ハードタイマーをクリアする
25 ソフトタイマーをクリアする
26
27
28
29 Highになるのを待つ
30 
31
32 ソフトタイマーの値
33 
34 ハードタイマーの値
35 ソフトタイマーの値をコピー
36 仕事のソフト的終了
37 仕事のハード的終了を知らせる
38 
39 
40 
41 異常終了
42 異常終了
43 仕事のソフト的終了
44 仕事のハード的終了を知らせる
45 
46 
47 

10-2-2 コマンド解析部分

ポートCの全ビット(8個)は数十kΩの抵抗でプルアップしておきます。
このプログラムのチェックには、一番始めに作った10-1-1 受信モジュールの出力の模擬 のシステムを利用します。

I2Cコマンド解釈部分
        case 8:  // Ball distance
            ANSEL  = 0x07;  // Configure AN pins as AD, AN0~2
            ANSELH = 0;
            TRISC = 0xff;
            TRISB &= 0xdf;  //bit5 output
            PORTB.B5 = 0;
            switch(subCmd){
              case 0:
                   OPTION_REG.T0CS=0;
                   INTCON.T0IE=1;    // Enables the Timer0 interrupt
                   INTCON.T0IF=0;
                   break;
              case 1:
                   spanMeasure(param);
                   break;
              case 2:
                   for(i=0; i<8; i++)
                     spanMeasure(i);
                   break;
            }
 1 
 2 
 3 
 4 ポートCを全部入力に設定する
 5 Busy出力用
 6 No Busy
 7 サブコマンド解析
 8 初期化コマンド
 9 タイマーを割り込みで開始
10 
11 
12 
13 
14 param番センサーの値を得る
15 
16 
17 8個全部のセンサーをスキャンする
18 
19 
20 


回路図
 RC5  ---47kΩ----------|   Vcc=3.3V
 RC4  ---47kΩ---22kΩ--|    |
 RC3  ---47kΩ---33kΩ--|   LED
 RC6  ---47kΩ---47kΩ--|    |
                        |---|< 2SC1815
                             |
                            GND


第一章に行く    ホームに戻る