24.01.2015 Views

C - U-netSURF

C - U-netSURF

C - U-netSURF

SHOW MORE
SHOW LESS
  • 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 言 語 版

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!