NEC ELECTRONICS NEC ELECTRONICS
NEC electronics NEC electronics NEC
ホーム
アプリケーション
製品情報
先端技術
サポート
WEBショップ
ニュース&イベント
会社案内
header
GO
詳細検索機能/特性検索
サイトマップ お問い合わせ

  78K:メモリ割り付け..ディレクティブ, LOCATION も参照

メモリ

目次

    
FAQ-ID = 78memory-nnnn
0001: メモリ外部拡張の基本事項
0002: 外部メモリ・アクセスのタイミング
0003: SRAMを増設したい
0004: 内部RAMデータ保持電圧について
0005: 内部高速RAM上でプログラム実行は可能か? [78K0]
0006: 外部メモリのアクセス方法 [78K4]
0007: データ・リード・タイミング [78K4]
0101: マイコン内蔵されているEEPROMについて[UPD78986xに共通の内容]
0201: マイコン内蔵メモリの特徴と使い方[78K0、78K0S]
78memory
-0001
メモリ外部拡張の基本事項
Q1
メモリの外部拡張について、基本的なことを教えてください。
A1
いくつかのマイコンは内部の ROMや RAM以外に外部にメモリを拡張できるようになっております。
そのときの内部アドレスと外部アドレスの関係を以下の図に示します。
 デバイスや設定によっては、マイコンが使用できるアドレス情報の一部しか外部に出力されない場合があります。
[memory](3Kbytes)

 CPUメモリ・マップに示すように CPUは 16ビットのアドレス空間を扱え、内部ROMが 24Kバイトあるような場合について説明します。
 この場合、6000H以降の部分が外部に拡張領域として使用できることになります。
 簡単のために外部拡張領域は DFFFH までの 32Kバイトとして説明します。

(1)外部に 12ビットのアドレス出力を指定 (4Kバイト拡張) した場合
 この場合には、外部に物理的に拡張できるメモリは 212 = 4Kバイトになります。
CPU から 6000Hをアクセスした時、外部には 6000Hの下位12ビット分のアドレス、つまり 000Hが出力されます。
同様に 7000Hや 8000H, 9000Hをアクセスした時にも下位の 12ビットは同じく 000Hとなります。
 このように同じアドレスがアクセスされることになり、イメージが 4Kバイト毎に現れます。

↓4Kバイト拡張時メモリ・マップ
[ex4KB](3Kbytes)

(2)外部に 14ビットのアドレス出力を指定 (16Kバイト拡張) した場合
 この場合には、外部に物理的に拡張できるメモリは214 = 16Kバイトになります。
CPU から 6000Hをアクセスした時、その下位14ビット、つまり 2000Hが出力されます。
同様に 7000Hでは 3000Hが、8000Hでは 0000Hが 9000Hでは 1000Hが、A000Hでは 2000Hが、B000Hでは 3000Hが出力されます。

 従って、6000Hから使用した場合には内部のアドレスの並びと外部のアドレスの並びが逆転してしまうことになります。
これは、外部に RAMを拡張した場合には問題はありませんが、PROMやフラッシュを接続する場合には注意する必要があります。
 これを避けるには、8000H以降のアドレスだけを使用することをお奨め致します。
 また、複数のアドレスで同じ外部アドレスが出力されますので、RAMを拡張したときには、 異なるアドレスからアクセスしないように管理を行っておく必要があります。

↓16Kバイト拡張時メモリ・マップ
[ex16KB](3Kbytes)

(3)外部に 16ビットのアドレス出力 (64Kバイト拡張) を指定した場合
 この場合には、外部に 64Kバイトの空間が使用できるようになります。
 しかしながら、CPUそのものが 64Kバイトの空間しか扱えないため、 外部に拡張出来るのは 64Kバイトから CPU内蔵の分を除いた領域だけになります (デバイスによってはさらに少なくなる事があります)。
 このとき、外部のアドレスと内部のアドレスと同じ値になります。
 このため、内部ROMと重なった部分 (この場合には 0〜5FFFH) が無駄になる可能性があります。

