イチから作って丸ごと学ぶ! H8マイコン道

イチから作って丸ごと学ぶ! H8マイコン道(9)

チャタリングを防止して、
スイッチ入力を完成させよう

横田 一弘 埼玉県立新座総合技術高等学校 教諭 2009/12/16

電子部品の小型化が進み、手作業による配線に限界を感じてはいないだろうか? 本連載では「プリント基板CADによる基板製作」を伝授するとともに、「マイコンボード製作」「マイコン制御プログラミング」の解説を行う。“イチから作って丸ごと学ぶ”をモットーにこれらの手順・ポイントを詳しく、楽しく紹介する。(編集部)

- PR -

前回のあらすじ

――マイコンボード「H8Tiny-USB」の入出力インターフェイスを理解し、C言語によるポート制御までをマスターした健一君。立派に制御プログラミングの世界へ足を踏み入れたようです。しかし、ホッとする間もなく、晴子さんから次なる宿題が……。前回へ

 健一君、今回はちゃんと宿題をやってきたのでしょうか。また、晴子さんに怒られないといいのですが……。

 おっと、健一君が来たみたいです。


本連載の登場人物
健一君 佐藤 健一(さとう けんいち)

電子工学を専攻している大学2年生。ロボットサークルに参加している。最近、やっと電子工作ができるようになったが……。
  晴子さん 岡野 晴子(おかの はるこ)

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

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

H8Tiny-USBのハードウェアを分析しよう

ここは健一君が所属する大学のサークル部屋。また、いつもの足音が聞こえてきました……。
     
  こんにちは!  
健一君(笑)
     
   
晴子さん(ニヤリ)
  あら、健一君。
ほっぺたにヨダレのあとが付いているけど……。
当然、今回はワタシの宿題ちゃんとやってきたわよね。
 
     
     
  ギクッーーー。
それが、あの〜、その〜(汗)
 
健一君(汗)
     
   
晴子さん(怒)
  ちょっと!
相変わらずハッキリしないわね!!
 
     
     
  実は、プログラムを作ってみたんですが、コンパイルにしくじって……。
どうしたものかと……。
 
健一君(涙)
     
   
晴子さん
  まったく世話が焼けるわね。
それじゃ、今日もスパルタでいくわよ!!
 
     
     
  は、はい……。  
健一君(暗)
     

――「H8マイコン道」もソフトウェア編の3回目に突入しました。晴子さんが出した宿題に健一君も頑張って取り組んだようです。しかし、健一君にとっては、まだまだマイコン制御プログラムの世界は奥が深いようです。まずは、健一君のプログラムをH8Tiny-USBで動かすことからはじめましょう!

 以下は、健一君が作ったプログラムです(ソースコード1)

/* SW1が押された回数を表示する。
 *
 */
#define PCR1 (*((volatile unsigned char *)0xffe4))
#define PDR1 (*((volatile unsigned char *)0xffd4))
#define PCR5 (*((volatile unsigned char *)0xffe8))
#define PDR5 (*((volatile unsigned char *)0xffd8))
#define PCR8 (*((volatile unsigned char *)0xffeb))
#define PDR8 (*((volatile unsigned char *)0xffdb))


#define    SW1    0x01
#define    SW2    0x02
#define    SW3    0x04


