| 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 |
| 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
|