目次

接続信号

 回路図を描いたので、信号をどう生成するか検討します。

 データシートのタイミングチャートを読みながら、各信号を生成
 する関数を定義します。


リセット

 リセットは、XRSTとRESETと2信号ありますが、コネクタ  には、XRSTとして出力されています。  タイミングチャートから、XCKに同期させてXRSTを変化させます。  ファームウエアから制御する場合、XCKは頻繁にHとLを繰り返すので  与える論理値により、信号を切り替える関数を定義します。 #define XCK 2 void set_xck(UBYTE x) { if ( x ) { PORTA |= (1 << XCK) ; } else { PORTA &= ~(1 << XCK) ; } } コーリングシーケンスは、次のようにします。 #define OFF 0 #define ON OFF+1   Hを出力 set_xck(ON);   Lを出力 set_xck(OFF);  リセットそのものを関数にします。 #define XRST 3 void reset_cam(void) { /* impress XCK:L */ set_xck(OFF); /* impress XRST:L */ PORTA &= ~(1 << XRST) ; /* impress XCK:H */ set_xck(ON); /* impress XRST:H */ PORTA |= (1 << XRST) ; /* impress XCK:L */ set_xck(OFF); }

データセット

 GBCを動かすためには、モードを設定しなければなりません。  そのために、SIN、LOADを使い8ビットデータを転送します。  タイミングチャートは、以下です。  8ビットデータは、レジスタ番号を設定してから、転送します。  全体で11ビットなので、16ビットでレジスタ番号と8ビットを  合成して関数に渡します。 send_cam((1 << 8) | 0x12);  XCKの制御は定義済みなので、SINデータ出力を定義します。 #define SIN 5 void set_sin(UBYTE x) { if ( x ) { PORTA |= (1 << SIN) ; } else { PORTA &= ~(1 << SIN) ; } }  LOADの変化を加えて、関数send_camを定義します。 #define LOAD 4 void send_cam(UWORD x) { UWORD tmp ; UBYTE i ; /* get variable */ tmp = x ; /* set default */ set_sin(OFF); set_sck(OFF); PORTA &= ~(1 << LOAD); /* send register number */ for ( i = 0 ; i < 3 ; i++ ) { /* impress data */ set_sin(OFF); if ( tmp & 0x400 ) { set_sin(ON) ; } /* impress XCK:H */ set_sck(ON); /* shift */ tmp <<= 1 ; /* impress XCK:L */ set_sck(OFF); } /* get variable */ tmp = x ; /* send data */ for ( i = 0 ; i < 8 ; i++ ) { /* impress LOAD:H */ PORTA |= (1 << LOAD); /* impress data */ set_sin(OFF); if ( tmp & 0x80 ) { set_sin(ON) ; } /* impress XCK:H */ set_sck(ON); /* shift */ tmp <<= 1 ; /* impress XCK:L */ set_sck(OFF); } /* set default */ set_sin(OFF); PORTA &= ~(1 << LOAD); }

変換開始

 GBCで撮影するためには、START信号を与えます。  タイミングチャートは、以下です。  開始そのものを関数にします。 #define START 6 void send_start(void) { /* impress START:L */ PORTA &= ~(1 << START) ; /* impress XCK:L */ set_xck(OFF); /* impress START:H */ PORTA |= (1 << START) ; /* impress XCK:H */ set_xck(ON); /* impress START:L */ PORTA &= ~(1 << START) ; /* impress XCK:L */ set_xck(OFF); }

変換開始

 GBCが撮影した内容を取得するためには、READ信号を待ちます。  READ信号がHになったなら、VoutをA/D変換します。  タイミングチャートは、以下です。  GBCは、128ピクセルx128ラインの合計16kバイトのデータを出力します。  READ信号がHであるとき、VoutをA/D変換してシリアル出力します。 #define MAX_SIZE 16384 UWORD img_cnt ; void get_img(void) { UWORD result ; UBYTE dh; UBYTE dl; /* send start trigger */ send_start() ; /* loop */ img_cnt = 0 ; while ( img_cnt < MAX_SIZE ) { /* impress XCK:H */ set_xck(ON); /* impress XCK:L */ set_xck(OFF); /* judge */ if ( PINA & 0x02 ) { /* start ADC */ ADCSR |= (1 << ADSC) ; /* wait conversion */ while ( (ADCSR & (1 << ADSC)) ) ; /* get ADC value */ dl = ADCL ; dh = ADCH ; result = (dh << 8) + dl ; /* shift */ result >>= 2 ; /* send UART */ show_value( (UBYTE)result ); /* increment */ img_cnt++ ; } } }  AT90S8535は、10ビットのA/D変換器をもちますが、8ビットに圧縮します。  圧縮すると、画像処理と解析が楽になりますし、マイコン内部での処理が  単純になります。

目次

inserted by FC2 system