こんにちわ。進藤です。
先日イエローソフトの製品が届きまして、嬉々として使っております次第です。
ところで、今回は、、
LCDに画像を表示させるべく、デュアルポートメモリ(VRAM)を使いたいのですが、
うまく動作させることができません。色々試してはみたのですが。。。
富士通のMB81461-12という古めのVRAMで、簡単な記事がトランジスタ技術の1986年
11月号に載っています(ずいぶん古いです…)。
VRAMといってもCPUから見る分には基本的にはDRAMですので、特別な設定はせずに
外部増設DRAMとして扱うことができるかと思います。
過去ログや熊谷研究室のページなど参考にしたつもりではあるのですが、どこが間違って
いるのでしょうか。。
というのが今回の質問です。
以下に今の状況を書きます。
H8とRAMとの接続です。RAM側のみを書きます。
H8側 MB81461側
HWR(P6-5) ------- WE
CS3(P8-1) ------- RAS <-1KΩ抵抗でプルアップ
RD(P6-4) ------- CAS
D8(P3-0) ------- DQ0
D9(P3-1) ------- DQ1
D10(P3-2) ------- DQ2
D11(P3-3) ------- DQ3
A0(P1-0) ------- A0
:
A7(P1-7) ------- A7
さらに簡単なプログラムとして、PCから入力した値をRAMへ書き込んで
次の瞬間読み出して表示するというものを作っています。
イエローソフトのCコンパイラを使用していまして、PCとのシリアル通信の
設定はスタートアップルーチン(アセンブリ部分)にて行っております。
以下はそのCの部分のプログラムです。
(ちなみにVRAMではなく内部アドレスで同様にした場合はうまく動作しました。)
/*-------------------------------------------------------
VRAM(MB81461-12)[65536word * 4bit]
RAMポートアクセスタイム(max) 120ns
RAMポートサイクルタイム(min) 230ns
PCとの通信速度9600bps
-------------------------------------------------------*/
#include <3048f.h>
#include <stdio.h>
#pragma seg_bss VRAM
unsigned char VRAM[0x10000]; /* VRAMというセグメントに領域を確保 */
#pragma seg_bss_end
/*------------------ウエイト--------------------------*/
void wait1(unsigned short t)
{
unsigned short i;
for (i = 0; i < t; i++) ;
}
/*---------------ポートの初期化----------------------*/
void iniIO(void)
{
P1.DDR = 0xff; /* アドレスバスに使用 */
P3.DDR = 0xff; /* データバスに使用 */
P8.DDR = 0xe3; /* CS3を出力に設定 */
}
/*-----------------------VRAMの初期化---------------------
データシートによると、電源立ち上がり後最小200usのポーズと、その後8回の
リフレッシュサイクルと、8回の転送サイクルが必要ということです。*/
void iniVRAM(void)
{
unsigned int i;
wait1(1000); /* ポーズ時間200us以上(約500us) *
BSC.ABWCR.BYTE = 0xf7; /* 16bitアクセス空間に設定*/
RFSHC.RTCOR = 0x1e; /* リフレッシュサイクル 256/4ms => 約15usに一回 */
RFSHC.RTMCSR.BYTE = 0x17; /* CLOCK(16MHz) / 8 */
RFSHC.RFSHCR.BYTE = 0x23; /* 2WE方式・8bitカラム・リフレッシュサイクル許可 */
wait1(1000); /* リフレッシュサイクルを8回以上 */
for(i=0; i<8; i++) VRAM[i] = 0; /* 転送サイクルを8回以上 */
}
/*----------------------------メインルーチン---------------------------*/
void main()
{
unsigned int tmp;
unsigned int add;
unsigned char i;
iniIO(); /* 入出力ポートの初期化 */
iniVRAM(); /* VRAMの初期化 */
while(1){
printf("\nVRAM[n] n=? > "); /* 値を入れる場所を指定(一応…0〜9) */
scanf("%d",&add);
printf("\nValue? > "); /* 値を指定 */
scanf("%x",&tmp);
VRAM[add] = (unsigned char)tmp; /* 指定した場所へ値を移動 */
for(i=0; i<10; i++) printf("\nVRAM[%d]=%2x",i,VRAM[i]); /* データ出力 */
}
}
ご存知の方いらっしゃいますでしょうか。。足りない情報がありましたら教えてください。その都度
補充させていただきます。長くなりましてすみません。何卒よろしくお願いします。
********************************************
name: 進藤 正彦(Masahiko Shindo)@筑波大学
e-mail: shindou@xxxxxxxxxxxxx
********************************************