↓64Kバイト拡張時メモリ・マップ
[ex64KB](3Kbytes)

関連FAQ:
通常のメモリ以外に変数やコードを割り付ける方法は?
この情報はお役にたちましたか?
back to top  
(2002/03)

78memory
-0002
外部メモリ・アクセスのタイミング
Q1
uPD780031Aの電気的特性のタイミング・チャートで、 「外部データ・アクセス」では、RD, WR信号が順次アクティブとなるように表現されています。
これは、リード・アクセスでもライト・アクセスでもリード・モディファイ・ライトの アクセスをすることを表しているのですか?
A1
いいえ違います。
ユーザーズ・マニュアル の「第20章 外部デバイス拡張機能」の図20-5、図20-6 に記載されているように、 リード時にはライト動作が、またライト時にはリード動作が、それぞれ発生しません。
ただし、この分の時間だけは必要とします (リード・モディファイ・ライトで必要な部分だけ信号がアクティブになるとお考えください)。
この情報はお役にたちましたか?
back to top  

78memory
-0003
SRAMを増設したい
Q1
uPD780078に SRAM等を外付けする場合の接続方法を教えてください。
A1
接続例としては、下記の回路か ユーザーズ・マニュアル の図20-8 をご参照ください。

外部RAMの容量が 32Kバイトありますが、添付の回路では 4Kバイト・モードでの例を示してあります。
これ以上の容量を使用されたい場合には 16Kバイト・モードや 64Kバイト・モードを利用されるか、 内部ROMをできるだけ確保したい場合には、4Kバイト・モードを使用して、 出力ポートを RAMの A12-14 に接続すること(バンク・スイッチ)が考えられます。

なお、タイミングでは、リード時にデータ・バス上のアドレス出力が切れない状態で SRAMからデータが出力され、一時的にデータが衝突する事が考えられます。
この対策としては SRAMに対する OE信号の立ち下がりだけをを遅延させることが考えられます。
この対策を行った場合には、リード時のタイミングが間に合わなくなりますので、 WAITを挿入する設定を行ってください。

また、タイミングは使用される電源電圧やクロック速度で異なりますので、 実際の使用条件に合わせた見直しを行ってください。
[780078](9Kbytes)
この情報はお役にたちましたか?
back to top  

78memory
-0004
内部RAMデータ保持電圧について
Q1
uPD780308Yの RAMの値が不定になる実力電圧値はおよそ何V でしょうか。
A1
実力値については分かりませんのでお答えできません。
なお、データ保持電源電圧の保証値は動作電源電圧ではなく、 別の項目としてデータ・シートに記載しており最小値は 1.6Vです。
この情報はお役にたちましたか?
back to top  

78memory
-0005
内部高速RAM上でプログラム実行は可能か? [78K0]
Q1
内部高速RAMでプログラムを実行することは可能でしょうか?
A1
いいえ、できません。内部高速RAMからのフェッチはできません。
この情報はお役にたちましたか?
back to top  
(2001/08)

78memory
-0006
外部メモリのアクセス方法 [78K4]
Q1
uPD78P4038での外部メモリ・アクセスがうまくいかないため、アクセス方法を教えてください。
78K2シリーズでは、例えば、
 「 MOV  A, &xxxxh 」
とすると外部をアクセスできますが、78K4シリーズでのやり方をご教授ください。
(ちなみに4Kbyte拡張モードで使用します)
A1
メモリが内蔵されていないアドレスをアクセスしてください。
 78K4では外部アクセスのための特殊なアドレシング・モードは存在しません。
メモリ・マップで、内部ROM、RAM、SFR以外のメモリ領域をアクセスした場合に外部アクセスとなります。

 具体的には、お問い合わせの uPD78P4038の場合は、内部PROMが 0〜1FFFFHの 128Kバイトありますので、 この後の 20000番地以降をアクセスすると外部アクセスとなります。
