RS08につながる

いくら新しいマイコンがあっても、 開発ツールでプログラムを書かないことには、マイコンは始まりません。 その前にこのマイコンにつながる開発ツールを入手しなくては なりません。 何とか、手持ちの機材で済まないかなあ。

評価ボードにRS08をつないだ写真

アジェンダ

RS08のインターフェース

RS08マイコンは、HCS08の流れくむ最新のマイコンです。 そのため、開発ツールとのインターフェースには、 HCS08と同じバック・グランド・モード(BackGround Mode : BDM)が使用されます。

BDMの物理的な仕様

BDMインターフェースは、 6ピンのピンヘッダによって信号の送受信を行います。 下の写真は、DEMO9S08QG8評価ボードに搭載したピンヘッダの例です。

BDMのピンヘッダ

このように、BDMインターフェースは、 2×3ピンヘッダとして規格化されています。 このコネクタには、以下のような信号線が接続されています。

BDM規格ピンヘッダの信号配置
信号名ピン番号ピン番号信号名
BKGD12VSS
N.C.34RESET*/VPP
N.C.56VDD

N.C.は、接続せず(Non-Connection)という意味を表しています。 いずれの開発ツールもこのコネクタ規格を使用していますが、 HCS08の場合には、4ピンにVPPの文字は ありませんでした。

VPPは、なぜ必要なのか

HC08やHCS08では、 FLASH ROMの書き込み・消去に必要な12Vの高電圧を マイコン内部のチャージポンプで作っていました。 このため、HC08やHCS08は、通常動作状態でもFLASH ROMを書き換える事が できました。 ところが、RS08では、内部チャージポンプを省略したため、 外部から12Vの高電圧を供給しなくてはならなくなりました。 これが、VPPと呼ばれる電源入力です。

VPPは、いつ必要なのか

VPPは、FLASH ROMを書き込むために必要なので、 もちろん、開発ツールが、プログラムを書き込むときにも必要です。

逆に言うと、FLASH ROMを書き換える必要が無いのであれば、 VPPを与える必要はありません。 また、VPPを与えない事によって、 FLASH ROMの内容を保護することもできます。

このページでは、 「FLASH ROMに書き込みをしないなら、VPPを必要とはしない。」 という事実を手がかりに、ひとまずRS08マイコンとの会話を試みます。

DEMO9S08QG8評価ボード

私の手元にあるBDMインターフェース搭載の開発ツールは、 DEMO9S08QG8評価ボードだけです。

DEMO9S08QG8
8Bitマイコン評価キット
$50(直販価格)
8Bitマイコン評価キット:DEMO9S08QG8

今回も、これを使ってRS08と会話をしてみます。

ハードウェア

RS08とDEMO9S08QG8評価ボードを接続するために ブレッドボード上に回路を組みました。

最初のブレッドボードの写真

回路図は、以下のようになっています。

最初の評価用回路図

大事なサンプルチップを壊しては大変なので、 要所要所に220Ωの保護抵抗を挿入しました。 また、動作確認用にPTA5にLEDと470Ωの電流制限抵抗を付けました。

ところで、この写真に写っているBDMピンヘッダは、 標準の2×3構成のものではありません。 このピンヘッダ構成は、ブレッドボード上で使用できるように 私が考案した配置で、SBDM(Serial BDM?)と呼んでいます。 このピンヘッダの配置は、以下のようになっています。

SBDM規格コネクタの信号配置
ピン番号信号名
1RESET* / VPP
2BKGD
3VDD
4VSS

この配置は、MC9S08QG8の1番ピンから4番ピンの配列そのままです。 また、同じ配置がDIPパッケージ版のMC9RS08KA2でも使用されています。 つまり、このコネクタをMC9S08QG8やMC9RS08KA2のアプリケーションに 使う時には、マイコンの直近に直列にピンヘッダを立てるだけで対応できます。

RS08と接続する

ブレッドボードとDEMO9S08QG8評価ボードを接続したら、 ハードウェアの準備は完了です。

評価ボードにRS08をつないだ写真

次は、CodeWarriorからのソフトウェア的な接続を試します。

現在、都合により画面ハードコピーを掲載していません。 説明文だけになりますが、ご了承ください。

CodeWarrior V5.1 で新規プロジェクトを作る

