目次
前
次
接続信号
回路図を描いたので、信号をどう生成するか検討します。
データシートのタイミングチャートを読みながら、各信号を生成
する関数を定義します。
リセット
リセットは、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ビットに圧縮します。
圧縮すると、画像処理と解析が楽になりますし、マイコン内部での処理が
単純になります。
目次
前
次