[H8-ML(2281)] H8<->DRAM
From: "Masahiko Shindo" <shindou@xxxxxxxxxxxxx>
Date: 2002年10月15日(火)20時27分22秒
こんにちわ。進藤です。
先日イエローソフトの製品が届きまして、嬉々として使っております次第です。

ところで、今回は、、
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
********************************************

スレッド概略
[表示中](起点)
 └[2282(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]