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/3069RF


秋月電子の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 などの割り込み端子に接続することにより、ソフトウェアでパルスカウントできます。