4Kバイト拡張モードとのことですので、20000番地から FEDFF番地(LOCATION 0FH命令実行時) のアドレスをアクセスすると 4Kバイト毎に同じアドレスがアクセスされます (アドレスは下位12ビットのみが出力され、上位が出力されないため)。
この情報はお役にたちましたか?
back to top  

78memory
-0007
データ・リード・タイミング [78K4]
Q1
uPD784038のローカル・バス・インタフェース機能を用いて外部にメモリ等を配置した場合、 CPUがそのデータを読み込むタイミングは「RD がL の期間の最後のクロック・エッジ」でしょうか?
A1
いいえ、CPUの内部クロックは外部で見えず、そのタイミングは分かりません。
なお、CLKOUT信号から出るクロックは、CPU内部のクロックとは別のクロックです。
CLKOUTは外部回路を動作させるための信号ですから、CPUが動作するクロックとの位相関係は規定できません。
この情報はお役にたちましたか?
back to top  

78memory
-0101
マイコン内蔵されているEEPROMについて[UPD78986xに共通の内容]
Q1
UPD78E9860に内蔵されたEEPROMの値は初期状態ではどうなっているか。
A1
現状では工場出荷時のEEPROMの値は"00"です。
なお、これはデバイスとして保証されている値ではなく、現状の値です。製造上の変更等により変わる場合もございますのでご注意ください。
この情報はお役にたちましたか?
Q2
UPD789860の内蔵EEPROM(0xF800-0xF81F)領域へのデータの書き込みがうまくできません。どのように書き込めばよいのでしょうか。
A2
以下にRAM上のデータをEEPROMに書き込む手順を示します(なお、ここではINTEE0割り込みは使用せず、フラグ(EWST10)のポーリングで処理しています)。

(1) EEWC10レジスタの設定により、書き込みタイマの設定とERE10ビットをセット(EEPROMの動作開始)する
(2) EEWC10レジスタのEWE10ビットをセット(書き込みモードの設定)
(3) 1mS以上ウエイト(書き込み可能になるのを待つ)
(4) 1バイト書き込む。(これにより EWST10は1になる)
(5) EWST10 が0になる(1バイトの書き込みが完了する)のを待つ。
(6) 書き込みたいデータのアドレスを進める。

(4)〜(6)を必要バイト数だけ繰り返す。

(7) EWE10をクリア(書き込みモードから抜ける)

以上の処理をアセンブリ言語で記述した書き込みプログラムの例を示します。
これは書き込みの場合の例です。

このプログラム例では、HLに書き込みたいEEPROMのアドレスをセット、DEに書き込みたいデータのアドレスをセット、Bに書き込みたいデータ数が既にセットされているとしたサブルーチンになっています。必要に応じて書き込んだデータを読み出して確認します。

;
;Write EEPROM
;Input parameter
;HLData Pointer for EEPROM
;DEData Pointer for Read
;BData number
;
WRITE:MOVA,#4CH
MOVEEWC10,A; Set ERE10 & Set Timer to 3.71mS
SET1EWE10; Set EWE10
PUSHDE
MOVWDE,#279; 1mS
LOOP2:DECWDE
MOVA,D
ORA,E
BNZ$LOOP2
POPDE
LOOP3:MOVA,[DE]; Read Data
MOV[HL],A; Write Data to EEPROM
INCWHL
INCWDE
LOOP4:BTEWST10,$LOOP4
DBNZB,$LOOP3
CLR1EWE10; Write end
RET

このプログラムの考え方は、UPD789862サブシリーズでも同じです。
この情報はお役にたちましたか?
back to top  
(2005/01)

78memory
-0201
マイコン内蔵メモリの特徴と使い方[78K0、78K0S]
78K0や78K0Sの8ビットのマイコン、特にAll Flashの製品では通常のメモリの中に特殊なアドレスが予約されています。ここでは、その違いと使い方について簡単に説明します。

