/* 汎用防犯装置プログラム COMPORT通信速度300ボー 受信信号構成 **\\%%%%%%! **マイコンの名前 \\コマンド %%%%%コマンド依存 !信号終了記号 GG 温度計測結果を発送する GH 湿度計測結果を発送する GI 高輝度LEDを点灯する GJ 高輝度LEDを消灯する GK ブザーを鳴らす GL ブザーを消す GM LED赤点灯 GN LED赤消灯 GO LED黄点灯 GP LED黄消灯 GQ LED青点灯 GR LED青消灯 GS ブザーを一定期間鳴らす4文字の数値がついている必要あり GT 人を検知したら一定期間ブザーを鳴らす GU 人を検知してもブザーを鳴らさない GV 人を検知したら一定期間高輝度LEDを光らす GW 人を検知しても高輝度LEDを光らさない GX 防犯解除キーをセット2文字の数値がついている必要あり GY 防犯解除キー入力を受け付けるようにする GZ 防犯解除入力を受け付けないようにする Gg 単に返答をする Gh フラグ情報をサーバーへ返す。1文字目:警備解除キーが押された2、3文字目:人センサーの検知回数 Gi 設定状況をサーバーへ返す。。1文字目:人検知時ブザーを鳴らすか 2文字目:人検知時LEDを光らせるか 3文字目:警備解除キーを受け付けるか Gj 特定のポートのIO設定を行う。1文字目:port名(1,5,7,8) 2文字目:port番号(0〜7)3文字目:io:1=出力0=入力に指定する Gk 特定の出力ポートの設定を行う。1文字目:port名(1,5,7,8) 2文字目:port番号(0〜7)3文字目:io:1=H0=Lに指定する.Gjで出力に指定してから用いる Gl 特定の入力port、bitno番目の端子のl/hを取得する。1文字目:port名(1,5,7,8,B) 2文字目:port番号(0〜7)Gjで入力に指定してから用いる。1,0を返す Gm 各PORTの状態を返す1,5,7,8,Bの順 */ #include #include "C:\work\yh8\tomolib3664\3664f.h" #include "C:\work\yh8\tomolib3664\sci3.h" #include "C:\work\yh8\tomolib3664\adc.h" #include "C:\work\yh8\tomolib3664\io.h" #include "C:\work\yh8\tomolib3664\timer.h" #include "C:\work\yh8\tomolib3664\y_sonota.h" void main( void ); void interrupt timertsta(void); void interrupt irq0int(void); void interrupt irq1int(void); void interrupt irq2int(void); void interrupt irq3int(void); void interrupt sci3int(void); void buza3(void); void GG( void );void GH( void );void GI( void );void GJ( void );void GK( void );void GL( void ); void GM( void );void GN( void );void GO( void );void GP( void );void GQ( void );void GR( void ); void GS( void );void GT( void );void GU( void );void GV( void );void GW( void );void GX( void ); void GY( void );void GZ( void ); void Gg( void );void Gh( void );void Gi( void );void Gj( void );void Gk( void );void Gl( void ); void Gm( void );//void Gn( void );void Go( void );void Gp( void );void Gq( void );void Gr( void ); //void Gs( void );void Gt( void );void Gu( void );void Gv( void );void Gw( void );void Gx( void ); //void Gy( void );void Gz( void ); char miname[2] ; //マイコンの名前を格納。マイコンによって全て違うように設定する unsigned char hito = 0 ;//人センサーの反応回数を記録する unsigned int jusinmojisu; //COMMPORTより受信した文字数を格納 unsigned char meirei[30]; //COMMPORTより受信した信号を格納 unsigned char jusinflug ; //命令の受信を確認した場合、1その他は0 unsigned char hitobuzaflug ; //人を検知した場合ブザーを鳴らす=1その他は0 unsigned char hitoledflug ; //人を検知した場合LEDを点灯=1その他は0 unsigned char hitoledcount ; //人を検知した場合LEDを点灯した場合のタイマ unsigned char keyflug ; //key解除のための入力を受け付ける=1その他は0 unsigned char key; //警備解除のためのキー unsigned char keytmp; //警備解除のためのキー入力 unsigned char keykaijoflug; //警備解除要請が出たことを示す=1その他は0 void main( void ) { unsigned char tmp; unsigned int i; miname[0] = 'G';miname[1] = 'G'; //マイコンの名前設定 jusinmojisu = 0; jusinflug = 0; hitobuzaflug = 0; hitoledflug = 0; hitoledcount = 61; key = 1; keytmp = 0xff; keykaijoflug = 0; keyflug = 0; //iniSci2( (unsigned char) 1 ,(unsigned char) 103 ); //通信速度設定1200boo iniSci2( (unsigned char) 2 ,(unsigned char) 103 ); //通信速度設定300boo //IRQ0割り込みの設定 //P1-4端子の状態により割り込みを発生させる //割り込みベクタ番号14 tmp = PMR1 ; tmp = ( tmp | 0x10 ); PMR1 = tmp; //port1-4の機能をirq0入力端子に設定 tmp = IEGR1; tmp = ( tmp | 0x01 ); IEGR1 = tmp; //立ち上がりエッジで割り込むように設定 tmp = IRR1 ; tmp = (tmp & ( ~0x01 )); IRR1 = tmp ; //IRR1の0Bit目、IRRI0(割り込み時に立つBit)をクリアしておく tmp = IENR1; tmp = ( tmp | 0x01 ); IENR1 = tmp; //IRQ0割り込みを許可 startTma( 1 ); //1秒ごとの割り込みを設定 tmp = SCR3; tmp = ( tmp | 0x40 ); SCR3 = tmp; //SCI3割り込みを許可 //ループ。信号を受信し、信号に従って分岐する do{ if( jusinflug ==1) { //命令をチェック switch(meirei[2]) { case 'G': switch(meirei[3]) { //温度測定結果を発送 case 'G': GG(); break; //湿度測定結果を発送 case 'H': GH(); break; //高輝度LEDを点灯 case 'I': GI(); break; //高輝度LEDを消灯する case 'J': GJ(); break; //ブザーを鳴らす case 'K': GK(); break; //ブザーを消す case 'L': GL(); break; //LED赤点灯 case 'M': GM(); break; //LED赤消灯 case 'N': GN(); break; //LED青点灯 case 'O': GO(); break; //LED青消灯 case 'P': GP(); break; //LED黄点灯 case 'Q': GQ(); break; //LED黄消灯 case 'R': GR(); break; //一定期間ブザーを鳴らす4文字の数値がついている必要あり case 'S': GS(); break; //人を検知したら一定期間ブザーを鳴らす case 'T': GT(); break; //人を検知してもブザーを鳴らさない case 'U': GU(); break; //人を検知したら一定期間高輝度LEDを光らす case 'V': GV(); break; //人を検知したら一定期間高輝度LEDを光らさない case 'W': GW(); break; //防犯解除キーをセット2文字の数値がついている必要あり case 'X': GX(); break; //防犯解除キー入力を受け付けるようにする case 'Y': GY(); break; //防犯解除キー入力を受け付けないようにする case 'Z': GZ(); break; //単に返答をする case 'g': Gg(); break; //フラグ情報をサーバーへ返す。1文字目:警備解除キーが押された2、3文字目:人センサーの検知回数 case 'h': Gh(); break; //設定状況をサーバーへ返す。1文字目:人検知時ブザーを鳴らすか 2文字目:人検知時LEDを光らせるか 3文字目:警備解除キーを受け付けるか case 'i': Gi(); break; //Gj 特定のポートのIO設定を行う。1文字目:port名(1,5,7,8) 2文字目:port番号(0〜7)3文字目:io:1=出力0=入力に指定する case 'j': Gj(); break; //Gk 特定の出力ポートの設定を行う。1文字目:port名(1,5,7,8) 2文字目:port番号(0〜7)3文字目:io:1=H0=Lに指定する.Gjで出力に指定してから用いる case 'k': Gk(); break; //Gl 特定の入力port、bitno番目の端子のl/hを取得する。1文字目:port名(1,5,7,8,B) 2文字目:port番号(0〜7)y_iniio()で入力に指定してから用いる。 case 'l': Gl(); break; //Gm 各PORTの状態を返す1,5,7,8,Bの順 case 'm': Gm(); break; default: break; } break; default: break; } jusinflug = 0; //初期化 for( i = 0;i<30;i++){ meirei[i] = ' ';} jusinmojisu =0; } }while(1); } //end main() //sci3割り込み void interrupt sci3int(void) { unsigned char tmp; unsigned int i; unsigned char tmpflug; tmpflug = 'T'; //SSRの2Bit目、TEND(受信DATAfull割り込み時に立つBit)をクリア tmp = SSR ; tmp = 0x80; SSR = tmp ; tmp = RDR; // outCh( tmp ); //デバッグ用 if(tmp != '!') { if( jusinmojisu<30){ meirei[jusinmojisu] = tmp ; jusinmojisu++; } }else { //'!'を受け取った後の処理 //名前が一致するかチェック if( meirei[0] == miname[0]){ if( meirei[1] == miname[1]){ jusinflug = 1; }else{tmpflug='F';}}else{tmpflug='F';} } if(tmpflug =='F') { jusinflug = 0; jusinmojisu =0; for( i = 0;i<30;i++){ meirei[i] = ' ';} } return; } //1秒ごとの割り込み void interrupt timertsta(void) { unsigned char tmp; //IRR1の6Bit目、IRRTA(TIMERA割り込み時に立つBit)をクリア tmp = IRR1 ; tmp = tmp & ( ~0x40 ); IRR1 = tmp ; //高輝度LED消灯のチェック if( hitoledcount <60){hitoledcount++;} if( hitoledcount == 60 ) { hitoledcount++; //高輝度LEDを消灯する setIo( '8' , 3 , 0 ); //port8-3 をLにセット。 iniIo( '8' , 3 , 0 ); //port8-3 を入力に設定。 } // hito=0; return; } //IRQ0割り込み //人センサーに繋がっている。 void interrupt irq0int(void) { unsigned char tmp; //IRR1の0Bit目、IRRTA(irq0割り込み時に立つBit)をクリア tmp = IRR1 ; tmp = tmp & ( ~0x1 ); IRR1 = tmp ; //ブザーを鳴らすかの検査 if( hitobuzaflug == 1) { tmp = IENR1; tmp = tmp & ( ~0x1 ); IENR1 = tmp; //IRQ0割り込みを不許可 buza3(); tmp = IENR1; tmp = ( tmp | 0x01 ); IENR1 = tmp; //IRQ0割り込みを許可 } //高輝度LED点灯の検査 if( hitoledflug == 1) { //高輝度LEDを点灯する iniIo( '8' , 3 , 1 ); //port8-3 を出力に設定。 setIo( '8' , 3 , 1 ); //port8-3 をHにセット。 //消灯は1秒割り込みで行う hitoledcount = 0; } hito++; return; } //IRQ1割り込み void interrupt irq1int(void) { unsigned char tmp; unsigned int i,ii; tmp = IENR1; tmp = tmp & ( ~0x2 ); IENR1 = tmp; //IRQ1割り込みを不許可 tmp = IRR1 ; tmp = tmp & ( ~0x2 ); IRR1 = tmp ; //IRR1の1Bit目、IRRTA(irq1割り込み時に立つBit)をクリア for(i=0;i<0xff;i++){ for(ii=0;ii<0xff;ii++){ }} tmp = IENR1; tmp = ( tmp | 0x02 ); IENR1 = tmp; //IRQ1割り込みを許可 outCh( '0' ); //デバッグ用 //警備解除キー受付時の処理 if( keyflug ==1) { keytmp = (keytmp<<1); } return; } //IRQ2割り込み void interrupt irq2int(void) { unsigned char tmp; unsigned int i,ii; tmp = IENR1; tmp = tmp & ( ~0x4 ); IENR1 = tmp; //IRQ2割り込みを不許可 tmp = IRR1 ; tmp = tmp & ( ~0x4 ); IRR1 = tmp ; //IRR1の2Bit目、IRRTA(irq2割り込み時に立つBit)をクリア for(i=0;i<0xff;i++){ for(ii=0;ii<0xff;ii++){ }} tmp = IENR1; tmp = ( tmp | 0x04 ); IENR1 = tmp; //IRQ2割り込みを許可 outCh( '1' ); //デバッグ用 //警備解除キー受付時の処理 if( keyflug ==1) { keytmp = (keytmp<<1); keytmp = keytmp + 1; } return; } //IRQ3割り込み void interrupt irq3int(void) { unsigned char tmp; unsigned int i,ii; tmp = IENR1; tmp = tmp & ( ~0x8 ); IENR1 = tmp; //IRQ3割り込みを不許可 tmp = IRR1 ; tmp = tmp & ( ~0x8 ); IRR1 = tmp ; //IRR1の3Bit目、IRRTA(irq3割り込み時に立つBit)をクリア for(i=0;i<0xff;i++){ for(ii=0;ii<0xff;ii++){ }} tmp = IENR1; tmp = ( tmp | 0x08 ); IENR1 = tmp; //IRQ3割り込みを許可 outCh( '3' ); //デバッグ用 //警備解除キー受付時の処理 if( keyflug ==1) { if(key==keytmp){ keykaijoflug = 1;outCh( 'T' ); } else{outCh( 'F' );}//デバッグ用 keytmp = 0; } return; } //ブザーを3回鳴らす void buza3(void) { unsigned int i,ii,iii; iniIo( '8' , 1 , 1 ); //port8-1 を出力に設定。 for(iii=0;iii<3;iii++){ setIo( '8' , 1 , 1 ); //port8-1 をHにセット。 for(i=0;i<0xff;i++){ for(ii=0;ii<120;ii++){ }} setIo( '8' , 1 , 0 ); //port8-1 をLにセット。 for(i=0;i<0xff;i++){ for(ii=0;ii<500;ii++){ }} } iniIo( '8' , 1 , 0 ); //port8-1 を入力に設定。 return; } //温度計測結果を発送する void GG( void) { unsigned int ad; ad = adcn( 1 ); outCh( miname[0] );outCh( miname[1] ); outChfi( ad ); outCh( '!' ); return; } //湿度計測結果を発送する void GH( void) { unsigned int ad; ad = adcn( 3 ); outCh( miname[0] );outCh( miname[1] ); outChfi( ad ); outCh( '!' ); return; } //高輝度LEDを点灯する void GI( void) { iniIo( '8' , 3 , 1 ); //port8-3 を出力に設定。 setIo( '8' , 3 , 1 ); //port8-3 をHにセット。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //高輝度LEDを消灯する void GJ( void) { setIo( '8' , 3 , 0 ); //port8-3 をLにセット。 iniIo( '8' , 3 , 0 ); //port8-3 を入力に設定。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //ブザーを鳴らす void GK( void) { iniIo( '8' , 1 , 1 ); //port8-1 を出力に設定。 setIo( '8' , 1 , 1 ); //port8-1 をHにセット。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //ブザーを消す void GL( void) { setIo( '8' , 1 , 0 ); //port8-1 をLにセット。 iniIo( '8' , 1 , 0 ); //port8-1 を入力に設定。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //LED赤点灯 void GM( void) { iniIo( '8' , 0 , 1 ); //port8-0 を出力に設定。 setIo( '8' , 0 , 1 ); //port8-0 をHにセット。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //LED赤消灯 void GN( void) { setIo( '8' , 0 , 0 ); //port8-0 をLにセット。 iniIo( '8' , 0 , 0 ); //port8-0 を入力に設定。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //LED青点灯 void GO( void) { iniIo( '8' , 2 , 1 ); //port8-2 を出力に設定。 setIo( '8' , 2 , 1 ); //port8-2 をHにセット。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //LED青消灯 void GP( void) { setIo( '8' , 2 , 0 ); //port8-2 をLにセット。 iniIo( '8' , 2 , 0 ); //port8-2 を入力に設定。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //LED黄点灯 void GQ( void) { iniIo( '8' , 4 , 1 ); //port8-4 を出力に設定。 setIo( '8' , 4 , 1 ); //port8-4 をHにセット。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //LED黄消灯 void GR( void) { setIo( '8' , 4 , 0 ); //port8-4 をLにセット。 iniIo( '8' , 4 , 0 ); //port8-4 を入力に設定。 outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); return; } //ブザーを一定期間鳴らす4文字の数値がついている必要あり void GS( void) { char * ch1=" "; unsigned int timer , i,ii ; outCh( miname[0] );outCh( miname[1] ); outCh( '!' ); *ch1 =meirei[4]; *(ch1+1) =meirei[5]; *(ch1+2) =meirei[6]; *(ch1+3) =meirei[7]; *(ch1+4) ='\0'; timer = y_conv_ch4_touint( ch1 ); iniIo( '8' , 1 , 1 ); //port8-1 を出力に設定。 setIo( '8' , 1 , 1 ); //port8-1 をHにセット。 for(i=0;i