H8のページ
H8/3048F
モニタの構築
ルネサスのページからモニタをダウンロード
ソースファイルの追加
advanced.src
cmd02.src, cmd04.src, cmd05.src, cmd06.src, cmd07.src
cmd08.src, cmd09.src, cmd10.src, cmd11.src, cmd13.src
cmd14.src, cmd16.src, cmd17.src, cmd19.src, cmd20.src
cmd21.src, cmd24.src, cmd25.src, cmd27.src, cmd28.src
cmd30.src, cmd31.src, cmd32.src, cmd33.src, cmd34.src
cmd35.src, cmd36.src, cmd37.src, cmd38.src
3048のなかの
cpu01.src, cpu02.src, cpu03.src, cpu04.src
dmy01.src, dmy03.src, dmy12.src, dmy15.src, dmy.18.src
dmy23.src, dmy26.src, dmy29.src, dmy39.src, dmy41.src
mod01.src, mod02.src, mod03.src, mod04.src, mod05.src
mod06.src, mod07.src, mod08.src, mod09.src, mod10.src
mod11.src, mod12.src, mod13.src, mod14.src, mod15.src
mod16.src, mod17.src, mod18.src, mod19.src, mod20.src
mod21.src, mod22.src, mod23.src, mod24.src, mod25.src
mod26.src, mod27.src, mod28.src, mod29.src, mod30.src
mod31.src, mod32.src, mod33.src, mod34.src, mod35.src
mod36.src, mod37.src, mod38.src
lower.c
monitor.c
monitor\Release の中にある monitor.batを dosプロンプトで実行。
最適化リンカオプションの詳細
-noprelink -nodebug -nomessage -list="$(CONFIGDIR)\$(PROJECTNAME).map"
-nooptimize
-start=VECTOR/00,ROM,P,C/0130,USER/0FFF000,RAM,B/0FFF400,SCI/0FFFFB8
-nologo
-output="$(CONFIGDIR)\$(PROJECTNAME).abs" -DEFINE=$BRR=13
-DEFINE=$STACK=0FFFF10 -end
-input="$(CONFIGDIR)\$(PROJECTNAME).abs" -form=stype -output="$(CONFIGDIR)\$(PROJECTNAME).mot"
-exit
cpu01.src の中にあるオープニングメッセージ
I/Oの定義
ボード環境(モード6で使用)
24.576MHz
内蔵ROM 000000〜01FFFF(128KB)
(内000000〜0000FFは割込ベクタ)
内蔵RAM FFEF10〜FFFF0F(4KB)
内部I/O FFFF1C〜FFFFFF
外部SRAM 200000〜21FFFF(128kB, 70ns)
エミュレーションRAM
FFF000〜FFF3FF(1kB)
プログラム書き込みポート
sci1ポートを使用。
ベースアドレス FFFFB8
H8/3052F
モニタの構築
ほぼ3048と同じです。
最適化リンカオプションの詳細
-noprelink -nodebug -nomessage -list="$(CONFIGDIR)\$(PROJECTNAME).map"
-show=reference -nooptimize
-start=VECTOR/00,ROM,P,C/0130,RAM,B/0FFDF10,USER/0FFE030,SCI/0FFFFB8
-nologo
-output="$(CONFIGDIR)\$(PROJECTNAME).abs" -DEFINE=$BRR=13
-DEFINE=$STACK=0ffff10 -end
-input="$(CONFIGDIR)\$(PROJECTNAME).abs" -form=stype -output="$(CONFIGDIR)\$(PROJECTNAME).mot"
-exit
ボード環境(モード6で使用)
25.000MHz
内蔵ROM 000000〜07FFFF(512KB)
(内000000〜0000FFは割込ベクタ)
内蔵RAM FFDF10〜FFFF0F(8KB)
内部I/O FFFF1C〜FFFFFF
エミュレーションRAM
FFE000〜FFEFFF(4kB)
プログラム書き込みポート
sci1ポートを使用。
ベースアドレス FFFFB8
H8/3069F
モニタの構築
ほぼ3048と同じです。
-define=$BRR=13 -define=$STACK=0ffff20 -noprelink -nomessage -list="$(CONFIGDIR)\$(PROJECTNAME).map"
-nooptimize
-start=VECTOR/00,ROM,P,C/0130,RAM,B/0FFBF20,USER/0FFE030,SCI/0FFFFB8 -nologo
-output="$(CONFIGDIR)\$(PROJECTNAME).abs" -end -input="$(CONFIGDIR)\$(PROJECTNAME).abs" -form=stype
-output="$(CONFIGDIR)\$(PROJECTNAME).mot" -exit
イニシャライズモジュールの内容
void INITIALIZE(void) /* */
{ /* */
volatile unsigned long n;
P1DDR = 0xff; // A0-A7
P2DDR = 0x07; // A8-A10
P8DDR = 0xe8; // CS2
BSC.RTCOR = 99; // リフレッシュタイムコンスタントレジスタ
BSC.RTMCSR.BYTE = 0x0F; // リフレッシュタイマコントロール・ステータスレジスタ
BSC.DRCRB.BYTE = 0x98; // DRAMコントロールレジスタB
BSC.DRCRA.BYTE = 0x3C; // DRAMコントロールレジスタA
for(n=0; n<200; n++); // refresh wait
// SCI2 ハードウェア初期化
SCI2.SCR.BIT.TE = 0; // sci2 送信禁止
SCI2.SCR.BIT.RE = 0; // sci2 受信禁止
SCI2.SCR.BYTE = 0x00; // sci2
SCI2.SMR.BYTE = 0x00; // sci2 調歩,8bit,p-n, 1stop, clk =1/1
SCI2.BRR = 0x50; // 9,600bps (25.000e6 / 32 / 9600) - 1 = 80.38 => 80
// SCI2.BRR = 0x13; // 38,400bps (25.000e6 / 32 / 38400) - 1 = 19.34 => 19
// SCI2.BRR = 0x0c; // 57,600bps (25.000e6 / 32 / 57600) - 1 = 12.56 => 12
// SCI2.BRR = 0x06; // 115,200bps (25.000e6 / 32 / 115200) - 1 = 5.78 => 6
monitor(); /* Goto Monitor Program */
} /* */
ボード環境(モード5で使用)
25.000MHz
内蔵ROM 000000〜07FFFF(512KB)
(内000000〜0000FFは割込ベクタ)
内蔵RAM FFBF20〜FFFF1F(16KB)
内部I/O FEE000〜FEE0FF
FFFF20〜FFFFE9
エミュレーションRAM
FFC040〜FFC13F(4kB)
プログラム書き込みポート
sci1ポートを使用。
ベースアドレス FFFFB8
秋月電子のH8/3069 マイコンボードを買いました。
今、いろいろと勉強中です。
DRAM がついているので、書き込み回数を気にしなくてもよく、とても便利です。
hamayanさんの3069用モニターを書き込み、モード5でいろいろな機能を試しています。
ROM 000000〜07FFFF(512KB)
(内000000〜0000FFは割込ベクタ)
RAM FFBF20〜FFFF1F(16KB)
内部I/O FFFF20〜FFFFE9
DRAM 400000〜5FFFFF(2MB)
外部I/O 200000〜3FFFFF(ゴーストあり)
上記モニタに出ているように、FFC040 からになります。
HEWの セクション設定で、CVECT セクションを設定します。
// ITU0 初期化
ITU.TSNC.BYTE = 0xf8; // 同期なし
ITU.TMDR.BYTE = 0; // タイマモード標準
ITU.TOLR.BYTE = 0xc0; // タイマアウトプットレジスタ初期値
// ITU.TISRA.BYTE = 0x88; // 割り込み禁止
ITU.TISRA.BYTE = 0x98; // ITU0 GRA 割込
ITU.TISRB.BYTE = 0x88; // 割り込み禁止
ITU.TISRC.BYTE = 0x88; // オーバーフロー割り込み禁止
ITU0.GRA = 0x61a9; // ITU0.GRA でクリア 1ms
ITU0.TCR.BYTE = 0xa0; // タイマ0 CR GRA=TCNT clr PS = 1:1
ITU.TSTR.BIT.STR0 = 1; // ITU0 start
CPUの原発振は 25MHz です。
25 X 10^6 ÷ 1000 = 25000 -> 0x61A8
GRA に この値をセットし、GRA のコンペアマッチでクリアするようにする。
また、コンペアマッチで割り込み発生させ、1msecカウンタをカウントアップする。
20時間ぐらいストップウォッチと比較したところ、 0x61a9にした法がよく時間が一致していたので、
GRAには、0x61a9 をセット。
ITU1の原発振器として、8ビットタイマのTMR0を使用する。
そうすると、ハードウェアのみで、1秒以上の周期の発振器が簡単に構成できる。
// ITU1初期化
ITU1.TCR.BYTE = 0xa7; // タイマ1 CR GRA=TCNT clr PS = CLKD
ITU1.TIOR.BIT.IOA = 0x03; // タイマ1 TIOA1 GRAコンペアマッチでトグル出力
ITU1.GRA = 0xffff; // ITU1.GRA でトグル出力
ITU.TSTR.BIT.STR1 = 1; // ITU1 start
// 8bitタイマ
TMR0.TCORA = 02 - 1; // タイムコンスタントレジスタ
// TMR0.TCR.BYTE = 0x08 + 0x03; // 1/8192, TCORAでクリア
// TMR0.TCR.BYTE = 0x08 + 0x02; // 1/64, TCORAでクリア
TMR0.TCR.BYTE = 0x08 + 0x01; // 1/8, TCORAでクリア
// TMR0.TCR.BYTE = 0x08 + 0x00; // 禁止 TCORAでクリア
TMR0.TCSR.BYTE = 0x03; // コンペアマッチでTMO0出力反転
8ビットタイマの出力 PB0/TMO0 の出力を PA3/CLKDに入れる。
ITU1のクロックソースを CLKDにすれば、遅い発振ができるし、内部発振器にすれば、
早い発振ができる。
しかも、ソフトウェアの負担がない。これはすばらしいと思います。
PA4/TIOCA1 からパルスを出力。
ITU1 や TMR0 の GRA 値は、ゼロから始めるので、計算値から -1 しないと合いません。
H8/3069ではまだやっていませんが、CLKA , CLKB で2相カウントできます。
(H8/3048では使用したことがあります)
IRQ0 などの割り込み端子に接続することにより、ソフトウェアでパルスカウントできます。