連載
» 2010年03月26日 00時00分 UPDATE

イチから作って丸ごと学ぶ! H8マイコン道(12):シリアル通信でオリジナルprintf関数を作ろう (1/3)

ポート、スイッチ、タイマとH8マイコンの周辺機能を解説してきたソフトウェア開発編。最終回のテーマは「シリアル通信」だ!

[横田一弘 埼玉県立新座総合技術高等学校 教諭,@IT MONOist]

前回のあらすじ

――前回、健一君は見事に宿題をやってのけ、晴れてデート……。といきたいところでしたが、晴子さんに見事にかわされてしまいました。これまでポート、タイマとH8マイコンの周辺機能をマスターしてきた健一君、残すはシリアル通信です。卒業式を控える晴子さんに、カッコイイところを見せられるといいんですが……。前回へ

 本連載も今回で最終回、皆さん最後までお付き合いください。おっと、そろそろ健一君が来るころですね。


本連載の登場人物

ay_S_icon_ani.gif
佐藤 健一(さとう けんいち)
電子工学を専攻している大学2年生。ロボットサークルに参加している。最近、やっと電子工作ができるようになったが……。

ay_H_icon_ani.gif
岡野 晴子(おかの はるこ)
健一君が所属するサークルの先輩。組み込みソフトウェアを研究しており、サークルでも中心的な存在。活発で頼れる(健一君あこがれの)女性。



※注:本連載では、筆者が実際にH8Tiny-USBを制作し、動作確認を行った内容を掲載していますが、読者個人で作成したH8Tiny-USBの動作保証や、H8Tiny-USBを使用したことによる、損害・損失については一切保証できません。すべての作業は自己責任で行ってください。よろしくお願いします。


晴子さんのドライバ使ってパソコン通信しよう

ここは健一君が所属する大学のサークル部屋。また、いつもの足音が聞こえてきました……。

photo

晴子さん、こんにちは!


photo

あら、健一君。遅かったじゃない。


知っていると思うけど、ワタシ、明日で卒業なの。だから健一君への個別指導も今日で最後ね。


photo

そうか、晴子さんにもう会えないのか〜(あーあ、結局デートできなかったなぁ……)。


photo

そんなにシンミリしないの!


ところで健一君。ワタシの宿題やってきた?


photo

ギクッ!! それがその〜。


photo

まぁ、健一君のことだから、そんなことだろうと思って、今回は特別に「通信プログラム」作ってきたわよ!(ソースコード1)


photo

さすが晴子さん、ステキ!!



/* パソコンに「Hello world!」を送信する
 *
 */
#include "sci.h"
 
void wait(long);
 
int main(void)
{
    sci_open();
    for (;;) {
        sci_puts("Hello world!\r\n");
        wait(50000);
    }
    return 0;
}
 
void wait(long times)
{
    while (times--);
} 
ソースコード1 晴子さんが作ったプログラム

photo

な〜んだ。


こんなに簡単にできちゃうんだ!!


photo

何いってるのよ!


通信ドライバを作ったからできるのよ。


まったく! 何も分かっていないようね。


photo

うぅ……。


photo

ふんっ!!


今日も厳しくいくからね!


photo

(シュン……)。



――これまでポート、タイマとH8マイコンの周辺機能を紹介してきましたが、今回のテーマは「シリアル通信」です。今日も元気いっぱいの晴子さんは、健一君が宿題を解けなかったこともお見通し、ちゃんと通信プログラムを作ってきたようです。まずは、晴子さんのプログラムをコンパイルして、パソコンと通信してみましょう!

 今回はH8Tiny-USBとパソコンとで、シリアル通信をするプログラムを作成します。

 H8Tiny-USBとパソコンを接続するUSBケーブルは、パソコンからH8Tiny-USBに電源を供給する役割と、パソコンで作成したプログラムをH8Tiny-USBにダウンロードする役割があります。実はそこでは“シリアル通信”が行われているのです。

 連載第1回「プリント基板CADで“マイ”マイコンボードを作ろう!!」でお伝えしましたが、H8Tiny-USB搭載のIC「FT232RL」は、USBをシリアル・インターフェイスへと変換するICで、これによりUSB上でシリアル通信をエミュレートしています。

 それでは、プログラムをコンパイルしてみましょう。ここから「hello.lzh」をダウンロードして、適当な解凍ソフトで展開してください。

 最初にスタートアップ・ルーチン「crt0.s」をアセンブルします。

$ h8300-elf-gcc -c crt0.s 

 すると、オブジェクトファイル「crt0.o」が生成されます。

 次に、本体の「hello.c」をコンパイルします。