int main(void)
{
    unsigned char LED[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    int count;


    PCR1 = 0x0;
    PDR5 = 0xfe;
    PCR5 = 0x03;
    PDR8 = 0xff;
    PCR8 = 0xff;


    count = 0;
    PDR8 = LED[count];
    for (;;) {
        if ((PDR1 & SW1) == 0) {    /* SW1が押された */
            if (count < 9)
                count++;
            else
                count = 0;
            PDR8 = LED[count];
        }
    }
    return 0;
}
ソースコード1 健一君が作ったプログラム
ソースコード1のダウンロード(swcount_01.lzh

 なるほど、C言語のプログラムとしては、うまくできているようですね。晴子さんの宿題(2)では、7セグメントLEDに「0」〜「9」まで表示させることになっていました。

晴子さんからの宿題(2)

SW1を押した回数を、7セグメントLEDに表示するプログラムを作ってね。ただし、カウンタの初期値は「0」よ。それと、「9」の次のカウントで最初の「0」に戻ること!


 健一君のプログラム(ソースコード1)を見てみると、char配列LEDに表示パターンを設定しているようです。

 それでは、ソフトウェア編第1回に倣ってプログラムを実行してみましょう!

 マイコンのC言語プログラムには、「スタートアップ・ルーチン」が必要でした。まず、これを以下のコマンドでアセンブルします。

$ h8300-elf-gcc -c crt0.s

 どうやら無事にアセンブルできたようです。

 次に、C言語プログラムを以下のコマンドでコンパイルします。

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

 ここでもエラーは出ません。

 続いて、スタートアップ・ルーチンとC言語プログラムをリンクします。

$ h8300-elf-gcc -o swcount.bin -T 3664.x -nostdlib crt0.o swcount.o
swcount.o: In function `_main':
swcount.c:(.text+0x1b): undefined reference to `_memcpy'
collect2: ld returned 1 exit status

 あらあら、リンクの過程でエラーが出てしまいましたね。健一君は、ここでつまずいたようです。メッセージを読むと、このプログラムは内部でmemcpy関数を使っているようです。ここでは、それを“リンクできない”というエラーが起こっています。

 コマンドの「-nostdlib」は、標準のスタートアップ・ルーチンや標準関数を“リンクしない”指定です。このオプションを指定してしまったため、標準関数であるmemcpy関数がリンクできなかったのです。

 詳しい説明は後にして(注)、先に進むためにリンクを完了させてしまいましょう。

注:詳しくは、本稿の3ページ「変数の記憶域はどこだ」で解説します。

 以下のコマンドを入力してください。

$ h8300-elf-gcc -o swcount.bin -T 3664.x -nostdlib -mh
 -mn crt0.o swcount.o -lc

 いかがでしょうか。無事にリンクできましたね。最後の「-lc」オプションで標準関数を“リンクする”と指定したのです。

 これで実行ファイルが生成されたので、ヘキサファイルに変換します。以下のコマンドを入力してください。

$ h8300-elf-objcopy -O srec swcount.bin swcount.mot

 図1に最終的に生成されたファイル一覧を示します。

図1 無事に生成されたファイル

 後は、「swcount.mot」ファイルをライタでROM焼き(ROMに書き込むこと)して、プログラムを実行してください。

     
  よ〜し!
コンパイルも通ったことだし、実行しちゃいますよーーー!
 
健一君(笑)
     
   
晴子さん(ニヤリ)
  フフッ。
健一君のプログラム、しっかり動くかしら。
見ものだわー。
 
     
     
  それじゃ「SW1」を押して……。
あれっ、「8」が表示される!?(汗)
このプログラム、カウンタになってないじゃないかー。
おかしいなー。
画像1を参照のこと。
 
健一君(汗)
     
   
晴子さん
  やったー!
絶対そうなると思ったわ。
まんまとワタシの“ワナ”にはまってくれたわ。
 
     
     
  え〜っ。
そんな〜。
 
健一君(涙)
     

画像1 ソースコード1の実行結果

>>健一君のプログラムの何がいけなかったのか? 次ページで解明します!

  • 連載バックナンバー
  • 全記事インデックス
  • 組み込み開発トップ
  • MONOistトップ

スキルアップ/キャリアアップ(JOB@IT)

スポンサーからのお知らせ

- PR -
@IT Sepcial

震災関連・復興支援情報

震災関連・復興支援情報
@IT MONOist/EE Times Japan/環境メディアの製造業技術者向け3メディアを中心に、震災関連/復興支援情報を集めました

次世代エンベデッドコーナー

次世代エンベデッド
“次世代”の組み込み機器を開発するエンジニアを支援するコーナー。新潮流・新技術をインタビューやコラム、解説記事で分かりやすく紹介!

Windows Embeddedコーナー

Windows Embedded
Windows Embedded専門コーナー。Windows Embedded StandardやWindows Embedded CEをはじめとする「Windows Embedded」ファミリの最新動向や技術情報をお届けします!!

Androidコーナー

Android
Android専門コーナー。組み込みデバイスへの適用からアプリケーション開発、イベントレポート、ニュースなどAndroidに関するさまざまな技術情報がここに集結!!

@IT MONOist 求人情報

- PR -