いくら新しいマイコンがあっても、 開発ツールでプログラムを書かないことには、マイコンは始まりません。 その前にこのマイコンにつながる開発ツールを入手しなくては なりません。 何とか、手持ちの機材で済まないかなあ。
RS08マイコンは、HCS08の流れくむ最新のマイコンです。 そのため、開発ツールとのインターフェースには、 HCS08と同じバック・グランド・モード(BackGround Mode : BDM)が使用されます。
BDMインターフェースは、 6ピンのピンヘッダによって信号の送受信を行います。 下の写真は、DEMO9S08QG8評価ボードに搭載したピンヘッダの例です。
このように、BDMインターフェースは、 2×3ピンヘッダとして規格化されています。 このコネクタには、以下のような信号線が接続されています。
信号名 | ピン番号 | ピン番号 | 信号名 |
---|---|---|---|
BKGD | 1 | 2 | VSS |
N.C. | 3 | 4 | RESET*/VPP |
N.C. | 5 | 6 | VDD |
N.C.は、接続せず(Non-Connection)という意味を表しています。 いずれの開発ツールもこのコネクタ規格を使用していますが、 HCS08の場合には、4ピンにVPPの文字は ありませんでした。
HC08やHCS08では、 FLASH ROMの書き込み・消去に必要な12Vの高電圧を マイコン内部のチャージポンプで作っていました。 このため、HC08やHCS08は、通常動作状態でもFLASH ROMを書き換える事が できました。 ところが、RS08では、内部チャージポンプを省略したため、 外部から12Vの高電圧を供給しなくてはならなくなりました。 これが、VPPと呼ばれる電源入力です。
VPPは、FLASH ROMを書き込むために必要なので、 もちろん、開発ツールが、プログラムを書き込むときにも必要です。
逆に言うと、FLASH ROMを書き換える必要が無いのであれば、 VPPを与える必要はありません。 また、VPPを与えない事によって、 FLASH ROMの内容を保護することもできます。
このページでは、 「FLASH ROMに書き込みをしないなら、VPPを必要とはしない。」 という事実を手がかりに、ひとまずRS08マイコンとの会話を試みます。
私の手元にあるBDMインターフェース搭載の開発ツールは、 DEMO9S08QG8評価ボードだけです。
DEMO9S08QG8 8Bitマイコン評価キット $50(直販価格) |
今回も、これを使ってRS08と会話をしてみます。
RS08とDEMO9S08QG8評価ボードを接続するために ブレッドボード上に回路を組みました。
回路図は、以下のようになっています。
大事なサンプルチップを壊しては大変なので、 要所要所に220Ωの保護抵抗を挿入しました。 また、動作確認用にPTA5にLEDと470Ωの電流制限抵抗を付けました。
ところで、この写真に写っているBDMピンヘッダは、 標準の2×3構成のものではありません。 このピンヘッダ構成は、ブレッドボード上で使用できるように 私が考案した配置で、SBDM(Serial BDM?)と呼んでいます。 このピンヘッダの配置は、以下のようになっています。
ピン番号 | 信号名 |
---|---|
1 | RESET* / VPP |
2 | BKGD |
3 | VDD |
4 | VSS |
この配置は、MC9S08QG8の1番ピンから4番ピンの配列そのままです。 また、同じ配置がDIPパッケージ版のMC9RS08KA2でも使用されています。 つまり、このコネクタをMC9S08QG8やMC9RS08KA2のアプリケーションに 使う時には、マイコンの直近に直列にピンヘッダを立てるだけで対応できます。
ブレッドボードとDEMO9S08QG8評価ボードを接続したら、 ハードウェアの準備は完了です。
次は、CodeWarriorからのソフトウェア的な接続を試します。
現在、都合により画面ハードコピーを掲載していません。 説明文だけになりますが、ご了承ください。
RS08マイコンは、 CodeWarrior V5.1 でしか サポートされていません。 そのため、RS08マイコンを試す場合には、 CodeWarrior V5.1 のインストールと起動は必須です。
CodeWarrior を起動したら、 "Start Dialog"から"Create New Project"をクリックし、 新規プロジェクトの作成を開始します。
以下、簡単に設定を説明します。
項目 | 設定値 |
---|---|
Device | MC9RS08KA2 |
Connection | P&E Multilink/Cyclone Pro |
Language | Absolute assembly |
Project Name | FirstRS08 |
Add Additional Files | Nothing |
Rapid Application Development | None |
これは、まあ当然でしょう。 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バイトです。
アセンブラ記述に見慣れない関数が現れていることに気がついたでしょうか。 これら二つの関数は、RS08の命令を補完するために用意されています。
RS08では、16ビットのアドレスを指定する 「エクステンデド・アドレッシング・モードの命令が 大幅に削除されています。 わずかに残っているのは、無条件ジャンプ(JMP)と サブルーチンジャンプ(JSR)だけです。 そのため、$0100以降のアドレスのリソースにアクセスするためには、 アクセスするページをページ選択レジスタ(PAGESEL)に設定して、 $00C0から$00FFまでの窓から選択されたページを見に行くほかに 方法がありません。
この時にページを計算してくれるのが"HIGH_6_13"という関数で、 窓から見えるアドレスを計算してくれるのが"MAP_ADDR_6"という関数です。 $0100以降のアドレスのレジスタなどをアクセスする際には、 必要不可欠な関数です。
ここで例として掲げたプログラムには、 カウンタやアキュムレータの初期化部分が入っていません。 理由は、プログラムのコードを極力短くするためなのですが、同時に 「どうせ、フリーランニングのプログラムなんだから、必要ないだろう。」 という横着精神の現れでもあります。 このため、皆様にはお勧めできません。
プログラムを書いたら、 次は、デバッガを呼び出して、簡単な読み書きをして見ます。
DEMO9S08QG8評価ボードがUSBに接続されているのを確認し、 DEBUGボタンをクリックして、デバッガを呼び出します。
すると、"Connection Manager"というダイアログが出てきます。 ここで、"Connect"をクリックして接続します。
RS08に接続すると、 先ほどのプログラムがRAMにロードされます。 しかも、PCがプログラムの開始アドレスである$0020に設定されているので、 このまま"Start/Continue"ボタンをクリックするとプログラムが実行されます。 実行は、次の節で行います。
この時、評価ボードのファームウェアのバージョンが自動的に認識され、 必要であれば、書き直してしまいます。 私のボードもダイアログが出たかと思った瞬間、 またたく間に書き換えられてしまいました。
途中で電源が落ちたりすると書き込みに失敗するかも知れません。 お気をつけください。
まず、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
DEMO9S08QG8評価ボードは、 決してRS08に対応したハードウェアではありません。 そのため、そのままではFLASH ROMへの書き込みをすることはできません。 それでも、何とかしてFLASH ROMへの書き込みを行いたいと思うのが、 人情でしょう。 次は、DEMO9S08QG8評価ボードでもFLASH ROMへの書き込みが可能になるかを 検証してみます。
2006-06-04 緊急発行。