外部SRAM操作
H8/3048Fボードとc328(scam)の間には、SRAMを載せたボードを入れます。
SRAMの容量は、32kバイトで非圧縮の160x120(19200バイト)で
画像を取得した時、1画面分を保存できます。
H8のファームウエアで、c328(scam)が転送してきた画像データを
SRAMに保存します。
GBC(GameBoyCamera)のハードウエアと共有できるようにしたため
次のような回路にしてあります。
SRAMへのデータ保存、SRAMからのデータ取得が必要になるので
それぞれを定義します。
アドレス、データ信号処理
回路図に示したように、SRAMのアドレス、データはポートAを
利用して設定あるいは取得します。
アドレス16ビットは、ポートAに接続した2個の8ビットレジスタ
に格納します。
16ビットを上位8ビット、下位8ビットの2回に分けて出力し
ラッチパルスAHT、ALTを与えて、記憶します。
16ビットアドレスの更新には、関数update_addressを利用します。
アドレスの上位8ビットは、ひとつ前の処理から変化があれば
レジスタに格納する方式とし、可能な限りアクセス回数を減ら
しておきます。
void update_address(UWORD x)
{
UBYTE ah ;
UBYTE al ;
/* send upper byte */
ah = x / 256 ;
if ( ah != pre_ah ) {
PADR = ah ;
atrg(TRG_UPPER | ON ) ;
pre_ah = ah ;
atrg(TRG_UPPER | OFF) ;
}
/* send lowrebyte */
al = x % 256 ;
PADR = al ;
atrg(TRG_LOWER | ON ) ;
al = ah ;
atrg(TRG_LOWER | OFF) ;
}
アドレス設定後、SRAMへの書き込みでは、ポートAにデータを出力します。
SRAMからの読み込みでは、ポートAを入力に設定後、データを入力します。
データ出力時は、nWE信号をH=>L=>Hとして、SRAMにデータを記憶します。
データ入力時は、nOE信号をH=>L=>Hとして、SRAMにデータを記憶します。
nWE信号とnOE信号のパルス出力を、ひとつの関数にまとめます。
void atrg(UBYTE x)
{
if ( x == 0 ) { ALT = OFF ; }
if ( x == 1 ) { ALT = ON ; }
if ( x == 2 ) { AHT = OFF ; }
if ( x == 3 ) { AHT = ON ; }
}
SRAMへのデータ保存
アドレス(16ビット)とデータ(8ビット)を渡して
ポートA操作とラッチパルスを出力します。
void put_sram(UWORD adr,UBYTE dat)
{
UBYTE result ;
/* send address */
update_address(adr);
/* send data */
PADR = dat ;
/* enable WE */
SRAM_OE = LOFF ;
SRAM_WE = LON ;
/* wait */
result = 0 ;
/* disable WE */
SRAM_WE = LOFF ;
}
データのセットアップタイム、ホールドタイムが必要なので
ダミーで変数に値を入力する処理を入れています。
SRAMからのデータ取得
アドレス(16ビット)を渡して、ポートA操作とラッチパルス
を出力します。さらに、ポートAの入出力方向を切替えながら
データを入力します。
UBYTE get_sram(UWORD adr)
{
UBYTE result ;
/* send address */
update_address(adr);
/* change input */
PADDR = 0x00 ;
/* enable OE */
SRAM_WE = LOFF ;
SRAM_OE = LON ;
/* get 1 byte */
result = PADR ;
/* disable OE */
SRAM_OE = LOFF ;
/* change output */
PADDR = 0xff ;
return result ;
}
データの衝突を避けるため、アドレスを出力したなら
即座に、入力に切替えます。データ入力後、nOE信号を
ディセーブルにしてから、出力に戻します。
目次
前
次