C - U-netSURF
C - U-netSURF
C - U-netSURF
- No tags were found...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
はじめに<br />
コンピュータというとみなさんは 何 を 思 い 浮洆 かべますか。きっと,パソコンでしょうね。インターネッ<br />
トと 電 子 メールが 普晘 通 のものになった 今 ,パソコンは 一 人 一 台 (もしかしたらそれ 以 上 )の 時昷 代 になっ<br />
てきました。<br />
ところで,みなさんはコンピュータをいくつ 持 っていますか。(パソコンではないですよ。コンピュ<br />
ータです。) 実 は 一 人 10 台 以 上 持 っていても 不 思 議 ではありません。というのは,マイクロコンピュー<br />
タ,つまりマイコンがありとあらゆる 電 気 製 品 に 組 み 込 まれているからです。テレビ,ラジオ, 洗泙 濯 機 ,<br />
冷 蔵 庫 , 電 子 レンジ, 炊 飯 器 ,エアコン…。あげればきりがありません。<br />
これだけ 身 近 なマイコンですが, 多 くの 人 にとって 今 なおマイコンは 遠 い 存 在 です。マイコンを<br />
使 っていても,その 仕 組 みを 理 解 している 人 はそれほど 多 くはないでしょう。<br />
もっとも,これは 当 然 のことかもしれません。マイコンはすでに 空 気 のようなもので,なくてはなら<br />
ないものですが, 普晘 段 は 意 識 されない 存 在 だからです。でも, 空 気 について 調 べると 非 常 に 興 味 深济<br />
い 事 実 があるのと 同 じように,マイコンもその 仕 組 みを 理 解 すると 非 常 に 面 白 いものであることがわか<br />
ります。<br />
TK-3687mini は,そんなマイコンの 面 白 さを 理 解 したい,という 人 のために 用 意 されました。マイ<br />
コンを 理 解 する 早 道 は,とにかくプログラムを 作 って 動 かしてみる,という 事 につきますが,そのための<br />
道 具 としてきっとお 役 に 立 つことでしょう。<br />
ここで,TK-3687mini で 採 用 されている H8/3687 というワンチップマイコンについて 少 しふれてお<br />
きましょう。H8/3687 は 日 立 によって 開 発 が 始 まった H8 シリーズの 一 員 です。H8 シリーズは 規 模 や 用<br />
途 に 応 じて 多 くのシリーズがありますが,H8/3687 はシステムの 小 型 化 を 目 指 してそのほとんどをワン<br />
チップ 化 した‘H8/300H Tiny’シリーズに 属 します。‘H8/300H Tiny’シリーズの 標 準 品 は H8/3664<br />
で 多 くのボードメーカによってマイコンボードが 作 られました。TK-3687mini で 採 用 している H8/3687<br />
はその 機 能 強 化 版 にあたります。H8 シリーズは 現 在 , 日 立 と 三 菱 が 共 同 で 設 立 したルネサステクノロ<br />
ジが 製 造 ・ 販 売 しています。<br />
このマニュアルでは,マイコンにはじめて 触 れる 人 に 向 けて TK-3687mini の 基 本曓 的 な 使 い 方 を<br />
説 明 しています。 細 かい 理 屈 はわからなくても,このとおりやっていけばとりあえず 動 かすことができる<br />
ようになっています。 細 かい 理 屈 もちょっとだけ 書暯 いていますので 興 味 がわいたら 読 んでみてください。<br />
みなさんのマイコン 技 術 がさらにステップアップする 入 口 になれば 幸 いです。<br />
マニュアルについて<br />
ルネサステクノロジのサイト(http://www.renesas.com/jpn/)から,マニュアルのダウンロ<br />
ードサイト(http://www.renesas.com/jpn/products/mpumcu/16bit/tiny/tiny_manual.html)に 移<br />
動 し, 次 のマニュアルをダウンロードして 下 さい。 技 術 文 書暯 のため 読 みこなすのはかなりた<br />
いへんですが, 欠 かすことができない 資 料 です。<br />
「H8/3687 グループ ハードウェアマニュアル」<br />
「H8/300H シリーズ プログラミングマニュアル」<br />
あとは HEW と 一 緒 にパソコンにコピーされるマニュアルが,アセンブラや C の 言 語 仕<br />
様 を 説 明 しています。これも 読 むのはたいへんですが,やはり 欠 かすことができません。<br />
1<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
目 次<br />
はじめに ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.1<br />
第 1 章 ワンチップマイコン 入 門 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.3<br />
1.ワンチップマイコンとは 何 か ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.3<br />
2.H8/3687 の 構 成 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.4<br />
第 2 章 ハイパーH8 を 動 かしてみよう ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.9<br />
1.モニタプログラムとは 何 か ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.9<br />
2.モニタプログラム「ハイパーH8」を 使 ってみる・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.10<br />
3.デモプログラムの 実 行 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.16<br />
第 3 章 マシン 語 でプログラムを 作 ってみよう・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.19<br />
1.プログラムの 作 成 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.19<br />
2.プログラムの 入 力 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.21<br />
3.プログラムをデバッグする ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.25<br />
第 4 章 C 言 語 でプログラムを 作 ってみよう・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.27<br />
1. 統 合 開 発 環 境 「HEW」のインストール ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.27<br />
2.ハイパーH8 を 使 うときのメモリマップ ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.28<br />
3.C 言 語 でプログラムを 作 ってみる ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.29<br />
4.プログラムのダウンロードと 実 行 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.43<br />
第 5 章 内 蔵 周 辺 機 能 を 使 う ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.46<br />
1.I/O ポート・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.46<br />
2. 外 部 割 込 み・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.58<br />
3.タイマ V ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.66<br />
4.タイマ Z ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.73<br />
5.シリアルコミュニケーションインターフェース ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.80<br />
6.AD コンバータ ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.88<br />
第 6 章 μITRON を 実 装 しよう ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.99<br />
1. 開 発 に 必 要 なものを 用 意 する ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.100<br />
2.カーネルライブラリの 構 築 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.101<br />
3.プロジェクトの 作 成 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.111<br />
4.TK-3687 版 にカスタマイズする ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.130<br />
5.マルチタスクを 体 験 しよう・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.136<br />
6. 割 り 込 みを 使 ってみよう ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.140<br />
7.タスク 付 属 同 期曋 機 能 ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.145<br />
付 録 ( 回 路 図 , 参 考 資 料 ) ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」 P.148<br />
2<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
第 1 章<br />
ワンチップマイコン 入 門<br />
1.ワンチップマイコンとは 何 か<br />
2.H8/3687 の 構 成<br />
まずはマイコンと TK-3687mini について 見 てみましょう。この 章 は「マイコンって,こんなもんか」と<br />
いう 感 じで 気 楽 に 読 んでもらえればよいです。あとは 動 かしていくうちにわかってくるでしょう。<br />
1.ワンチップマイコンとは 何 か<br />
まずは TK-3687mini を 箱 から 出 して 眺 めてみましょう。<br />
基 板朋 の 中 央 に LSI(H8/3687)が 1 個 のっていますね。まわり<br />
にいろいろと 部 品 がのっていますが,これらは 全 部 おまけ<br />
みたいなもので, 実 はこの LSI がマイコンそのものです。こ<br />
の 中 にマイコンの 機 能 の 全 てがつまっています。<br />
<br />
マイコンの 3 要 素<br />
どんなマイコンでも 次 の 基 本曓 的 な 3 つの 要 素 からでき<br />
ています。もちろん H8/3687 も 例 外 ではありません。<br />
CPU は 演 算 や 判<br />
断 の 処 理 を 行 ない,<br />
データの 流泴 れをコント<br />
ロールするコンピュー<br />
タの 頭 脳 です。そして,<br />
その CPU を 動 作 させ<br />
るためのプログラムや<br />
データを 記 憶 するの<br />
がメモリです。 外 部 か<br />
ら 信 号 を 入 力 したり 外<br />
部 機 器 をコントロール<br />
するのが I/O です。 基<br />
本曓 的 に は 右 のような<br />
構 成 になります。<br />
• CPU(Central Processing Unit: 中 央 演 算 装 置 )<br />
• メモリ( 記 憶 装 置 )<br />
• I/O(Input/Output: 入 出 力 装 置 )<br />
CPU<br />
メモリ<br />
ROM I/O I/O I/O<br />
メモリ<br />
RAM<br />
I/O I/O I/O<br />
以 前 はこの 3 要<br />
素 は 別 々の LSI で,<br />
それぞれを 配 線 する 必 要 がありました。しかし, 最暷 近 はこれら 全 てが 一 つの LSI に 集 積 されるようにな<br />
りました。これをワンチップマイコンと 呼 んでいます。<br />
3<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
2.H8/3687 の 構 成<br />
H8/3687 の 内 部 ブロック<br />
TK-3687mini で 使 っている H8/3687 もワンチップマイコンです。H8/3687 に 何 が 内 蔵 されている<br />
か 次 の 図 をご 覧 下 さい。 前 のページの 図 とどのように 対 応 するか 色 分 けしてみました。マイコンの 3 要<br />
素 の 全 てが 入 っていますね。<br />
H8/3687 の 内 部 ブロック 図<br />
H8/3687 には,H8/300H という CPU が 内 蔵 されています。CPU は,メモリから 順 番 に 命 令 を 取 り<br />
出 し,その 命 令 に 従 って 計 算 ( 演 算 )したり,さらにメモリに 対 してデータをリード/ライトしたり,I/O に 対<br />
してデータをリード/ライトしたりします。<br />
4<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
H8/3687 のレジスタ<br />
H8/300H の 内 部 には, 一 時昷 的 にデータをセットするために 使 う 汎 用 レジスタ(ER0~ER7)と,<br />
CPU の 制 御 のために 使 うコントロールレジスタ(PC と CCR)があります。レジスタはメモみたいなもので,<br />
ちょっとデータを 記 録 しておく,というような 感 じで 使 います。これからこのマニュアルで TK-3687mini<br />
(H8/3687)について 調 べていきますが,レジスタはよく 出 てくるため,ここでまとめて 取 り 上 げます。<br />
• 汎 用 レジスタ<br />
H8/300H は 32 ビット 長 の 汎 用 レジスタを 8 本曓 持 っています。それぞれ,ER0~ER7 という 名 前 が<br />
つけられています。<br />
この 32 ビットレジスタを 上 位 16 ビットと 下 位 16 ビットにわけて,それぞれを 16 ビットレジスタとし<br />
て 使 うことができます。E0~E7,R0~R7 という 名 前 がつけられていて,16 ビットレジスタを 最暷 大 16 本曓<br />
使 うことができます。<br />
さらに,R0~R7 については 上 位 8 ビットと 下 位 8 ビットにわけて,それぞれを 8 ビットレジスタとし<br />
ても 使 うことができます。R0H~R7H,R0L~R7L という 名 前 がつけられていて,8 ビットレジスタを 最暷 大<br />
16 本曓 使 うことができます。<br />
これらの 汎 用 レジスタは「 汎 用 」と 名 付 けられているとおり, 全 て 同 じ 機 能 を 持 っています。つまり,<br />
ER0 でできることは ER1~ER7 でもできますし,R0L でできることは R0H~R7H,R1L~R7L でもでき<br />
ます。また, 各 レジスタは 独 立 して 32,16,8 ビットレジスタとして 使 うことができます。<br />
汎 用 レジスタの 構 成 について 図 で 示 すと 次 のようになります。(n=0~7)<br />
ERn(32 ビット)<br />
半 分 にする<br />
En(16 ビット)<br />
Rn(16 ビット)<br />
半 分 にする<br />
RnH(8 ビット)<br />
RnL(8 ビット)<br />
汎 用 レジスタは 全 て 同 じ 機 能 を 持 っているのですが,ER7 だけは 汎 用 レジスタとしての 機 能 にプ<br />
ラスして,スタックポインタとしての 機 能 も 持 っています。<br />
5<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
• コントロールレジスタ<br />
H8/300H には 2 つのコントロールレジスタがあります。1 つはプログラムカウンタ(PC)です。PC は<br />
24 ビットのレジスタで,CPU が 次 に 実 行 する 命 令 のアドレスを 示 しています。H8/3687 は PC の 下 位<br />
16 ビットを 使 用 しています。<br />
プログラムカウンタ(24 ビット)<br />
もう 1 つはコンディションコードレジスタ(CCR)です。CCR は 8 ビットのレジスタで,それぞれのビ<br />
ットが CPU の 内 部 状 態 を 表 しています。 演 算 結 果 が 0 になったとか,マイナスになったとか,キャリや<br />
ボローやオーバフローが 発 生 したという 情 報 がセットされます。おもに 分 岐 命 令 で 使 われます。どん<br />
な 種 類 があるのか 下 記 に 示 します。<br />
コンディションコードレジスタ(8 ビット)<br />
I UI H U N Z V C<br />
ビット<br />
ビット 7<br />
ビット 6<br />
ビット 5<br />
ビット 4<br />
ビット 3<br />
ビット 2<br />
ビット 1<br />
ビット 0<br />
ビット<br />
名 称<br />
I<br />
UI<br />
H<br />
U<br />
N<br />
Z<br />
V<br />
C<br />
機 能<br />
割 り 込 みマスクビット<br />
このビットが‘1’にセットされると 割 り 込 み 要 求 がマスクされます。<br />
ユーザビット<br />
ユーザが 自 由 に 定 義 , 設 定 できるビットです。<br />
ハーフキャリフラグ<br />
8 ビット 算 術 演 算 のときは,ビット 3 にキャリが 生 じたとき‘1’, 生 じなかったとき‘0’になりま<br />
す。16 ビット 算 術 演 算 のときは,ビット 11 にキャリが 生 じたとき‘1’, 生 じなかったとき‘0’に<br />
なります。32 ビット 算 術 演 算 のときは,ビット 27 にキャリが 生 じたとき‘1’, 生 じなかったとき<br />
‘0’になります。<br />
このフラグは 10 進 補 正 命 令 (DAA,DAS)のときに 使 用 されます。<br />
ユーザビット<br />
ユーザが 自 由 に 定 義 , 設 定 できるビットです。<br />
ネガティブフラグ<br />
データの 最暷 上 位 ビットを 符 号 ビットと 見 なし, 最暷 上 位 ビットの 値 を 格 納 します。<br />
ゼロフラグ<br />
データがゼロのときに‘1’,ゼロ 以 外 のときに‘0’になります。<br />
オーバフローフラグ<br />
算 術 演 算 命 令 の 実 行 によりオーバフローが 発 生 したときに‘1’,それ 以 外 のときは‘0’にな<br />
ります。<br />
キャリフラグ<br />
演 算 の 結 果 ,キャリが 生 じたときに‘1’, 生 じなかったときに‘0’になります。キャリには1 加<br />
算 結 果 のキャリ,2 減浦 算 結 果 のボロー,3シフト/ローテート 命 令 のキャリがあります。<br />
ダウンロードした「H8/300H シリーズ プログラミングマニュアル」の 各 命 令 のページに,「●コン<br />
ディションコード」という 項 目 があります。その 命 令 を 実 行 した 結 果 ,CCR がどのように 変 化 するか 説 明<br />
されています。<br />
「…」という 感 じでしょうか。でも 心 配 には 及 びません。このマニュアルでも 関 係 するところ<br />
で 説 明 しますし,プログラムを 作 ったり 動 かしたりしていくうちにだんだんわかってくると 思 います。「 習<br />
うより 慣 れろ」と 言 いますしね。<br />
6<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
H8/3687 のメモリマップ<br />
メモリはプログラムも 含 めたデータを 記 憶 する 部 分 です。もっとも 見 た 目 は 単 なる 数 字 にしか 見 え<br />
ませんが…。CPU からの 命 令 で 以 前 に 記 憶 させたデータを 読 んだり(リード), 新 たにデータを 記 憶 さ<br />
せる(ライト)ことができます。 例 えば,CPU がプログラムを 実 行 する 時昷 は,メモリからデータをリードして,<br />
そのデータがどんな 命 令 か 解 析 して 実 行 します。<br />
メモリには 1 バイトごとに 0 から 始 まるアドレスがつけられています。アドレスというぐらいなので,<br />
考 え 方 としては 町 の 住 所 のようなものです。 広 い 日 本曓 の 特 定 の 家 に 手 紙 を 届 けるために 住 所 をきち<br />
んと 指 定 するのと 同 じように,メモリをリード/ライトする 時昷 には 必 ずアドレスを 指 定 しなければなりませ<br />
ん。このとき 使 う 表 現 が「メモリの~ 番 地 」というフレーズです(やっぱり 住 所 ですね)。メモリの 場 合 は<br />
16 進 数 で 表 します。 例 えば,「EA00 番 地 から 実 行 する」という 感 じです。<br />
さて,H8/3687 には ROM と RAM という 2 種 類 のメモリが 内 蔵 されています。ROM とは Read<br />
Only Memory の 略 で, 電 源 をオフしても 消洑 えることはなく, 特 別 な 方 法沵 でしか 書暯 き 換 えることができな<br />
いメモリです。 通 常 はリードするだけです。H8/3687 に 内 蔵 されている ROM はフラッシュメモリで,プ<br />
ログラムや 変 更暬 する 必 要 のないデータはここに 書暯 き 込 みます。レジスタをメモとすれば,ROM は 本曓 で<br />
すね。 出 荷 時昷 にはハイパーH8 というプログラムが 書暯 き 込 まれています。なお,フラッシュメモリを 書暯 き<br />
換 えるためには‘FDT’という 道 具 を 使 います(FDT については「TK-3687mini 組 み 立 て 手 順 書暯 」をご<br />
覧 下 さい)。<br />
RAM は Random Access Memory の 略 で,いつでも 自 由 にリード/ライトすることができます。そ<br />
の 代 わり, 電 源 をオフすると 全 て 忘 れてしまいます。というわけで, 普晘 通 はプログラム 中 で 変 更暬 するデ<br />
ータをここに 記 憶 させておきます。もちろん,RAM にプログラムを 書暯 き 込 んでも,そのプログラムを 実<br />
行 することはできます(あとででてくるハイパーH8 では RAM にプログラムをセットします)。ただ, 電 源<br />
をオフすると,きれいさっぱり 忘 れてしま<br />
い, 思 い 出 すことは 不 可 能 です。レジスタ<br />
がメモ,ROM が 本曓 とすれば,RAM はノー<br />
トです。 作 業 にあわせてそのつど 書暯 いたり<br />
消洑 したりします。ただ, 電 源 をオフするとま<br />
るごとごみ 箱 に 捨 てて, 電 源 をオンするた<br />
びに 新 しいまっさらなノートを 準 備 する,と<br />
いう 感 じですが。<br />
H8/3687 のメモリの 広 さは 64K バイト<br />
(アドレスは 0 番 地 から FFFF 番 地 まで)あ<br />
ります。この 中 に ROM や RAM,さらには<br />
I/O が 割 り 当 てられています。メモリマップ<br />
は 右 のとおりです。<br />
0000 番 地<br />
DFFF 番 地<br />
E000 番 地<br />
E7FF 番 地<br />
E800 番 地<br />
EFFF 番 地<br />
F000 番 地<br />
F6FF 番 地<br />
F700 番 地<br />
F77F 番 地<br />
F780 番 地<br />
FB7F 番 地<br />
FB80 番 地<br />
FF7F 番 地<br />
FF80 番 地<br />
FFFF 番 地<br />
ROM/ネラッセシュポメペリ<br />
(56K ト゜ダ)<br />
未 使 用<br />
RAM<br />
(2K ト゜ダ)<br />
未 使 用<br />
I/O レジスタ<br />
RAM(1K ト゜ダ)<br />
ネラッセシュポメペリ 書 換 え 用<br />
ワョーヴク゠リアのため 使 用 不 可<br />
RAM<br />
(1K ト゜ダ)<br />
I/O レジスタ<br />
7<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
10 進 数 と 2 進 数 ,16 ,<br />
進 数<br />
私 たちが 日 常 使 っているのは 10 進 数 です。0~9<br />
の 10 個 の 数 字 を 使 って 数 を 表 します。<br />
ところが,コンピュータの 世 界 , 特 にマイコンの 世<br />
界 では 2 進 数 や 16 進 数 が 普晘 通 に 使 われています。<br />
2 進 数 は 0 と 1 の 2 個 の 数 字 で 数 を 表 す 方 法沵 ,16<br />
進 数 は 0~9 と A~F の 16 個 の 数 字 で 数 を 表 す 方<br />
法沵 です。<br />
では,ちょっと 比 較 してみましょう。<br />
10 進 数 2 進 数 16 進 数<br />
0 00000000 00<br />
1 00000001 01<br />
2 00000010 02<br />
3 00000011 03<br />
4 00000100 04<br />
5 00000101 05<br />
6 00000110 06<br />
7 00000111 07<br />
8 00001000 08<br />
9 00001001 09<br />
10 00001010 0A<br />
11 00001011 0B<br />
12 00001100 0C<br />
13 00001101 0D<br />
14 00001110 0E<br />
15 00001111 0F<br />
16 00010000 10<br />
ところで,2 進 数 と 16 進 数 を 比 較 するとおもしろい<br />
ことに 気 づきませんかそれは,2 進 数 を 4 桁 づつ<br />
区 切 ると 16 進 数 の 1 桁 に 相 当 する,ということです。<br />
( 例 )00001010 = 0A<br />
実 はこれがマイコンで 16 進 数 が 使 われている 理<br />
由 です。よく 言 われているようにデジタルの 世 界 は 0<br />
か 1 です。ご 多 分 にもれずマイコンの 世 界 も 0 か 1<br />
です。なので, 本曓 当 は 2 進 数 がぴったりなのです。<br />
でも,2 進 数 は 桁 が 長 すぎる,それなら 4 桁 づつまと<br />
めて 16 進 数 で 表 してしまおう,ということになりまし<br />
た。<br />
ちなみに 10 進 数 ,2 進 数 ,16 進 数 の 表 し 方 はい<br />
ろいろですが,このマニュアルでは 次 のようにあらわ<br />
すことにします。(10 進 数 の 10 をどのように 表 すか)<br />
10 進 数 :( 例 )10<br />
2 進 数 :( 例 )B'00001010<br />
16 進 数 :( 例 )H'0A,0x0A または 0Ah<br />
ビット,バイト,ワード,ロングワード<br />
マイコンの 世 界 はデジタルの 世 界 なので,‘0’か<br />
‘1’の 世 界 です。というわけで,2 進 数 1 桁 が 最暷 小 単<br />
位 となり,これをビットと 呼 びます。<br />
さて,メモリがそうですが,マイコンでは 1 データを<br />
8 ビット 単 位 で 扱 うことが 多 いです。そこで,8 ビットで<br />
構 成 される 単 位 をバイトと 呼 びます。16 進 数 2 桁 に<br />
なります。(R0H~R7H,R0L~R7L レジスタ)<br />
さらに,2 バイト 単 位 でまとめることもよくあります。<br />
で,これをワードという 単 位 にします。16 進 数 4 桁 で<br />
すね。(E0~E7,R0~R7 レジスタ)<br />
そして 最暷 後 に,2 ワード 単 位 (4 バイト 単 位 )にした<br />
ものをロングワードと 呼 びます。16 進 数 8 桁 になりま<br />
す。(ER0~ER7 レジスタ)<br />
まとめると,<br />
1 ロングワード=2 ワード=4 バイト=32 ビット<br />
となります。<br />
メモリマップとは<br />
CPU はアクセスできるアドレスの 範 囲 が 決 まって<br />
います。 例 えば,H8/3687 の 場 合 は,0000~FFFFま<br />
でです。この 中 に ROM や RAM を 割 付 けていきま<br />
す。<br />
さて,どこに 何 が 割 付 けられているか 示 した 図 を<br />
メモリマップと 呼 びます。 前 のページは H8/3687 のメ<br />
モリマップになるわけです。<br />
ところで,メモリマップといいながら I/O も 割 付 けら<br />
れていました。H8 の 場 合 I/O もメモリのように 扱 って<br />
います。データをリード/ライトするという 点 では,メモ<br />
リも I/O もかわりないですしね。このような 割 付 け 方 を<br />
メモリマップド I/O と 呼 びます。<br />
対 して,I/O のための 専 用 のマップを 準 備 する<br />
CPU もあります。この 場 合 ,メモリマップではなく I/O<br />
マップといいます。このような 割 り 付 け 方 を I/O マップ<br />
ド I/O とか,アイソレーテッド I/O と 呼 びます。<br />
これはどちらが 優 れているというわけではありませ<br />
ん。 単 に 思 想 の 違 いです。<br />
8<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
第 2 章<br />
マイコンボードを 動 かしてみよう<br />
1.モニタプログラムとは 何 か<br />
2.モニタプログラム「ハイパーH8」を 詰 まってみる<br />
3.デモプログラムの 実 行<br />
では, 早 速 TK-3687mini を 動 かしてみましょう。とはいっても,TK-3687mini をみると 分 かるように,<br />
電 源 をオンしてもなんだかよく 分 かりません。というわけで,マイコンの 中 身 をのぞく 道 具 を 準 備 して,<br />
それを 動 かしてみましょう。その 道 具 の 名 前 は‘ハイパーH8’です。<br />
1.モニタプログラムとは 何 か<br />
モニタプログラムとは 何 でしょうか。モニタ(monitor)には 監 視 する,という 意 味 があります。マイコ<br />
ンでいうモニタというプログラムは,マイコンの 中 身 を 監 視 するプログラムです。レジスタの 値 はどうな<br />
っているでしょうか。ROM や RAM にどんなデータが 入 っているでしょうか。I/O にどんなデータが 入<br />
出 力 されているでしょうか。モニタが 搭 載 されていれば,このようなマイコンの 中 身 の 情 報 を 見 ることが<br />
できます。また,パソコンで 作 ったプログラムをマイコンに 送 り 込 む(ロード)こともできます。さらに,プ<br />
ログラムの 動 作 そのものも 制 御 することができ,ロードしたプログラムを 実 行 したり, 途 中 で 止 めたりも<br />
できます。いろいろな 機 能 を 持 つモニタですが,C 言 語 ではロード(L)と 実 行 (G)のみを 使 います。<br />
ハイパーH8 は Windows シリーズに 標 準 で 搭 載 されているターミナルソフト,‘ハイパーターミナ<br />
ル’を 使 用 した 簡 易昒 モニタです。お 手 持 ちのパソコンと TK-3687mini のシリアルポートを RS-232C ケ<br />
ーブルで 接 続 することで, 簡 単 なモニタ 環 境 を 作 ることができます。TK-3687mini にはあらかじめハイ<br />
パーH8 が 書暯 き 込 まれていて, 電 源 オンですぐにマイコンの 中 身 を 見 ることができます。<br />
9<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
2.モニタプログラム「ハイパー<br />
.モニタプログラム「ハイパーH8」を 使 ってみる<br />
パソコンと TK-3687mini をつなぐ<br />
まず TK-3687mini とパソコンをつなぎます。D-Sub・9pin(オス)-9pin(メス)ストレートケーブル<br />
( 写 真 上 )でメス 側 をパソコンの COM ポート( 写 真 中 )へ,オス 側 を TK-3687mini の CN5( 写 真 下 )へ<br />
接 続 します。しっかりとさし 込 み,ケーブルにネジがついている 場 合 はネジをしめて 固 定 しましょう。 写<br />
真 のように COM ポートがいくつか 空 いている 場 合 は1 番 につなげてください。なお,この 時昷 はまだ<br />
TK-3687mini の 電 源 は 入 れないでください。<br />
10<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ハイパーターミナルの 設 定<br />
それでは, 通 信 ソフト‘ハイパーターミナル’を 起 動 して,TK-3687mini と 通 信 するためのセッティ<br />
ングを 行 いましょう。<br />
まずハイパーターミナルを 起 動 します。ハイパーターミナルは,<br />
→<br />
プログラム →<br />
アクセサリ →<br />
通 信 →<br />
から 起 動 できます。Windows のバージョンによっては,<br />
ハイパーターミナル →<br />
ハイパーターミナル<br />
→<br />
プログラム →<br />
アクセサリ →<br />
通 信 →<br />
から 起 動 する 場 合 もあります。もし,スタートメニューにない 場 合 は,<br />
→<br />
検 索 →<br />
ファイルやフォルダ<br />
ハイパーターミナル<br />
で‘hypertrm.exe’を 検 索 してください。ハイパーターミナルを 起 動 したら, 出 てくるダイアログウィンド<br />
ウにしたがって 設 定 していきましょう。<br />
1 接 続 の 設 定 (1)(<br />
名 前 とアイコンを 設 定 します。 右 の<br />
画 面 では, 名 前 は 接 続 速 度 がわかるよ<br />
うに「38400bps」としました。 名 前 を 入 力<br />
してアイコンを 選 択 したら<br />
をクリックします。<br />
名 前 を 入 力<br />
11<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
2 接 続 の 設 定 (2)(<br />
接 続 方 法沵 (N):のプルダウンメニューから,<br />
ケーブルを 接 続 した COM ポート( 右 の 画 面 で<br />
は COM1)を 選 択 して<br />
ます。<br />
をクリックし<br />
接 続 した COM<br />
ポートを 選 択<br />
3 COM1 のプロパティ<br />
各 項 目 を 次 のように 設 定 します。<br />
ノワット/ 秒 (B) :38400<br />
テワョタセノワット(D) :8<br />
ハンヨティヲ(P) :なし<br />
スサトッハンノワット(S) :1<br />
ハロルョ 制 御 (F) :Xon/Xoff<br />
設 定 し 終 えたら<br />
リックします。<br />
をク<br />
4 プロパティアイコンをクリック<br />
ターミナル 画 面 に 切 り 替暶 わりますので,<br />
ツールバーのプロパティアイコンをクリックし<br />
てプロパティダイアログを 開 きます。<br />
をクリック<br />
12<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
5 プロパティ<br />
‘ 設 定 ’タブをクリックして‘エミュ<br />
レーション(E):’のプルダウンメニュー<br />
か ら ‘ ANSIW ’ を 選 択 し ,<br />
をクリックします。<br />
ANSIW を<br />
選 択<br />
クリック<br />
6 ASCII 設 定<br />
‘ASCII の 受 信 ’の 中 の‘ 着 信 データに 改 行<br />
文 字 を 付 け る ( A ) ’ の チ ェ ッ ク を 入 れ て<br />
をクリックします。するとプロパティダ<br />
イアログに 戻 りますので,もう 一 度<br />
クリックしてターミナル 画 面 に 戻 ります。<br />
を<br />
チェックを 入 れる<br />
これで 設 定 は 終 了 です。それでは 電 源 をオンしてみましょう。ちゃんと 動 くでしょうか。<br />
◆<br />
13<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
電 源 ( 例 え ば 電 池 4 本曓 =6V ) を<br />
TK-3687mini の CN1 につなぎます( 右 写<br />
真 参 照 )。 電 源 をオンするとハイパーターミ<br />
ナルの 画 面 に 次 のように 表 示 されます。<br />
ここまでくればマイコンの 中 身 を 自 由 に 見 ることができます。 次 の 章 では 手 始 めにあらかじめ<br />
TK-3687mini に 書暯 き 込 まれているデモプログラムを 実 行 してみましょう。<br />
でも,その 前 に…( 次 のページを 見 てください)<br />
14<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ハイパーターミナルを 起 動 する<br />
たびに 毎 回 毎 回 設 定 を 繰 り 返 してい<br />
たのでは 面 倒 ですね。そこで,ハイ<br />
パーターミナルの 設 定 を 保 存 してお<br />
きましょう。メニューバーの「ファイル<br />
(FF)」→「 上 書暯 き 保 存 (SS)」を 選 択 し<br />
て 保 存 して 下 さい。<br />
さらに,この 設 定 のハイパーターミナルをすぐに 呼 び 出 せるように,デスクトップにショートカットを<br />
作 成 しましょう。スタートメニューから,<br />
→<br />
プログラム →<br />
アクセサリ →<br />
通 信 →<br />
ハイパーターミナル →<br />
38400bps.ht<br />
までカーソルを 進 め, 右 クリックします。プルダウンメニューの 中 の⦆コピー(CC)。を 選 択 してください。<br />
デスクトップで 再 度 右 クリックし,「ショートカ<br />
ットの 貼 り 付 け(SS)」を 選 択 してショートカットを 作<br />
成 します。<br />
なお,ここで 示 した 方 法沵 は Windows2000 の<br />
場 合 です。この 方 法沵 でショートカットが 作 成 できな<br />
い 場 合 は,エクスプローラやファイルの 検 索 を 使<br />
ってデスクトップにショートカットを 作 ってくださ<br />
い。<br />
デスクトップで<br />
右 クリックすると…<br />
15<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
3.デモプログラムの 実 行<br />
プログラムの 作 り 方 はあとで 説 明 するとして,この 章 ではとにかくプログラムを 動 かしてみましょう。<br />
TK-3687mini とパソコンは RS-232C ケーブルでつながっていますか。 前 の 章 の 最暷 後 でデスクトップに<br />
「38400bps」のショートカットを 作 りました。ハイパーターミナルを 終 了 してしまった 人 はショートカットを<br />
ダブルクリックしてハイパーターミナルを 起 動 して 下 さい。TK-3687mini の 電 源 をオンして 右 のとおり<br />
ハイパーH8 の 最暷 初 の 画 面 が 表 示 されたら 準 備 OK です。<br />
TK-3687mini にはデモ 用 に,また, 基 板朋 チェックのために,いくつかのプログラムが ROM にあら<br />
かじめ 書暯 き 込 まれています。そのうちの 一 つを 動 かしてみましょう。ハイパーターミナルから‘G6000’と<br />
入 力 して‘Enter’キーを 押 します。すると,あっけないほど 簡 単 にプログラムが 動 き 出 します。<br />
16<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
P60~67 の LED が 順 番 に 点 滅 します。<br />
TK-3687mini のリセ<br />
ットスイッチ(SW1)を 押<br />
すと, 実 行 中 のプログラ<br />
ムは 停 止 して,ハイパー<br />
H8 は 下 図 のように 入 力<br />
待 ちの 状 態 になります。<br />
さて, 今 の 操 作 は,<br />
メモリの‘6000’ 番 地 のアドレスからのプログラムを 実 行 する<br />
というものでした。これで,プログラムの 実 行 ができるようになりました。<br />
17<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ハイパーH8 のコマンドを 調 べるには…<br />
‘G’コマンドを 使 いましたが,そのほかにもハイパーH8 には 便 利 なコマンドがたくさん<br />
用 意 されています。 詳 しくはハイパーH8 のマニュアルを 見 ていただくとして, 思 い 出 しやす<br />
いようにコマンドヘルプがハイパーH8 には 組 み 込 まれています。キーボードから‘’を 入<br />
力 して 下 さい。 次 の 画 面 が 表 示 されます。<br />
ハイパーH8 は 便 利 な 道 具 なんですが…<br />
ハイパーH8 は 便 利 な 道 具 ですが, 多 少 の 制 限 もあります。もっとも 大 きな 制 限 は<br />
「ROM にデータを 書暯 き 込 むことができない」ということです。<br />
この 制 限 のため,ハイパーH8 でプログラムを 入 力 する 時昷 は,RAM に 入 力 しなければ<br />
なりません。また,HEW を 使 ってアセンブルする 時昷 も,RAM 上 にプログラムができるように<br />
Section を 設 定 しなければなりません。(この 意 味 は HEW を 使 う 章 でわかります。)<br />
さらに,ROM に 比 べて RAM のサイズが 小 さいため,あまり 大 きなプログラムを 実 行 す<br />
ることができない,という 問 題 もおきます。<br />
しかし, 学 習 用 と 割 り 切 って 使 う 分 には 全 く 気 にする 必 要 はありません。なお,ROM に<br />
プログラムを 書暯 き 込 む 場 合 は, 専 用 のツール( 無 償 版 があります)を 使 うことになります。また,<br />
デバッグまで 行 なう 場 合 は‘E8a’というエミュレータを 購 入 して 使 うことになります。<br />
18<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
第 3 章<br />
マシン 語 でプログラムを 作 ってみよう<br />
1.プログラムの 作 成<br />
2.プログラムの 入 力<br />
3.プログラムをデバッグする<br />
プログラムの 作 り 方 を 理 解 するための 最暷 も 早 道 は 何 でしょうか。それは,とにかくたくさん 作 って<br />
みる,ということです。くりかえし 作 っているうちに 段 々プログラミングの 考 え 方 が 身 についてきます。<br />
とはいっても, 最暷 初 はどこから 手 をつけてよいかわらないでしょう。そこでこの 章 では, 何 もないと<br />
ころからプログラムを 作 り 始 めて,TK-3687mini で 動 かすまでの 流泴 れを 理 解 しましょう。もっとも,ここで<br />
作 るプログラムはものすご~く 簡 単 なものです。 命 令 の 細 かい 部 分 はルネサスの 資 料 ,「H8/300H シ<br />
リーズ プログラミングマニュアル」で,もっと 詳 しい 説 明 がされています。 興 味 のある 方 はお 読 みくだ<br />
さい。<br />
組 込 み 系 の 分 野 では,コンピュータの 仕 組 みやプログラムの 本曓 質 を 知 ることはとても 大 事 なこと<br />
です。それで,CC 言 語 を 学 ぶ 前 にマイコンがどのようにプログラムを 動 かしているのか、マシン 語 の 世<br />
界 をちょっとだけのぞいてみましょう。<br />
1.プログラムの 作 成<br />
ここで 作 るプログラムは,TK-3687mini の P60 に 接 続 した LED を 点 滅 させるというものです。そ<br />
の 部 分 の 回 路 図 を 抜 き 出 すと 次 のようになります。<br />
19<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
フローチャートの 作 成<br />
まずはおおまかなフローチャートを 作 ってどんなプログラムにするか 考 えてみましょう。できたフロ<br />
ーチャートは 下 のとおりです。それほど 難 しくありませんね。LED のオンとオフを 繰 り 返 すだけです。<br />
_main<br />
ポート 6 の<br />
イニシャライズ<br />
LED オン<br />
(P60=0)<br />
LED オフ<br />
(P60=1)<br />
<br />
コーディング<br />
さて 次 は, 今 考 えたフローチャートを 見 ながら H8/3687 のアセンブラ 命 令 に 変 換 していきます。<br />
これをコーディングといいます。コーディングした 結 果 は 下 のリストのとおりです。<br />
_main:<br />
LOOP:<br />
MOV.B #H'01,R0L ;ポーヴダ6の゜ニッシホラ゜ズ<br />
MOV.B R0L,@H'FFE9<br />
BCLR #0,@H'FFD9 ;LEDオン (P60=0)<br />
BSET #0,@H'FFD9 ;LEDオフ (P60=1)<br />
BRA LOOP ;LOOPにジホンルハ<br />
ところで, 実 はまだ 人 間 の 言 葉 にすぎなくて,マイコンにとっては 理 解 できない 外 国 語 です。そ<br />
れで,マイコンの 言 葉 (=マシン 語 , 機 械 語 )に 直 す 必 要 があります。<br />
20<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
マシン 語 に 変 換 する<br />
コーディングが 終 了 したものの,このままではマイコン(H8/3687)は 何 をしたら 良 いのか 理 解 でき<br />
ません。マイコンが 理 解 できるのはマシン 語 ( 機 械 語 )と 呼 ばれる 16 進 の 数 字 の 羅 列 だけです。そこ<br />
で, 次 はマシン 語 への 変 換 作 業 を 行 ないます。これをアセンブルと 呼 びます。マシン 語 に 変 換 すると<br />
次 のようになります。これをハイパーH8 で RAM に 入 力 していきます。<br />
マシンル 語<br />
ソサーヴスリスダ<br />
アチレス デーヴタ ラベル ニッーヴペニッッセク オヒランルチ コカメンルダ<br />
EA00 F8 _main: MOV.B #H'01,R0L ポーヴダ6の゜ニッシホラ゜ズ<br />
EA01 01<br />
EA02 38 MOV.B R0L,@H'FFE9<br />
EA03 E9<br />
EA04 7F LOOP: BCLR #0,@H'FFD9 LEDオンル(P60=0)<br />
EA05 D9<br />
EA06 72<br />
EA07 00<br />
EA08 7F BSET #0,@H'FFD9 LEDオネ(P60=1)<br />
EA09 D9<br />
EA0A 70<br />
EA0B 00<br />
EA0C 40 BRA LOOP LOOPにジホンルハ<br />
EA0D F6<br />
EA0E<br />
EA0F<br />
2.プログラムの 入 力<br />
それでは,ハイパーH8 を 使 って<br />
TK-3687mini のメモリにマシン 語 を 入<br />
力 していきましょう。‘W’コマンドを 使<br />
います。‘EA00’ 番 地 から 入 力 します<br />
の で , パ ソ コ ン の キ ー ボ ー ド か ら<br />
‘WEA00’と 入 力 して‘Enter’キーを<br />
押 します。 入 力 状 態 になったら 1 バイ<br />
トづつ 順 番 にデータを 入 力 します。<br />
21<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
キーボード:‘F’,‘8’,‘Enter’<br />
キーボード:‘0’,‘1’,‘Enter’<br />
キーボード:‘3’,‘8’,‘Enter’<br />
22<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
キーボード:‘F’,‘6’,‘Enter’<br />
全 てのデータを 入 力 したら,キーボードから‘/’を 押 してコマンド 入 力 に 戻 ります。<br />
キーボード:‘/’<br />
23<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
最暷 後 に, 間 違 いなくデータを 入 力 できたか 確 認 しておきましょう。パソコンのキーボードから<br />
‘DEA00’と 入 力 して‘Enter’キーを 押 します。<br />
ちゃんとセットされて<br />
いますね。<br />
さてここで,この 項 目 で 使 ったハイパーH8 のコマンドをまとめておきます。まずは‘W’コマンドで<br />
す。‘WEA00’と 入 力 しましたが,これは,<br />
メモリの‘EA00’ 番 地 のアドレスからデータをセットする<br />
という 意 味 です。 入 力 が 終 わったら‘/’キーを 押 すとコマンド 入 力 に 戻 ります。<br />
もう 一 つは‘D’コマンドです。‘DEA00’と 入 力 しましたが,これは,<br />
という 意 味 です。<br />
メモリの‘EA00’ 番 地 のアドレスからメモリの 内 容 をダンプ 表 示 する<br />
これで,メモリの 中 身 を 読 み 書暯 きできるようになりました。<br />
24<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
3.プログラムをデバッグする<br />
では,プログラムを 実 行 してみましょう。 今 回 は‘G’コマンドではなく,‘T’コマンドを 使 ってプログ<br />
ラムの 動 きを 一 命 令 づつ 追 いかけてみたいと 思 います。<br />
<br />
トレース 実 行<br />
最暷 初 にどこからプログラムをスタ<br />
ートするか 指 定 します。このプログラ<br />
ムは EA00 番 地 からスタートしますの<br />
で,PC に EA00 をセットします。キー<br />
ボードから‘RPCEA00’と 入 力 して<br />
‘Enter’キーを 押 します。そうすると,<br />
PC に EA00 がセットされたことが 表<br />
示 されます。<br />
PC=EA00 に<br />
セットされました<br />
次 に,キーボードから‘T’と 入 力 して‘Enter’キーを 押 してください。<br />
プログラム<br />
カウンタ<br />
コンディションコード<br />
レジスタ<br />
マシン 語<br />
ニーモニックとオペランド<br />
このとき 注泃 意 したいのは,この 時昷 点 ではまだこの 命 令 は 実 行 されていないということです。 次 に,<br />
‘Enter’キーを 押 すと,この 命 令 が 実 行 され,その 結 果 が 次 に 表 示 されます。<br />
25<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
それでは,‘Enter’キーを 押 していってプログラムが 考 えたとおりに 動 いていくかたしかめてみま<br />
しょう。また,LED がちゃんと 点 滅 するかもみてください。<br />
いかがでしょうか。ちゃんと 動 きましたかうまく 動 作 しないときはプログラムの 入 力 ミスの 可 能 性<br />
が 大 です。もう 一 度 ちゃんと 入 力 しているかたしかめてみましょう。<br />
さて,このように 命 令 を 一 命 令 づつ 実 行 して, 考 えたとおりに 動 いていくか 確 認 するのがデバッ<br />
グ(プログラムのまちがい 探 し)の 第 一 歩 です。<br />
最暷 後 に,‘/’キーを 押 してコマンド 入 力 に 戻 りましょう。<br />
さてここで,この 項 目 で 使 ったハイパーH8 のコマンドをまとめておきます。まずは‘R’コマンドで<br />
す。‘RPCEA00’と 入 力 しましたが,これは,<br />
という 意 味 です。<br />
プログラムカウンタに‘EA00’をセットする<br />
もう 一 つは‘T’コマンドです。‘T’と 入 力 しましたが,これは,<br />
プログラムカウンタが 示 すアドレスからトレース 実 行 する<br />
という 意 味 です。‘Enter’キーを 押 すと 一 命 令 づつレース 実 行 します。また,‘/’キーを 押 すとコマンド<br />
入 力 に 戻 ります。<br />
これで,スタートアドレスを 指 定 して,そこからトレース 実 行 ができるようになりました。<br />
26<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
第 4 章<br />
C 言 語 でプログラムを 作 ってみよう<br />
1. 統 合 開 発 環 境 「HEW」のインストール 4.プログラムのダウンロードと 実 行<br />
2.ハイパーH8 を 使 うときのメモリマップ<br />
3.C 言 語 でプログラムを 作 ってみる<br />
前 の 章 ではアセンブラ→マシン 語 でプログラムを 作 ってみました。ハンドアセンブルは H8 に 限 ら<br />
ず,どんな CPU にも 対 応 できるので 便 利 ()ですが,プログラムが 長 くなっていくと, 間 違 いは 増 え,<br />
間 違 いを 修 正 するのも 大 変 で, 何 よりアセンブルするだけで,ものすご~く 疲 れます。しかも,アセン<br />
ブラはマシン 語 よりわかりやすいとはいえ, 人 間 にとってはまだまだわかりにくい 言 語 です。というわけ<br />
で, 大 変 なことはパソコンにまかせてしまいましょう。そこで,C 言 語 を 使 うのがスマートな 方 法沵 となりま<br />
す。<br />
1. . 統 合 開 発 環 境 「HEW」のインストール<br />
「<br />
ダウンロード 先 をデスクトップにした 場 合 で 説 明 します。ダウンロードした‘h8v6200_ev.exe’を<br />
ダブルクリックしてください。すると,インストールが 始 まります。 画 面 の 指 示 に 従 ってインストールして<br />
ください。<br />
さて,この 章 で 入 手 した 無 償 評 価 版 コンパイラは,はじめてコンパイルした 日 から 60 日 間 は 製 品<br />
版 と 同 等 の 機 能 と 性 能 のままで 試 用 できます。61 日 目 以 降 はリンクサイズが 64K バイトまでに 制 限 さ<br />
れますが,H8/3687 はもともとアクセスできるメモリサイズが 64K までバイトなので,この 制 限 は 関 係 あ<br />
りません。また, 無 償 評 価 版 コンパイラは 製 品 開 発 では 使 用 できないのですが,H8/300H Tiny シリ<br />
ーズ(H8/3687 も 含 まれる)では 許 可 されています。<br />
さて, 無 償 評 価 版 コンパイラは, 無 償 とはいえ 非 常 に 強 力 な 開 発 環 境 で,アセンブラにも C 言 語<br />
にも 対 応 しています。(というよりは,C 言 語 がメインで,アセンブラはその 一 部 分 を 使 用 しているに 過<br />
ぎないのですが…。)がんばってマスターしてください。<br />
最暷 新 版 の HEW を 手 に 入 れましょう<br />
HEW は 頻 繁 にバージョンアップされています。HEW はルネサステクノロジの<br />
マイコン 全 てに 対 応 しているため,H8 シリーズはもとより,R8 シリーズや SH シリ<br />
ーズなど, 対 応 するマイコンが 増 えるとそのたびにマイナーチェンジされるようで<br />
す。また,その 際 に 報 告 されていた 不 具 合 を 一 緒 に 修 正 することもあります。<br />
それで,ルネサステクノロジのホームページは 定 期曋 的 にのぞいてみることをお<br />
すすめします。 特 にデバイスアップデータの 情 報 は 要 注 意 です。<br />
27<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
2.ハイパー<br />
.ハイパーH8 を 使 うときのメモリマップ<br />
..<br />
HEW を 使 うときのコツの 一 つは,メモリマップを 意 識 する,ということです。プログラムがどのアド<br />
レスに 作 られて,データはどのアドレスに 配 置 されるか,ちょっと 意 識 するだけで,HEW を 理 解 しやす<br />
くなります。ハイパーH8 を 使 うときのメモリマップは 次 のとおりです。<br />
0000 番 地<br />
DFFF 番 地<br />
E000 番 地<br />
E7FF 番 地<br />
E800 番 地<br />
ROM/フラッシュメモリ<br />
(56Kバイト)<br />
未曑 使 用<br />
モニタプログラム<br />
“ハイパーH8”<br />
未曑 使 用<br />
ハイパーH8<br />
ユーザ 割 り 込 みベクタ<br />
E860 番 地 PResetPRG リセットプログラム<br />
PIntPRG 割 り 込 みプログラム<br />
EA00 番 地 P プログラム 領 域<br />
C<br />
定 数 領 域<br />
C$DSEC 初 期曋 化 データセクションの<br />
RAM<br />
アドレス 領 域<br />
(2Kバイト) C$BSEC 未曑 初 期曋 化 データセクションの<br />
アドレス 領 域<br />
D<br />
初 期曋 化 データ 領 域<br />
ユーザ<br />
RAM<br />
エリア<br />
EFFF 番 地<br />
F000 番 地<br />
F6FF 番 地<br />
F700 番 地<br />
F77F 番 地<br />
未曑 使 用<br />
I/Oレジスタ<br />
未曑 使 用<br />
I/Oレジスタ<br />
F780 番 地 B 未曑 初 期曋 化 データ 領 域<br />
FB7F 番 地<br />
FB80 番 地<br />
RAM(1Kバイト)<br />
フラッシュメモリ 書暯 換 用<br />
ワークエリアのため<br />
FDTとE7,E8,E8a<br />
使 用 時昷 は<br />
ユーザ 使 用 不 可<br />
R<br />
初 期曋 化 データ 領 域<br />
( 変 数 領 域 )<br />
ユーザ<br />
RAM<br />
エリア<br />
RAM<br />
FD80 番 地 (1Kバイト) S スタック 領 域<br />
FDFF 番 地<br />
FE00 番 地<br />
FF7F 番 地<br />
FF80 番 地<br />
FFFF 番 地<br />
I/Oレジスタ<br />
ハイパーH8<br />
ワークエリア<br />
I/Oレジスタ<br />
メモリマップのうち“ユーザ RAM エリア”の 部 分 だけが 自 由 に 使 用 できるエリアです。<br />
28<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
3.C 言 語 でプログラムを 作 ってみる<br />
プロジェクトの 作 成<br />
HEW ではプログラム 作 成 作 業 をプロジェクトと 呼 び,そのプロジェクトに 関 連 するファイルは 1 つ<br />
のワークスペース 内 にまとめて 管 理 されます。 通 常 はワークスペース,プロジェクト,メインプログラム<br />
には 共 通 の 名 前 がつけられます。この 章 で 作 るプロジェクトは‘IoPort_led_c’と 名 付 けます。 以 下 に,<br />
新 規 プロジェクト‘IoPort_led_c’を 作 成 する 手 順 と 動 作 確 認 の 手 順 を 説 明 します。<br />
しかしその 前 に,HEW 専 用 作 業 フォルダを 作 っておきましょう。C ドライブに‘Hew4_tkk3687’を 作<br />
ってください。このマニュアルのプロジェクトは 全 てこのフォルダに 作 成 します。<br />
C ドライブに‘Hew4_tk3687’<br />
フォルダを 作 ります。<br />
29<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
では,HEW を 起 動 しましょう。スタートメニューから 起 動 します。<br />
→<br />
ハンロルクカワラムマ →<br />
Renesas →<br />
High-performance Embedded Workshop<br />
→<br />
High-performance Embedded Workshop<br />
HEW を 起 動 すると 下 記 の 画 面 が 現 れるので,「 新 規 プロジェクトワークスペースの 作 成 」を 選 択<br />
して‘OK’をクリックします。<br />
前 に 作 ったプロジェクトを 使 うとき<br />
その 場 合 は,「ようこそ!」ダイアログで「 最暷 近 使<br />
用 したプロジェクトワークスペースを 開 く」を 選 択 して<br />
‘OK’をクリックします。そのプロジェクトの 最暷 後 に 保<br />
存 した 状 態 で HEW が 起 動 します。<br />
30<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
まず,1「ワークスペース 名 (W)」(ここでは‘IoPort_led_c’)を 入 力 します。「プロジェクト 名 (P)」<br />
は 自 動 的 に 同 じ 名 前 になります。<br />
ワークスペースの 場 所 を 指 定 します。2 右 の「 参 照 (B)…」ボタンをクリックします。そして,あらか<br />
じめ 用 意 した HEW 専 用 作 業 フォルダ(ここでは Hew4_tk3687)を 指 定 します。 設 定 後 ,「ディレクトリ<br />
(D)」が 正 しいか 確 認 して 下 さい。(3)<br />
次 にプロジェクトを 指 定 します。 今 回 は C 言 語 なので4「Application」を 選 択 します。<br />
入 力 が 終 わったら5「OK」をクリックして 下 さい。<br />
1<br />
4<br />
3<br />
2<br />
5<br />
31<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「 新 規 プロジェクト-1/9-CPU」で, 使 用 する CPU シリーズ(300H)と,CPU タイプ(3687)を 設<br />
定 し,「 次 へ(N)>」をクリックします。<br />
「 新 規 プロジェクト-2/9-オプション」,「 新 規 プロジェクト-3/9- 生 成 ファイル」,「 新 規 プロジ<br />
ェクト-4/9- 標 準 ライブラリ」は 変 更暬 しません。「 次 へ(N)>」をクリックして 次 の 画 面 に 進 みます。<br />
32<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「 新 規 プロジェクト-5/9-スタック 領 域 」でスタックのアドレスとサイズを 変 更暬 します。ハイパー<br />
H8 を 使 用 するので,1スタックポインタを H'FE00 に,2スタックサイズを H'80 にします。 設 定 が 終 わ<br />
ったら「 次 へ(N)>」をクリックします。<br />
1H'FE00 に 変 更暬<br />
2H'80 に 変 更暬<br />
「 新 規 プロジェクト-6/9-ベクタ」と「 新 規 プロジェクト-7/9-デバッガ」は 変 更暬 しません。「 次<br />
へ(N)>」をクリックして 次 の 画 面 に 進 みます。<br />
33<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
次 は「 新 規 プロジェクト-9/9- 生 成 ファイル 名 」です。ここも 変 更暬 しません。「 完 了 」をクリックし<br />
ます。<br />
すると,「 概 要 」が 表 示 されるので「OK」をクリックします。<br />
34<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
これで,プロジェクトワークスペースが 完 成 します。HEW はプロジェクトに 必 要 なファイルを 自 動<br />
生 成 し,それらのファイルは 左 端 のワークスペースウィンドウに 一 覧 表 示 されます。<br />
ワークスペース<br />
ウィンドウ<br />
アウトプット<br />
ウィンドウ<br />
35<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
さて,これでプロジェクトは 完 成 したのですが,ハイパーH8 を 使 うときはセクションを 変 更暬 してプロ<br />
グラムが RAM 上 にできるようにします。( 当 然 ながら,ハイパーH8 を 使 わないときは 変 更暬 する 必 要 は<br />
なく,そのままで OK。)<br />
下 図 のように,メニューバーから「H8S,H8/300 Standard Toolchain…」を 選 びます。<br />
すると,「H8S,H8/300 Standard Toolchain」ウィンドウが 開 きます。「 最暷 適 化 リンカ」のタブを 選 び,<br />
「カテゴリ(Y)」のドロップダウンメニューの 中 から「セクション」を 選 択 します。すると, 下 図 のような 各 セ<br />
クションの 先 頭 アドレスを 設 定 する 画 面 になります。「 編 集 (E)」ボタンをクリックしてください。<br />
36<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「セクション 設 定 」ダイアログが 開<br />
きます。それでは,「2.ハイパーH8 を<br />
使 うときのメモリマップ」で 調 べたメモリ<br />
マップにあわせて 設 定 していきましょう。<br />
最暷 初 に‘B’Section のアドレスを 変 更暬 し<br />
ます。デフォルトでは E800 番 地 になっ<br />
ていますね。1‘0x0000E800’というと<br />
ころをクリックして 下 さい。それから,2<br />
「 変 更暬 (M)…」をクリックします。<br />
2<br />
1<br />
そうすると,「セクションのアドレス」ダイアログが 開 きます。<br />
‘B’Section は F780 番 地 から 始 まりますので, 右 のように 入 力 し<br />
て‘OK’をクリックします。<br />
すると…<br />
かわった!!<br />
37<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
同 じように, 他 のセクションも 変 更暬 しましょう。メモリマップと 同 じように Section が 指 定 されているこ<br />
とを 確 認 します。ちゃんと 設 定 されていたら「OK」をクリックします。<br />
セクション 設 定 の 保 存<br />
次 回 のために 今 修 正 したセクション 情 報 を 保 存 することがで<br />
きます。 下 段 の「エクスポート(E)」ボタンをクリックしてください。 保<br />
存 用 のダイアログが 開 きますので 好 きな 名 前 を 付 けて 保 存 しま<br />
す。 次 回 は「インポート(I)」ボタンをクリックすると 保 存 したセクショ<br />
ン 設 定 を 呼 び 出 すダイアログが 開 きます。(おすすめ!!)<br />
38<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
もう 一 度 確 認 しましょう。ちゃんと 設 定 されていたら「OK」をクリックして‘H8S,H8/300 Standard<br />
Toolchain’ウィンドウを 閉 じます。<br />
39<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ソースリストの 入 力<br />
いよいよソースリストの 入 力 です。3 章 で 作 った LED の 点 滅 プログラムの 考 え 方 をもとにして,G<br />
コマンドで 実 行 しても 点 滅 がわかるようにウェイトを 入 れてみます。フローチャートは 次 のようになりま<br />
す。 詳 しくは 次 の 章 で 説 明 しますので,リストどおり 入 力 してみてください。<br />
main<br />
ポートの<br />
イニシャライズ<br />
LED オン<br />
ウェイト<br />
LED オフ<br />
ウェイト<br />
回 路 図 は 前 回 と 同 じです。 下 記 に 再 掲 します。<br />
40<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
HEW のワークスペースウィンド<br />
ウの‘IoPort_led_c.c’をダブルクリッ<br />
クしてください。すると, 自 動 生 成 さ<br />
れた‘IoPort_led_c.c’ファイルが 開<br />
きます。<br />
このファ<br />
イルに 追 加 ・<br />
修 正 していき<br />
ます。 左 のリ<br />
ス ト の と お り<br />
入 力 し て み<br />
てください。<br />
なお,C 言 語<br />
の 文 法沵 に つ<br />
い て は ,<br />
HEW をイン<br />
ストールした<br />
ときに 一 緒 に<br />
コピーされる<br />
「 H8S ,<br />
H8/300 シ リ<br />
ーズ C/C++<br />
コ ンパイラ,<br />
アセンブラ,<br />
最暷 適 化 リンケ<br />
ージエディタ<br />
ユ ー ザ ー ズ<br />
マニュアル」<br />
の 中 で 説 明<br />
さ れ て い ま<br />
す。<br />
41<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ビルド<br />
では,ビルドしてみましょう。ファンクションキーの[[F7]]を 押 すか, 図 のように1メニューバーから<br />
‘ビルド’を 選 ぶか,2ツールバーのビルドのアイコンをクリックして 下 さい。<br />
2<br />
1<br />
ビルドが 終 了 するとアウト<br />
プットウィンドウに 結 果 が 表 示<br />
されます。 文 法沵 上 のまちがい<br />
がないかチェックされ,なけれ<br />
ば 「 0 Errors 」 と 表 示 さ れ ま<br />
す。<br />
エラーがある 場 合 はソー<br />
スファイルを 修 正 します。アウ<br />
トプットウィンドウのエラー 項 目<br />
にマウスカーソルをあててダブルクリックすると,エラー 行 に 飛 んでいきます(このあたりの 機 能 が 統 合<br />
化 環 境 の 良 いところですね。)ソースファイルと 前 のページのリストを 比 べてまちがいなく 入 力 している<br />
かもう 一 度 確 認 して 下 さい。<br />
さて, 図 では「1 Warning」と 表 示 されています。これは「まちがいではないかもしれないけど, 念<br />
のため 確 認 してね」という 警 告 表 示 です。 例 えばこの 図 の「L1100(W) Cannot find "C" specifind in<br />
option "start"」は,C セクションを 設 定 したのに C セクションのデータがないとき 表 示 されます。 今 回 の<br />
プログラムでは C セクションは 使 っていませんので,この 警 告 が 出 ても 何 も 問 題 ありません。<br />
もっとも,Warninng の 中 には 動 作 に 影 響 を 与 えるものもあります。「H8S,H8/300 シリーズ<br />
C/C++コンパイラ,アセンブラ, 最暷 適 化 リンケージエディタ ユーザーズマニュアル」の 539 ページから<br />
コンパイラのエラーメッセージが,621 ページから 最暷 適 化 リンケージエディタのエラーメッセージが 載<br />
せられていますので, 問 題 ないか 必 ず 確 認 して 下 さい。<br />
42<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
4.プログラムのダウンロードと 実 行<br />
ビルドが 成 功 すると C の 命 令 がマシン 語 に 変 換 され‘IoPort_led_c.mot’というファイルが 作 られ<br />
ます。 拡 張 子 が‘.mot’のファイルは「S タイプファイル」とか「mot ファイル」と 呼 ばれていて,マシン 語<br />
の 情 報 が 含 まれているファイルです。このファイルはプロジェクトフォルダの 中 の「Debug」フォルダ 内<br />
に 作 られます。<br />
こ の フ ォ ル ダ の 中<br />
にあります。<br />
43<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
それでは 実 行 してみましょう。ハイパーH8 を 起 動 して 下 さい。‘L’コマンドと‘G’コマンドを 使 いま<br />
す。ハイパーH8 はコマンドを 続 けて 入 力 すると,その 順 番 に 実 行 することができます。 今 回 はこれを<br />
使 ってみましょう。パソコンのキーボードから‘LG’と 入 力 して‘Enter’キーを 押 します。<br />
次 に,メニューの‘ 転 送 (T)’から‘テキストファイルの 送 信 (T)’を 選 び,「テキストファイルの 送<br />
信 」ウィンドウを 開 きます。ファイルの 種 類 を‘すべてのファイル’にして,‘IoPort_led_c.mot’を 選 びま<br />
す。<br />
2 選 択 したら…<br />
3クリック<br />
1 変 更暬 して…<br />
44<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ダウンロードが 終 了 すると(プログラムが 短 いのであっという 間 です), 続 いてロードしたプログラ<br />
ムを 実 行 します。<br />
いかがでしょうか。ちゃんと LED は 点 滅 しましたか。うまく 動 作 しないときはプログラムの 入 力 ミス<br />
の 可 能 性 が 大 です。もう 一 度 ちゃんと 入 力 しているか 確 認 してみてください。<br />
45<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
第 5 章<br />
内 蔵 周 辺 機 能 を 使 う<br />
1.I/O ポート<br />
4.タイマ Z<br />
2. 外 部 割 込 み 5.シリアルコミュニケーションインターフェース<br />
3.タイマ V<br />
6.AD コンバータ<br />
H8/3687 には 様 々な 機 能 が 内 蔵 されています。この 章 ではいくつかの 内 蔵 周 辺 機 能 の 使 い 方<br />
をマスターしましょう。なお, 内 蔵 周 辺 機 能 の 詳 しい 内 容 は「H8/3687 グループ ハードウェアマニュア<br />
ル」(これからハードウェアマニュアルと 呼 びます)で 説 明 されています。 本曓 書暯 では 説 明 されていない<br />
機 能 がたくさんありますので,ぜひお 読 みください。<br />
1.I/O ポート<br />
そもそも I/O とは 何 でしょうか。 第 1 章 では,<br />
「 外 部 から 信 号 を 入 力 したり 外 部 機 器 をコントロールしたりするのが I/O です。」<br />
と, 簡 単 に 説 明 しました。ここでは,もっと 詳 しく 説 明 しましょう。<br />
もともと CPU は「できるだけ 速 く」を 合 言 葉 に 進 歩 してきました。H8/3687 は 1 つの 命 令 を 0.1μs<br />
~1.2μs(μs:マイクロ 秒 は 1 秒 の 百 万 分 の 一 )で 実 行 できるように 作 られています。<br />
一 方 , 外 部 機 器 は 速 いものももちろんありますが, 大 抵 はもっとのんびりしています。 例 えば<br />
LED の 表 示 なんかはマイクロ 秒 単 位 で 点 滅 しても 人 間 の 目 にはわかりませんし,スイッチをマイクロ<br />
秒 単 位 で 入 力 しようとしても 人 間 の 指 のスピードはそんなに 速 くなりません。<br />
また, 一 般 的 に CPU は 電 圧 が 5V で 動 いていますし,できるだけ 少 ない 電 流泴 で 動 くように 発 展 し<br />
てきましたが, 外 部 機 器 の 中 には 12V だったり 電 流泴 がたくさん 必 要 だったりするものがあります。<br />
というわけで,CPU が, 性 格 の 異 なる 外 部 から 信 号 を 入 力 したり, 外 部 機 器 をコントロールしたり<br />
するには, 間 に 立 ってデータを 受 け 渡浫 す 役 目 が 必 要 になります。この 役 目 を 果 たすのが I/O になりま<br />
す。<br />
第 1 章 の「H8/3687 の 内 部 ブロック 図 」からわかるように I/O にはいくつも 種 類 がありますが,この<br />
節 で 取 り 上 げている I/O ポートはパラレルポートと 呼 ばれるものです。 以 後 , 本曓 節 で I/O ポート,あるい<br />
はポートといえば,パラレルポートをさすものとします。<br />
CPU<br />
I/O<br />
外<br />
部<br />
機<br />
器<br />
46<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
実 習 には,TK-3687mini,Timer&LED Display(B6092)と,この 二 つを 接 続 するユニバーサル<br />
基 板朋 に 実 装 されている CDS を 利 用 します。 回 路 図 は 次 のようになります。<br />
47<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
設 定 用 レジスタの 説 明<br />
H8/3687 の 端 子 はいくつもの 機 能 が 兼 用 されています。それで, 各 ピンをどの 機 能 で 使 うか 設<br />
定 する 必 要 があります。 実 習 用 TK-3687mini はポート 5 にスイッチ,ポート 6 に LED がつながってい<br />
ます。それで,ポート 5 とポート 6 の 設 定 用 レジスタについて 説 明 します。<br />
ポート 5 に 関 係 するレジスタは,PMR5,PCR5,PDR5,PUCR5 の 4 つです。<br />
ポートモードレジスタ 5(PMR5<br />
PMR5) : アドレス=0xFFE1<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 POF57 0 R/W P57 の 出 力 形 式 の 選 択 。<br />
0:CMOS 出 力 。 / 1:NMOS オープンドレイン 出 力 。<br />
6 POF56 0 R/W P56 の 出 力 形 式 の 選 択 。<br />
0:CMOS 出 力 。 / 1:NMOS オープンドレイン 出 力 。<br />
5 WKP5 0 R/W P55,WKP5,ADTRG 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:WKP5,および,ADTRG 入 力 端 子 。<br />
4 WKP4 0 R/W P54,WKP4 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:WKP4 入 力 端 子 。<br />
3 WKP3 0 R/W P53,WKP3 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:WKP3 入 力 端 子 。<br />
2 WKP2 0 R/W P52,WKP2 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:WKP2 入 力 端 子 。<br />
1 WKP1 0 R/W P51,WKP1 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:WKP1 入 力 端 子 。<br />
0 WKP0 0 R/W P50,WKP0 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:WKP0 入 力 端 子 。<br />
ポートコントロールレジスタ 5(PCR5<br />
PCR5) : アドレス=0xFFE8<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 PCR57 0 W<br />
6 PCR56 0 W<br />
5 PCR55 0 W<br />
4 PCR54 0 W<br />
3 PCR53 0 W<br />
2 PCR52 0 W<br />
1 PVR51 0 W<br />
0 PCR50 0 W<br />
各 ビットの 入 出 力 の 設 定 。<br />
0: 入 力 ポート。 / 1: 出 力 ポート。<br />
ポートデータレジスタ 5(PDR5<br />
PDR5) : アドレス=0xFFD8<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 P57 0 R/W<br />
6 P56 0 R/W<br />
5 P55 0 R/W<br />
4 P54 0 R/W<br />
3 P53 0 R/W<br />
2 P52 0 R/W<br />
1 P51 0 R/W<br />
0 P50 0 R/W<br />
データレジスタ。 入 力 ポートに 設 定 されているビットの 端 子 の 状 態 を 読 み 出<br />
したり, 出 力 ポートに 設 定 されている 端 子 の 出 力 値 を 格 納 する。<br />
48<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ポートプルアップコントロールレジスタ 5(PUCR5<br />
PUCR5) : アドレス=0xFFD1<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 - 0 -<br />
6 - 0 -<br />
5 PUCR55 0 R/W<br />
4 PUCR54 0 R/W<br />
3 PUCR53 0 R/W<br />
2 PUCR52 0 R/W<br />
1 PUCR51 0 R/W<br />
0 PUCR50 0 R/W<br />
各 ビットのプルアップ MOS の 設 定 。<br />
0:プルアップしない。 / 1:プルアップする。<br />
ポート 6 に 関 係 するレジスタは,PCR6,PDR6 の 2 つです。<br />
ポートコントロールレジスタ 6(PCR6<br />
PCR6) : アドレス=0xFFE9<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 PCR67 0 W<br />
6 PCR66 0 W<br />
5 PCR65 0 W<br />
4 PCR64 0 W<br />
3 PCR63 0 W<br />
2 PCR62 0 W<br />
1 PCR61 0 W<br />
0 PCR60 0 W<br />
各 ビットの 入 出 力 の 設 定 。<br />
0: 入 力 ポート。 / 1: 出 力 ポート。<br />
ポートデータレジスタ 6(PDR6<br />
PDR6) : アドレス=0xFFD9<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 P67 0 R/W<br />
6 P66 0 R/W<br />
5 P65 0 R/W<br />
4 P64 0 R/W<br />
3 P63 0 R/W<br />
2 P62 0 R/W<br />
1 P61 0 R/W<br />
0 P60 0 R/W<br />
データレジスタ。 入 力 ポートに 設 定 されているビットの 端 子 の 状 態 を 読 み 出<br />
したり, 出 力 ポートに 設 定 されている 端 子 の 出 力 値 を 格 納 する。<br />
49<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ところで,HEW でプロジェクトを 作 成 すると, 自 動 的 に“iodefine.h”が 生 成 されます。 通 常<br />
H8/3687 の I/O にアクセスする 際 ,“iodefine.h”で 定 義 されている 名 称 を 使 います。しかし,“iodefine.<br />
h”は 構 造 体 や 共 用 体 を 駆 使 して 定 義 されているため, 最暷 初 はとっつきにくく 感 じるかもしれません。<br />
それでも 慣 れてくると 非 常 に 便 利 です。<br />
“iodefine.h”で 定 義 されている 名 称 を 使 う 場 合 ,まずこのファイルをインクルードします。<br />
#include "iodefine.h" // 内 蔵 I/Oのラベル 定 義<br />
一 例 として“iodefine.h”でポート 6 は 次 のように 定 義 されています。( 黄 色 で 塗 りつぶしている 行<br />
はあとの 説 明 で 使 う 部 分 )<br />
struct st_io { /* struct IO */<br />
∫<br />
union { /* PDR6 */<br />
unsigned char BYTE; /* Byte Access */<br />
struct { /* Bit Access */<br />
unsigned char B7:1; /* Bit 7 */<br />
unsigned char B6:1; /* Bit 6 */<br />
unsigned ned char B5:1; /* Bit 5 */<br />
unsigned char B4:1; /* Bit 4 */<br />
unsigned char B3:1; /* Bit 3 */<br />
unsigned char B2:1; /* Bit 2 */<br />
unsigned char B1:1; /* Bit 1 */<br />
unsigned char B0:1; /* Bit 0 */<br />
} BIT; /* */<br />
} PDR6; /* */<br />
∫<br />
unsigned char PCR6; /* PCR6 */<br />
∫<br />
}; /* */<br />
∫<br />
#define IO (*(volatile struct st_io *)0xFFD0) /* IO Address*/<br />
∫<br />
それでは,ポートコントロールレジスタ 6(PCR6)に 値 をセットしてみましょう。ポート 6 は 全 ビット 出<br />
力 で 使 いますので,セットする 値 は 0xxFF です。<br />
モジュール 名 称<br />
I/O ポート: ポートコントロールレジスタ 6<br />
ビット 名 称<br />
レジスタ 名 称<br />
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0<br />
IO PCR6 (ビットアクセスは 未曑 定 義 )<br />
ソースリストから 分 かるように PCR6 は 共 用 体 を 使 ってビットアクセスするようには 定 義 されていま<br />
せん。それで 常 に 1 バイト 単 位 でアクセスします。ここでは PCR6 に 0xxFF をセットするので 次 のように<br />
50<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
記 述 します。<br />
IO.PCR6 = 0xff;<br />
次 にポートデータレジスタ 6 に 値 をセットしましょう。セットする 値 は 55h としましょう。<br />
モジュール 名 称<br />
I/O ポート: ポートデータレジスタ 6<br />
ビット 名 称<br />
レジスタ 名 称<br />
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0<br />
IO PDR6 B7 B6 B5 B4 B3 B2 B1 B0<br />
ソースリストから 分 かるように PDR6 は 共 用 体 を 使 ってバイトアクセスとビットアクセスができるよう<br />
に 定 義 しています。ここでは PDR6 に 55h をセットするのでバイトアクセスです。 次 のように 記 述 しま<br />
す。<br />
IO.PDR6.BYTE<br />
= 0x55;<br />
さて,B0 だけを 一 時昷 的 に 0 にする 場 合 はどうでしょうか。 今 度 は 特 定 のビットだけを 書暯 き 替暶 えるの<br />
でビットアクセスです。 次 のように 記 述 します。<br />
IO.PDR6.BIT<br />
BIT.B0 = 0;<br />
51<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
LED の 点 滅<br />
4 章 で 実 行 した P60 につながっている LED の 点 滅 について 詳 しく 見 てみましょう。まず,ポート<br />
の 入 出 力 を「ポートコントロールレジスタ 6(PCR6)」で 設 定 します。P60 を 出 力 にします。P61~67 は<br />
LED がつながっていますが 今 回 は 使 いません。どちらでもよいのですが,とりあえず 入 力 にしておき<br />
ましょう。<br />
b7 b6 b5 b4 b3 b2 b1 b0<br />
PCR6 0 0 0 0 0 0 0 1<br />
あとは 自 由 に LED を 光 らせることができます。ポート 6 の 入 出 力 は「ポートデータレジスタ 6<br />
(PDR6)」で 行 ないます。<br />
では,プログラムを 作 ってみましょう。LED を 点 滅 させるという,しごく 簡 単 なプログラムです。ただ,<br />
今 回 はハイパーH8 の‘G’コマンドで 動 かしますので,CPU の 速 度 で 点 滅 させると 人 間 の 目 には 判 別<br />
不 能 になります。それで,オンしたら 少 し 待 つ,オフしたら 少 し 待 つ,というのを 繰 り 返 すことにします。<br />
では,フローチャートを 考 えてみましょう。<br />
main<br />
ポートの<br />
イニシャライズ<br />
LED オン<br />
ウェイト<br />
LED オフ<br />
ウェイト<br />
ウェイトは 単 純 ループで 作 ります。<br />
52<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
では,コーディングしてみましょう。<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :IoPort_led_c.c */<br />
/* DATE :Wed, Apr 20, 2005 */<br />
/* DESCRIPTION :Main Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is programed by TOYO-LINX Co.,Ltd. / yKikuchi */<br />
/* */<br />
/***********************************************************************/<br />
/************************************************************************<br />
゜ンルクルーヴチネァ゜ル<br />
************************************************************************/<br />
#include // H8 特 有 の 命 令 をを 使 う<br />
#include "iodefine.h" // 内 蔵 I/Oのラベル 定 義<br />
/************************************************************************<br />
関 数 の 定 義<br />
************************************************************************/<br />
void main(void);<br />
void wait(void);<br />
/************************************************************************<br />
メ゜ンルハロエラム<br />
************************************************************************/<br />
void main(void)<br />
{<br />
IO.PCR6 = 0x01;<br />
// ポーヴダ6のbit0(P60)をを 出 力 に 設 定<br />
}<br />
while(1){<br />
IO.PDR6.BIT.B0 = 0;<br />
wait();<br />
IO.PDR6.BIT.B0 = 1;<br />
wait();<br />
}<br />
// LEDオンル<br />
// LEDオネ<br />
/************************************************************************<br />
ウェ゜ダ<br />
************************************************************************/<br />
void wait(void)<br />
{<br />
unsigned long i;<br />
}<br />
for (i=0;i
スイッチの 入 力<br />
次 は 入 力 ポートの 例 として,プッシュスイッチの 入 力 を 考 えてみましょう。スイッチが 押 された 瞬 間<br />
だけ,0.2 秒 間 (200ms)LED が 光 る(ワンショット 動 作 ),というプログラムを 作 ります。プッシュスイッチ<br />
は P53 につながっているものを 使 います。LED は P60 です。<br />
さて,プッシュスイッチを 入 力 するとき 最暷 初 に 考 えなければならないのはチャタリングの 除 去 です。<br />
スイッチをオンにするというのは,おおざっぱに 言 えば 金 属 と 金 属 をぶつけることです。そのため, 押<br />
した 瞬 間 , 金 属 の 接 点 がバウンドしてオンとオフが 繰 り 返 されます。これをチャタリングと 呼 びます。 数<br />
ms の 間 だけなのですが,マイコンにしてみれば 十 分 長 い 時昷 間 です。そのため, 単 純 に 入 力 すると,こ<br />
のオンとオフをすべて 読 んでしまって, 何 度 もスイッチが 押 されたとかんちがいしてしまいます。<br />
チャタリングを 取 り 除 くために,<br />
スイッチがオンしたら,しばらく 待 っ<br />
てから(10ms ぐらい)もう 一 度 読 む<br />
(ダブルリード),ということを 行 な<br />
います。2 度 目 に 読 んだときもオン<br />
だったら 本曓 当 にスイッチがオンした<br />
と 見 なします。<br />
次 はワンショット 動 作 について 考 えてみましょう。スイッチがオンになった 瞬 間 だけを 検 出 するた<br />
めにスイッチの 状 態 をおぼえておくことにします。 変 数 として‘SwStatus’を B セクションに 用 意 し,<br />
SwStatus=0 のときはスイッチが 押<br />
されていない,SwStatus=1 のとき<br />
はスイッチが 押 されている,という<br />
ことにします。スイッチが 押 された<br />
瞬 間 を 検 出 するので,SwStatus<br />
が 0 から 1 に 変 化 したときに LED<br />
を 点 灯 します。<br />
以 上 のことを 考 えてタイミングチャートをかいてみましょう。これを 見 ながらコーディングしていきま<br />
す。<br />
54<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
***********************************************************************/<br />
/* */<br />
/* FILE :IoPort_sw_led_c.c */<br />
/* DATE :Wed, Jan 09, 2008 */<br />
/* DESCRIPTION :Main Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is programed by TOYO-LINX Co.,Ltd. / yKikuchi */<br />
/* */<br />
/***********************************************************************/<br />
/************************************************************************<br />
゜ンルクルーヴチネァ゜ル<br />
************************************************************************/<br />
#include // H8 特 有 の 命 令 をを 使 う<br />
#include "iodefine.h" // 内 蔵 I/Oのラベル 定 義<br />
/************************************************************************<br />
エローヴトル 変 数 の 定 義 と゜ニッシホラ゜ズ(RAM)<br />
************************************************************************/<br />
unsigned char SwStatus = 0; //ス゜ッセスの 状 態<br />
/************************************************************************<br />
関 数 の 定 義<br />
************************************************************************/<br />
void main(void);<br />
void wait10(void);<br />
void wait200(void);<br />
/************************************************************************<br />
メ゜ンルハロエラム<br />
************************************************************************/<br />
void main(void)<br />
{<br />
IO.PUCR5.BYTE = 0x08; // ポーヴダ5ハルアッセハ 抵 抗 の 設 定<br />
IO.PCR5 = 0x00; // ポーヴダ5をを 入 力 に 設 定<br />
IO.PCR6 = 0x01; // ポーヴダ6のbit0(P60)をを 出 力 に 設 定<br />
IO.PDR6.BIT.B0 = 1; // LEDオネ<br />
while(1){<br />
if (IO.PDR5.BIT.B3==0){<br />
wait10();<br />
if (IO.PDR5.BIT.B3==0){<br />
if (SwStatus==0){<br />
SwStatus = 1;<br />
IO.PDR6.BIT.B0 = 0;<br />
wait200();<br />
IO.PDR6.BIT.B0 = 1;<br />
}<br />
}<br />
else{<br />
SwStatus = 0;<br />
}<br />
//ス゜ッセスオンル<br />
//ちょっと 待 つ<br />
//やっぱりス゜ッセスオンル<br />
// 今 までス゜ッセスオネだった<br />
//ス゜ッセスオンルをを 記 憶<br />
//LEDオンル<br />
//しばらく 待 つ<br />
//LEDオネ<br />
//ス゜ッセスオネだった<br />
55<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
}<br />
}<br />
}<br />
else{<br />
SwStatus = 0;<br />
}<br />
//ス゜ッセスオネ<br />
/************************************************************************<br />
ウェ゜ダ<br />
************************************************************************/<br />
void wait10(void)<br />
{<br />
unsigned long I;<br />
}<br />
for (I=0;I
練 習 問 題 (1)<br />
(<br />
次 のように LED が 点 灯 するプログラムを 作 りなさい。( 解 答 例 は「IoPort_led_rotate_c」)<br />
練 習 問 題 (2)<br />
(<br />
スイッチが 押 されるたびに, 練 習 問 題 (1)の LED の 点 灯 方 向 が 逆 になるプログラムを 作 りなさい。<br />
( 解 答 例 は「IoPort_sw_led_rotate_c」)<br />
57<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
2. . 外 部 割 込 み<br />
基 本曓 的 にマイコンはプログラムに 従 って 一 連 の 作 業 を 順 番 に 実 行 していきます。しかし,マイコ<br />
ンにセンサやスイッチをつないで,「センサから 入 力 があったらこの 処 理 を 行 なう」とか,「スイッチが 押<br />
されたらあの 処 理 を 行 なう」というようにプログラムする 場 合 ,いつ 入 力 があるかわからないため,セン<br />
サやスイッチの 状 態 をいつも 監 視 していなければなりません。マイコンが 普晘 段 ひまだったり, 多 少 反 応<br />
が 遅 くなってもよかったりするのであれば,そういう 方 法沵 でもよいのですが,いろいろな 処 理 を 行 ない<br />
ながら,いざ 入 力 があったときは 優 先 して 処 理 しなければならないとなると, 別 の 方 法沵 を 考 えなえれば<br />
なりません。<br />
このようなときに 使 うのが 外 部 割 込 みです。H8/3687 には IRQ0,IRQ1,IRQ2,IRQ3 という 4 つ<br />
の 端 子 が 用 意 されていて,それぞれの 端 子 の 信 号 の 変 化 によって 割 込 みをかけ, 特 定 の 処 理 を 実<br />
行 することができます。 割 込 みとはハードウェア 的 にサブルーチンを 実 行 する 方 法沵 ,とも 言 えるでしょ<br />
う。<br />
<br />
割 込 み 処 理 の 概 要<br />
割 込 み 要 求 は H8/3687 に 内 蔵 さ<br />
れている 割 込 みコントローラによって 制<br />
御 されます。 外 部 割 込 みの 割 込 み 動 作<br />
は 下 記 のとおりです。<br />
1. IRQ0~3 端 子 に 入 力 エッジが<br />
あると 割 込 みコントローラに 割 込 み<br />
要 求 信 号 を 送 ります。(エッジの 方<br />
向 は 個 別 に 選 択 可 能 )<br />
2. 割 込 みコントローラは CPU に<br />
対 して 割 込 み 処 理 を 要 求 します。<br />
3. CPU は 割 込 みを 受 け 付 けると,<br />
実 行 中 の 命 令 を 実 行 したあと,プロ<br />
グラムカウンタと CCR(コンディショ<br />
ンコードレジスタ)をスタックにプッ<br />
シュします。<br />
4. CPU は CCR の I ビットを 1 にセ<br />
ットして 他 の 割 込 みを 受 け 付 けない<br />
ようにします。<br />
5. CPU は 外 部 割 込 み 要 求 に 対<br />
するベクタアドレス(IRQ0 のとき<br />
0x001C , IRQ1 の と き 0x001E ,<br />
IRQ2 のとき 0x0020,IRQ3 のとき<br />
0x0022)を 生 成 し,そのベクタアドレスにセットされているデータ( 割 込 み 処 理 のスタートアドレス)<br />
をプログラムカウンタにセットします。<br />
6. 割 込 み 処 理 がスタートします。<br />
58<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
外 部 割 込 みに 使 用 するコントロールレジスタ<br />
割 込 みを 制 御 するレジスタの 内 , 外 部 割 込 み IRQ0~3 に 関 係 するレジスタは 次 のとおりです。<br />
なお, 外 部 割 込 みに 関 係 するビットは 黄 色 でマークしています。<br />
割 込 みエッジセレクトレジスタ 1(IEGR1<br />
IEGR1) : アドレス=0xFFF2<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 NMIEG 0 R/W NMI エッジセレクト。<br />
0:NMI 入 力 端 子 の 立 ち 下 がりエッジを 検 出 。<br />
1:NMI 入 力 端 子 の 立 ち 上 がりエッジを 検 出 。<br />
6 - 1 - リザーブビット。リードすると 常 に 1 が 読 み 出 される。<br />
5 - 1 - リザーブビット。リードすると 常 に 1 が 読 み 出 される。<br />
4 - 1 - リザーブビット。リードすると 常 に 1 が 読 み 出 される。<br />
3 IEG3 0 R/W IRQ3 エッジセレクト。<br />
0:IRQ3 入 力 端 子 の 立 ち 下 がりエッジを 検 出 。<br />
1:IRQ3 入 力 端 子 の 立 ち 上 がりエッジを 検 出 。<br />
2 IEG2 0 R/W IRQ2 エッジセレクト。<br />
0:IRQ2 入 力 端 子 の 立 ち 下 がりエッジを 検 出 。<br />
1:IRQ2 入 力 端 子 の 立 ち 上 がりエッジを 検 出 。<br />
1 IEG1 0 R/W IRQ1 エッジセレクト。<br />
0:IRQ1 入 力 端 子 の 立 ち 下 がりエッジを 検 出 。<br />
1:IRQ1 入 力 端 子 の 立 ち 上 がりエッジを 検 出 。<br />
0 IEG0 0 R/W IRQ0 エッジセレクト。<br />
0:IRQ0 入 力 端 子 の 立 ち 下 がりエッジを 検 出 。<br />
1:IRQ0 入 力 端 子 の 立 ち 上 がりエッジを 検 出 。<br />
割 込 みイネーブルレジスタ 1(IENR1<br />
IENR1) : アドレス=0xFFF4<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 IENDT 0 R/W 直 接 遷 移 割 込 み 要 求 イネーブル。<br />
0:ディセーブル。 / 1:イネーブル。<br />
6 IENTA 0 R/W RTC 割 込 み 要 求 イネーブル。<br />
0:ディセーブル。 / 1:イネーブル。<br />
5 IENWP 0 R/W ウェイクアップ 割 込 み 要 求 イネーブル。(WKP0~5 共 通 )<br />
0:ディセーブル。 / 1:イネーブル。<br />
4 - 1 - リザーブビット。リードすると 常 に 1 が 読 み 出 される。<br />
3 IEN3 0 R/W IRQ3 割 込 み 要 求 イネーブル。<br />
0:ディセーブル。 / 1:イネーブル。<br />
2 IEN2 0 R/W IRQ2 割 込 み 要 求 イネーブル。<br />
0:ディセーブル。 / 1:イネーブル。<br />
1 IEN1 0 R/W IRQ1 割 込 み 要 求 イネーブル。<br />
0:ディセーブル。 / 1:イネーブル。<br />
0 IEN0 0 R/W IRQ0 割 込 み 要 求 イネーブル。<br />
0:ディセーブル。 / 1:イネーブル。<br />
59<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
割 込 みフラグレジスタ 1(IRR1<br />
IRR1) : アドレス=0xFFF6<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 IRRDT 0 R/W 直 接 遷 移 割 込 み 要 求 フラグ。<br />
[セット 条曵 件 ]SYSCR2 の DTON に 1 をセットした 状 態 でスリープ 命 令 を<br />
実 行 し 直 接 遷 移 したとき。<br />
[クリア 条曵 件 ]0 をライトしたとき。<br />
6 IRRTA 0 R/W RTC 割 込 み 要 求 フラグ。<br />
[セット 条曵 件 ]RTC がオーバーフローしたとき。<br />
[クリア 条曵 件 ]0 をライトしたとき。<br />
5 - 1 - リザーブビット。リードすると 常 に 1 が 読 み 出 される。<br />
4 - 1 - リザーブビット。リードすると 常 に 1 が 読 み 出 される。<br />
3 IRRI3 0 R/W IRQ3 割 込 み 要 求 フラグ。<br />
[セット 条曵 件 ]IRQ3 が 割 込 み 入 力 に 設 定 され, 指 定 されたエッジを 検 出<br />
したとき。<br />
[クリア 条曵 件 ]0 をライトしたとき。<br />
2 IRRI2 0 R/W IRQ2 割 込 み 要 求 フラグ。<br />
[セット 条曵 件 ]IRQ2 が 割 込 み 入 力 に 設 定 され, 指 定 されたエッジを 検 出<br />
したとき。<br />
[クリア 条曵 件 ]0 をライトしたとき。<br />
1 IRRI1 0 R/W IRQ1 割 込 み 要 求 フラグ。<br />
[セット 条曵 件 ]IRQ1 が 割 込 み 入 力 に 設 定 され, 指 定 されたエッジを 検 出<br />
したとき。<br />
[クリア 条曵 件 ]0 をライトしたとき。<br />
0 IRRI0 0 R/W IRQ0 割 込 み 要 求 フラグ。<br />
[セット 条曵 件 ]IRQ0 が 割 込 み 入 力 に 設 定 され, 指 定 されたエッジを 検 出<br />
したとき。<br />
[クリア 条曵 件 ]0 をライトしたとき。<br />
IRQ0~3 はポート 1 の P14~17 と 兼 用 ピンになっています。それで,IRQ0~3 として 使 うように 指<br />
定 しなければなりません。 次 のレジスタで 指 定 します。<br />
ポートモードレジスタ 1(PMR1<br />
PMR1) : アドレス=0xFFE0<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 IRQ3 0 R/W P17,IRQ3,TRGV 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:IRQ3,および,TRGV 入 力 端 子 。<br />
6 IRQ2 0 R/W P16,IRQ2 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:IRQ2 入 力 端 子 。<br />
5 IRQ1 0 R/W P15,IRQ1,TMIB1 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:IRQ1,および,TMIB 入 力 端 子 。<br />
4 IRQ0 0 R/W P14,IRQ0 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:IRQ0 入 力 端 子 。<br />
3 TXD2 0 R/W P72,TXD_2 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:TXD_2 出 力 端 子 。<br />
2 PWM 0 R/W P11,PWM 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:PWM 出 力 端 子 。<br />
1 TXD 0 R/W P22,TXD 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:TXD 出 力 端 子 。<br />
0 TMOW 0 R/W P10,TMOW 端 子 の 機 能 の 選 択 。<br />
0: 汎 用 入 出 力 ポート。 / 1:TMOW 出 力 端 子 。<br />
60<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
回 路 図<br />
Timer&LED Display(B6092)の SW1( 右 のスイッチ)は H8/3687 の P53 につながっていますが,<br />
ユニバーサル 基 板朋 で P14 にもつながっています。P14 は IRQ0 と 兼 用 になっています。 同 じように<br />
SW2 は P54・P15・IRQ1 に,SW3 は P55・P16・IRQ2 につながっています。 今 回 は IRQ0,1,2 割 込 み<br />
を 使 ってみましょう。 回 路 図 を 再 掲 します。<br />
61<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
プログラムの 作 成<br />
作 成 するプログラムは「SW1 が 押 されるたびにポート 6 の 表 示 をインクリメント,SW2 が 押 される<br />
たびにポート 6 の 表 示 をデクリメント,SW3 が 押 されるたびに 表 示 をローテートする」というものです。<br />
スイッチオンの 検 知 は 外 部 割 込 みで 行 ないます。スイッチオンで 信 号 は High から Low になりま<br />
すから, 立 ち 下 がりエッジで 割 込 みをかければよいわけです。ソースリストは 次 のようになります。<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :irq_c.c */<br />
/* DATE :Thu, Jan 10, 2008 */<br />
/* DESCRIPTION :Main Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is programed by TOYO-LINX Co.,Ltd. / yKikuchi */<br />
/* */<br />
/***********************************************************************/<br />
/************************************************************************<br />
゜ンルクルーヴチネァ゜ル<br />
************************************************************************/<br />
#include // H8 特 有 の 命 令 をを 使 う<br />
#include "iodefine.h" // 内 蔵 I/Oのラベル 定 義<br />
/************************************************************************<br />
エローヴトル 変 数 の 定 義 と゜ニッシホラ゜ズ(RAM)<br />
************************************************************************/<br />
unsigned char DispData = 0x00; // 表 示 デーヴタ<br />
/************************************************************************<br />
関 数 の 定 義<br />
************************************************************************/<br />
void intprog_irq0(void);<br />
void intprog_irq1(void);<br />
void intprog_irq2(void);<br />
void main(void);<br />
/************************************************************************<br />
メ゜ンルハロエラム<br />
************************************************************************/<br />
void main(void)<br />
{<br />
// ゜ニッシホラ゜ズ ----------------------------------------------------<br />
IO.PMR1.BYTE = 0x72; // P14-16ををIRQ0,1,2に 接 続<br />
IO.PCR1 = 0x00; // ポーヴダ1をを 入 力 に 設 定<br />
IO.PUCR5.BYTE = 0x38;<br />
IO.PCR5 = 0x00;<br />
IO.PCR6 = 0xff;<br />
IEGR1.BYTE = 0x00;<br />
IRR1.BYTE = 0x00;<br />
IENR1.BYTE = 0x07;<br />
// ポーヴダ5ハルアッセハ 抵 抗 の 設 定<br />
// ポーヴダ5をを 入 力 に 設 定<br />
// ポーヴダ6をを 出 力 に 設 定<br />
// IRQ0-2 立 ち 下 がり゠ッセジ<br />
// IRQ0-2 割 込 み 要 求 ネラエクリア<br />
// IRQ0-2 割 込 み゜ネヅーヴノル<br />
62<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
}<br />
// メ゜ンルルーヴハ ------------------------------------------------------<br />
while(1){<br />
IO.PDR6.BYTE = ~DispData; // ポーヴダ6に 表 示 する<br />
}<br />
/************************************************************************<br />
IRQ0 割 込 み<br />
************************************************************************/<br />
#pragma regsave (intprog_irq0)<br />
void intprog_irq0(void)<br />
{<br />
DispData++;<br />
// On → ゜ンルクリメンルダ<br />
IRR1.BIT.IRRI0 = 0;<br />
// 割 込 み 要 求 ネラエクリア<br />
}<br />
/************************************************************************<br />
IRQ1 割 込 み<br />
************************************************************************/<br />
#pragma regsave (intprog_irq1)<br />
void intprog_irq1(void)<br />
{<br />
DispData--;<br />
// On → デクリメンルダ<br />
IRR1.BIT.IRRI1 = 0;<br />
// 割 込 み 要 求 ネラエクリア<br />
}<br />
/************************************************************************<br />
IRQ2 割 込 み<br />
************************************************************************/<br />
#pragma regsave (intprog_irq2)<br />
void intprog_irq2(void)<br />
{<br />
DispData = rotlc(1,DispData); // On → 左 ローヴテーヴダ<br />
IRR1.BIT.IRRI2 = 0;<br />
// 割 込 み 要 求 ネラエクリア<br />
}<br />
割 込 みを 使 うためにはソースファイルだけではなく,HEW が 自 動 生 成 する‘intprg.c’を 修 正 す<br />
る 必 要 があります。 下 記 のリストをご 覧 ください。<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :intprg.c */<br />
/* DATE :Thu, Jan 10, 2008 */<br />
/* DESCRIPTION :Interrupt Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is generated by Renesas Project Generator (Ver.4.9). */<br />
/* */<br />
/***********************************************************************/<br />
#include <br />
63<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
extern void intprog_irq0(void);<br />
extern void intprog_irq1(void);<br />
extern void intprog_irq2(void);<br />
#pragma section IntPRG<br />
// vector 1 Reserved<br />
追 加<br />
// vector 2 Reserved<br />
// vector 3 Reserved<br />
// vector 4 Reserved<br />
// vector 5 Reserved<br />
// vector 6 Reserved<br />
// vector 7 NMI<br />
__interrupt(vect=7) void INT_NMI(void) {/* sleep(); */}<br />
// vector 8 TRAP #0<br />
__interrupt(vect=8) void INT_TRAP0(void) {/* sleep(); */}<br />
// vector 9 TRAP #1<br />
__interrupt(vect=9) void INT_TRAP1(void) {/* sleep(); */}<br />
// vector 10 TRAP #2<br />
__interrupt(vect=10) void INT_TRAP2(void) {/* sleep(); */}<br />
// vector 11 TRAP #3<br />
__interrupt(vect=11) void INT_TRAP3(void) {/* sleep(); */}<br />
// vector 12 Address break<br />
__interrupt(vect=12) void INT_ABRK(void) {/* sleep(); */}<br />
// vector 13 SLEEP<br />
__interrupt(vect=13) void INT_SLEEP(void) {/* sleep(); */}<br />
// vector 14 IRQ0<br />
__interrupt(vect=14) void INT_IRQ0(void) {intprog_irq0();}<br />
// vector 15 IRQ1<br />
__interrupt(vect=15) void INT_IRQ1(void) {intprog_irq1();}<br />
// vector 16 IRQ2<br />
__interrupt(vect=16) _interrupt(vect=16) void INT_IRQ2(void) {intprog_irq2();}<br />
// vector 17 IRQ3<br />
__interrupt(vect=17) void INT_IRQ3(void) {/* sleep(); */}<br />
// vector 18 WKP<br />
__interrupt(vect=18) void INT_WKP(void) {/* sleep(); */}<br />
// vector 19 RTC<br />
__interrupt(vect=19) void INT_RTC(void) {/* sleep(); */}<br />
// vector 20 Reserved<br />
修 正<br />
修 正<br />
修 正<br />
// vector 21 Reserved<br />
// vector 22 Timer V<br />
__interrupt(vect=22) void INT_TimerV(void) {/* sleep(); */}<br />
// vector 23 SCI3<br />
__interrupt(vect=23) void INT_SCI3(void) {/* sleep(); */}<br />
// vector 24 IIC2<br />
__interrupt(vect=24) void INT_IIC2(void) {/* sleep(); */}<br />
// vector 25 ADI<br />
64<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
__interrupt(vect=25) void INT_ADI(void) {/* sleep(); */}<br />
// vector 26 Timer Z0<br />
__interrupt(vect=26) void INT_TimerZ0(void) {/* sleep(); */}<br />
// vector 27 Timer Z1<br />
__interrupt(vect=27) void INT_TimerZ1(void) {/* sleep(); */}<br />
// vector 28 Reserved<br />
// vector 29 Timer B1<br />
__interrupt(vect=29) void INT_TimerB1(void) {/* sleep(); */}<br />
// vector 30 Reserved<br />
// vector 31 Reserved<br />
// vector 32 SCI3_2<br />
__interrupt(vect=32) void INT_SCI3_2(void) {/* sleep(); */}<br />
では,ビルドして 実 行 してみましょう。 期曋 待 通 り 動 作 するでしょうか。なお, 付 属 の CD-ROM には<br />
あらかじめダウンロードするファイルがおさめられています。<br />
をダウンロードして 実 行 してください。<br />
<br />
練 習 問 題<br />
‘irq_c.mot’<br />
おそらく,スイッチを 押 したときに+1 だけではなく, 不 規 則 に+2 や+3 になったりすると 思 います。<br />
これはスイッチのチャタリングの 影 響 です。では,チャタリングを 取 り 除 く 方 法沵 を 考 えてみてください。<br />
( 解 答 例 は「irq_c_v2」)<br />
♭♯♪♭♯♪<br />
ところで, 解 答 例 「irq_c_v2.c」はプログラムだけでチャタリングを 除 去 する 方 法沵 です。ただ, 割 込<br />
みプログラムの 中 にチャタリング 除 去 のためのウェイトが 入 っているため, 他 の 処 理 が 行 なえなくなっ<br />
てしまいます。なので,ハードウェアでチャタリングを 除 去 することを 考 えてもよいでしょう。 回 路 は 次 の<br />
ようになります。<br />
抵 抗 とコンデンサを1 個 ずつ 追 加 するだけです。コンデンサは 使 うスイッチにあわせてチャタリ<br />
ングが 除 去 できる 容 量 にします。この 抵 抗 とコンデンサでローパスフィルタを 作 り, 波沿 形 をなまらせて<br />
チャタリングを 吸 収 します。プログラムは「irq_c.c」を 使 います。<br />
もちろん,コンデンサを 追 加 せずに,なおかつ 他 の 処 理 に 影 響 を 与 えずにプログラムでチャタリ<br />
ングを 除 去 する 方 法沵 もあります。これについては「6.ADコンバータ」のプログラムをご 覧 ください。<br />
65<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
3.タイマ<br />
V<br />
マイコンの 内 蔵 機 能 で I/O ポートと 並 んでよく 使 われる 機 能 はタイマです。 出 力 波沿 形 を 作 ったり,<br />
タイミングを 作 ったりします。H8/3687 には 3 つの 汎 用 タイマが 内 蔵 されています。ここでは,そのうち<br />
の 一 つ,タイマ V を 使 ってみましょう。<br />
<br />
タイマ V の 概 要<br />
タイマ V は 8 ビットカウンタ<br />
をベースにした 8 ビットタイマ<br />
です。タイマ V に 内 蔵 されて<br />
い る タ イ マ カ ウ ン タ V<br />
( TCNTV ) は CPU ク ロ ッ ク<br />
(TK-3687 の 場 合 は 20MHz)<br />
を 分 周 し た ク ロ ッ ク ( 1/128 ,<br />
1/64,1/32,1/16,1/8,1/4 の<br />
いずれか 選 択 可 能 )によって<br />
常 に+1 されます。TCNTV は<br />
タイムコンスタントレジスタ A<br />
(TCORA)とタイムコンスタント<br />
レジスタ B(TCORB)と 比 較 さ<br />
れており, 一 致 すると CPU に<br />
割 り 込 みをかけることができま<br />
す。その 際 ,TCNTV を 0 にク<br />
リアするよう 設 定 することもでき<br />
ます。<br />
なお,タイマ V の 詳 細 に<br />
ついては「H8/3687 シリーズ<br />
ハードウェアマニュアル」の<br />
「12.タイマ V」をご 覧 下 さい。<br />
66<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
タイマ V の 設 定 用 レジスタの 説 明<br />
タイマ V の 設 定 に 関 係 するレジスタは 次 のとおりです。<br />
タイマコントロールレジスタ V0(TCRV0<br />
TCRV0) : アドレス=0xFFA0<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 CMIEB 0 R/W コンペアマッチインタラプトイネーブル B。<br />
1 のとき TCSRV の CMFB による 割 込 み 要 求 がイネーブルになる。<br />
6 CMIEA 0 R/W コンペアマッチインタラプトイネーブル A。<br />
1 のとき TCSRV の CMFA による 割 込 み 要 求 がイネーブルになる。<br />
5 OVIE 0 R/W タイマオーバフローインタラプトイネーブル。<br />
1 のとき TCSRV の OVF による 割 込 み 要 求 がイネーブルになる。<br />
4 CCLR1 0 R/W カウンタクリア。TCNTV のクリア 条曵 件<br />
3 CCLR0 0 R/W<br />
00:クリアされない。<br />
01:コンペアマッチ A でクリア。<br />
10:コンペアマッチ B でクリア。<br />
11:TMRIV 端 子 の 立 上 がりエッジでクリア。<br />
2 CLK2 0 R/W<br />
1 CLK1 0 R/W<br />
0 CLK0 0 R/W<br />
クロックセレクト。<br />
TCRV1 の ICHS0 との 組 み 合 わせで,TCNTV に 入 力 するクロックとカウ<br />
ント 条曵 件 を 選 択 する。 下 表 を 参 照 。<br />
TCRV0<br />
TCEV1<br />
CKS2 CKS1 CKS0 ICKS0<br />
0 0 0 - クロック 入 力 禁 止 。<br />
0 0 1 0 内 部 クロックΦ/4 立 ち 下 がりエッジでカウント。<br />
0 0 1 1 内 部 クロックΦ/8 立 ち 下 がりエッジでカウント。<br />
0 1 0 0 内 部 クロックΦ/16 立 ち 下 がりエッジでカウント。<br />
0 1 0 1 内 部 クロックΦ/32 立 ち 下 がりエッジでカウント。<br />
0 1 1 0 内 部 クロックΦ/64 立 ち 下 がりエッジでカウント。<br />
0 1 1 1 内 部 クロックΦ/128 立 ち 下 がりエッジでカウント。(*)<br />
1 0 0 - クロック 禁 止 。<br />
1 0 1 - 外 部 クロックの 立 ち 上 がりエッジでカウント。<br />
1 1 0 - 外 部 クロックの 立 ち 下 がりエッジでカウント。<br />
1 1 1 - 外 部 クロックの 立 ち 上 がり/ 立 ち 下 がり 両 エッジでカウント。<br />
(*)この 組 み 合 わせを 次 に 作 成 するプログラムで 設 定 する<br />
説 明<br />
67<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
タイマコントロールステータスレジスタ<br />
ータスレジスタ V(TCSRV<br />
TCSRV) : アドレス=0xFFA1<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 CMFB 0 R/W コンペアマッチフラグ B。<br />
[セット 条曵 件 ]TCNTV の 値 と TCORB の 値 が 一 致 したとき。<br />
[クリア 条曵 件 ]CMFB=1 で,CMFB をリードした 後 ,CMFB に 0 をライト。<br />
6 CMFA 0 R/W コンペアマッチフラグ A。<br />
[セット 条曵 件 ]TCNTV の 値 と TCORA の 値 が 一 致 したとき。<br />
[クリア 条曵 件 ]CMFA=1 で,CMFA をリードした 後 ,CMFA に 0 をライト。<br />
5 OVF 0 R/W タイマオーバフローフラグ。<br />
[セット 条曵 件 ]TCNTV の 値 が FF から 00 にオーバーフローしたとき。<br />
[クリア 条曵 件 ]OVF=1 で,OVF をリードした 後 ,OVF に 0 をライト。<br />
4 - 1 - リザーブビット。<br />
3 OS3 0 R/W アウトプットセレクト 3~2。TCORB と TCNTV のコンペアマッチによる TMOV<br />
2 OS2 0 R/W<br />
端 子 の 出 力 方 法 。<br />
00: 変 化 しない。01:0 出 力 。10:1 出 力 。11:トグル 出 力 。<br />
1 OS1 0 R/W アウトプットセレクト 1~0。TCORA と TCNTV のコンペアマッチによる TMOV<br />
0 OS0 0 R/W<br />
端 子 の 出 力 方 法 。<br />
00: 変 化 しない。01:0 出 力 。10:1 出 力 。11:トグル 出 力 。<br />
タイマコントロールレジスタ V1(TCRV1<br />
TCRV1) : アドレス=0xFFA5<br />
番 地<br />
ビット ビット 名 初 期曋 値 R/W 説 明<br />
7 - - リザーブビット。<br />
6 - - リザーブビット。<br />
5 - - リザーブビット。<br />
4 TVEG1 0 R/W TRGV 入 力 エッジセレクト。<br />
3 TVEG0 0 R/W<br />
00:TRGV からのトリガ 禁 止 。<br />
01: 立 ち 上 がりエッジ。<br />
10: 立 ち 下 がりエッジ。<br />
11: 立 ち 上 がり/ 立 ち 下 がり 両 エッジ。<br />
2 TRGE 0 R/W TVEG1,TVEG0 で 選 択 されたエッジの 入 力 により,TCNTV カウントアップ<br />
開 始 。<br />
0:TRGV 端 子 入 力 による TCNTV カウントアップの 開 始 とコンペアマッチ<br />
による TCNTV クリア 時昷 の TCNTV カウントアップの 停 止 を 禁 止 。<br />
1:TRGV 端 子 入 力 による TCNTV カウントアップの 開 始 とコンペアマッチ<br />
による TCNTV クリア 時昷 の TCNTV カウントアップの 停 止 を 許 可 。<br />
1 - 1 - リザーブビット。<br />
0 ICKS0 0 R/W インターナルクロックセレクト。<br />
TCRV0 の CKS2~0 との 組 み 合 わせで,TCNTV に 入 力 するクロックとカ<br />
ウント 条曵 件 を 選 択 する。<br />
68<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
タイマ V と 割 込 みを 使 って LED を 点 滅 させる<br />
まずは 基 準 となるタイミングをタイマ V で 作 ります。 今 回 は CPU クロック(20MHz)の 1/128(=156.<br />
25KHz)で TCNTV を+1 します。そして,TCORA に 156 をセットし, 一 致 したら 割 込 みをかけると 同 時昷<br />
に TCNTV を 0 にクリアします。TCNTV は 常 に+1 されるので, 割 込 みは 約 1ms 毎 (1KHz)にかかる<br />
ことになります。もちろん 1ms で LED を 点 滅 させたのでは 人 間 の 目 に 感 じられませんので,0.5 秒 ぐ<br />
らいで 点 滅 するよう 割 込 み 処 理 の 中 で 細 工 します。<br />
割 込 みは 外 部 割<br />
込 みとほとんど 同 じ<br />
考 え 方 です。 異 なる<br />
のは,CPU が 生 成 す<br />
るタイマ V の 割 り 込<br />
み 要 求 に 対 するベク<br />
タアドレスが 002Ch<br />
であることです。その<br />
ベクタアドレスにセッ<br />
ト さ れ て い るデ ータ<br />
( 割 込 み 処 理 のスタ<br />
ートアドレス)をプロ<br />
グラムカウンタにセッ<br />
トします。<br />
では,ソースリストを 書暯 いてみましょう。<br />
69<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
***********************************************************************/<br />
/* */<br />
/* FILE :tmv_led_c.c */<br />
/* DATE :Thu, Jan 10, 2008 */<br />
/* DESCRIPTION :Main Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is programed by TOYO-LINX Co.,Ltd. / yKikuchi */<br />
/* */<br />
/***********************************************************************/<br />
/************************************************************************<br />
゜ンルクルーヴチネァ゜ル<br />
************************************************************************/<br />
#include // H8 特 有 の 命 令 をを 使 う<br />
#include "iodefine.h" // 内 蔵 I/Oのラベル 定 義<br />
/************************************************************************<br />
エローヴトル 変 数 の 定 義 と゜ニッシホラ゜ズ(RAM)<br />
************************************************************************/<br />
unsigned int LedCnt = 0; // 点 滅 タ゜ミンルエィウンルタ<br />
/************************************************************************<br />
関 数 の 定 義<br />
************************************************************************/<br />
void intprog_tmv(void);<br />
void main(void);<br />
/************************************************************************<br />
メ゜ンルハロエラム<br />
************************************************************************/<br />
void main(void)<br />
{<br />
IO.PCR6 = 0x01;<br />
// ポーヴダ6のbit0(P60)をを 出 力 に 設 定<br />
TV.TCSRV.BYTE = 0x00; //TOMV 端 子 は 使 わわない<br />
TV.TCORA = 156; // 周 期 =1ms(1kHz)<br />
TV.TCRV1.BYTE = 0x01; //TRGVダリイ 入 力 禁 止 ,<br />
TV.TCRV0.BYTE = 0x4b; //コカンルヒアマッセスA 割 込 み゜ネヅーヴノル<br />
//コカンルヒアマッセスA でTCNTVクリア<br />
// 内 部 クロッセクφ/128(=156.25kHz)<br />
}<br />
while(1){}<br />
/************************************************************************<br />
タ゜マV 割 込 み<br />
************************************************************************/<br />
#pragma regsave (intprog_tmv)<br />
void intprog_tmv(void)<br />
{<br />
//コカンルヒアマッセスネラエA クリア<br />
TV.TCSRV.BIT.CMFA = 0;<br />
70<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
}<br />
// 点 滅<br />
LedCnt = LedCnt + 1;<br />
if ((LedCnt&0x0200)==0x0200){<br />
IO.PDR6.BIT.B0 = 0;<br />
}<br />
else{<br />
IO.PDR6.BIT.B0 = 1;<br />
}<br />
割 込 みを 使 うためにはソースファイルだけではなく,HEW が 自 動 生 成 する‘intprg.c’を 修 正 す<br />
る 必 要 があります。 下 記 のリストをご 覧 ください。<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :intprg.c */<br />
/* DATE :Thu, Jan 10, 2008 */<br />
/* DESCRIPTION :Interrupt Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is generated by Renesas Project Generator (Ver.4.9). */<br />
/* */<br />
/***********************************************************************/<br />
#include <br />
extern void intprog_tmv(void);<br />
#pragma section IntPRG<br />
// vector 1 Reserved<br />
// vector 2 Reserved<br />
// vector 3 Reserved<br />
// vector 4 Reserved<br />
// vector 5 Reserved<br />
// vector 6 Reserved<br />
// vector 7 NMI<br />
__interrupt(vect=7) void INT_NMI(void) {/* sleep(); */}<br />
// vector 8 TRAP #0<br />
__interrupt(vect=8) void INT_TRAP0(void) {/* sleep(); */}<br />
// vector 9 TRAP #1<br />
__interrupt(vect=9) void INT_TRAP1(void) {/* sleep(); */}<br />
// vector 10 TRAP #2<br />
__interrupt(vect=10) void INT_TRAP2(void) {/* sleep(); */}<br />
// vector 11 TRAP #3<br />
__interrupt(vect=11) void INT_TRAP3(void) {/* sleep(); */}<br />
71<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
vector 12 Address break<br />
__interrupt(vect=12) void INT_ABRK(void) {/* sleep(); */}<br />
// vector 13 SLEEP<br />
__interrupt(vect=13) void INT_SLEEP(void) {/* sleep(); */}<br />
// vector 14 IRQ0<br />
__interrupt(vect=14) void INT_IRQ0(void) {/* sleep(); */}<br />
// vector 15 IRQ1<br />
__interrupt(vect=15) void INT_IRQ1(void) {/* sleep(); */}<br />
// vector 16 IRQ2<br />
__interrupt(vect=16) void INT_IRQ2(void) {/* sleep(); */}<br />
// vector 17 IRQ3<br />
__interrupt(vect=17) void INT_IRQ3(void) {/* sleep(); */}<br />
// vector 18 WKP<br />
__interrupt(vect=18) void INT_WKP(void) {/* sleep(); */}<br />
// vector 19 RTC<br />
__interrupt(vect=19) void INT_RTC(void) {/* sleep(); */}<br />
// vector 20 Reserved<br />
// vector 21 Reserved<br />
// vector 22 Timer V<br />
__interrupt(vect=22) void INT_TimerV(void) {intprog_tmv();}<br />
tmv();}<br />
// vector 23 SCI3<br />
__interrupt(vect=23) void INT_SCI3(void) {/* sleep(); */}<br />
// vector 24 IIC2<br />
__interrupt(vect=24) void INT_IIC2(void) {/* sleep(); */}<br />
// vector 25 ADI<br />
__interrupt(vect=25) void INT_ADI(void) {/* sleep(); */}<br />
// vector 26 Timer Z0<br />
__interrupt(vect=26) void INT_TimerZ0(void) {/* sleep(); */}<br />
// vector 27 Timer Z1<br />
__interrupt(vect=27) void INT_TimerZ1(void) {/* sleep(); */}<br />
// vector 28 Reserved<br />
// vector 29 Timer B1<br />
__interrupt(vect=29) void INT_TimerB1(void) {/* sleep(); */}<br />
// vector 30 Reserved<br />
// vector 31 Reserved<br />
// vector 32 SCI3_2<br />
__interrupt(vect=32) void INT_SCI3_2(void) {/* sleep(); */}<br />
では,ビルドして 実 行 してみましょう。 期曋 待 通 り 動 作 するでしょうか。なお, 付 属 の CD-ROM には<br />
あらかじめダウンロードするファイルがおさめられています。<br />
をダウンロードして 実 行 してください。<br />
<br />
練 習 問 題<br />
‘tmv_led_c.mot’<br />
今 度 はポート 6 にインクリメントデータを 表 示 してください。( 解 答 例 は「tmv_led_inc_c」)<br />
72<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
4.タイマ<br />
Z<br />
H8/3687 に 内 蔵 されている 別 のタイマ,タイマ Z について 調 べてみましょう。 前 節 のタイマ V と 比<br />
べ,さらに 多 機 能 なタイマになっています。<br />
<br />
タイマ Z の 概 要<br />
タイマ Z は 16 ビットカウンタをベースにした 16 ビットタイマで,ほとんど 同 じ 機 能 の 16 ビットタイ<br />
マを 2 チャンネル 内 蔵 しています。<br />
基 本曓 的 な 使 い 方 の 場 合 (コンペアマッチによる 出 力 ),タイマ Z に 内 蔵 されているタイマカウンタ<br />
(TCNT_0 と TCNT_1)は CPU クロック(TK-3687mini の 場 合 は 20MHz)を 分 周 したクロック(1/8,1/4,<br />
1/2,1/1 のいずれか 選 択 可 能 )によって 常 に+1 されます。TCNT_0 と TCNT_1 は 各 チャンネルに 4<br />
本曓 , 合 計 8 本曓 あるジェネラルレジスタ(GR)と 比 較 されており, 一 致 すると CPU に 割 り 込 みをかけたり,<br />
ポートの 出 力 を 変 化 させることができます。その 際 ,TCNT_0 と TCNT_1 を 0 にクリアするよう 設 定 する<br />
ことができます。<br />
タイマ Z はその 他 にも 多 くの 機 能 を 内 蔵 しています。タイマ Z の 詳 細 については「H8/3687 シリ<br />
ーズ ハードウェアマニュアル」の「13.タイマ Z」をご 覧 下 さい。<br />
73<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
74<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
75<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
タイマ Z を 使 ってサウンダを 鳴 らしてみよう<br />
タイマ Z を 使 ってサウンダを 鳴 らしてみましょう。 今 回 は,タイマ Z チャネル 0 のコンペアマッチ A<br />
で 割 り 込 みます。 割 込 みがかかるたびにポート 5 の P52 をトグル 出 力 すれば, 与 えられる 周 波沿 数 の 音<br />
が 出 ます。そして, 割 込 みがかかるたびに GRA の 値 を+1 していけば, 周 波沿 数 が 徐 々に 変 化 していき<br />
ます。どんな 音 になるでしょうか。なお,GRA の 上 位 8 ビットをポート 6 に 出 力 して LED に 表 示 します。<br />
ソースリストは 次 のとおりです。<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :sounder_c.c */<br />
/* DATE :Fri, Jan 11, 2008 */<br />
/* DESCRIPTION :Main Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is programed by TOYO-LINX Co.,Ltd. / yKikuchi */<br />
/* */<br />
/***********************************************************************/<br />
/************************************************************************<br />
゜ンルクルーヴチネァ゜ル<br />
************************************************************************/<br />
#include // H8 特 有 の 命 令 をを 使 う<br />
#include "iodefine.h" // 内 蔵 I/Oのラベル 定 義<br />
/************************************************************************<br />
関 数 の 定 義<br />
************************************************************************/<br />
void intprog_tmz0(void);<br />
void main(void);<br />
/************************************************************************<br />
メ゜ンルハロエラム<br />
************************************************************************/<br />
void main(void)<br />
{<br />
IO.PMR5.BYTE = 0x00; //ポーヴダ5, 汎 用 入 出 力 ポーヴダ<br />
IO.PUCR5.BYTE = 0x38; //ポーヴダ5,P53-55 内 蔵 ハルアッセハオンル<br />
IO.PCR5 = 0x04; //ポーヴダ5のbit2(P52)をを 出 力 に 設 定<br />
IO.PDR5.BYTE = 0x04; //ポーヴダ5, 初 期 出 力<br />
IO.PCR6 = 0xff; //ポーヴダ6をを 出 力 に 設 定<br />
IO.PDR6.BYTE = 0xff; //ポーヴダ6, 初 期 出 力<br />
TZ.TSTR.BYTE = 0x00; //TCNT0,1 停 止<br />
TZ0.TCR.BYTE = 0x20; //GRAのコカンルヒアマッセスでTCNT=0,φ/1<br />
TZ.TOER.BYTE = 0xff; //FTIO 端 子 デ゛セーヴノル<br />
TZ0.TIORA.BYTE = 0x88; //GRAはアウダハッセダコカンルヒアレジスタ<br />
//コカンルヒアマッセスによる 出 力 禁 止<br />
TZ0.TSR.BYTE = 0x00; // 割 込 みネラエクリア<br />
TZ0.TIER.BYTE = 0x01; //コカンルヒアマッセス゜ンルターヴラハダ゜ネヅーヴノルA<br />
TZ0.GRA = 0x0001; //ィウンルダ 初 期 値<br />
TZ0.TCNT = 0x0000; //TCNT0=0<br />
TZ.TSTR.BYTE = 0x01; //TCNT0 ィウンルダスターヴダ<br />
76<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
}<br />
while(1){}<br />
/************************************************************************<br />
タ゜マZ0 割 込 み<br />
************************************************************************/<br />
#pragma regsave (intprog_tmz0)<br />
void intprog_tmz0(void)<br />
{<br />
unsigned int d;<br />
//タ゜マZ0 コカンルヒアマッセス゜ンルタラハダネラエ クリア<br />
TZ0.TSR.BIT.IMFA =0;<br />
//サキウンルジ 出 力 反 転<br />
IO.PDR5.BIT.B2 = ~IO.PDR5.BIT.B2;<br />
}<br />
// 次 のGRAをを 計 算 してセッセダ<br />
d = TZ0.GRA;<br />
d = d + 1;<br />
TZ0.GRA = d;<br />
IO.PDR6.BYTE = ~(d / 0x0100);<br />
割 込 みを 使 うためにはソースファイルだけではなく,HEW が 自 動 生 成 する‘intprg.c’を 修 正 す<br />
る 必 要 があります。 下 記 のリストをご 覧 ください。<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :intprg.c */<br />
/* DATE :Fri, Jan 11, 2008 */<br />
/* DESCRIPTION :Interrupt Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is generated by Renesas Project Generator (Ver.4.9). */<br />
/* */<br />
/***********************************************************************/<br />
#include <br />
extern void intprog_tmz0(void);<br />
#pragma section IntPRG<br />
// vector 1 Reserved<br />
// vector 2 Reserved<br />
// vector 3 Reserved<br />
// vector 4 Reserved<br />
77<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
vector 5 Reserved<br />
// vector 6 Reserved<br />
// vector 7 NMI<br />
__interrupt(vect=7) void INT_NMI(void) {/* sleep(); */}<br />
// vector 8 TRAP #0<br />
__interrupt(vect=8) void INT_TRAP0(void) {/* sleep(); */}<br />
// vector 9 TRAP #1<br />
__interrupt(vect=9) void INT_TRAP1(void) {/* sleep(); */}<br />
// vector 10 TRAP #2<br />
__interrupt(vect=10) void INT_TRAP2(void) {/* sleep(); */}<br />
// vector 11 TRAP #3<br />
__interrupt(vect=11) void INT_TRAP3(void) {/* sleep(); */}<br />
// vector 12 Address break<br />
__interrupt(vect=12) void INT_ABRK(void) {/* sleep(); */}<br />
// vector 13 SLEEP<br />
__interrupt(vect=13) void INT_SLEEP(void) {/* sleep(); */}<br />
// vector 14 IRQ0<br />
__interrupt(vect=14) void INT_IRQ0(void) {/* sleep(); */}<br />
// vector 15 IRQ1<br />
__interrupt(vect=15) void INT_IRQ1(void) {/* sleep(); */}<br />
// vector 16 IRQ2<br />
__interrupt(vect=16) void INT_IRQ2(void) {/* sleep(); */}<br />
// vector 17 IRQ3<br />
__interrupt(vect=17) void INT_IRQ3(void) {/* sleep(); */}<br />
// vector 18 WKP<br />
__interrupt(vect=18) void INT_WKP(void) {/* sleep(); */}<br />
// vector 19 RTC<br />
__interrupt(vect=19) void INT_RTC(void) {/* sleep(); */}<br />
// vector 20 Reserved<br />
// vector 21 Reserved<br />
// vector 22 Timer V<br />
__interrupt(vect=22) void INT_TimerV(void) {/* sleep(); */}<br />
// vector 23 SCI3<br />
__interrupt(vect=23) void INT_SCI3(void) {/* sleep(); */}<br />
// vector 24 IIC2<br />
__interrupt(vect=24) void INT_IIC2(void) {/* sleep(); */}<br />
// vector 25 ADI<br />
__interrupt(vect=25) void INT_ADI(void) {/* sleep(); */}<br />
// vector 26 Timer Z0<br />
__interrupt(vect=26) void INT_TimerZ0(void) {intprog_tmz0();}<br />
// vector 27 Timer Z1<br />
__interrupt(vect=27) void INT_TimerZ1(void) {/* sleep(); */}<br />
// vector 28 Reserved<br />
// vector 29 Timer B1<br />
__interrupt(vect=29) void INT_TimerB1(void) {/* sleep(); */}<br />
// vector 30 Reserved<br />
// vector 31 Reserved<br />
// vector 32 SCI3_2<br />
78<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
__interrupt(vect=32) void INT_SCI3_2(void) {/* sleep(); */}<br />
では,ビルドして 実 行 してみましょう。 期曋 待 通 り 動 作 するでしょうか。なお, 付 属 の CD-ROM には<br />
あらかじめダウンロードするファイルがおさめられています。<br />
をダウンロードして 実 行 してください。<br />
‘sounder_c.mot’<br />
<br />
練 習 問 題<br />
この 考 え 方 でいろいろな 音 が 作 れると 思 います。いろいろ 考 えてみてください。( 解 答 例<br />
「sounder_c_v2」)<br />
79<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
5.シリアルコミュニケーションインターフェース<br />
シリアル 通 信 の 基 本曓 的 な 考 え 方<br />
1 バイト(=8 ビット)のデータを 伝 えることを 考 えてみましょう。 線 は 何 本曓 必 要 でしょうか。<br />
パラレルポートの 考 え 方 ですと,1 ビットにつき 1 本曓 なので,8 本曓 必 要 になりますね。もちろん,こ<br />
れだけでは 当 然 駄 目 で, 信 号 の 基 準 になる GND 用 に 1 本曓 は 必 要 なので 9 本曓 以 上 になります。<br />
さて,これをなんとか, 信 号 1 本曓 と GND1 本曓 , 合 計 2 本曓 の 線 だけでデータを 伝 えることはできない<br />
でしょうか。 信 号 が1 本曓 しかないのですから1ビットずつ 順 番 に 送 るしか 方 法沵 がありません。この 発 想 か<br />
ら 生 まれた 方 法沵 がシリアル 通 信 です。<br />
上 の 図 では bit0 から 順 番 に 送 り 出 します。 受 ける 方 は bit0 から 受 けていきます。8 ビット 受 け 取 っ<br />
たら,1 バイトデータとして 使 います。<br />
80<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
調 歩 同 期曋 式 シリアル 通 信<br />
1 ビットずつ 送 受 信 するわけですが, 問 題 になるのは 今 受 信 しているデータが 何 ビット 目 なんだ<br />
ろう,ということです。これが 伝 わらないとまったくちがうデータになってしまいます。いろいろな 方 法沵 が<br />
考 えられているのですが,その 中 でもっとも 基 本曓 的 な 調 歩 同 期曋 式 という 方 法沵 を 調 べてみましょう。<br />
次 の 図 をご 覧 下 さい。これが 調 歩 同 期曋 式 シリアル 通 信 のフォーマットになります。<br />
かぎとなるのは,1 ビットの 時昷 間<br />
が 決 まっていることと, 信 号 線 は 通 常<br />
は High(5V)で,スタートビットで 必<br />
ず Low(0V)になるということです。ハ<br />
イパーH8 の 設 定 をしたとき COM1 の<br />
プロパティを 設 定 しました。ちょっと<br />
思 い 出 してみましょう。( 右 図 参 照 )<br />
‘ビット/ 秒 ’というのがありますが,<br />
これは 別 の 言 葉 でボーレート( 単 位 :<br />
bps,bit/s,またはボー)といいます。<br />
上 の 式 に 当 てはめると,1 ビットの 時昷<br />
間 は 約 26μ 秒 となります。シリアルポ<br />
ートをずっと 見 ていて,High か ら<br />
Low になったらスタートビットが 始 ま<br />
ったと 判 断 します。そこから 26μ 秒 た<br />
ったら bit0 が 始 まります。あとはその<br />
繰 り 返 しですべてのビットを 受 け 取 る<br />
ことができます。ストップビットは 必 ず<br />
High なので, 次 のデータのスタートビットを 見 つける 準 備 ができています。うまくできている 思 いませ<br />
んか。<br />
81<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
シリアルコミュニケーションインターフェース 3<br />
調 歩 同 期曋 式 シリアル 通 信 の 考 え 方 はわかったと 思 いますが,これを I/O ポートとプログラムだけ<br />
で 作 るのは 結 構 たいへんです。ちょっとでもタイミングがずれると,ちゃんとデータを 受 け 取 ることがで<br />
きません。<br />
大 変 なことは 専 用 のパーツにおまかせしましょう,というのがスマートな 方 法沵 です。H8/3687 には<br />
シリアル 通 信 用 の I/O が 内 蔵 されています。「シリアルコミュニケーションインタフェース 3(SCI3)」と 呼<br />
ばれています。SCI3 は 調 歩 同 期曋 式 シリアル 通 信 以 外 にも 対 応 できるように 作 られています。 詳 しくは,<br />
「H8/3687 グループ ハードウェアマニュアル」( 以 降 ハードウェアマニュアル)の 16-1 ページから 説 明<br />
されていますので,ぜひお 読 みください。I/O ポートにくらべると SCI3 の 使 い 方 は 最暷 初 は 難 しく 感 じる<br />
のですが,わかってしまうとそれほどでもありません。しかも I/O の 使 い 方 の 基 本曓 が 含 まれているので,<br />
SCI3 の 使 い 方 がわかると 他 の I/O の 使 い 方 , 例 えば I 2 C バスインタフェース 2(IIC2)を 理 解 するのも<br />
それほどたいへんではなくなります。ここは 一 つがんばってみてください。<br />
<br />
ハイパーターミナルから 送 られてくるデータを 見 てみよう<br />
SCI3 を 使 ったプログラム 例 を 考 えてみましょう。<br />
ハイパーH8 はハイパーターミナルを 使 っていますね。パソコンのキーボードからキーを 入 力 する<br />
と,いろいろと 表 示 されます。よく 考 えると 不 思 議 ですよね。<br />
パソコンのキーボードで 入 力 すると,TK-3687mini にどんなデータが 送 られているのでしょうか。<br />
答 えを 言 うようですが,それぞれのキーに 割 付 けられた 数 字 が 送 られてきます。というわけで,どんな<br />
数 字 が 送 られてきたか,それを 返 信 してハイパーターミナルに 表 示 するプログラムを 作 ってみましょ<br />
う。<br />
2パソコン→TK-3687mini<br />
例 :30h<br />
:<br />
1キーボード 入 力<br />
例 :‘0’<br />
3TK-3687mini→パソコン<br />
例 :「30」と 表 示 させる<br />
とりあえず 動 かしてみたい 方 は,CD-ROM から<br />
‘sci3_key_code_c.mot’<br />
をダウンロードして 実 行 して 下 さい。パソコンのキーを 押 すとハイパーターミナルに 数 字 が 表 示 される<br />
はずです。<br />
82<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
シリアルポートのプログラムで 最暷 初 に 考 えるのは 通 信 条曵 件 です。 今 回 はハイパーH8 を 動 かして<br />
いたハイパーターミナルに 表 示 するので,ハイパーターミナルと 同 じ 条曵 件 になります。<br />
ビット/ 秒 (ボーレート) ・」・」・」・」・」・」・」・」・」・」・」38400bps(38400bit/s,38400 ボー)<br />
データビット ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」8 ビット<br />
パリティ ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」なし<br />
ストップビット ・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」・」1 ビット<br />
まずは SCI3 にこの 条曵 件 をセットします。ハードウェアマニュアルの 16-4 ページ,「16.4.2 SCI3<br />
の 初 期曋 化 」を 参 考 にイニシャライズのフローチャートを 作 ってみました。<br />
イニシャライズ<br />
P22 を TXD にする<br />
送 受 信 停 止<br />
TE,RE=0<br />
内 部 ボーレート 選 択<br />
CKE1=CKE2=0<br />
「9.1.1 ポートモードレジスタ 1」(<br />
」(9-2<br />
~9-3 ページ)<br />
TXD は P22 と 兼 用 ピンになっていま<br />
す。TXD として 使 うよう 指 定 します。<br />
「16.3.6 シリアルコントロールレジス<br />
タ 3」(<br />
」(16-6 ページ)<br />
通 信 条曵 件 のセット<br />
調 歩 同 期曋<br />
データビット=8<br />
ストップビット=1<br />
パリティなし<br />
内 部 φクロック<br />
BRR セット<br />
38400bps<br />
「 16.3.5 シ リ ア ル モ ー ド レ ジ ス タ 」<br />
(16-5 ページ)<br />
「16.3.8 ビットレートレジスタ」(16-8<br />
ページ)<br />
16-11 ページの 表 から,φ=20MHz<br />
のときの 38400bit/s にする 値 をセット<br />
する。<br />
No<br />
1 ビット 期曋<br />
間 経 過 <br />
送 受 信 開 始<br />
TE=RE=1<br />
「16.3.6 シリアルコントロールレジス<br />
タ 3」(<br />
」(16-6 ページ)<br />
リターン<br />
83<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
次 に 受 信 動 作 について 考 えてみましょう。 当 然 ながら,TK-3687mini はパソコンのキーがいつ 押<br />
されるかわかりません。もっとも, 受 信 動 作 そのものは SCI3 が 自 動 的 に 行 なってくれます。そして,デ<br />
ータを 受 信 したかどうかしらせるステータスが 用 意 されています。というわけで,マイコンはそのステー<br />
タスを 見 て, 受 信 していたらデータを 読 み 込 みます。<br />
ハードウェアマニュアルの 16-7 ページ,「16.3.7 シリアルステータスレジスタ」をご 覧 下 さい。ビッ<br />
ト 6,‘RDRF’が 1 になったらデータを 受 信 しています。 受 信 していたらレシーブデータレジスタ<br />
‘RDR’からデータを 読 み 込 みます。フローチャートにしてみました。<br />
1バイト 受 信<br />
=0<br />
RDRF<br />
(RDR)→<br />
)→R0L<br />
リターン<br />
あとは 送 信 動 作 です。38400bps で 1 データ 送 信 するのにどれくらい 時昷 間 がかかるでしょうか。 今<br />
作 っているプログラムの 条曵 件 だと 約 260μs(μs:マイクロ 秒 は 1 秒 の 百 万 分 の 一 )かかります。 速 いよ<br />
うに 思 うかもしれませんが,マイコン(H8/3687)は 1 つの 命 令 を 0.1μs~1.2μs で 実 行 できることを<br />
考 えると,ものすご~く 遅 いということがわかります。もし, 何 も 考 えずに SCI3 に 送 信 データをどんどん<br />
書暯 き 込 むと,まだ 送 信 が 終 わっていないのに 書暯 き 込 むことになるかもしれません。それで, 送 信 デー<br />
タを 書暯 き 込 んでよいか 判 断 するステータスが 用 意 されています。マイコンはそのステータスを 見 て, 大<br />
丈 夫 ならデータを 書暯 き 込 みます。<br />
ハードウェアマニュアルの 16-7 ページ,「16.3.7 シリアルステータスレジスタ」をご 覧 下 さい。ビッ<br />
ト 7,‘TDRE’が 1 になったら 送 信 データを 書暯 き 込 んでも 大 丈 夫 です。トランスミットデータレジスタ<br />
‘TDR’に 送 信 データを 書暯 き 込 みます。フローチャートにしてみました。<br />
1バイト 送 信<br />
=0<br />
TDRE<br />
R0L→(<br />
→(TDR)<br />
リターン<br />
ここで 出 てきた,ステータスを 見 ながらデータを 読 み 込 んだり 書暯 き 込 んだりする 考 え 方 は,I/O を<br />
使 うときの 基 本曓 的 な 考 え 方 です。ぜひおぼえておいてください。<br />
84<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
さて,プログラムリストは 次 のようになりました。<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :sci3_key_code_c.c */<br />
/* DATE :Fri, Jan 11, 2008 */<br />
/* DESCRIPTION :Main Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is programed by TOYO-LINX Co.,Ltd. / yKikuchi */<br />
/* */<br />
/***********************************************************************/<br />
/************************************************************************<br />
゜ンルクルーヴチネァ゜ル<br />
************************************************************************/<br />
#include // H8 特 有 の 命 令 をを 使 う<br />
#include "iodefine.h" // 内 蔵 I/Oのラベル 定 義<br />
/************************************************************************<br />
関 数 の 定 義<br />
************************************************************************/<br />
unsigned int hex2asc(unsigned char);<br />
void init_sci3(void);<br />
void main(void);<br />
unsigned char rxone(void);<br />
void txone(unsigned char);<br />
/************************************************************************<br />
メ゜ンルハロエラム<br />
************************************************************************/<br />
void main(void)<br />
{<br />
unsigned char rd;<br />
unsigned int hd;<br />
init_sci3(); //SCI3゜ニッシホラ゜ズ<br />
txone(0x0d); // 改 行<br />
}<br />
while(1){<br />
rd = rxone();<br />
hd = hex2asc(rd);<br />
txone(hd / 0x0100);<br />
txone(hd & 0x00ff);<br />
txone(0x0d);<br />
}<br />
//1ト゜ダ 受 信<br />
//アスゥーヴコカーヴチ 変 換<br />
// 上 位 ト゜ダ 送 信<br />
// 下 位 ト゜ダ 送 信<br />
// 改 行<br />
/************************************************************************<br />
SCI3 ゜ニッシホラ゜ズ<br />
************************************************************************/<br />
85<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
void init_sci3(void)<br />
{<br />
#define CPU_CLK 20000000 // Clock=20MHz=20000000Hz<br />
#define BAUD 38400 // baudrate<br />
#define BITR (CPU_CLK) / (BAUD*32) - 1<br />
#define WAIT_1B (CPU_CLK) / 6 / BAUD<br />
char i;<br />
IO.PMR1.BYTE = IO.PMR1.BYTE | 0x02; //P22はTXDとして 使 う<br />
}<br />
SCI3.SCR3.BYTE = 0x00;<br />
SCI3.SMR.BYTE = 0x00; // 調 歩 同 期 ,8bit,NonParity,StopBit=1<br />
SCI3.BRR = BITR; //38400Baud<br />
for (i=0;i0x09) {asc_dt = asc_dt + 0x37;}<br />
else<br />
{asc_dt = asc_dt + 0x30;}<br />
86<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
hex_dt = hex_dt / 0x10;<br />
if (hex_dt>0x09) {asc_1dt = (hex_dt + 0x37) * 0x0100 + asc_dt;}<br />
else<br />
{asc_dt = (hex_dt + 0x30) * 0x0100 + asc_dt;}<br />
}<br />
return asc_dt;<br />
ビルドしてプログラムを 実 行 してみましょう。いろいろキーボードから 入 力 してみてください。どん<br />
なデータが 送 られてきているでしょうか。<br />
87<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
6.AD コンバータ<br />
自 然 界 の 物 理 量 , 例 えば, 温浲 度 , 湿 度 , 重 さ, 明 るさ, 音 などは 全 てアナログ 量 です。 一 方 ,これ<br />
まで 調 べたことからお 分 かりのように,マイコンはデジタル 値 しか 扱 うことができません。ということは,<br />
マイコンでこういったものを 扱 うときは 何 らかの 方 法沵 でアナログ 値 をデジタル 値 に 変 換 する 必 要 があり<br />
ます。このような 働 きをする I/O が AD コンバータです。 温浲 度 制 御 をしたい, 重 さを 量 りたい,というよう<br />
に,ちょっと 応 用 範 囲 を 広 げようとすると 必 ずアナログ 値 を 扱 わないといけなくなります。この 章 では<br />
AD コンバータの 基 本曓 的 な 考 え 方 と 使 い 方 を 調 べてみましょう。<br />
<br />
AD コンバータとは<br />
AD コンバータは, 入 力 電 圧 に 比 例 したデジタル 値 に 変 換 する I/O です。 通 常 AD コンバータに<br />
は 最暷 小 入 力 電 圧 と 最暷 大 入 力 電 圧 ,そして 変 換 ビット 数 が 決 まっています。 例 えば,0V から 5V まで 入<br />
力 できて, 変 換 ビット 数 が 8 ビットのときは,0V のときは B'00000000(16 進 数 で 00h)に,5V のときは<br />
B'11111111(16 進 数 で FFh)に 変 換 します。その 間 は 比 例 するので, 例 えば 2.5V を 入 力 すると 80h<br />
に 変 換 します。<br />
AD コンバータに 入 力 できるのは 電 圧 だけなので, 温浲 度 や 重 さといった 物 理 量 を AD 変 換 するに<br />
は,まず 電 圧 に 変 換 する 必 要 があります。このようなデバイスをセンサと 呼 びます。 一 例 ですが, 温浲 度<br />
を 測浴 るにはサーミスタや 熱 伝 対 , 明 るさを 測浴 るには Cds などを 使 います。<br />
88<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
H8/3687 の AD コンバータ<br />
H8/3687 には AD コンバータが 内 蔵 されています。 詳 しくは,「H8/3687 グループ ハードウェア<br />
マニュアル」( 以 降 ハードウェアマニュアル)の 18-1 ページから 説 明 されていますので,ぜひお 読 みく<br />
ださい。いくつか 特 徴 をあげておきましょう。<br />
入 力 電 圧<br />
0V から AVcc までです。TK-3687mini は AVcc に 5V をつないでいますので, 最暷 大 入 力 電 圧 は<br />
5V です。<br />
分 解 能 :10<br />
:<br />
ビット<br />
0V のときに B'0000000000,AVcc(5V)のときに B'1111111111 になります。ただし, 変 換 結 果 は<br />
16 ビットデータのうち 上 位 10 ビットにセットされ 下 位 6 ビットは 0 になります。というわけで,0V の<br />
ときは 0000h,AVcc(5V)のときは FFC0h になります。 変 換 結 果 をプログラムで 6 ビット 右 シフトし<br />
て 0000h~03FFh として 扱 うこともあります。もちろん,どうするかはプログラマしだいです。なお,<br />
これから 作 成 するプログラムでは 平 均 後 の 上 位 8 ビットを 使 います。<br />
入 力 チャンネル:8 チャンネル<br />
AD コンバータ 自 体 は 1 個 だけなのですが,アナログマルチプレクサ 回 路 が 内 蔵 されているので,<br />
8 種 類 の 電 圧 を 入 力 することができます。そのため, 同 時昷 に 8 チャンネルの AD 変 換 ができるわ<br />
けでなく, 順 番 に 1 チャンネルずつ AD 変 換 します。<br />
動 作 モード<br />
単 一 モードとスキャンモードの 2 種 類 があります。 単 一 モードは 指 定 された 1 チャンネルのアナロ<br />
グ 入 力 を AD 変 換 します。 一 方 ,スキャンモードは 指 定 された 最暷 大 4 チャンネルのアナログ 入 力<br />
を 自 動 的 に 順 番 に AD 変 換 します。<br />
変 換 速 度<br />
TK-3687mini は CPU クロックが 20MHz なので,1 チャンネルあたり 最暷 短 3.5μs で 変 換 できます。<br />
89<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
サンプルプログラム<br />
では,AD コンバータで 明 るさを 表 示 するプログラムを 作 ってみましょう。ここでは,CDS というセ<br />
ンサを 使 って 明 るさをマイコンに 取 り 込 んでみます。CDS は 光 のエネルギーで 抵 抗 値 が 変 化 する 素<br />
子 です。 明 るいところでは 100Ω 以 下 だったものが, 暗晶 くなると 10MΩ 以 上 になるものがあります。 回<br />
路 図 を 再 掲 します。この 回 路 で 明 るさを 電 圧 に 変 換 して AD コンバータに 入 力 します。<br />
AD コンバータで 変 換 すること 自 体 はそれほど 難 しくありません。ハードウェアマニュアルの 18-4<br />
ページ,「18.3.2 AD コントロール/ステータスレジスタ」をご 覧 ください。ADST を 1 にすると AD 変 換<br />
がスタートします。AD 変 換 が 終 了 すると ADF が 1 になります。 今 回 は AN0 の 電 圧 を AD 変 換 します。<br />
それで,AD 変 換 が 終 了 したら ADDRA からデータを 入 力 します。<br />
90<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
この AD 値 をそのまま 使 えばよいかというと,そういうわけにはいきません。 入 力 電 圧 が 安 定 して<br />
いてノイズがまったくなければよいのですが, 現 実 にはそういう 信 号 はなく,ノイズなどの 影 響 で AD<br />
値 はふらふらします。そこで, 何 回 か 入 力 してその 平 均 値 を 求 めることでノイズの 影 響 をなくします。<br />
今 回 はタイマ B1 で 1ms ごとに 割 込 みをかけ,その 都 度 AD 変 換 し,256 回 加 算 して 平 均 しました。<br />
得 られた 平 均 値 を 表 示 します。<br />
なお, 表 示 はドットマトリックス LED に 表 示 しました。SW1 を 押 すと 16 進 数 で,SW2 を 押 すと 棒<br />
グラフ 表 示 ,SW3 を 押 すと 折 れ 線 グラフ 表 示 します。 今 までの 総 決 算 です。(ちょっと 大 変 かも・・・)<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :demo_adc.c */<br />
/* DATE :Wed, Jan 09, 2008 */<br />
/* DESCRIPTION :Main Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is generated by Renesas Project Generator (Ver.4.9). */<br />
/* */<br />
/* ------------------------------------------------------------------- */<br />
/* */<br />
/* This file is programed by TOYO-LINX Co.,Ltd. / yKikuchi */<br />
/* */<br />
/***********************************************************************/<br />
/************************************************************************<br />
゜ンルクルーヴチネァ゜ル<br />
************************************************************************/<br />
#include //H8 特 有 の 命 令 をを 使 う<br />
#include "iodefine.h" // 内 蔵 I/Oのラベル 定 義<br />
/************************************************************************<br />
定 数 の 定 義 ( 直 接 指 定 )<br />
************************************************************************/<br />
//AD 変 換 に 関 係 した 定 数 --------------------------------------------------<br />
#define ADC_TIME 256 // 加 算 回 数 (Max=65536)<br />
//LED 表 示 ---------------------------------------------------------------<br />
#define DRV_LOGIC 0x300 //チラ゜トの 入 力 論 理<br />
// 負 論 理 入 力 のビニッセダをを‘1’にする<br />
/************************************************************************<br />
定 数 ゠リアの 定 義 (ROM)<br />
************************************************************************/<br />
//スゥホンルデーヴタ<br />
const unsigned int ScanData[10] =<br />
{0x001,0x002,0x004,0x008<br />
,0x010,0x020,0x040,0x080<br />
,0x100,0x200};<br />
//ゥホラクタデーヴタ(4×8)<br />
const unsigned char LEDDispData[][4] = {<br />
{0x00,0xff,0x81,0xff}, // 0<br />
{0x00,0x02,0xff,0x00}, // 1<br />
{0x00,0xf1,0x91,0x9f}, // 2<br />
{0x00,0x89,0x89,0xff}, // 3<br />
91<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
};<br />
{0x00,0x1f,0x10,0xff}, // 4<br />
{0x00,0x8f,0x89,0xf9}, // 5<br />
{0x00,0xff,0x89,0xf9}, // 6<br />
{0x00,0x0f,0x01,0xff}, // 7<br />
{0x00,0xff,0x89,0xff}, // 8<br />
{0x00,0x9f,0x91,0xff}, // 9<br />
{0x00,0xff,0x11,0xff}, // A<br />
{0x00,0xff,0x88,0xf8}, // B<br />
{0x00,0xff,0x81,0x81}, // C<br />
{0x00,0xf8,0x88,0xff}, // D<br />
{0x00,0xff,0x89,0x89}, // E<br />
{0x00,0xff,0x09,0x09}, // F<br />
/************************************************************************<br />
エローヴトル 変 数 の 定 義 と゜ニッシホラ゜ズ(RAM)<br />
************************************************************************/<br />
// AD 値 に 関 係 した 変 数 ---------------------------------------------------<br />
unsigned int AdcData = 0; // 平 均 値<br />
unsigned long AdcBuf = 0; // 加 算 トッセネァ<br />
unsigned long AdcCnt = ADC_TIME; // 加 算 ィウンルタ<br />
unsigned int AdcDataBuf[8] = {0x0000,0x0000<br />
,0x0000,0x0000<br />
,0x0000,0x0000<br />
,0x0000,0x0000}; // 過 去 デーヴタトッセネァ<br />
unsigned char DispForm = 0; // 表 示 方 式<br />
// 0:16 進 数<br />
// 1:トーヴ<br />
// 2: 折 れ 線<br />
// LED 表 示 に 関 係 した 変 数 ------------------------------------------------<br />
unsigned char ScanCnt = 0; //スゥホンルィウンルタ<br />
unsigned char DispFlag = 1; // 表 示 ネラエ<br />
// 0: 消洑 去<br />
// 1: 通 常 表 示<br />
// 2: 反 転 表 示<br />
unsigned char DispBuf[10] = {0x00,0x00,0x00,0x00,0x00<br />
,0x00,0x00,0x00,0x00,0x00}; // 表 示 トッセネァ<br />
// ス゜ッセス 入 力 に 関 係 した 変 数 -------------------------------------------<br />
unsigned char SwData1 = 0; //ネァーヴスダリーヴチ<br />
unsigned char SwData2 = 0; //ジノルリーヴチにより 決 定 したデーヴタ<br />
unsigned char SwData3 = 0; // 前 回 のジノルリーヴチで 決 定 したデーヴタ<br />
unsigned char SwData4 = 0; //0→1に 変 化 したデーヴタ<br />
unsigned char SwStatus = 0; //ス゜ッセス 入 力 ステーヴタス<br />
// 0:ネァーヴスダリーヴチ<br />
// 1:ジノルリーヴチ<br />
/************************************************************************<br />
関 数 の 定 義<br />
************************************************************************/<br />
void<br />
display_change(void);<br />
void<br />
display_set(void);<br />
void<br />
init_ad(void);<br />
void<br />
init_io(void);<br />
92<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
void<br />
void<br />
void<br />
void<br />
void<br />
void<br />
void<br />
init_tmb1(void);<br />
init_tmv(void);<br />
intprog_ad(void);<br />
intprog_tmb1(void);<br />
intprog_tmv(void);<br />
main(void);<br />
switch_in(void);<br />
/************************************************************************<br />
メ゜ンルハロエラム<br />
************************************************************************/<br />
void main(void)<br />
{<br />
// ゜ニッシホラ゜ズ ----------------------------------------------------<br />
init_io();<br />
init_ad();<br />
init_tmb1();<br />
init_tmv();<br />
}<br />
// メ゜ンルルーヴハ ------------------------------------------------------<br />
while(1){<br />
display_change(); // 表 示 方 式 変 更<br />
display_set(); // 表 示 デーヴタセッセダ<br />
}<br />
/************************************************************************<br />
表 示 方 式 変 更<br />
************************************************************************/<br />
void display_change(void)<br />
{<br />
if ((SwData4 & 0x08)==0x08){ //SW1が 押 された<br />
DispForm = 0;<br />
SwData4 = 0;<br />
}<br />
else if ((SwData4 & 0x10)==0x10){ //SW2が 押 された<br />
DispForm = 1;<br />
SwData4 = 0;<br />
}<br />
else if ((SwData4 & 0x20)==0x20){ //SW3が 押 された<br />
DispForm = 2;<br />
SwData4 = 0;<br />
}<br />
}<br />
/************************************************************************<br />
表 示 デーヴタセッセダ<br />
************************************************************************/<br />
void display_set(void)<br />
{<br />
unsigned char i,j;<br />
unsigned int d;<br />
// チッセダマダリッセクスLED<br />
switch (DispForm){<br />
93<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
}<br />
case 0:<br />
DispBuf[0] = LEDDispData[AdcData / 0x1000][0];<br />
DispBuf[1] = LEDDispData[AdcData / 0x1000][1];<br />
DispBuf[2] = LEDDispData[AdcData / 0x1000][2];<br />
DispBuf[3] = LEDDispData[AdcData / 0x1000][3];<br />
DispBuf[4] = LEDDispData[(AdcData / 0x0100) & 0x0f][0];<br />
DispBuf[5] = LEDDispData[(AdcData / 0x0100) & 0x0f][1];<br />
DispBuf[6] = LEDDispData[(AdcData / 0x0100) & 0x0f][2];<br />
DispBuf[7] = LEDDispData[(AdcData / 0x0100) & 0x0f][3];<br />
break;<br />
case 1:<br />
for (j=0; j
}<br />
IO.PCR6 = 0xff; //ポーヴダ6,P60-67 出 力<br />
IO.PDR6.BYTE = 0xff;<br />
/************************************************************************<br />
A/D 変 換 器 ゜ニッシホラ゜ズ<br />
************************************************************************/<br />
void init_ad(void)<br />
{<br />
AdcBuf = 0; //トッセネァクリア<br />
AdcCnt = ADC_TIME; //ィウンルタセッセダ<br />
AD.ADCSR.BYTE = 0x40; // 割 り 込 み゜ネヅーヴノル, 単 一 ペーヴチ,134ステーヴダ,CH0<br />
}<br />
/************************************************************************<br />
ADC 割 込 み(A/D 変 換 & 平 均 化 )<br />
************************************************************************/<br />
#pragma regsave (intprog_ad)<br />
void intprog_ad(void)<br />
{<br />
unsigned char i;<br />
}<br />
AD.ADCSR.BIT.ADF = 0;<br />
//AD゠ンルチネラエクリア<br />
AdcBuf = AdcBuf + AD.ADDRA; // 加 算<br />
AdcCnt = AdcCnt - 1;<br />
//ィウンルタ-1<br />
if (AdcCnt==0){<br />
AdcData = (unsigned int)(AdcBuf / ADC_TIME); // 平 均<br />
for (i=0; i
IRR2.BIT.IRRTB1 = 0;<br />
//AD 変 換 スターヴダ<br />
AD.ADCSR.BIT.ADST = 1;<br />
}<br />
//ス゜ッセス 入 力<br />
switch_in();<br />
/************************************************************************<br />
ス゜ッセス 入 力<br />
************************************************************************/<br />
void switch_in(void)<br />
{<br />
switch(SwStatus){<br />
case 0:<br />
SwData1 = ~IO.PDR5.BYTE & 0x38;<br />
if (SwData1!=0) {SwStatus = 1;}<br />
else {SwData2 = SwData3 =0;}<br />
break;<br />
case 1:<br />
if (SwData1==(~IO.PDR5.BYTE & 0x38)){<br />
SwData2 = SwData1;<br />
SwData4 = SwData4 | (SwData2 & (~SwData3));<br />
SwData3 = SwData2;<br />
}<br />
SwStatus = 0;<br />
break;<br />
}<br />
}<br />
/************************************************************************<br />
タ゜マV ゜ニッシホラ゜ズ<br />
************************************************************************/<br />
void init_tmv(void)<br />
{<br />
TV.TCSRV.BYTE = 0x00; //TOMV 端 子 は 使 わわない<br />
TV.TCORA = 156; // 周 期 =1ms(1kHz)<br />
TV.TCRV1.BYTE = 0x01; //TRGVダリイ 入 力 禁 止 ,<br />
TV.TCRV0.BYTE = 0x4b; //コカンルヒアマッセスA 割 込 み゜ネヅーヴノル<br />
//コカンルヒアマッセスA でTCNTVクリア<br />
// 内 部 クロッセクφ/128(=156.25kHz)<br />
}<br />
/************************************************************************<br />
タ゜マV 割 込 み(1ms)<br />
************************************************************************/<br />
#pragma regsave (intprog_tmv)<br />
void intprog_tmv(void)<br />
{<br />
//コカンルヒアマッセスネラエA クリア<br />
TV.TCSRV.BIT.CMFA = 0;<br />
// 表 示 をを 消洑 す<br />
IO.PDR5.BYTE = (IO.PDR5.BYTE & 0xfc) | (0x00 ^ (DRV_LOGIC/0x100));<br />
96<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
IO.PDR3.BYTE = 0x00 ^ DRV_LOGIC;<br />
IO.PDR6.BYTE = 0xff;<br />
//デーヴタ 出 力<br />
if (DispFlag==0) {IO.PDR6.BYTE = 0xff;}<br />
else if (DispFlag==1) {IO.PDR6.BYTE = ~DispBuf[ScanCnt];}<br />
else<br />
{IO.PDR6.BYTE = DispBuf[ScanCnt];}<br />
//スゥホンル 信 号 出 力<br />
IO.PDR5.BYTE = ((unsigned char)((ScanData[ScanCnt] ^ DRV_LOGIC) / 0x100)) | (IO.PDR5.BYTE & 0xfc);<br />
IO.PDR3.BYTE = (unsigned char)((ScanData[ScanCnt] ^ DRV_LOGIC) & 0x0ff);<br />
}<br />
// 次 のスゥホンルのセッセダ<br />
ScanCnt++; if (ScanCnt>=10) {ScanCnt = 0;}<br />
割 込 みを 使 うためにはソースファイルだけではなく,HEW が 自 動 生 成 する‘intprg.c’を 修 正 す<br />
る 必 要 があります。 下 記 のリストをご 覧 ください。<br />
/***********************************************************************/<br />
/* */<br />
/* FILE :intprg.c */<br />
/* DATE :Wed, Jan 09, 2008 */<br />
/* DESCRIPTION :Interrupt Program */<br />
/* CPU TYPE :H8/3687 */<br />
/* */<br />
/* This file is generated by Renesas Project Generator (Ver.4.9). */<br />
/* */<br />
/***********************************************************************/<br />
#include <br />
extern void intprog_ad(void);<br />
extern void intprog_tmb1(void);<br />
extern void intprog_tmv(void);<br />
#pragma section IntPRG<br />
// vector 1 Reserved<br />
// vector 2 Reserved<br />
// vector 3 Reserved<br />
// vector 4 Reserved<br />
// vector 5 Reserved<br />
// vector 6 Reserved<br />
// vector 7 NMI<br />
__interrupt(vect=7) void INT_NMI(void) {/* sleep(); */}<br />
// vector 8 TRAP #0<br />
97<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
__interrupt(vect=8) void INT_TRAP0(void) {/* sleep(); */}<br />
// vector 9 TRAP #1<br />
__interrupt(vect=9) void INT_TRAP1(void) {/* sleep(); */}<br />
// vector 10 TRAP #2<br />
__interrupt(vect=10) void INT_TRAP2(void) {/* sleep(); */}<br />
// vector 11 TRAP #3<br />
__interrupt(vect=11) void INT_TRAP3(void) {/* sleep(); */}<br />
// vector 12 Address break<br />
__interrupt(vect=12) void INT_ABRK(void) {/* sleep(); */}<br />
// vector 13 SLEEP<br />
__interrupt(vect=13) void INT_SLEEP(void) {/* sleep(); */}<br />
// vector 14 IRQ0<br />
__interrupt(vect=14) void INT_IRQ0(void) {/* sleep(); */}<br />
// vector 15 IRQ1<br />
__interrupt(vect=15) void INT_IRQ1(void) {/* sleep(); */}<br />
// vector 16 IRQ2<br />
__interrupt(vect=16) void INT_IRQ2(void) {/* sleep(); */}<br />
// vector 17 IRQ3<br />
__interrupt(vect=17) void INT_IRQ3(void) {/* sleep(); */}<br />
// vector 18 WKP<br />
__interrupt(vect=18) void INT_WKP(void) {/* sleep(); */}<br />
// vector 19 RTC<br />
__interrupt(vect=19) void INT_RTC(void) {/* sleep(); */}<br />
// vector 20 Reserved<br />
// vector 21 Reserved<br />
// vector 22 Timer V<br />
__interrupt(vect=22) void INT_TimerV(void) {intprog_tmv();}<br />
// vector 23 SCI3<br />
__interrupt(vect=23) void INT_SCI3(void) {/* sleep(); */}<br />
// vector 24 IIC2<br />
__interrupt(vect=24) void INT_IIC2(void) {/* sleep(); */}<br />
// vector 25 ADI<br />
__interrupt(vect=25) void INT_ADI(void) {intprog_ad();}<br />
// vector 26 Timer Z0<br />
__interrupt(vect=26) void INT_TimerZ0(void) {/* sleep(); */}<br />
// vector 27 Timer Z1<br />
__interrupt(vect=27) void INT_TimerZ1(void) {/* sleep(); */}<br />
// vector 28 Reserved<br />
// vector 29 Timer B1<br />
__interrupt(vect=29) void INT_TimerB1(void) {intprog_tmb1();}<br />
// vector 30 Reserved<br />
// vector 31 Reserved<br />
// vector 32 SCI3_2<br />
__interrupt(vect=32) void INT_SCI3_2(void) {/* sleep(); */}<br />
では,ビルドして 実 行 してみましょう。なお, 付 属 の CD-ROM にはあらかじめダウンロードするフ<br />
ァイルがおさめられています。‘demo_adc.mot’をダウンロードして 実 行 してください。<br />
98<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
第 6 章<br />
μITRON を 実 装 しよう<br />
1. 開 発 に 必 要 なものを 用 意 する 4.TK-3687 版 にカスタマイズする 7.タスク 付 属 同 期曋 機 能<br />
2.カーネルライブラリの 構 築 5.マルチタスクを 体 験 しよう 8.<br />
3.プロジェクトの 作 成 6. 割 り 込 みを 使 ってみよう 9.<br />
パソコンのプログラムは Windows や Linux など OS の 上 で 実 行 されます。 一 方 , 組 み 込 みシステ<br />
ムのプログラムにおいては OS を 実 装 せずにプログラムすることが 多 かったように 感 じます。しかし, 近<br />
年 の 組 み 込 みシステムの 高 機 能 化 や 大 規 模 化 ,ネットワーク 対 応 や GUI の 搭 載 などにより,システム<br />
を 効 率 よく 制 御 するため OS の 必 要 性 が 高 まってきました。ITRON は 社 団 法沵 人 トロン 協 会 が 推 進 し,<br />
日 本曓 の 半 導 体 メーカ,ソフト 開 発 メーカが 参 画 したトロンプロジェクトの 中 で 作 成 された 組 み 込 みシス<br />
テム 向 け 汎 用 リアルタイム OS の 標 準 仕 様 です。<br />
ところで,μITRON を 手 に 入 れようとしても,μITRON という 名 前 の OS はありません。トロンプロ<br />
ジェクトでは,ITRON の 仕 様 書暯 は 配 布 していますが, 実 際 に 動 くコードは 配 布 していないからです。<br />
企 業 や 団 体 , 個 人 が, 配 布 されている 仕 様 書暯 を 元 にコードを 書暯 き,「μITRON 仕 様 準 拠 OS」として 配<br />
布 , 販 売 しています。このマニュアルで 利 用 する「HOS」もプロジェクト HOS が 開 発 したμITRON 仕 様<br />
のフリーの OS です。(「μITRON 仕 様 に 準 拠 している」と 言 うためにμITRON の 全 ての 仕 様 を 持 た<br />
せる 必 要 はありません。 必 要 な 最暷 低 限 の 機 能 も 仕 様 書暯 に 規 定 されています。)<br />
「HOS」は「Hyper Operating System」の 略 です。(ちなみに,90 年 代 半 ばに 連 載 され,OVA やテ<br />
レビアニメ, 映昚 画 にもなったコミック「 起 動 警 察 パトレイバー」に 登 場 するレイバーと 呼 ばれる 作 業 用 ロ<br />
ボットに 搭 載 されている OS の 名 称 が「HOS」で,これにちなんで 名 付 けられたそうです。)「HOS」は 高<br />
い 移 植 性 を 持 っていて,H8 だけではなく,SH や ARM,IA32 にも 移 植 されています。ライセンス 条曵 項<br />
に 従 う 限 り, 商 用 , 非 商 用 に 関 係 なく, 自 由 に 利 用 し 再 配 布 することができます。(ライセンス 条曵 項 は<br />
プロジェクト HOS の 配 布 ファイル「licence.txt」を 参 照 , 元 の 著 作 権 情 報 を 削 除 しない, 著 作 者 は 利<br />
用 した 損 害 の 責 任 はとらない, 著 作 者 はサポートの 義 務 は 負 わない,など)<br />
実 際 のところ,H8 程 度 の 規 模 のマイコンであれば OS を 実 装 しなくてもほとんどのプログラムはで<br />
きてしまいます。プログラムの 開 発 効 率 もそれほどかわりません。それでも,リアルタイム OS を 使 うと,<br />
これまでとは 違 った 感 覚 でプログラムすることができます。 最暷 初 の 目 標 は,プロジェクト HOS が 配 布 し<br />
ている H8/3664(16MHz) 用 のサンプルプログラムを TK-3687/TK-3687mini(つまり H8/3687,<br />
20MHz)で 動 かすことです。<br />
μITRON4.0 仕 様 に 準 拠 したソフトウェアの 製 品 マニュアルに 入 れるよう 強 く 推 奨 されている 文 言 が<br />
あります。それに 従 い,ここで 入 れておきます。<br />
<br />
<br />
<br />
<br />
TRON は“The Real-time Operating system Nucleus”の 略 称 です。<br />
ITRON は“Industrial TRON”の 略 称 です。<br />
μITRON は“Micro Industrial TRON”の 略 称 です。<br />
TRON,ITRON,およびμITRON は, 特 定 の 商 品 ないしは 商 品 群 を 指 す 名 称 ではありません。<br />
μITRON4.0 仕 様 に 準 拠 したソフトウェアの 製 品 マニュアルに 入 れるよう 推 奨 されている 文 言 があり<br />
ます。それに 従 い,ここで 入 れておきます。<br />
<br />
μITRON4.0 仕 様 は,トロン 協 会 が 定 めたオープンなリアルタイムカーネル 仕 様 です。μ<br />
ITRON4.0 仕 様 の 仕 様 書暯 は,トロン 協 会 のホームページ(http://www.assoc.tron.org/)から 入 手<br />
することができます。<br />
99<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
1. . 開 発 に 必 要 なものを 用 意 する<br />
開 発 環 境 : HEW<br />
ルネサステクノロジのサイト(http://japan.renesas.com/<br />
http://japan.renesas.com/)からダウンロードします。<br />
HOS のソースコード<br />
プロジェクト HOS のサイト(https://sourceforge.jp/projects/hos/<br />
https://sourceforge.jp/projects/hos/)から「hos-v4」をダウンロ<br />
ードしてください。HOS-V4 の 中 にも 圧 縮 形 式 の 異 なるファイルがあるのですが,Windows の 場<br />
合 は「HOS-V4LZH」をダウンロードします。このマニュアル 執 筆 時昷 点 のフ<br />
ァイル 名 は「h4_102.lzh」でした。<br />
解 凍 ソフト<br />
WindowsXP あたりからは ZIP 形 式 の 圧 縮 ファイル(ファイル 拡 張 子 ZIP)であれば 標 準 で 解 凍 す<br />
ることができるのですが,HOS は LHA 形 式 (ファイル 拡 張 子 LZH)で 圧 縮 されているため 解 凍 ソ<br />
フトが 必 要 です。もっとも,LHA 形 式 は 日 本曓 で DOS の 時昷 代 から 使 われていて, 日 本曓 ではデファク<br />
トスタンダードともいえる 圧 縮 形 式 なので, 日 本曓 で 作 られたものであればフリーソフトをはじめほと<br />
んどの 解 凍 ソフトで 対 応 できるはずです。 気 に 入 ったものをご 用 意 ください。「h4_102.lzh」を 解 凍<br />
すると「hos_v4」というフォルダが 表 われ,その 中 に 次 のようなファイルがあります。<br />
書暯 き 込 みツール : FDT<br />
HOS はアプリケーションといっしょにフラッシュメモリに 書暯 き 込 みます。ルネサステクノロジのサイト<br />
からダウンロードしてください。<br />
エミュレータ : E8a<br />
HOS はアプリケーションといっしょにフラッシュメモリに 書暯 き 込 む 関 係 上 ,TK-3687/TK-3687mini<br />
に 搭 載 されているハイパーH8 ではデバッグできません。 購 入 することをおすすめします。<br />
ターミナルソフト<br />
サンプルプログラムの 動 作 確 認 に 利 用 します。<br />
μITRON<br />
の 仕 様 書暯<br />
ト ロ ン プ ロ ジ ェ ク ト の サ イ ト ( http://www.assoc.tron.org/itron/home-j.html<br />
) か ら 「 μ<br />
ITRON4.0 仕 様 」というドキュメントをダウンロードしてください。<br />
100<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
2.カーネルライブラリの 構 築<br />
HOS のアプリケーションの 開 発 では,HOS のカーネルをライブラリとして 生 成 しておき,このライ<br />
ブラリをリンカから 呼 び 出 す 方 法沵 を 取 ります。それで,まずカーネルライブラリを 構 築 しましょう。<br />
HEW を 起 動 すると「ようこそ!」というダイアログが 表 示 されるので,「 新 規 プロジェクトワークスペ<br />
ースの 作 成 」を 選 択 して「OK」をクリックします。<br />
プロジェクトタイプは「Library」を 指 定 します。ワークスペース 名 とプロジェクト 名 は「hosv4」,ディ<br />
レクトリは「C:\hew_tk3687\hosv4」を 入 力 します。また,CPU 種 別 は「H8S,H8/300」,ツールチェイン<br />
は「Reneas H8S,H8/300 Standard」を 選 択 します。 入 力 が 終 わったら「OK」をクリックします。<br />
101<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
す。<br />
「 新 規 プロジェクト-1/2-CPU」で,CPU シリーズとして「300H」を 選 択 して「 次 へ」をクリックしま<br />
す。<br />
「 新 規 プロジェクト-2/2-オプション」で, 動 作 モードは「Normal」を 選 択 して「 完 了 」をクリックしま<br />
「 概 要 」ダイアログが 表 示 されますので「OK」をクリックします。プロジェクトが 起 動 します。<br />
102<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
次 に,HOS のソースファイルをプロジェクトに 追 加 します。まず, 解 凍 した「hos-v4」フォルダの 中<br />
身 を 全 て, 今 回 作 成 した「hosv4」フォルダにコピーします。<br />
こ れ を 全 部<br />
コピーする<br />
103<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
今 コピーしたソースファイルをプロ<br />
ジェクトに 登 録 します。 登 録 するのは<br />
「C:\hew4_tk3687\hosv4\src\kernel\」<br />
以 下 のフォルダにある 全 てのファイルと,<br />
「 C:\hew4_tk3687\hosv4\src\mknl\ 」<br />
以 下 のフォルダにある 全 てのファイル<br />
です。メニューから「プロジェクト」→「フ<br />
ァイルの 追 加 」を 選 択 します。<br />
すると,「プロジェクトにファイルを<br />
追 加 」ダイアログが 表 示 されますので,<br />
ファイルを 選 択 して「 追 加 」をクリックし<br />
ま す 。 次 の 図 は 「 kernel 」 フ ォ ル ダ と<br />
「mknl」フォルダを 表 示 していますが, 実 際 はさらにこの 先 のフォルダ( 例 えば「alm」フォルダ)を 開 い<br />
て,そこにある 全 てのファイルを 追 加 します。「 相 対 パス」にチェックを 忘 れずに 入 れてください。<br />
104<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
次 に , CPU や 開 発 環 境 に 依 存 す る プ ロ グ ラ ム を プ ロ ジ ェ ク ト に 追 加 し ま す 。<br />
「C:\hew4_tk3687\hosv4\src\h83\htc\」フォルダの「pacctxn.src」と「pacintn.src」です。<br />
さらに,「C:\hew4_tk3687\hosv4\src\h83\」フォルダのソースファイルもすべて 追 加 します。<br />
追 加 するファイルが 多 いので, 追 加 し 忘 れないように 注泃 意 してください。 特 に「kernel」フォルダと<br />
「mknl」フォルダは,その 先 のフォルダを 一 つ 一 つ 開 いてその 中 の 全 てのファイルを 指 定 して 追 加 す<br />
るため 忘 れがちです。<br />
105<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
次 に,インクルード<br />
ファイルのパスを 指 定<br />
し ま す 。 メ ニ ュ ー か ら<br />
「 ビ ル ド 」 →<br />
「H8S,H8/300 Standard<br />
Toolchain... 」を 選 択 し<br />
ます。<br />
「コンパイラ」タブを 開 き,「ソース」カテゴリのオプション 項 目 「インクルードファイルディレクトリ」を<br />
選 択 して「 追 加 」をクリックします。ダイアログが 開 きますので,「 相 対 パス」は「Workspace directory」を<br />
選 択 し,「サブディレクトリ」は「include」を 指 定 して「OK」をクリックします。もう 一 度 「 追 加 」をクリックし<br />
て ダ イ ア ロ グ を 開 き , 「 相 対 パ ス 」 は 「 Workspace directory 」 を 選 択 し , 「 サ ブ デ ィ レ ク ト リ 」 は<br />
「include\h83」を 指 定 して「OK」をクリックします。<br />
ここを 確 認 する<br />
106<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ところで,このままビルドすると 大 量 の「Warning」が 発 生 します。メニューから「ビルド」→<br />
「H8S,H8/300 Standard Toolchain...」を 選 択 してください。「 全 般 」タブの「 依 存 関 係 検 索 エラーメッセ<br />
ージ 抑 止 」にチェックを 入 れます。<br />
さて,ここで H8/3687 用 にカスタマイズするためにソースファイルを 一 部 修 正 します。H8/3664 の<br />
割 り 込 みベクタ 番 号 は 0~25 ですが,H8/3687 の 割 り 込 みベクタ 番 号 は 0~32 です。それで, 割 り 込<br />
み 処 理 を 行 なっている「pacintn.src」を 次 のように 修 正 します。(リストは 一 部 を 抜 粋 しています)<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
_hos_vector007<br />
_hos_vector008<br />
_hos_vector009<br />
_hos_vector010<br />
_hos_vector011<br />
_hos_vector012<br />
_hos_vector013<br />
_hos_vector014<br />
_hos_vector015<br />
_hos_vector016<br />
_hos_vector017<br />
_hos_vector018<br />
_hos_vector019<br />
_hos_vector021<br />
_hos_vector022<br />
_hos_vector023<br />
_hos_vector024<br />
_hos_vector025<br />
_hos_vector026<br />
_hos_vector027<br />
追 加<br />
107<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
.EXPORT<br />
_hos_vector028<br />
_hos_vector029<br />
_hos_vector030<br />
_hos_vector031<br />
_hos_vector032<br />
;------------------------------------------------<br />
; 割 り 込 みデンルチラ<br />
;------------------------------------------------<br />
修 正 :コード 追 加 に 伴 いジャンプ 先 が 遠 くなったため<br />
_hos_vector007: push.w r0<br />
mov.b #7, r0l<br />
bra int_handler:16<br />
_hos_vector008: push.w r0<br />
mov.b #8, r0l<br />
bra int_handler:16<br />
_hos_vector009: push.w r0<br />
mov.b #9, r0l<br />
bra int_handler:16<br />
修 正 :コード 追 加 に 伴 いジャンプ 先 が 遠 くなったため<br />
修 正 :コード 追 加 に 伴 いジャンプ 先 が 遠 くなったため<br />
_hos_vector010: push.w r0<br />
mov.b #10, r0l<br />
bra int_handler<br />
_hos_vector011: push.w r0<br />
mov.b #11, r0l<br />
bra int_handler<br />
_hos_vector012: push.w r0<br />
mov.b #12, r0l<br />
bra int_handler<br />
_hos_vector013: push.w r0<br />
mov.b #13, r0l<br />
bra int_handler<br />
_hos_vector014: push.w r0<br />
mov.b #14, r0l<br />
bra int_handler<br />
_hos_vector015: push.w r0<br />
mov.b #15, r0l<br />
bra int_handler<br />
_hos_vector016: push.w r0<br />
mov.b #16, r0l<br />
bra int_handler<br />
_hos_vector017: push.w r0<br />
mov.b #17, r0l<br />
bra int_handler<br />
_hos_vector018: push.w r0<br />
108<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
mov.b #18, r0l<br />
bra int_handler<br />
_hos_vector019: push.w r0<br />
mov.b #19, r0l<br />
bra int_handler<br />
_hos_vector021: push.w r0<br />
mov.b #21, r0l<br />
bra int_handler<br />
_hos_vector022: push.w r0<br />
mov.b #22, r0l<br />
bra int_handler<br />
_hos_vector023: push.w r0<br />
mov.b #23, r0l<br />
bra int_handler<br />
_hos_vector024: push.w r0<br />
mov.b #24, r0l<br />
bra int_handler<br />
_hos_vector025: push.w r0<br />
mov.b #25, r0l<br />
bra int_handler<br />
追 加<br />
_hos_vector026:<br />
push.w<br />
mov.b<br />
#26, r0l<br />
bra int_handler<br />
_hos_vector027:<br />
push.w<br />
mov.b<br />
#27, r0l<br />
bra int_handler<br />
_hos_vector028:<br />
push.w<br />
mov.b<br />
#28, r0l<br />
bra int_handler<br />
_hos_vector029:<br />
push.w<br />
mov.b<br />
#29, r0l<br />
bra int_handler<br />
_hos_vector030:<br />
push.w<br />
mov.b<br />
#30, r0l<br />
bra int_handler<br />
_hos_vector031:<br />
push.w<br />
mov.b #31, r0l<br />
bra int_handler<br />
_hos_vector032:<br />
push.w<br />
mov.b<br />
#32, r0l<br />
bra int_handler<br />
r0<br />
r0<br />
r0<br />
r0<br />
r0<br />
r0<br />
r0<br />
109<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
では,ビルドしてライブラリを 構 築 しましょう。<br />
最暷 終 的 に い く つ か 「 Warning 」 が 出 ま す が 無 視 し て 構 い ま せ ん 。<br />
「C:\hew4_tk3687\hosv4\hosv4\debug\」フォルダに「hosv4.lib」というファイルができているはずです。<br />
これをアプリケーションから 呼 び 出 します。<br />
110<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
3.プロジェクトの 作 成<br />
HOS のカーネルライブラリを 構 築 したワークスペースに,アプリケーションプロジェクトを 追 加 しま<br />
す。もしワークスペースを 終 了 しているなら,「hosv4.hws」をダブルクリックしてワークスペースを 起 動 し<br />
てください。ライブラリを 構 築 した 状 態 になります。ここから,アプリケーションプロジェクトを 挿 入 しまし<br />
ょう。メニューから「プロジェクト」→「プロジェクトの 挿 入 」を 選 択 します。<br />
「プロジェクトの 挿 入 」ダイアログが 表 示 されますので,「 新 規 プロジェクト」にチェックを 入 れて<br />
「OK」をクリックします。<br />
111<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
プロジェクトタイプは「Application」を 指 定 します。プロジェクト 名 は「sample_01」,ディレクトリは<br />
「C:\hew_tk3687\hosv4\sample_01」を 入 力 します。また,CPU 種 別 は「H8S,H8/300」,ツールチェイ<br />
ンは「Reneas H8S,H8/300 Standard」を 選 択 します。 入 力 が 終 わったら「OK」をクリックします。<br />
「 新 規 プロジェクト-1/9-CPU」で,CPU シリーズは「300H」,CPU タイプは「3687」を 選 択 して「 次<br />
へ」をクリックします。<br />
112<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
す。<br />
「 新 規 プロジェクト-2/9-オプション」で, 動 作 モードは「Normal」を 選 択 して「 次 へ」をクリックしま<br />
「 新 規 プロジェクト-3/9- 生 成 ファイル」で,「I/O レジスタ 定 義 ファイル」のみチェックし,「I/O ライ<br />
ブラリ 使 用 」と「ヒープメモリ 使 用 」はチェックしません。「main() 関 数 生 成 」は「None」を 選 択 します。「 次<br />
へ」をクリックします。<br />
113<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「 新 規 プロジェクト-4/9- 標 準 ライブラリ」は, 必 要 なライブラリにチェックします。 変 更暬 しなくても<br />
OK です。「 次 へ」をクリックします。<br />
「 新 規 プロジェクト-5/9-スタック 領 域 」は 変 更暬 しません。スタックの 管 理 は HOS 側 で 行 なうからで<br />
す。「 次 へ」をクリックします。<br />
114<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「 新 規 プロジェクト-6/9-ベクタ」で「ベクタテーブル 定 義 」のチェックを 外 します。これも HOS 側 で<br />
行 なうからです。「 次 へ」をクリックします。<br />
「 新 規 プロジェクト-7/9-デバッガ」で,E8a を 使 うときは,ターゲットの「H8 Tiny/Super Low Power<br />
E8a SYSTEM 300」にチェックを 入 れます(E8a をインストールしていないと,この 選 択 肢 は 表 示 されま<br />
せん)。「 次 へ」をクリックします。<br />
115<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「 新 規 プロジェクト-8/9-デバッガオプション」は 変 更暬 しません。「 次 へ」をクリックします。<br />
「 新 規 プロジェクト-9/9- 生 成 ファイル 名 」も 変 更暬 しません。「 完 了 」をクリックします。<br />
最暷 後 に「 概 要 」ダイアログが 開 きます。「OK」をクリックしてください。これで,プロジェクトができま<br />
した。<br />
116<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
この 時昷 点 で「iodefine.h」と「dbsct.c」というファイルが 生 成 されます。このうち「dbsct.c」はセクショ<br />
ンの 初 期曋 化 をするためのファイルですが,セクションの 初 期曋 化 は HOS の 中 でも 行 なっているため,こ<br />
のファイルをプロジェクトから 削 除 します。メニューから「プロジェクト」→「ファイルの 削 除 」を 選 択 しま<br />
す。<br />
「プロジェクトファイルの 削 除 」ダイアログが 開 きます。「dbsct.c」を 選 択 して「 削 除 」をクリックしてく<br />
ださい。 削 除 されたら「OK」をクリックします。<br />
117<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
続 いて,プロジェクトに 必 要 なファイルを 登 録 します。まず,H8/Tiny 用 のサンプルプログラムを<br />
コ ピ ー し ま す 。 「 C:\hew4_tk3687\hosv4\sample\h83n\ 」 フ ォ ル ダから 次 の 10 個 の ファ イ ル を<br />
「C:\hew4_tk3687\hosv4\sample_01\」フォルダにコピーします。<br />
118<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
メニューから「プロジェクト」→「ファイルの 追 加 」を 選 択 します。すると,「プロジェクトにファイルを<br />
追 加 」ダイアログが 表 示 されますので, 今 コピーしたファイルのうち,「crt0.src」,「h8t_sci.c」,<br />
「ostimer.c」,「sample.c」,「vector.src」の 5 つのファイルを 選 択 して「 追 加 」をクリックします。「 相 対 パ<br />
ス」にチェックを 忘 れずに 入 れてください。<br />
続 いて, 構 築 したカーネルライブラリを 追 加 します。メニューから「プロジェクト」→「ファイルの 追<br />
加 」を 選 択 します。すると,「プロジェクトにファイルを 追 加 」ダイアログが 表 示 されますので,<br />
「C:\hew4_tk3687\hosv4\hosv4\Debug\hosv4.lib」を 選 択 して「 追 加 」をクリックします。「 相 対 パス」に<br />
チェックを 忘 れずに 入 れてください。<br />
119<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
さて,アプリケーションの 構 築 を 進 めてきましたが,ここでもう 一 つ 登 録 が 必 要 なファイルがありま<br />
す。それはシステムコンフィギュレーションファイル「system.cfg」に 基 づき 生 成 される,カーネルの 構<br />
成 や 初 期曋 化 に 必 要 なファイル「kernel_cfg.c」です。ここで 使 うツールをコンフィギュレータと 呼 びます。<br />
コンフィギュレータの 詳 細 についてはμITRON4.0 仕 様 書暯 の「2.1.10 システムコンフィギュレーションフ<br />
ァイル」をご 覧 ください。ここでは,とにかく 動 かして 生 成 し 先 に 進 みましょう。<br />
まずはコンフィギュレーションファイル「system.cfg」を HEW の H8 用 コンパイラ ch38.exe のプリプ<br />
ロセス 機 能 を 使 って 整 形 します。そしてこの 処 理 をビルドに 組 み 込 んで 自 動 的 に 行 なうようにします。<br />
メニューから「ビルド」→「ビルドフェーズ」を 選 択 します。<br />
すると,ビルドフェーズダイアログが 開 きますので,「 追 加 」をクリックします。<br />
120<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「 新 規 ビルドフェーズ - 1/4 ステップ」で「 新 規 カスタムフェーズの 作 成 」をチェックします。「 次<br />
へ」をクリックします。<br />
「 新 規 ビルドフェーズ – 2/4 ステップ」で「 単 一 フェーズ」をチェックします。「 次 へ」をクリックしま<br />
す。<br />
121<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「 新 規 ビルドフェーズ – 3/4 ステップ」でフェーズ 名 は「PreConfigure」,コマンドパラメータは<br />
「 $(HEWDIR)\Tools\Renesas\H8\7_0_0\bin\ch38.exe 」 , デ フ ォ ル ト オ プ シ ョ ン は 「 -CPU=300HA<br />
–PREP=system.i system.cfg」, 初 期曋 ディレクトリは「$(PROJDIR)」を 入 力 します。「 次 へ」をクリックしま<br />
す。<br />
「 新 規 ビルドフェーズ – 4/4 ステップ」の 変 更暬 はありません。「 完 了 」をクリックします。<br />
122<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
ビルドフェーズダイアログに 戻 ります。 今 作 った「PreConfigure」を 選 択 し,「 上 へ」をクリックして 先<br />
頭 に 移 動 します。<br />
次 に, 整 形 した 中 間 ファイルを,HOS に 付 属 しているコンフィギュレータ hos4cfg.exe を 使 ってオ<br />
ブジェクトファイル「kernel_cfg.c」と,ID 番 号 などの 定 義 ファイル「kernel_id.h」を 生 成 します。やはりこ<br />
の 処 理 をビルドに 組 み 込 んで 自 動 的 に 行 なうようにします。ビルドフェーズダイアログの「 追 加 」をクリ<br />
ックします。「 新 規 ビルドフェーズ - 1/4 ステップ」と「 新 規 ビルドフェーズ – 2/4 ステップ」は 同 じです。<br />
「 新 規 ビ ルド フ ェー ズ – 3/4 ス テ ップ 」でフェー ズ 名 は「Configure」 , コマ ンドパラメータは<br />
「 $(WORKDIR)\config\hos4cfg.exe 」 , デ フ ォ ル ト オ プ シ ョ ン は 「 system.i 」 , 初 期曋 デ ィ レ ク ト リ は<br />
「$(PROJDIR)」を 入 力 します。「 次 へ」をクリックします。<br />
123<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
「 新 規 ビルドフェーズ – 4/4 ステップ」の 変 更暬 はありません。「 完 了 」をクリックします。すると,ビル<br />
ドフェーズダイアログに 戻 ります。 今 作 った「Configure」を 選 択 し,「PreConfigure」の 次 に 移 動 します。<br />
この 段 階 で 一 度 ビルドしてみましょう。Warning がでますが 気 にしないで 大 丈 夫 です。<br />
「kernel_cfg.c」と「kernel_id.h」が 生 成 されます。このうち,「kernel_cfg.c」をプロジェクトに 登 録 します。メ<br />
ニューから「プロジェクト」→「ファイルの 追 加 」を 選 択 します。すると,「プロジェクトにファイルを 追 加 」<br />
ダイアログが 表 示 されますので,「kernel_cfg.c」を 選 択 して「 追 加 」をクリックします。「 相 対 パス」にチェ<br />
ックを 忘 れずに 入 れてください。<br />
124<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
次 に,インクルードファイルのパスを 指 定 します。メニューから「ビルド」→「H8S,H8/300 Standard<br />
Toolchain...」を 選 択 します。ダイアログが 開 きますので,「コンパイラ」タブを 開 き,「ソース」カテゴリの<br />
オプション 項 目 「インクルードファイルディレクトリ」を 選 択 して「 追 加 」をクリックします。ダイアログが 開<br />
きますので,「 相 対 パス」は「Workspace directory」を 選 択 し,「サブディレクトリ」は「include」を 指 定 し<br />
て「OK」をクリックします。もう 一 度 「 追 加 」をクリックしてダイアログを 開 き,「 相 対 パス」は「Workspace<br />
directory」を 選 択 し,「サブディレクトリ」は「include\h83」を 指 定 して「OK」をクリックします。さらに「 追<br />
加 」をクリックしてダイアログを 開 き,「 相 対 パス」は「Project directory」を 選 択 して「OK」をクリックしま<br />
す。<br />
ここを 確 認 する<br />
125<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
以 前 と 同 じように,このままビルドすると 大 量 の「Warning」が 発 生 します。メニューから「ビルド」→<br />
「H8S,H8/300 Standard Toolchain...」を 選 択 してください。「 全 般 」タブの「 依 存 関 係 検 索 エラーメッセ<br />
ージ 抑 止 」にチェックを 入 れます。<br />
126<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
標 準 では ROM から RAM へマップするセクションは D セクションと R セクションですが,HOS の<br />
場 合 は D セクションと X セクションです。この 設 定 を 修 正 します。メニューから「ビルド」→<br />
「H8S,H8/300 Standard Toolchain...」を 選 択 してください。「 最暷 適 化 リンカ」タブの「 出 力 」カテゴリを 選<br />
び,オプション 項 目 のリストから「ROM から RAM へマップするセクション」を 選 択 します。「 変 更暬 」をクリ<br />
ックして R を X に 変 更暬 してください。<br />
127<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
続 いてセクションを 指 定 します。メニューから「ビルド」→「H8S,H8/300 Standard Toolchain...」を<br />
選 択 してください。「 最暷 適 化 リンカ」タブの「セクション」カテゴリを 選 び, 設 定 項 目 のリストから「セクショ<br />
ン」を 選 択 します。「 編 集 」をクリックして 次 のように 設 定 します。<br />
128<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
STACK を 設 定 します。メニューから「ビルド」→「H8S,H8/300 Standard Toolchain...」を 選 択 して<br />
ください。「 最暷 適 化 リンカ」タブの「 入 力 」カテゴリを 選 び,オプション 項 目 のリストから「シンボル 定 義 」を<br />
選 択 します。「 追 加 」をクリックして「STACK」を 設 定 してください。<br />
さらに,プログラムの 開 始 アドレスは「_startup」なので,「エントリポイント」にチェックを 入 れて 入<br />
力 します。<br />
これで, 環 境 が 整 いました。ビルドしてください。「C:\hew4_tk3687\hosv4\sample_01\Debug\」フ<br />
ォルダに「sample_01.mot」ができていれば,まずは OK です。<br />
129<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
4.TK-3687 版 にカスタマイズする<br />
ビルドも 終 わり mot ファイルが 生 成 されましたが,あくまでこれはプロジェクト HOS が 提 供 している<br />
H8/3664 用 のサンプルプログラムです。これを TK-3687/TK-3687mini 版 (H8/3687)にカスタマイズ<br />
します。 主 な 変 更暬 点 は,CPU:H8/3664→H8/3687,クロック:16MHz→20MHz,の 2 点 です。<br />
まず OS タイマをカスタマイズしましょう。オリジナルは H8/3664 のタイマ A を 使 っていますが,<br />
H8/3687 はタイマ A のかわりに RTC が 搭 載 されているので,RTC をフリーランカウンタモードで 使 用<br />
するよう 変 更暬 します。「ostimer.c」を 次 のように 修 正 します。<br />
/* ------------------------------------------------------------------------ */<br />
/* Hyper Operating System V4 サキンルハルハロエラム */<br />
/* H8/3664 用 OSタ゜マ (Timer Aをを 利 用 ) */<br />
/* */<br />
/* Copyright (C) 1998-2002 by Project HOS */<br />
/* http://sourceforge.jp/projects/hos/ */<br />
/* ------------------------------------------------------------------------ */<br />
/* H8/3687 用 OSタ゜マ (RTCをを 利 用 ) */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd.*/<br />
/* I/O http://www2.u-netsurf.ne.jp/~toyolinx 定 義 ファイルを,<br />
*/<br />
/* ------------------------------------------------------------------------ HEW が 生 成 したものに<br />
*/<br />
#include "kernel.h"<br />
変 更暬 する。<br />
C で 2 進 数 表 現 を 使 え<br />
#include "kernel_id.h"<br />
るように, 東朁 洋泒 リンクス<br />
//#include "h83664f.h"<br />
#include "iodefine.h"<br />
作 成 の 定 義 ファイルを<br />
インクルードする。<br />
#include "ostimer.h"<br />
#include "binary.h"<br />
//Cで2 進 数 表 示 をを 使 う(00000000<br />
(00000000-11111111)<br />
/* OSタ゜マの 初 期 化 */<br />
void OsTimer_Initialize(VP_INT exinf)<br />
{<br />
H8/3664 用 のプログラ<br />
/* TMA 初 期 化<br />
16MHzで8.192msecの゜ンルターヴトルタ゜マとして 設 定 */<br />
ムをコメント 化 する。<br />
// IO.PMR1.BYTE = 0x02;<br />
// IO.PCR1 = 0xff;<br />
// TA.TMA.BYTE = 0x03; /* 00000011 */<br />
// IENR1.BIT.IENTA = 1; /* タ゜マ 割 り 込 み 許 可 */<br />
H8/3687 用 プログ<br />
ラムの 追 加 。<br />
/* RTC 初 期 化<br />
20MHzで6.5536msec<br />
6.5536msecの゜ンルターヴトルタ゜マとして 設 定 */<br />
IO.PMR1.BYTE = _00000010B;<br />
00010B; // TMOWデ゛セーヴノル<br />
デ゛セーヴノル,TxD<br />
,TxD゜ネヅーヴノル<br />
RTC.RTCCR1.BYTE = _00010000B;<br />
// STOP,RESET<br />
RTC.RTCCR1.BYTE = _00000000B;<br />
// STOP,RESET 解 除<br />
RTC.RTCCSR.BYTE = _00000100B;<br />
// CLK/512(ネリーヴランルィウンルタとして 使 用 )<br />
RTC.RTCCR2.BYTE = _00100000B; // オーヴトーヴネローヴ 割 り 込 み゜ネヅーヴノル<br />
IENR1.BIT.IENTA = 1; // RTC 割 り 込 み゜ネヅーヴノル<br />
RTC.RTCCR1.BYTE = _10000000B;<br />
// RUN<br />
}<br />
/* タ゜マ 用 割 り 込 みデンルチラ */<br />
void OsTimer_TimerHandler(VP_INT exinf)<br />
130<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
{<br />
}<br />
/* 割 り 込 み 要 因 クリア */<br />
IRR1.BYTE &= 0xbf; /* 10111111 */<br />
/* タ゜ムテ゛ッセク 供 給 */<br />
isig_tim();<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 1998-2002 by Project HOS */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd. */<br />
/* ------------------------------------------------------------------------ */<br />
これで,6.5536ms 周 期曋 で 割 り 込 みが 発 生 します。あとは HOS に 対 して 何 ms 毎 に 割 り 込 みが 発<br />
生 するか 定 義 します。その 定 義 が「system.cfg」にあります。 次 のように 変 更暬 します。なお,HEW のエ<br />
ディタでは 開 けないので,メモ 帳 などのエディタソフトで 修 正 してください。<br />
//HOS_TIM_TIC(1024, 125); /* タ゜ムテ゛ッセクの 設 定 ( 省 略 時 1/1 ) */<br />
HOS_TIM_TIC(4096, 625); /* タ゜ムテ゛ッセクの 設 定 ( 省 略 時 1/1 ) */<br />
この 定 義 の 意 味 は「 割 り 込 みのたびに 4096/625(=6.5536)を 積 算 する」というものです。<br />
続 いてシリアルポートの 定 義 を 調 整 します。H8/3664 と H8/3687 は 同 じ SCI を 搭 載 しているので<br />
プログラム 自 体 はそのままでかまわないのですが,TK-3687/TK-3687mini 実 装 のクロックが 異 なるの<br />
でボーレート 用 の 定 義 を 変 更暬 します。ファイルは「h8t_sci.h」です。 次 のように 修 正 してください。<br />
/* SCI 通 信 速 度 定 義 (16MHzのとき) */<br />
16MHz 用 の 定 義 をコ<br />
//#define SCI_2400 207<br />
メント 化 。<br />
//#define SCI_4800 103<br />
//#define SCI_9600 51<br />
//#define SCI_19200 25<br />
//#define SCI_31250 15<br />
//#define SCI_38400 12<br />
//#define SCI_57600 8 /* 誤 差 -3.5%<br />
ぎりぎりいけるかも (^^;; */<br />
/* SCI 通 信 速 度 定 義 (20MHzのとき) */<br />
#define SCI_4800 129<br />
#define SCI_9600 64<br />
#define SCI_19200 S<br />
32<br />
#define SCI_31250 19<br />
#define SCI_38400 15<br />
#define SCI_57600 10<br />
20MHz 用 の 定 義 を<br />
追 加 する。<br />
続 いて 割 り 込 みベクタに 関 する 修 正 です。 一 部 ,カーネルライブラリ 構 築 の 際 に 修 正 しています<br />
が, 残 りの 修 正 を 行 います。。H8/3664 はベクタ 番 号 が 0~25 までですが,H8/3687 は 0~32 までで<br />
す。それに 伴 い,「vector.src」を 次 のように 修 正 します。<br />
; ---------------------------------------------------------------------------<br />
; Hyper Operating System V4 サキンルハルハロエラム<br />
; 割 り 込 みベクターヴテーヴノル<br />
;<br />
131<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
; Copyright (C) 1998-2002 by Project HOS<br />
; http://sourceforge.jp/projects/hos/<br />
; ---------------------------------------------------------------------------<br />
; Copyright (C) 2009 by TOYO-LINX Co.,Ltd.<br />
; http://www2.u-netsurf.ne.jp/~toyolinx<br />
; ---------------------------------------------------------------------------<br />
.CPU<br />
300HN<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
.IMPORT<br />
_startup<br />
_hos_vector007<br />
_hos_vector008<br />
_hos_vector009<br />
_hos_vector010<br />
_hos_vector011<br />
_hos_vector012<br />
_hos_vector013<br />
_hos_vector014<br />
_hos_vector015<br />
_hos_vector016<br />
_hos_vector017<br />
_hos_vector018<br />
_hos_vector019<br />
_hos_vector021<br />
_hos_vector022<br />
_hos_vector023<br />
_hos_vector024<br />
_hos_vector025<br />
_hos_vector026<br />
_hos_vector027<br />
_hos_vector028<br />
_hos_vector029<br />
_hos_vector030<br />
_hos_vector031<br />
_hos_vector032<br />
追 加 。<br />
.SECTION VECT,DATA,ALIGN=2<br />
; -----------------------------------------------<br />
; 割 り 込 みベクタテーヴノル<br />
; -----------------------------------------------<br />
.DATA.W _startup<br />
.DATA.W h'ffff<br />
.DATA.W h'ffff<br />
.DATA.W h'ffff<br />
.DATA.W h'ffff<br />
.DATA.W h'ffff<br />
.DATA.W h'ffff<br />
.DATA.W _hos_vector007<br />
.DATA.W _hos_vector008<br />
.DATA.W _hos_vector009<br />
.DATA.W _hos_vector010<br />
.DATA.W _hos_vector011<br />
.DATA.W _hos_vector012<br />
.DATA.W _hos_vector013<br />
132<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.DATA.W<br />
.END<br />
_hos_vector014<br />
_hos_vector015<br />
_hos_vector016<br />
_hos_vector017<br />
_hos_vector018<br />
_hos_vector019<br />
.DATA.W h'ffff<br />
_hos_vector021<br />
_hos_vector022<br />
_hos_vector023<br />
_hos_vector024<br />
_hos_vector025<br />
_hos_vector026<br />
_hos_vector027<br />
_hos_vector028<br />
_hos_vector029<br />
_hos_vector030<br />
_hos_vector031<br />
_hos_vector032<br />
追 加 。<br />
; ---------------------------------------------------------------------------<br />
; Copyright (C) 1998-2002 by Project HOS<br />
; Copyright (C) 2009 by TOYO-LINX Co.,Ltd.<br />
; ---------------------------------------------------------------------------<br />
HOS に 対 して 割 り 込 みベクタ 番 号 の 範 囲 を 指 定 します。H8/3687 の 場 合 ,14~32 が NMI 以 外<br />
の 外 部 割 り 込 みになるので,「system.cfg」を 次 のように 修 正 します。( 内 部 割 込 みを 使 うときは 修 正 し<br />
ます。)<br />
//HOS_MIN_INTNO(19);<br />
/* 使 用 する 割 り 込 み 番 号 の 最 小 値 ( 省 略 時 0) */<br />
//HOS_MAX_INTNO(23); /* 使 用 する 割 り 込 み 番 号 の 最 大 値 ( 省 略 時 0) */<br />
HOS_MIN_INTNO(14); /* 使 用 する 割 り 込 み 番 号 の 最 小 値 ( 省 略 時 0) */<br />
HOS_MAX_INTNO(32); /* 使 用 する 割 り 込 み 番 号 の 最 大 値 ( 省 略 時 0) */<br />
最暷 後 に「sample.cc」を 次 のように 修 正 します。<br />
/* ------------------------------------------------------------------------ */<br />
/* Hyper Operating System V4 サキンルハルハロエラム */<br />
/* */<br />
/* Copyright (C) 1998-2002 by Project HOS */<br />
/* http://sourceforge.jp/projects/hos/ */<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd.*/<br />
/* http://www2.u-netsurf.ne.jp/~toyolinx */<br />
I/O 定 義 ファイルを,<br />
/* ------------------------------------------------------------------------ */<br />
HEW が 生 成 したものに<br />
#include "kernel.h"<br />
変 更暬 する。<br />
#include "kernel_id.h"<br />
//#include "h83664f.h"<br />
#include "iodefine.h"<br />
#include "h8t_sci.h"<br />
133<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
#include "binary.h"<br />
/* メ゜ンル 関 数 */<br />
int main()<br />
{<br />
/* SCIの 初 期 化 */<br />
// Sci_Initialize(SCI_19200);<br />
Sci_Initialize(SCI_38400);<br />
//Cで2 進 数 表 示 をを 使 う(00000000<br />
(00000000-11111111)<br />
C で 2 進 数 表 現 を 使 え<br />
るように, 東朁 洋泒 リンクス<br />
作 成 の 定 義 ファイルを<br />
インクルードする。<br />
/* 開 始 メッセセーヴジ */<br />
Sci_PutChar('H');<br />
Sci_PutChar('O');<br />
Sci_PutChar('S');<br />
Sci_PutChar('\r');<br />
Sci_PutChar('\n');<br />
ボーレートを 38400 ボー<br />
に 変 更暬 する。<br />
sta_hos();<br />
}<br />
return 0;<br />
/* 初 期 化 デンルチラ */<br />
void Initialize(VP_INT exinf)<br />
{<br />
/* act_tsk(TSKID_SAMPLE1);*/<br />
}<br />
/* サキンルハルタスク */<br />
void Task1(VP_INT exinf)<br />
{<br />
SYSTIM st;<br />
for ( ; ; )<br />
{<br />
/* タ゜マ 値 取 得 */<br />
get_tim(&st);<br />
/* タ゜マ 値 出 力 */<br />
Sci_PutChar('0' + (st.ltime / 10000) % 10);<br />
Sci_PutChar('0' + (st.ltime / 1000) % 10);<br />
Sci_PutChar('0' + (st.ltime / 100) % 10);<br />
Sci_PutChar('0' + (st.ltime / 10) % 10);<br />
Sci_PutChar('0' + (st.ltime / 1) % 10);<br />
Sci_PutChar(':');<br />
/* タスクメッセセーヴジ */<br />
Sci_PutChar('T');<br />
Sci_PutChar('a');<br />
Sci_PutChar('s');<br />
Sci_PutChar('k');<br />
Sci_PutChar('1');<br />
Sci_PutChar('\r');<br />
Sci_PutChar('\n');<br />
134<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
}<br />
}<br />
/* 1 秒 待 つ */<br />
dly_tsk(1000);<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 1998-2003 by Project HOS */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd. */<br />
/* ------------------------------------------------------------------------ */<br />
ここで 一 つファイルをコピーしておきます。 付 属 の CD の 中 に「binary.h」がありますので,<br />
「C:\hew4_tk3687\hosv4\sample_01\」フォルダにコピーします。<br />
お 疲 れ 様 でした。これで 修 正 作 業 は 完 了 です。ビルドしてみましょう。エラーがでたときは 入 力 ミ<br />
スがないかもう 一 度 確 認 してください。OK なら「C:\hew4_tk3687\hosv4\sample_01\Debug\」フォルダ<br />
の「sample_01.mot」を FDT で TK-3687/TK-3687mini にダウンロードして 実 行 しましょう。E8a をお 持<br />
ちの 方 は,E8a でダウンロード・ 実 行 してください。 実 行 の 様 子 はシリアルポートを 介 してターミナルに<br />
表 示 されます。ターミナルの 設 定 はハイパーモニタと 同 じです。 次 のように 表 示 されれば 完 成 です。<br />
135<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
5.マルチタスクを 体 験 しよう<br />
サンプルプログラムは 1 本曓 のタスクを 実 行 しました。しかし,HOS はマルチタスク OS なので, 複<br />
数 のタスクを 実 行 するときに 真 価 を 発 揮 します。それで,このサンプルプログラムを 改 造 して 2 本曓 のタ<br />
スクを 実 行 するプログラムを 作 り,マルチタスクを 体 験 してみましょう。プログラムの 内 容 は 次 のようなも<br />
のです。<br />
タスク 1 : 1 秒 おきにシリアルポートにシステムタイマの 値 を 送 信 する。<br />
タスク 2 : 0.1 秒 おきにポート 5 とポート 6 の 出 力 値 を+1 する。<br />
では, 今 作 成 した「sample_01」を 立 ち 上 げてください。これをそのまま 改 造 してもよいのですが,<br />
このマニュアル(および 付 属 CD)では,このワークスペースに 新 たに「sample_02」というアプリケーショ<br />
ンプロジェクトを 追 加 します。これまで 説 明 してきた 手 順 (3 項 と 4 項 )で sample_01 とまったく 同 じプロ<br />
グラムを 作 ってください。<br />
では 改 造 していきましょう。まず 修 正 するのはコンフィギュレーションファイル「system.cfg」です。<br />
このファイルにはタスクや 資 源 などの 生 成 情 報 を 記 述 します。ここに「Task2」というタスクを 追 加 します。<br />
次 のように 修 正 ・ 追 加 してください。<br />
/* サキンルハルハロエラム */<br />
ATT_INI({TA_HLNG, 0, Initialize});<br />
CRE_TSK(TSKID_SAMPLE1, {TA_HLNG|TA_ACT, 1, Task1, 1, 256, NULL});<br />
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG|TA_ACT, TA_ACT, 2, Task2, 1, 256, NULL});<br />
「CRE_TSK」は「Create Task」の 略 でタスクを 生 成 する 静 的 API です。<br />
次 の「TSKID_SAMPLE1」はタスク ID で,コンフィギュレータによってほかのタスクと 重 ならないよう<br />
にこのラベルに 番 号 が 割 り 付 けられます。このプログラムでは 使 っていませんが,アプリケーションが<br />
タスクを 終 了 したり, 起 床 したり, 待 ち 状 態 に 遷 移 させたりするときは,タスク ID でどのタスクかを 指 定<br />
します。<br />
{ } 内 の「TA_HLNG|TA_ACT」は 属 性 です。「TA_HLNG」はタスクが 高 級 言 語 (C 言 語 )で 記 述 さ<br />
れていることを 示 し,「TA_ACT」は OS の 起 動 時昷 にこのタスクを 実 行 状 態 ,もしくは 実 行 可 能 状 態 にす<br />
ることを 示 しています。ここでは「|」(オア)でつながっているので,「このタスクは 高 級 言 語 で 記 述 さ<br />
れ,かつ,OS 起 動 時昷 に 実 行 状 態 にする」ということを 指 定 しています。<br />
次 の 数 字 「1」は 拡 張 情 報 で,この 数 値 がタスク 起 動 時昷 に 引 数 として 渡浫 されます(サンプルプログ<br />
ラムでは 特 に 使 っていない)。<br />
「Task1」はタスクの 開 始 アドレスです。サンプルプログラムのタスクの 関 数 名 を 指 定 します。<br />
次 の 数 字 「1」はタスクの 優 先 順 位 を 示 しています。1から 始 まる 数 字 で 小 さいほど 優 先 順 位 が 高<br />
くなります。サンプルプログラムでは 二 つのタスクの 優 先 順 位 を 同 じにしています。<br />
次 の 数 字 「256」はスタックのサイズを 示 し,その 次 の 引 数 で 指 定 したアドレスにスタック 領 域 が 確<br />
保 されます。「NULL」を 指 定 するとコンフィギュレータが 自 動 的 に 領 域 を 確 保 します。<br />
さて, 続 いてサンプルプログラム「sample.c」を 次 のように 改 造 します。<br />
/* ------------------------------------------------------------------------ */<br />
/* Hyper Operating System V4 サキンルハルハロエラム */<br />
/* */<br />
136<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
* Copyright (C) 1998-2002 by Project HOS */<br />
/* http://sourceforge.jp/projects/hos/ */<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd.*/<br />
/* http://www2.u-netsurf.ne.jp/~toyolinx */<br />
/* ------------------------------------------------------------------------ */<br />
#include "kernel.h"<br />
#include "kernel_id.h"<br />
//#include "h83664f.h"<br />
#include "iodefine.h"<br />
#include "h8t_sci.h"<br />
#include "binary.h"<br />
//Cで2 進 数 表 示 をを 使 う(00000000-11111111)<br />
/* メ゜ンル 関 数 */<br />
int main()<br />
{<br />
/* SCIの 初 期 化 */<br />
// Sci_Initialize(SCI_19200);<br />
Sci_Initialize(SCI_38400);<br />
/* 開 始 メッセセーヴジ */<br />
Sci_PutChar('H');<br />
Sci_PutChar('O');<br />
Sci_PutChar('S');<br />
Sci_PutChar('\r');<br />
Sci_PutChar('\n');<br />
sta_hos();<br />
}<br />
return 0;<br />
/* 初 期 化 デンルチラ */<br />
void Initialize(VP_INT exinf)<br />
{<br />
/* act_tsk(TSKID_SAMPLE1);*/<br />
ポート 5 とポート 6 のイニシャライズ。<br />
アプリケーションのイニシャライズは 初 期曋<br />
化 ハンドラに 記 述 する。<br />
}<br />
// I/Oポーヴダの゜ニッシホラ゜ズ<br />
IO.PCR5 = _11111111B;<br />
//P50-57<br />
57 出 力<br />
IO.PCR6 = _11111111B;<br />
//P60-67<br />
67 出 力<br />
/* サキンルハルタスク */<br />
void Task1(VP_INT exinf)<br />
{<br />
SYSTIM st;<br />
for ( ; ; )<br />
{<br />
/* タ゜マ 値 取 得 */<br />
get_tim(&st);<br />
/* タ゜マ 値 出 力 */<br />
137<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
Sci_PutChar('0' + (st.ltime / 10000) % 10);<br />
Sci_PutChar('0' + (st.ltime / 1000) % 10);<br />
Sci_PutChar('0' + (st.ltime / 100) % 10);<br />
Sci_PutChar('0' + (st.ltime / 10) % 10);<br />
Sci_PutChar('0' + (st.ltime / 1) % 10);<br />
Sci_PutChar(':');<br />
/* タスクメッセセーヴジ */<br />
Sci_PutChar('T');<br />
Sci_PutChar('a');<br />
Sci_PutChar('s');<br />
Sci_PutChar('k');<br />
Sci_PutChar('1');<br />
Sci_PutChar('\r');<br />
Sci_PutChar('\n');<br />
}<br />
}<br />
/* 1 秒 待 つ */<br />
dly_tsk(1000);<br />
追 加 するタスク。<br />
void Task2(VP_INT exinf)<br />
{<br />
while(1){<br />
// LEDををィウンルダアッセハ 表 示<br />
IO.PDR5.BYTE = IO.PDR5.BYTE + 1;<br />
IO.PDR6.BYTE = IO.PDR6.BYTE + 1;<br />
}<br />
}<br />
// 0.1s 待 つ<br />
dly_tsk(100);<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 1998-2003 by Project HOS */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd. */<br />
/* ------------------------------------------------------------------------ */<br />
1s 待 ったり,0.1s 待 ったりするときに「dly_tsk」を 使 っています。「dly_tsk」は 指 定 された 時昷 間 ,タス<br />
クを 待 ち 状 態 にするサービスコールです。<br />
もう 一 つ,「sample.h」も 修 正 します。サンプルプログラムのプロトタイプ 宣 言 が 記 されています。<br />
関 数 Task2 の 定 義 を 記 述 します。<br />
/* ------------------------------------------------------------------------ */<br />
/* Hyper Operating System V4 サキンルハルハロエラム */<br />
/* */<br />
/* Copyright (C) 1998-2002 by Project HOS */<br />
/* http://sourceforge.jp/projects/hos/ */<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd.*/<br />
/* http://www2.u-netsurf.ne.jp/~toyolinx */<br />
/* ------------------------------------------------------------------------ */<br />
138<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
#ifndef __PROJECT_HOS__sample_h__<br />
#define __PROJECT_HOS__sample_h__<br />
void Initialize(VP_INT exinf);<br />
void Task1(VP_INT exinf);<br />
void Task2(VP_INT exinf);<br />
追 加<br />
#endif /* __PROJECT_HOS__sample_h__ */<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 1998-2002 by Project HOS */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd. */<br />
/* ------------------------------------------------------------------------ */<br />
では,ビルドしてみましょう。エラーがでたときは 入 力 ミスがないかもう 一 度 確 認 してください。OK<br />
な ら 「 C:\hew4_tk3687\hosv4\sample_02\Debug\ 」 フ ォ ル ダ の 「 sample_02.mot 」 を FDT で<br />
TK-3687/TK-3687mini にダウンロードして 実 行 しましょう。E8a をお 持 ちの 方 は,E8a でダウンロード・<br />
実 行 してください。 前 回 と 同 じようにターミナルに 表 示 するとともに,ポート 5 とポート 6 の 状 態 が+1 さ<br />
れますので,LED をつなぐとカウントアップしていく 様 子 を 見 ることができます。<br />
意 外 と 簡 単 に 感 じたと 思 います。 基 本曓 的 には,それぞれのタスクの 動 作 をそれぞれプログラムし<br />
ておいて, 並 行 して 動 かすための 調 整 は HOS にお 任 せする,という 感 じです。これが OS を 採 用 する<br />
メリットの 一 つでしょう。<br />
139<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
6. . 割 り 込 みを 使 ってみよう<br />
これまでのサンプルプログラムは「dly_tsk」を 使 ってタスクを 待 ち 状 態 にし,その 間 にほかに 実 行<br />
できるタスクがあれば,その 処 理 を 行 なっていました。 逆 に, 何 か 条曵 件 がそろったら( 外 部 入 力 が 変 化<br />
した, 受 信 した,など)すぐに 実 行 したい 処 理 もあります。このようなとき OS 無 しのプログラムでは 割 り<br />
込 みを 使 うことが 多 いですが,HOS でも 割 り 込 み 処 理 で 対 応 することができます。 今 回 はシリアルポ<br />
ートの 受 信 処 理 を 例 に, 割 り 込 みプログラムを HOS に 組 み 込 んでみましょう。プログラムの 内 容 は 次<br />
のようなものです。<br />
タスク 1 : シリアルポートから 受 信 したら, 受 信 データをそのまま 送 信 する。<br />
タスク 2 : 0.1 秒 おきにポート 5 とポート 6 の 出 力 値 を+1 する。<br />
今 回 は「sample_02」を 改 造 します。ただし,このマニュアル(および 付 属 CD)では,このワークス<br />
ペースに 新 たに「sample_03」というアプリケーションプロジェクトを 追 加 します。これまで 説 明 してきた<br />
手 順 (3 項 と 4 項 )で sample_02 とまったく 同 じプログラムを 作 ってください。<br />
では 改 造 していきましょう。まず 修 正 するのはコンフィギュレーションファイル「system.cfg」です。<br />
次 のように 修 正 ・ 追 加 してください。<br />
/* SCI3 */<br />
ATT_ISR({TA_HLNG, 0, 23, SCI3_RxiHandler});<br />
追 加<br />
/* サキンルハルハロエラム */<br />
変 更暬<br />
ATT_INI({TA_HLNG, 0, Initialize});<br />
CRE_TSK(TSKID_SAMPLE1, {TA_HLNG|TA_ACT, 1, Task1, 2, 256, NULL});<br />
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG|TA_ACT, 2, Task2, 1, 256, NULL});<br />
「ATT_ISR」は 割 り 込 みサービスルーチンを 定 義 する 静 的 API です。<br />
{ } 内 の「TA_HLNG」は 属 性 です。「TA_HLNG」は 割 り 込 みサービスルーチンが 高 級 言 語 (C 言<br />
語 )で 記 述 されていることを 示 しています。<br />
次 の 数 字 「0」は 拡 張 情 報 で,この 数 値 が 割 り 込 みサービスルーチンに 引 数 として 渡浫 されます(サ<br />
ンプルプログラムでは 特 に 使 っていない)。<br />
次 の 数 字 「23」は 割 り 込 みベクタ 番 号 です。<br />
次 の「SCI3_RxiHandler」は 割 り 込 みサービスルーチンの 先 頭 アドレスです。 関 数 名 を 指 定 しま<br />
す。<br />
「CRE_TSK」も 変 更暬 します。タスク 1 の 優 先 順 位 を「2」にします。タスク 1 は 受 信 したかどうかを 常<br />
に 監 視 することになりますが,もしタスク 2 と 優 先 順 位 が 同 じか,タスク 1 のほうの 優 先 順 位 が 高 いと,<br />
タスク 1 ばかりが 実 行 されてタスク 2 の 処 理 が 行 なわれません。タスク 2 の 処 理 を 優 先 的 に 行 ない,0.1<br />
秒 の 待 ち 時昷 間 の 間 にタスク 1 の 処 理 を 行 なうようにします。<br />
続 いてシリアル 制 御 用 プログラムライブラリ「h8_sci.c」を 次 のように 改 造 します( 黄 色 でマークして<br />
いる 行 )。 受 信 割 り 込 み「Sci3_RxiHandler」でリングバッファにストアし,サブルーチン「Sci3_GetChar」<br />
でリングバッファから 1 文 字 ずつ 取 り 出 します。<br />
/* ------------------------------------------------------------------------ */<br />
/* H8/3664 用 SCI3 制 御 ラ゜ノラリ */<br />
/* */<br />
140<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
* Copyright (C) 1998-2006 by Project HOS */<br />
/* http://sourceforge.jp/projects/hos/ */<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd.*/<br />
/* http://www2.u-netsurf.ne.jp/~toyolinx */<br />
/* ------------------------------------------------------------------------ */<br />
#include "kernel.h"<br />
//#include "h83664f.h"<br />
#include "iodefine.h"<br />
#include "h8t_sci.h"<br />
#include "binary.h"<br />
//Cで2 進 数 表 示 をを 使 う(00000000-11111111)<br />
#define RECV_BUFSIZE 32 /* 受 信 トッセネァのサキ゜ズ */<br />
static unsigned char recv_buf[RECV_BUFSIZE];<br />
static int head;<br />
static int tail;<br />
/* SCI3 初 期 化 */<br />
void SCI3_Initialize(unsigned char rate)<br />
{<br />
volatile int i;<br />
/* SCI3 初 期 化 */<br />
SCI3.SCR3.BYTE = 0x00;<br />
SCI3.SMR.BYTE = 0x00;<br />
SCI3.BRR = rate;<br />
for ( i = 0; i < 280; i++ )<br />
;<br />
// SCI3.SCR3.BYTE = 0x20; /* 送 信 可 */<br />
SCI3.SCR3.BYTE = 0x70; /* 送 信 可 | 受 信 可 */<br />
IO.PMR1.BIT.TXD = 1;<br />
}<br />
/* 1 文 字 出 力 */<br />
void SCI3_PutChar(char c)<br />
{<br />
while ( !(SCI3.SSR.BYTE & 0x80) )<br />
;<br />
SCI3.TDR = c;<br />
/* SCI3.SSR.BYTE &= 0x7f; */<br />
}<br />
/* 1 文 字 入 力 */<br />
int SCI3_GetChar(void)<br />
{<br />
unsigned char c;<br />
if (head==tail){<br />
return -1;<br />
}<br />
c = recv_buf[head++];<br />
141<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
if (head>=RECV_BUFSIZE){<br />
head = 0;<br />
}<br />
}<br />
return c;<br />
/* SCI 受 信 割 り 込 み */<br />
void SCI3_RxiHandler(VP_INT exinf)<br />
{<br />
unsigned char c;<br />
int next;<br />
/* 1 文 字 受 信 */<br />
c = SCI3.RDR;<br />
/* 次 の 末 尾 位 置 をを 計 算 */<br />
next = tail + 1;<br />
if ( next == RECV_BUFSIZE )<br />
{<br />
next = 0;<br />
}<br />
/* オーヴトーヴネローヴスェッセク */<br />
if ( next == head )<br />
{<br />
return;<br />
}<br />
}<br />
/* 受 信 トッセネァに 格 納 */<br />
recv_buf[tail] = c;<br />
tail = next;<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 1998-2006 by Project HOS */<br />
/* http://sourceforge.jp/projects/hos/ */<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd.*/<br />
/* http://www2.u-netsurf.ne.jp/~toyolinx */<br />
/* ------------------------------------------------------------------------ */<br />
シリアル 制 御 用 プログラムのプロトタイプ 宣 言 と 定 義 ファイル「h8_sci.h」を 次 のように 改 造 します<br />
( 一 部 分 抜 粋 , 黄 色 でマークしている 行 が 追 加 部 分 )。<br />
/* SCI3 */<br />
void SCI3_Initialize(unsigned char rate); /* SCI3 初 期 化 */<br />
void SCI3_PutChar(char c); /* 1 文 字 出 力 */<br />
int SCI3_GetChar(void); /* 1 文 字 入 力 */<br />
void SCI3_RxiHandler(VP_INT exinf);<br />
/* 受 信 割 り 込 みデンルチラ */<br />
/* assign SCI3 for SCI*/<br />
#define Sci_Initialize SCI3_Initialize<br />
142<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
#define Sci_PutChar SCI3_PutChar<br />
#define Sci_GetChar SCI3_GetChar<br />
#define Sci_RxiHandler SCI3_RxiHandler<br />
続 いてサンプルプログラム「sample.c」を 次 のように 改 造 します。<br />
/* ------------------------------------------------------------------------ */<br />
/* Hyper Operating System V4 サキンルハルハロエラム */<br />
/* */<br />
/* Copyright (C) 1998-2002 by Project HOS */<br />
/* http://sourceforge.jp/projects/hos/ */<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd.*/<br />
/* http://www2.u-netsurf.ne.jp/~toyolinx */<br />
/* ------------------------------------------------------------------------ */<br />
#include "kernel.h"<br />
#include "kernel_id.h"<br />
//#include "h83664f.h"<br />
#include "iodefine.h"<br />
#include "h8t_sci.h"<br />
#include "binary.h"<br />
//Cで2 進 数 表 示 をを 使 う(00000000-11111111)<br />
/* メ゜ンル 関 数 */<br />
int main()<br />
{<br />
/* SCIの 初 期 化 */<br />
// Sci_Initialize(SCI_19200);<br />
Sci_Initialize(SCI_38400);<br />
/* 開 始 メッセセーヴジ */<br />
Sci_PutChar('H');<br />
Sci_PutChar('O');<br />
Sci_PutChar('S');<br />
Sci_PutChar('\r');<br />
Sci_PutChar('\n');<br />
sta_hos();<br />
}<br />
return 0;<br />
/* 初 期 化 デンルチラ */<br />
void Initialize(VP_INT exinf)<br />
{<br />
/* act_tsk(TSKID_SAMPLE1);*/<br />
}<br />
// I/Oポーヴダの゜ニッシホラ゜ズ<br />
IO.PCR5 = _11111111B; //P50-57 出 力<br />
IO.PCR6 = _11111111B; //P60-67 出 力<br />
/* サキンルハルタスク */<br />
143<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
void Task1(VP_INT exinf)<br />
{<br />
int c;<br />
while(1){<br />
c = Sci_GetChar(); //1 文 字 入 力<br />
}<br />
}<br />
if (c!=-1){<br />
Sci_PutChar((char)(c & 0x00ff)); // 受 信 デーヴタをを 送 信<br />
}<br />
void Task2(VP_INT exinf)<br />
{<br />
while(1){<br />
// LEDををィウンルダアッセハ 表 示<br />
IO.PDR5.BYTE = IO.PDR5.BYTE + 1;<br />
IO.PDR6.BYTE = IO.PDR6.BYTE + 1;<br />
}<br />
}<br />
// 0.1s 待 つ<br />
dly_tsk(100);<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 1998-2003 by Project HOS */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd. */<br />
/* ------------------------------------------------------------------------ */<br />
では,ビルドしてみましょう。エラーがでたときは 入 力 ミスがないかもう 一 度 確 認 してください。OK<br />
な ら 「 C:\hew4_tk3687\hosv4\sample_03\Debug\ 」 フ ォ ル ダ の 「 sample_03.mot 」 を FDT で<br />
TK-3687/TK-3687mini にダウンロードして 実 行 しましょう。E8a をお 持 ちの 方 は,E8a でダウンロード・<br />
実 行 してください。ポート 5 とポート 6 の 状 態 が+1 されますので,LED をつなぐとカウントアップしてい<br />
くのと 同 時昷 に,パソコンのキーボードから 入 力 すると 同 じ 文 字 が 表 示 されます。<br />
144<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
7.タスク 付 属 同 期曋 機 能<br />
これまでのプログラムは 各 タスクがそれぞれ 個 別 に 動 作 していました。しかし, 複 数 のタスクが 協<br />
調 しながら 動 作 するアプリケーションも 考 えられます。 例 えば, 通 常 動 作 しているタスク 内 である 条曵 件<br />
がそろったときに,より 優 先 順 位 の 高 いタスクを 実 行 する,というものです。「dly_tsk」を 使 ってタスクを<br />
待 ち 状 態 にし,その 間 にほかに 実 行 できるタスクがあれば,その 処 理 を 行 なう,という 方 法沵 はすでに<br />
説 明 しましたが,ここではより 積 極 的 に 特 定 のタスクを 実 行 することを 考 えてみましょう。<br />
このようなときに 使 う 機 能 が「タスク 付 属 同 期曋 機 能 」です。μITRON4.0 仕 様 書暯 では「タスクの 状 態<br />
を 直 接 的 に 操 作 することによって 同 期曋 を 行 なうための 機 能 である。」と 説 明 されています( 実 を 言 うと<br />
「dly_tsk」もタスク 付 属 同 期曋 機 能 の 一 部 です)。では,タスク 付 属 同 期曋 機 能 を 使 って 次 のプログラムを<br />
作 ってみましょう。<br />
タスク 1 : シリアルポートから 受 信 したら, 受 信 データをポート 5 とポート 6 に 出 力 するとともに, 受 信<br />
データが‘0’~‘9’のときはタスク 2 を 起 床 する。<br />
タスク 2 : シリアルポートに「Receive Number」と 送 信 する。<br />
今 回 は「sample_03」を 改 造 します。ただし,このマニュアル(および 付 属 CD)では,このワークス<br />
ペースに 新 たに「sample_04」というアプリケーションプロジェクトを 追 加 します。これまで 説 明 してきた<br />
手 順 (3 項 と 4 項 )で sample_03 とまったく 同 じプログラムを 作 ってください。<br />
では 改 造 していきましょう。 修 正 するのは「sample.c」だけです。 次 の 黄 色 でマークしている 部 分<br />
を 修 正 ・ 追 加 してください。<br />
/* ------------------------------------------------------------------------ */<br />
/* Hyper Operating System V4 サキンルハルハロエラム */<br />
/* */<br />
/* Copyright (C) 1998-2002 by Project HOS */<br />
/* http://sourceforge.jp/projects/hos/ */<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd.*/<br />
/* http://www2.u-netsurf.ne.jp/~toyolinx */<br />
/* ------------------------------------------------------------------------ */<br />
#include "kernel.h"<br />
#include "kernel_id.h"<br />
//#include "h83664f.h"<br />
#include "iodefine.h"<br />
#include "h8t_sci.h"<br />
#include "binary.h"<br />
//Cで2 進 数 表 示 をを 使 う(00000000-11111111)<br />
/* メ゜ンル 関 数 */<br />
int main()<br />
{<br />
/* SCIの 初 期 化 */<br />
// Sci_Initialize(SCI_19200);<br />
Sci_Initialize(SCI_38400);<br />
/* 開 始 メッセセーヴジ */<br />
Sci_PutChar('H');<br />
Sci_PutChar('O');<br />
Sci_PutChar('S');<br />
145<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
Sci_PutChar('\r');<br />
Sci_PutChar('\n');<br />
sta_hos();<br />
}<br />
return 0;<br />
/* 初 期 化 デンルチラ */<br />
void Initialize(VP_INT exinf)<br />
{<br />
/* act_tsk(TSKID_SAMPLE1);*/<br />
}<br />
// I/Oポーヴダの゜ニッシホラ゜ズ<br />
IO.PCR5 = _11111111B; //P50-57 出 力<br />
IO.PCR6 = _11111111B; //P60-67 出 力<br />
/* サキンルハルタスク */<br />
void Task1(VP_INT exinf)<br />
{<br />
int c;<br />
while(1){<br />
c = Sci_GetChar(); //1 文 字 入 力<br />
if ((c>='0')&(c
}<br />
}<br />
Sci_PutChar('r');<br />
Sci_PutChar('\r');<br />
r');<br />
Sci_PutChar('\n');<br />
/* ------------------------------------------------------------------------ */<br />
/* Copyright (C) 1998-2003 by Project HOS */<br />
/* Copyright (C) 2009 by TOYO-LINX Co.,Ltd. */<br />
/* ------------------------------------------------------------------------ */<br />
Task1 の 中 の「wup_tsk(TSKID_SAMPLE2)」が,TSKID_SAMPLE2 で 指 定 するタスクを 起 床 するサ<br />
ービスコールです。wup_tsk が 発 行 されると, 指 定 されたタスクは 実 行 可 能 状 態 ,もしくは 実 行 状 態 に<br />
遷 移 します。<br />
Task2 の 中 の「slp_tsk()」は 自 タスクを 待 ち 状 態 に 遷 移 するサービスコールです。<br />
さて,「system.cfg」で Task2 の 優 先 順 位 が Task1 よりも 高 くなっています。このことを 踏 まえてプロ<br />
グラムの 動 きを 考 えてみましょう。<br />
プログラムが 動 き 出 すと,「CRE_TSK」により Task1 と Task2 はどちらも 実 行 状 態 ,もしくは 実 行 可<br />
能 状 態 になります。ただし,Task2 の 優 先 順 位 が Task1 より 高 いので,Task2 が 実 行 状 態 ,Task1 が<br />
実 行 可 能 状 態 になります。<br />
Task2 は「slp_tsk」により,すぐに 待 ち 状 態 になります。その 結 果 ,Task1 が 実 行 状 態 になります。<br />
Task1 はシリアルポートから 受 信 するとデータの 範 囲 を 判 定 し,‘0’~‘9’のときに「wup_tsk」を 発<br />
行 してタスク 2 を 実 行 可 能 状 態 にします。すると,タスク 2 の 優 先 順 位 がタスク 1 より 高 いので,タスク<br />
1 は 実 行 可 能 状 態 に 遷 移 し,タスク 2 が 実 行 状 態 になりメッセージの 送 信 処 理 を 実 行 します。<br />
Task2 はメッセージを 送 信 したあと「slp_tsk」により,すぐに 待 ち 状 態 になります。その 結 果 ,<br />
Task1 が 実 行 状 態 になり 再 び 受 信 を 待 ちます。<br />
このように,タスク 1 とタスク 2 が 協 調 しながら 動 作 していくことになります。<br />
◆<br />
いかがだったでしょうか。HOS を H8/3687 に 実 装 するまでは 手 順 も 多 く 複 雑 に 思 えたかもしれま<br />
せん。それでも,マルチタスクでアプリケーションタスクを 実 装 すること 自 体 は 意 外 と 簡 単 に 感 じたこと<br />
でしょう。もちろん,μITRON の 機 能 はこのマニュアルで 説 明 したことだけではなく(というより 説 明 して<br />
いないことが 大 部 分 ),まだまだ 入 り 口 をくぐったに 過 ぎません。これをきっかけに 組 み 込 み OS につ<br />
いても 興 味 を 広 げていただければ 幸 いです。<br />
147<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
148<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
回 路 図 :TK-3687mini<br />
:<br />
149<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
回 路 図 :タイマ&LED ディスプレイ<br />
150<br />
TK-3687mini ユーザーズマニュアル C 言 語 版
お 問 い 合 わせ 先<br />
株 式 会 社 東朁 洋 リンクス<br />
※ご 質 問 はメール,または FAX で…<br />
ユーザーサポート 係 ( 月暻 ~ 金 10:00~17:00, 土 日 祝 は 除 く)<br />
〒102-0093 東朁 京 都 千 代 田 区 平 河沜 町 1-2-2 朝曉 日 ビル<br />
TEL:03-3234-0559<br />
FAX:03-3234-0549<br />
E-mail:toyolinx@va.u-netsurf.jp<br />
URL:http://www2.u-netsurf.ne.jp/~toyolinx<br />
151<br />
20091222<br />
TK-3687mini ユーザーズマニュアル C 言 語 版