/**********************************************************/ /* */ /* CMOS-EYE ATmega128動体検知サンプルプログラム */ /* Target Board:BestTechnorogy BTC068 */ /* Environment:GDL1.7.4.0 */ /* Since:2006.9.13 */ /* (c) AsakusaGiken Co., LTD. T.Ishii */ /* */ /**********************************************************/ /*----------------------------------------------------------------------------------- ピンアサイン (CMOS-EYE - ATmega128) A0 PA0 A1 PA1 A2 PA2 A3 PA3 A4 PA4 A5 PA5 A6 PA6 A7 PA7 A8 PC0 A9 PC1 A10 PC2 A11 PC3 A12 PC4 A13 PC5 A14 PC6 A15 PC7 A16 PG0 A17 PG1 A18 PG2 D0 PF0 D1 PF1 D2 PF2 D3 PF3 D4 PF4 D5 PF5 D6 PF6 D7 PF7 M0 PE5 M1 PE6 M2 PE7 CE PE2 WE PE3 OE PE4 ST PB0 BSY PB1 RX PD3/TXD1 *CMOS-EYEシリアル命令用 TX PD2/RXD1 (BTC068上ですでに配線されているもの) LED PB7 *BTC068上のLED (オシロ<-ATmega128) TEST PB2 *TESTは処理時間測定用、オシロスコープで波形を計測 ------------------------------------------------------------------------------------------*/ /*-----------------------------------------------*/ /* ヘッダファイルインクルード */ /*-----------------------------------------------*/ #include /* ATmega128の内部I/O定義をインクルード(GDL付属のヘッダファイル) */ /*-----------------------------------------------*/ /* 名称定義 */ /*-----------------------------------------------*/ /*---ピン---*/ #define ADDR1 PORTA #define ADDR2 PORTC #define ADDR3 PORTG #define DATA_IN PINF #define DATA_OUT PORTF #define M0 PE5 #define M1 PE6 #define M2 PE7 #define CE PE2 #define WE PE3 #define OE PE4 #define ST PB0 #define BSY PB1 #define RX PD3 #define TX PD2 #define LED PB7 #define TEST PB2 /*---IO方向---*/ #define DATA_DIR DDRF //#define INPUT 0 #define ALL_INPUT 0x00 //#define OUTPUT 1 #define ALL_OUTPUT 0xFF /*---その他---*/ #define LOW 0 #define HIGH 1 /*-----------------------------------------------*/ /* アドレスセット */ /*-----------------------------------------------*/ void set_address(long myAddr) { /*引数は19ビット以上必要なのでlong 型(32ビット)*/ ADDR1 = (unsigned char)(0x000000FF & myAddr); ADDR2 = (unsigned char)((0x0000FF00 & myAddr)>>8); ADDR3 = (unsigned char)((0x00070000 & myAddr)>>16); } /*-----------------------------------------------*/ /* 設定 (M0-M2,CE,WE,OEのみ) */ /*-----------------------------------------------*/ void set_high(unsigned char myPin) { PORTE |= (1<>BSY; } /*-----------------------------------------------*/ /* LED (LOWで点灯、HIGHで消灯) */ /*-----------------------------------------------*/ void LED_ON(void) { PORTB &= ~(1< nowData) threLo = 0; /* 許容範囲で上限値と加減値をセット */ else threLo = nowData - myDiff; /* (1バイトなので0-255の範囲にまるめる) */ if(nowData > (255-myDiff)) threHi = 255; else threHi = nowData + myDiff; DATA_DIR = ALL_OUTPUT; /* データバスを出力へ */ if (pstData >= threLo && pstData <= threHi){ /* 範囲内か? */ setPixData(toAddr + cnt, 255); /* 範囲内なら背景(白:255)を描画 */ }else{ setPixData(toAddr + cnt, 0); /* 範囲外なら対象ありで黒(0)を描画 */ } } DATA_DIR = ALL_INPUT; /* 後処理 */ set_high(CE); } /*-----------------------------------------------*/ /* メイン */ /*-----------------------------------------------*/ void main(void) { unsigned char cnt; /* ループカウント用変数 */ unsigned char diff,x,y; unsigned char* p; unsigned char snd_data[5]; long addr1,addr2,addr3,length; /* ---IO初期化--- */ init_io(); /* ---LED3回点滅--- */ for (cnt=0; cnt<3; cnt++){ LED_ON(); wait_ms(100); LED_OFF(); wait_ms(100); } /* ---CMOS-EYEが立ち上がるまで待つ--- */ wait_ms(3000); /*---画像モード設定---*/ PORTE |= 0x1C; /*80x60白黒モード*/ wait_ms(200); /*設定終了まで待つ*/ /*---AWBとAE機能オフ(シリアル命令)---*/ p = snd_data; snd_data[0] = 255; /*シンクロバイト*/ snd_data[1] = 98; /*CMOS-EYE ID(初期値は98)*/ snd_data[2] = 2; /*送信データ長*/ snd_data[3] = 102; /*命令102(自動機能設定)*/ snd_data[4] = 0; /*AWBオフ、AEオフ*/ tx(p, 5); /*命令送信*/ wait_ms(500); /*命令が反映されるまで待つ(約500mS)*/ /*-----------------------------*/ /* メインループ */ /*-----------------------------*/ x = 80; /*画面幅*/ y = 60; /*画面縦*/ length = 4800; /*画面サイズ*/ addr1 = 0; /*背景画像アドレス*/ addr2 = 4800; /*現在画像アドレス*/ addr3 = 9600; /*結果画像アドレス*/ diff = 100; /*許容範囲*/ set_address(addr1); /*背景を撮影*/ shatter(); while(1){ /*5秒おきループ*/ wait_ms(5000); set_address(addr2); /*現在画像を撮影*/ shatter(); set_TEST_high(); /*時間計測開始*/ moveDetect(addr1,addr2,addr3,length,diff); /*動体検出*/ set_TEST_low(); /*時間計測修了*/ } }