RS08マイコンは、 CodeWarrior V5.1 でしか サポートされていません。 そのため、RS08マイコンを試す場合には、 CodeWarrior V5.1 のインストールと起動は必須です。

CodeWarrior を起動したら、 "Start Dialog"から"Create New Project"をクリックし、 新規プロジェクトの作成を開始します。

以下、簡単に設定を説明します。

項目設定値
DeviceMC9RS08KA2
ConnectionP&E Multilink/Cyclone Pro
LanguageAbsolute assembly
Project NameFirstRS08
Add Additional FilesNothing
Rapid Application DevelopmentNone

RS08では、Cが使えません

これは、まあ当然でしょう。 RS08には、スタックの概念がありませんから、 C のように関数の呼び出しにより構成され、 スタック上に自動変数を配置する C のような 言語には不向きです。

ぜひ、アセンブラの世界をお楽しみください。

プログラムを書く

まだ、FLASH ROMに書き込みを行うための12V電源はつないでいません。 このため、プログラムを書いても書き込めるはずはありません。 ここで書くプログラムは、 $0020から開始されるデバッガ上でRAMに転記するためのプログラムです。

"main.asm"の中の "variable/data section"のコメント部分から ファイルの最後のリセットベクタの部分に至るまでを 以下のプログラムに置き換えました。

;
; variable/data section
;
            ORG     TINY_RAMStart
Var_i:      ds.b    1
Var_j:      ds.b    1

;
; code section
;
            ORG     RAMStart
_Startup:
; Disable COP
            mov     #HIGH_6_13(SOPT),PAGESEL
            bclr    SOPT_COPE,MAP_ADDR_6(SOPT)
; Configure PTA5 as output.            
            bset    PTADD_PTADD5,PTADD
mainLoop:
; Wait for a while
L1:
            inc     Var_i
            bne     L1
            inc     Var_j
            bne     L1
; Invert the state of LED            
            sta     PTAD
            eor     #mPTAD_PTAD5
; Infinite-loop
            bra     mainLoop            

16ビットのカウンタを使って、 LEDの接続されているポートをトグルするだけの簡単なプログラムです。 このプログラムをディスアセンブルするとこうなります。

 Abs. Rel.   Loc    Obj. code   Source line
 ---- ----   ------ ---------   -----------
  503   18                      ;
  504   19                      ; variable/data section
  505   20                      ;
  506   21                                  ORG     TINY_RAMStart
  507   22  a000000             Var_i:      ds.b    1
  508   23  a000001             Var_j:      ds.b    1
  509   24                      
  510   25                      ;
  511   26                      ; code section
  512   27                      ;
  513   28                                  ORG     RAMStart
  514   29                      _Startup:
  515   30                      ; Disable COP
  516   31  a000020 3E 08 1F                mov     #HIGH_6_13(SOPT),PAGESEL
  517   32  a000023 1F C1                   bclr    SOPT_COPE,MAP_ADDR_6(SOPT)
  518   33                      ; Configure PTA5 as output.            
  519   34  a000025 1A 11                   bset    PTADD_PTADD5,PTADD
  520   35                      mainLoop:
  521   36                      ; Wait for a while
  522   37                      L1:
  523   38  a000027 20                      inc     Var_i
  524   39  a000028 36 FD                   bne     L1
  525   40  a00002A 21                      inc     Var_j
  526   41  a00002B 36 FA                   bne     L1
  527   42                      ; Invert the state of LED            
  528   43  a00002D F0                      sta     PTAD
  529   44  a00002E A8 20                   eor     #mPTAD_PTAD5
  530   45                      ; Infinite-loop
  531   46  a000030 30 F5                   bra     mainLoop            
  532   47                      

プログラムは、全部で18バイトです。

関数"HIGH_6_13"と"MAP_ADDR_6"

アセンブラ記述に見慣れない関数が現れていることに気がついたでしょうか。 これら二つの関数は、RS08の命令を補完するために用意されています。

RS08では、16ビットのアドレスを指定する 「エクステンデド・アドレッシング・モードの命令が 大幅に削除されています。 わずかに残っているのは、無条件ジャンプ(JMP)と サブルーチンジャンプ(JSR)だけです。 そのため、$0100以降のアドレスのリソースにアクセスするためには、 アクセスするページをページ選択レジスタ(PAGESEL)に設定して、 $00C0から$00FFまでの窓から選択されたページを見に行くほかに 方法がありません。