$ h8300-elf-gcc -c -mh -mn hello.c 

 今度は、オブジェクトファイル「hello.o」が生成されます。

 さらに、シリアル通信ドライバの「sci.c」をコンパイルします。

$ h8300-elf-gcc -c -mh -mn sci.c 

 「sci.c」には、“sci_open”“sci_puts”などのシリアル通信のための関数があります。コンパイルするとオブジェクトファイル「sci.o」が作られます。

 そして、「crt0.o」「hello.o」「sci.o」をリンクし、1つの実行ファイルを作ります。

$ h8300-elf-gcc -o hello -T 3664.x -nostdlib crt0.o hello.o sci.o -lc 

 これで実行ファイル「hello」が作られました。

 最後に、実行ファイルをヘキサファイルに変換します。

$ h8300-elf-copy -O srec hello hello.mot 

 すると、ヘキサファイル「hello.mot」が作られます。以下のように、ライタでH8/3664のフラッシュメモリにプログラムを書き込んで、マイコン側の準備は完了です。

$ h8write -3664 sw1.mot 

 続いて、パソコン側の準備をします。

 今回のシリアル通信においては、H8Tiny-USBから送られてくるビットデータを、単に文字として表示します。そのために使用するソフトウェアが「ターミナル」で、今回はWindowsでよく使われている「TeraTerm」を使用します。

 それでは早速、TeraTermをインストールしましょう。

 Webブラウザを開き、「TeraTermプロジェクト日本語トップページ」にアクセスしてください。そして、ダウンロードを選択し、「teraterm-4.65.exe」をダウンロードします。

 ダウンロードした「teraterm-4.65.exe」をダブルクリックするとインストールが開始されます。今回は標準の設定でインストールしますが、「コンポーネントの選択」では「コンパクトインストール」を、「言語の選択」では「日本語」を選択してください。

 インストールが終了したら、H8Tiny-USBを接続したままTeraTermを起動します。すると「新しい接続」ダイアログが表示されるので、「シリアルポート」を選択してください(図1)。

TeraTermの起動(初期) 図1 TeraTermの起動(初期)

 次に、[設定(S)]―[シリアルポート(E)...]メニューを選択します。すると、「シリアルポートの設定」ダイアログが表示されるので、図2のように入力し、[OK]ボタンを押します。さらに、[設定(S)]―[設定の保存(S)...]メニューを選択し、「TERATERM.INI」ファイルに設定を保存します。

シリアルポートの設定 図2 シリアルポートの設定

 これで準備が整いました。H8Tiny-USBでプログラムを実行すると、図3のようにH8Tiny-USBから送信されたメッセージ「Hello world!」が表示されます。

TeraTermによるシリアル通信 図3 TeraTermによるシリアル通信

コラム:調歩同期式シリアル通信

ノートパソコンでは、ほとんどなくなってしまいましたが、パソコンのシリアルポートに外部機器を接続して、コマンド操作やダンプ出力をするなど、シリアル通信(RS-232C)は現在でも用いられている通信手段です。

シリアル通信はとてもシンプルで、1ビットずつ逐次データを送る通信です。「グランド(GND)」「送信(TXD)」「受信(RXD)」の3つの信号線により通信を行います。そして、送信側と受信側が信号の同期を取るために、

ボーレート(1秒当たりの転送ビット数)
データの長さ
パリティの有無(ありの場合は奇数か偶数か)
ストップビットの長さ

を双方であらかじめ決めておきます。

シリアル通信の信号フォーマットを、図4に示します。

調歩式シリアル通信のフォーマット 図4 調歩式シリアル通信のフォーマット

1つの通信データは、「スタートビット」から始まり、「送信/受信データ」「パリティビット」「ストップビット」の順で構成されます。何も情報がないときがマーク状態(“1”)で、受信側ではスタートビット(“0”)が送られてくると、そこから決められた時間間隔でビットを受信します。

以上のように、データそのものに同期用信号を追加して、受信側・送信側双方で同期を取っているため、「調歩同期式」と呼ばれています。



photo

やった! 「Hello world!」が表示された。


photo

あらあら、健一君。


ずいぶんうれしそうね。


photo

晴子さんがシリアル通信のドライバを作ってくれたおかげで、簡単に通信できましたね。


photo

動作の保証されたプログラムは積極的に使わなきゃ。これもモジュール化の利点よね。


photo

ところで晴子さん。


モジュール化とリンクって、すごく関係がありそうですよね!?


photo

あら、今日の健一君、さえてるわね。


それじゃあ、プログラミングは一休みして、開発ソフトウェアの話をしてあげるわ。


photo

お願いします!



       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.