[内蔵メモリ領域]
これらのマイコンに内蔵され、プログラムにより通常使用するメモリとしては以下の3つがあります。

メモリ領域特徴/機能
ROM命令や固定データ用で、マスクまたはフラッシュで構成
高速RAMデータアクセス専用のメモリ
内部拡張RAMデータや命令を格納

[ROM]
通常のプログラムや固定データ用に用いられますが、マイコンのアーキテクチャにより特殊な領域が存在します。



ベクタ・テーブル[0000〜003FH]
この領域にはベクタ・テーブルが並んでいます。特に0000と0001番地はリセット解除後に実行開始する命令のアドレス情報をベクタとしてセットします。残りは使用する割り込みに対応して、割り込み処理プログラムの開始アドレス情報をベクタとしてセットします。通常は下記の例に示すように、DW擬似命令により処理部のアドレスを記述します。ここで、STARTは実際のプログラムの実行開始アドレスです。記述例を以下に示します。使用しない割り込みのベクタはRETI命令を記述したダミーエントリを準備しておき、そのアドレスを記述します。

  VECT   CSEG   AT      0
                DW      START         ;00:リセットエントリー
                DW      DUMYINT       ;02:未使用割り込み用ダミーエントリ
                DW      LVIINT        ;04:低電圧
                DW      P0INT         ;06:エッジ検出割り込み
                DW      DUMYINT       ;08:エッジ検出割り込み(未使用)
CALLTテーブル[0040H〜007FH]
この領域には1バイトのCALL命令であるCALLT命令を使用するときの各CALLT命令に対応した処理プログラムの開始アドレス情報をベクタとしてセットします。
例えばサブルーチンSUBADDR0及び1へのベクタを以下のようにして設定しておくと、CALLT [SUB1]やCALLT [SUB2]と記述することでSUBADDR0やSUBADDR1をサブルーチンとしてコールできます。Cコンパイラではコード効率を良くするためにこの機能を利用しています。

  CALTTBL CSEG  CALLT0
  SUB1:         DW      SUBADDR0      ;サブルーチン1
  SUB2:         DW      SUBADDR1      ;サブルーチン2
オプションバイト他[0080H〜]
この領域はAll Flashマイコンで各種の設定情報やセキュリティ情報のための領域です。通常、プログラムで参照することはありません。設定したいデータはDB擬似命令で記述します。

  OPTIONB CSEG    AT      80H
          DB      01111111B           ;WDTは最低速で動作
          DB      00000001B           ;POCは2.7V動作
          DB      0
          DB      0
          DB      0
プログラム領域[〜07FFH]
通常のプログラムで使用できる領域です。プログラムは通常CSEGで指定します。

CALLFエントリ領域[0800H〜0FFFH]
この領域は2バイトのCALL命令であるCALLF命令で実際に処理するプログラム(ハンドラ)のための領域です。CALLTとは異なり、ここには実際の処理部分が入ります。CALLF命令を使わない場合には通常のプログラム領域として使うこともできます。
(通常のプログラムと同様にサブルーチン・プログラムを記述するだけです。そのように記述したサブルーチンをコールする際にCALL命令ではなくCALLF命令を使用します。)

プログラム領域[1000H〜]
この領域は個々のデバイスにより大きさが異なります(アドレスとしては最大でも0EFFFまでです)。また、8000H以降の領域は、フラッシュのセルフ・プログラミング時には書き込み用のファームウェアに置き換わってしまいます。

[高速RAM]
最大1Kバイトの領域が割り当てられています。この領域はその最後のアドレスが固定されていて、内蔵される高速RAMの容量により開始アドレスが異なります。代表的なマイコンの高速RAMを下表に示します。