この時にページを計算してくれるのが"HIGH_6_13"という関数で、 窓から見えるアドレスを計算してくれるのが"MAP_ADDR_6"という関数です。 $0100以降のアドレスのレジスタなどをアクセスする際には、 必要不可欠な関数です。

横着しました

ここで例として掲げたプログラムには、 カウンタやアキュムレータの初期化部分が入っていません。 理由は、プログラムのコードを極力短くするためなのですが、同時に 「どうせ、フリーランニングのプログラムなんだから、必要ないだろう。」 という横着精神の現れでもあります。 このため、皆様にはお勧めできません。

RS08のリソースへのアクセス

プログラムを書いたら、 次は、デバッガを呼び出して、簡単な読み書きをして見ます。

デバッガを呼び出す

DEMO9S08QG8評価ボードがUSBに接続されているのを確認し、 DEBUGボタンをクリックして、デバッガを呼び出します。

すると、"Connection Manager"というダイアログが出てきます。 ここで、"Connect"をクリックして接続します。

RS08に接続すると、 先ほどのプログラムがRAMにロードされます。 しかも、PCがプログラムの開始アドレスである$0020に設定されているので、 このまま"Start/Continue"ボタンをクリックするとプログラムが実行されます。 実行は、次の節で行います。

ファームウェアが自動的に書き換えられる

この時、評価ボードのファームウェアのバージョンが自動的に認識され、 必要であれば、書き直してしまいます。 私のボードもダイアログが出たかと思った瞬間、 またたく間に書き換えられてしまいました。

途中で電源が落ちたりすると書き込みに失敗するかも知れません。 お気をつけください。

RAMの読み書き

まず、RAM領域の読み書きをしてみます。 "Memory"サブウィンドウで右クリックし、 "Address..."からMC9RS08KA2のRAMが配置されている "0020"(十六進数表記)を指定すると、 RAMのメモリダンプが現れます。 このサブウィンドウの中でダブル・クリックすると RAMの内容を書き換えることができます。

レジスタの読み書き

次に、レジスタの読み書きをしてみます。 ここでは、PTA5に接続したLEDを操作します。

"Command"サブウィンドウで、 PTADレジスタ($0010)とPTADDレジスタ($0011)を書き換えるために 以下のコマンドを打ちます。

in>WW 0x10 0x2020

すると、PTA5が"1"を出力するように設定されて、LEDが点灯します。

逆に、LEDを消灯するときには、以下のコマンドを打ちます。

in>WW 0x10 0x0020

プログラムを走らせる

DEMO9S08QG8評価ボードとRS08が接続されているのが確認できましたので、 先ほどのプログラムを走らせてみます。

プログラムの再ロード

"Command"サブウィンドウで、以下のコマンドを打ちます。

in>LOADCODE ./bin/Project.abs
executing .\cmd\RS08_BDM_P&E_Multilink_CyclonePro_preload.cmd

!// Before load the commands written below will be executed 
done .\cmd\RS08_BDM_P&E_Multilink_CyclonePro_preload.cmd

Preload command file correctly executed.

Loading 18 bytes.
executing .\cmd\RS08_BDM_P&E_Multilink_CyclonePro_postload.cmd

!// After load the commands written below will be executed 
RESET
done .\cmd\RS08_BDM_P&E_Multilink_CyclonePro_postload.cmd

Postload command file correctly executed.

すると、プログラムがRAMに再ロードされ、 プログラムカウンタも$0020に設定されます。 この状態で、同じく"Command"サブウィンドウに以下のコマンドを打つと、 プログラムが走り始め、LEDが点滅します。

in>GO
STARTED
RUNNING

課題

FLASH ROMに書き込みたい

DEMO9S08QG8評価ボードは、 決してRS08に対応したハードウェアではありません。 そのため、そのままではFLASH ROMへの書き込みをすることはできません。 それでも、何とかしてFLASH ROMへの書き込みを行いたいと思うのが、 人情でしょう。 次は、DEMO9S08QG8評価ボードでもFLASH ROMへの書き込みが可能になるかを 検証してみます。

2006-06-04 緊急発行。

Copyright (C) 2006 noritan.org ■