こんにちわ。進藤です。 先日イエローソフトの製品が届きまして、嬉々として使っております次第です。 ところで、今回は、、 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 ********************************************