シリーズデバイスアドレス容量(バイト)
78K0S/Kx1+UPD78F9210〜92120FE80H〜0FEFFH128
UPD78F92210FE80H〜0FEFFH128
UPD78F92220FE00H〜0FEFFH256
UPD78F9232、92340FE00H〜0FEFFH256
78K0/Kx2UPD78F05000FD00H〜0FEFFH512
UPD78F05010FC00H〜0FEFFH768
UPD78F0502、05030FB00H〜0FEFFH1024
UPD78F05110FC00H〜0FEFFH768
UPD78F0512〜05150FB00H〜0FEFFH1024
UPD78F05210FC00H〜0FEFFH768
UPD78F0522〜05250FB00H〜0FEFFH1024
UPD78F05310FC00H〜0FEFFH768
UPD78F0532〜05350FB00H〜0FEFFH1024
UPD78F0544〜05470FB00H〜0FEFFH1024
78K0/Lx2UPD78F03610FC00H〜0FEFFH768
UPD78F0362〜03970FB00H〜0FEFFH1024

なお、高速RAMはスタックを含めたデータ専用領域です。ここからプログラムをフェッチすることはできません。また、高速RAMはいくつかに分かれているので、スタック領域を設定する際には注意が必要です。
そのうちの一つは、ショート・ダイレクト・アドレッシング(saddr、saddrp)領域と呼ばれる領域です。これは0FE20H〜0FF1FHの256バイトの領域で、そのうち0FE20H〜0FEFFHが高速RAMになります。この領域にバイト長の変数を配置するには、下記のようにSADDR属性でDSEGを定義し、そこでDS擬似命令で変数(領域)を定義します。

  D0            DSEG    SADDR
  DATA1:        DS      1
  DATA2:        DS      1
  DATA3:        DS      1
このように定義した変数は以下のように、汎用レジスタを介することなく、値を代入したり演算を行なったりと汎用レジスタと同じように使用することもできます。

  MOV           DATA1,#1
  INC           DATA2
  CMP           DATA3,#10
また、上記のようにバイト単位の変数ではなく、16ビットの変数として使用する場合には再配置属性をsaddrではなくsaddrpとします。これによりsaddrpに指定した変数は16ビットアクセスができるようになります。なお、この再配置属性を指定すると変数は必ず偶数番地に配置されます。

  DP              DSEG    SADDRP
  DATA1P: DS      2
  DATA2P: DS      2
  DATA3P: DS      2
このように、このショート・ダイレクト・アドレッシング領域は便利に使えるので、スタックのような単純な機能で使うのはもったいないところです。
もう一つは78K0だけの制限で、78K0Sでは該当しませんが、0FEE0〜0FEFFHの32バイトの領域です。この領域には78K0の汎用レジスタが配置されています。78K0では割り込み処理の高速化のために、割り込みで使用するレジスタを切り替えられる機能(レジスタ・バンク機能)があります。この機能を利用すると、割り込み処理で使用するレジスタをスタックにセーブしたり、逆に復帰したりする手間が必要なくなります。
また、高速RAMはセルフ・プログラミングではエントリRAMやデータ・エリアとしても使われます。
なお、SADDR領域に限定せずに高速RAMにデータ領域を配置する場合にはDSEG指定で、再配置属性をIHRAMに指定します。以下に例を示します。

  RAMD          DSEG    IHRAM
  DATA4:        DS      2
[内部拡張RAM]
内部拡張RAMはプログラムの実行が可能なRAM領域です。通常のデータやプログラムをこの領域に配置することはできますが、スタックを設定することはできません。この領域には通常は、それほどアクセス頻度が高くないような変数やデータ量が大きな変数(配列など)を配置します。また、一部のデバイスでは、ROMコレクション機能でプログラムを実行するためにも使用されます。
この領域はDSEG指定で、再配置属性をIXRAMに指定します。以下に例を示します。

  LSPRAM2 DSEG    IXRAM
  DATA_AREA1:
          DS      20H
  DATA_AREA2:
          DS      20H
  DATA_AREA3:
          DS      20H

(2005/12)

この情報はお役にたちましたか?
back to top  
(2005/12)









































 ご利用にあたって  個人情報保護について  RSS       © 1995-2008  NEC Electronics Corporation