「絵解き マイコンCプログラミング教科書」の補足情報を記します.読者さまから多かった質問などを特に取り上げています.参考にしていただければ幸いです.
●Tera Termとデバイス・ドライバの設定
「絵解き マイコンCプログラミング教科書」は,マイコンの組み込みプログラミングを最初の一歩から学ぶことができる,まさに教科書的な書籍です.本書にはC-Firstボードが付属していて,学んだことをすぐに試すことができます.これを使ってみたので紹介します.
まずは開封します.ダンボールに入った基板に,化粧の紙が巻き付いています.
写真1 書籍というよりキットという感じ
ダンボール箱の厚みの半分が書籍で,残りが基板(C-Firstボード)です.C-Firstボードが小さいので,余ったところはダンボールの小さな箱で衝撃吸収しているようです.書籍は約350ページ,なかなかの分量です.マンガで解説している章もあって,とっつきやすい感じです.
写真2 C-Firstボードを取り出し
ボードがあるならまず動かしてみる,基本ですね.書籍は後回しにしてさっそく動かしましょう.
本書のp.26に「[4]動作確認済みのプログラムを動かしてみる」の説明があります.先ず,ボードのマイコンには出荷時に評価済みプログラムなるものが書き込まれていて,パソコンに通信ソフトを準備することで,動くそうです.C-FirstボードはUSBをパソコンにつなぐだけです.C-Firstボードにはスライド・スイッチ2個(SW3とSW4)があります.初期の状態は2個のスイッチとも「VCOM」と表示された側にスライドしています.この状態を変更してはいけませんね.
もし間違えて評価済みプログラムを消去した場合は,DVDの中にあるプロジェクト
\02_ボード動作確認用プログラム\C-First_TEST\ C-First_TEST.mtpj
を実行して,デバッガでダウンロードします.この時にRL78/G14の内蔵ROMに書き込まれますから,出荷時の状態に戻ります.
写真3 スライド・スイッチ2個の状態>初期状態のままの「VCOM」側にします
準備するのはWindowsのパソコンと通信ソフト,ドライバ・ソフトです.
▲ソフトウェア1:Tera Term
1つは,C-Firstボードから送信される情報を表示する通信ソフトウェア(ターミナルと呼ばれる)です.「Tera Term」というものが無料で使いやすいです.書籍ではTera Termの設定は説明されていますが,このアプリはいったいどこにあるのかが書かれていませんでした.
インターネットで探すと,下記のウェブ・サイトにありました.デフォルトの設定でインストールして問題ありません.
https://ja.osdn.net/projects/ttssh2/
#2018年5月現在の最新版は4.98です.
図1 Tera Termのアイコン
図2 Tera Termのホームページ
図3 Tera Termのインストール
これでOKと思い,C-FirstボードをパソコンのUSBポートに差し込んでもTera Termの「シリアル」にC-Firstボードが表示されません.もしやと思いデバイス・マネージャを見ると「不明なデバイス」との表示です.
▲ソフトウェア2:USB用のドライバ
そこでもう1つ,USB用のドライバ・ソフトウェアをインストールします.DVDにあるのでは,と探すとここにありました.
デバイス・マネージャの「不明なデバイス」を右クリックして「デバイスの更新」を選択,「コンピュータを参照してドライバソフトウェアを検索」を選択し,「次の場所でドライバを検索します」の入力ボックスにフォルダ「01_開発環境CS+とエミュレータ¥EZエミュレータ用ドライバ¥x32またはx64」を指定します.パソコンのOSはWindowsメニューの「システム」から確認します.
図4 デバイスマネージャとシステム情報へのアクセス>Windowsメニューを右クリック
図5 Windowsのビット数の確認>このパソコンは64ビット
図6 デバイスマネージャの確認と設定>C-Firstボードを接続したので「不明なデバイス」がある
図7 不明のデバイスにドライバをインストールする>不明なデバイスを右クリックして更新する
図8 ドライバソフトウェアを参照する
図9 Windowsに合わせてフォルダを指定>例のパソコンは64ビット版のWindowsなのでx64フォルダを指定
図10 ドライバを参照,インストール>「次へ」でインストールを開始
図11 ドライバの確認>Renesas Electronics Corporationで良いかの確認.「インストール」を選択する
図12 インストールの完了メッセージ
図13 不明なデバイスが消えてRenesas Virtual UARTが表示される>この状態で使える
デバイス・マネージャのポート(COMとLPT)に表示され,不明なデバイスが消えました.Tera Termを実行して,新しい接続で「シリアル」,ポートを「Renesas Virtual UART」を選択します.これで準備完了です.
図14 新しい接続でシリアルポートを選択
Tera Termの「端末(T)…」と「シリアルポート(E)…」設定をします.
図15 Tera Termの端末とシリアルポートの設定
図16 端末の設定>端末サイズ,受信改行コード,ローカルエコー,漢字の送受信コードを変更
図17 シリアルポート設定>ボーレートを変更
C-FirstボードがUSBでパソコンにつながった状態で, C-FirstボードにあるRESETボタンを1回,押し下げるとC-Firstボードから起動のメッセージがTera Termに表示されます.
図18 C-Firstボードのテスト・プログラムの起動>RESETボタンを押し下げる
加速度センサの表示は3なので,「3」と「Enter」のキーを順に入力します.C-Firstボードを傾けてみると,下記のように表示されます.
C-First テストプログラム
CQ出版社
---------------------------
1: 温度センサ表示(℃)
2x: 照度センサ表示(LX)
21:高感度 22:中感度 23:低感度
3: 加速度センサ表示(G)
4: スイッチ・LEDテスト
SW1:点滅方向変更
SW2:点滅速度変更
5: RL78内基準電圧1.45(V)
6: RL78内温度センサ(℃)
---------------------------
No.?:3(Enterキー)
加速度センサの値を表示
ボードを傾けると値が変化します
加速度 X: 0.01G Y: 0.02G Z: 1.02G ← 平に置いた時
加速度 X:-0.99G Y: 0.03G Z: 0.03G ← RESETボタンのある側を下にして立てたとき
加速度 X:-0.00G Y: 1.03G Z: 0.09G ← CN1(CQ出版社のロゴがある側)を下にして立てたとき
なるほど,ですね.次にやることは?デバッガを使ってみることです.
<
藤澤 幸穂>
●デバッガを使ってプログラムを動かしてみる
デバッガを使って自ら作成したプログラムを動かしてみましょう.
準備をしましょう.パソコンにCS+というソフトをインストールと,C-Firstボードのスライド・スイッチを変更します.
写真1 C-FirstのスイッチはSW3,SW4をOCD側へスライドする
パソコンに開発環境CS+を入れます.
インストールはデフォルトでOKです.書籍にも詳細が出ていますので迷うことはないと思います.
ここでは手始めに「第6章」のsample1_1を動かします.このサンプルはP.119に紹介されていて,スイッチと連動してLEDが点灯するプログラムです.
DVDを確認するとあります.ファイルは紹介されているmain.c以外にもいくつかあるようです.
DVDROM
├ 01_開発環境CS+とエミュレータ
├ 02_ボード動作確認用プログラム
├ 03_サンプル・プログラム
| ├ APP3_演習問題
| ├ 第6章
| | └ リスト16_sample1_1
| | ├ cstart.asm
| | ├ hdwinit.asm
| | ├ iodefine.h
| | ├ main.c
| | ├ sample1_1.mtpj
| | ├ sample1_1.rcpe
| | └ stkinit.asm
取りあえずこのフォルダをDVDからパソコンのハードディスクまたはSSDなどにコピーしておきます.私はC:\Workspaceフォルダにコピーしました.
図1 サンプルをコピーしたところ
sample1_1.mtpjをダブルクリックして起動します
コピーしたらsample1_1.mtpjファイルが開発環境CS+のプロジェクト情報のファイルなので,これをダブルクリックして起動します.
図2 sample1_1プロジェクトが開いたところ
プロジェクトとしてちゃんと開きました.main.cファイル以外のファイルはおおよそこんな処理をしているようです.
-------------
cstart.asm:リセットから起動してmain関数を呼び出すまでの処理(CPU内部,RAMの初期化など).アセンブリ言語なので変更するのは大変そうだが,外部にバスが出ていないRL78のマイコンなので変更の必要がないはず.
hdwinit.asm:ハードウェアの初期化であるが必須なわけではない.サンプルも中はカラ.アセンブリ言語なのであまり使いたくない.
iodefine.h:内蔵周辺機能のレジスタ名,ビット名が定義されている.名前が気に入らないときは修正するかundefして再定義する.
sample1_1.mtpj:プロジェクトの構成(コンパイラ/リンカなどのバージョンなど)ファイル.
sample1_1.rcpe:オプションの状況(コンパイル/リンクなどのオプション設定など)ファイル.
stkinit.asm:スタック領域の設定.変更の必要がないファイル.
-------------
このサンプルの中のサブルーチン,関数の呼び出しルートを確かめてみました.関数の名前を追っても構いませんがここでは「スタック解析」を行う方法を使ってみました.この他にも「Report」には「コール・グラフ」機能があるのでこれが使えます.
リンク・オプションで「スタック情報ファイルを出力する」を「はい」に設定してからビルド,その後に「ツール」から「スタック見積もりツールの起動」を選ぶと図3と図4のように表示されます.
図3 スタック情報ファイルの出力を設定.関数呼び出し経路の表示にも役立つ
図4 スタック使用量と関数の呼び出し経路を表示するCall Walker
cstart.asmで起動したらアセンブラで記述されたhdwinitを呼び出して戻ってきたらmain関数を呼び出しますが,mainからは戻ってきません.またmainからほかの関数を呼び出すこともありません.
横道にそれてしまいました.元に戻ってプログラムを実行してみます.
プログラムの実行は,下記の機能を使って確認します.私が書いたソースコードが悪いのか,それともハードウェアか,はたまたCコンパイラなのか,まさかマイコンの不具合かどうかを確認できます.
①プログラムのビルドとRL78/G14の内蔵ROMへの転送(書き込み)
②プログラムの実行と停止
考えた通りの動作なら問題ありませんが,上手くいかなかったときは,デバッグとなり
③プログラムの1行ごとの実行
④変数の確認と一時的な強制変更
⑤入出力(内蔵周辺機能のレジスタ値,入出力端子のレベル)の確認と一時的な強制変更
⑥機械語の確認(内蔵ROM内の機械語コードの逆アセンブル表示)
ところでRL78/G14には「オプションバイト」があり,プログラムで設定するのではなくレジスタの初期値をROMに書き込んでおく,となっています.オプションバイトにはウォッチドッグタイマ(WDT)や電源電圧を監視してリセットをかける機能(LVD)の設定をROMに書き込んでおきます.間違ってWDTが動いていると厄介です.CC-RLのプロパティを確認すると,このサンプルではWDTは停止しています.問題なしです.
図5 CC-RLのオプションバイトの設定状況.WDTは停止している
デバッグを始めてみます.
①「デバッグ(D)」メニューから」「ビルド&デバッグ・ツールへダウンロード(B) F6」を選択
これでマイコン内蔵ROMへ書き込みができて,main関数の先頭まで実行して一時停止してくれます.
図6 ビルド,ダウンロードが完了.main関数の先頭で自動的に止まる
内蔵ROMへ書き込む(ダウンロード)した時点でmain関数まで実行するのは,EZエミュレータの設定によってなので変更できますね.
図7 EZエミュレータの設定.main関数までを実行する設定で変更可能
②「実行(G)」の選択で動作が始まるので,SW1を押すとLED0が光ります.もちろんサンプルなので動いて当たり前です.止めるには「停止(S)」を選択します.
回路を動かすプログラムなので,回路図を確認しておきましょう.
SW1はP75端子(ポート7のビット5の位置)に接続されていますが電源やGNDにつながる抵抗は見当たりません.コストのためでしょうかね.RL78/G14のハードウェア・マニュアルを確認すると内部には電源につながるプルアップ抵抗があり,プルアップ制御レジスタ(PUx)でON/OFFできます.これをONする必要があります.スイッチがONならLOWレベルで「0」,OFFならHIGHレベルで「1」が読めます.
LED0はP17端子(ポート1のビット7の位置)に接続されています.P17から「0」のLOWレベルが出力されると,LED0に電流が流れて点灯します.「1」のHIGHレベル出力では消灯です.
図8 C-Firstボードの回路図(一部)
●EZエミュレータの操作
さて,デバッグしなければならなくなったときのためにEZエミュレータの操作を覚えておくのも良いですね.まずプログラムを最初からもう一度ゆっくり動かしてみましょう.
リセットして元に戻します(図9).最初にハードウェアのチェック方法です.回路が正しく動作するかを確かめます.プログラムは使わなくてもRL78/G14の内蔵周辺機能レジスタ(SFR)を書き換えることで確認できるのです.
図9 CPUをリセットして元に戻す
図10 内蔵周辺機能レジスタ(SFR)の表示
LED0はP17端子に接続されているので,P1に0x80(消灯)または0x00(点灯)を書いてみます.
図11 P1にLED0の点灯/消灯のデータを書いてみる.LED0は変化しない
LED0は変化しません.当然ですね,端子が出力になっていないからです.出力設定はPM1の対応するビットに「0」を書き込むので,P17のみ出力なら0x7fです.これで先ほどのP1に0x80または0x00を書くと, LED0が消灯/点灯します.
図12 PM1にP17端子を出力にする設定を書く.0x7fでP17は出力端子
次にSW1の値を確認します.P75なのでP7の値に注目しながら,SW1を押しながら「最新の情報に更新」,離して「最新の情報に更新」して変化するかを確認します.
図13 SW1の状態を読んでみる.プルアップ抵抗が接続されていないのでスイッチの変化がP7に表れない
図14 内蔵プルアップ抵抗をONにする.SW1の変化をP7で読み取ることができる
これでハードウェアが壊れていないかの確認ができました.
では,順にプログラムを動かして初期化を確認します.もう一度「CPUリセット」してから「ステップ・イン」します.1行分進みます.
図15 ステップ・インして1行分進める
PCの位置が1行分進んでPU7への書き込みが終了して停止します.この状態でP7初期化が終わっているので,SW1の状態がP7に読み込めるので,上記と同じように確認できます.
次にステップ・インするとLED0を消します.
図16 ステップ・インで結果を確認する
プログラムが大きいとステップ・インでは時間がかかるので,途中までは正しいからそこはさっと実行したい,ってことありますよね.そんなときに活躍するのが「ブレークポイント」.ブレークポイントの位置に来たら実行を停止してくれます.
図17 ブレークポイントの設定.設定できたら「実行」でプログラムを動かす
図17の例ではSW1をOFFにしたらブレークします.
ところで,デバッグしていると,ハードウェアは正しいのに動かない,ソースの記述はいくら眺めても正しいとしか判断できないときありますよね.そんなとき,もしかしたらCコンパイラが不具合の原因ではないか? と思ったことありますよね.たいていの場合は自分のソースが不具合の原因ですが,ごくまれにコンパイラも不具合がでます.そんなときに役立つのが逆アセンブリ表示です.
図18 逆アセンブル表示の設定
図19 逆アセンブル表示.Cのソースとともに表示されてはいますが,慣れないと解読は難しい!
残念ながらこのプログラムには変数が存在しないのですが,変数を参照/変更する場合は「ウォッチ」を使います.SFRと同じように参照と変更ができます.
以上で一通りのデバッグの使い方は終わりです.
元の評価済みプログラムに戻す方法を紹介します.DVDにある評価済みプログラムのプロジェクトを実行します.
DVDROM
├ 01_開発環境CS+とエミュレータ
├ 02_ボード動作確認用プログラム
| └ C-First_TEST
C-First_TEST.mtpjファイルをダブルクリックしますが,ここでおまじないを1つ.C-First_TEST.ichiro.mtudファイル名の内,ichiroの部分をパソコンのユーザ名に変更します.私のユーザ名はa0102067なので,C-First_TEST.a0102067.mtudとします.
C-First_TEST.mtpjファイルをダブルクリックしCS+を起動します.
「デバッグ(D)」メニューから」「ビルド&デバッグ・ツールへダウンロード(B) F6」を選択します.これでマイコン内蔵ROMへ書き込みができて,main関数の先頭まで実行して一時停止してくれます.
これで書き込みができたので,「実行(G)」を選択すると動作が始まります.
Tera Termは? そうですね,USBをCS+が占有しているため,つながりません.仕方ないので,「停止(S)」して,「デバッグ・ツールから切断(N) Shift+F6」します.
Tera Termを起動したら,C-FirstボードのSW3とSW4をVCOM側にスライドして,USBケーブルを指し直すか,RESETボタンを押し下げてから放して最初から実行します.
どうですか,最初に戻りましたね.
以上でC-Firstボードの使い方は使えるようになりました.マイコンのプログラミングを楽しんでください.
<
藤澤 幸穂>