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

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

割り込みテクニックでタイマを使おう

横田 一弘 埼玉県立新座総合技術高等学校 教諭 2010/1/26

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

- PR -

前回のあらすじ

――晴子さんの“ワナ”にはまりつつも、何とかスイッチ入力にかかわるプログラミング、プログラムによるチャタリング対策までを理解した健一君。マイコン制御プログラミングの奥深さを肌で感じ、その面白さに気が付きはじめたようです。さて、今回は晴子さんのどんなスパルタが待ち受けているのでしょうか? そして、今度こそ宿題で満点を取れるのでしょうか? 頑張れ健一君! 前回へ

 さて、そろそろ健一君の授業が終わるころですが……。


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

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

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

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

H8Tinyのタイマを使おう

ここは健一君が所属する大学のサークル部屋。また、いつもの足音が聞こえてきました……。
     
  あー。今日も疲れた。  
健一君
     
   
晴子さん(ニヤリ)
  またどうせ居眠りしていたくせに!!
ところで、今回はワタシの宿題ちゃんとやってきたわよね。
 
     
     
  へへっ〜。
カウント表示くらい簡単、簡単!
 
健一君(笑)
     
   
晴子さん
  あら今回はずいぶん自信があるのね。
じゃあ、健一君のプログラム見せてよ。
 
     
     
  ほいっ。  
健一君(笑)
     
   
晴子さん(怒)
  どれどれ……。
ちょっと! 何これ!!
タイマ”を使っていないじゃないの。
これじゃあ正確な時間を刻むのは無理よ!
 
     
     
  え〜。
やっぱりダメか……。
 
健一君(暗)
     
   
晴子さん
  は〜。
仕方ない。今日もはじめるわよ!
 
     

――あらあら健一君、今回も晴子さんにダメ出しを食らっています。でも何の解説もなしに「タイマ」を使うのは、健一君でも大変です……。ということで、今回は時計用ベースのタイマである「タイマA」について解説します。

 それでは、前回同様、健一君が作ってきたプログラムを見てみましょう(ソースコード1)

/*  1秒間隔でカウント表示する。
 *
 */
#define PCR5 (*((volatile unsigned char *)0xffe8))
#define PDR5 (*((volatile unsigned char *)0xffd8))
#define PCR8 (*((volatile unsigned char *)0xffeb))
#define PDR8 (*((volatile unsigned char *)0xffdb))


void wait(long);


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


    PDR5 = 0xfe;
    PCR5 = 0x03;
    PCR8 = 0xff;


    count = 0;
    PDR8 = LED[count];
    for (;;) {
        wait(500000);
        if (count < 9)
            count++;
        else
            count = 0;
        PDR8 = LED[count];
    }
    return 0;
}


void wait(long times)
{
    while (--times) ;
}
ソースコード1 健一君が作ったプログラム
ソースコード1のダウンロード(seccnt0.lzh

 なるほど、健一君のプログラムではwait関数を使いCPUの処理時間を浪費することで1秒間隔のカウント表示を実現しています。50万カウントで約1秒というわけですね。

 wait関数のような空ループはマイコン制御のプログラムでCPUの処理を一定時間待機したいときによく用いる手法です。しかし、この手法では“正確な”待機時間を得るのは難しいでしょう。それに、Cコンパイラによって生成するコードは異なるので、50万カウントで約1秒さえも保証できません。

 そこで、晴子さんが話していた「タイマ」の登場です。

 晴子さんの宿題(3)のように、制御プログラムでは“周期的な処理”を行うことが多いので、すべてのマイコンといっていいほど、マイコンには「タイマ機能」が搭載されています。

 それでは、「H8/3664」のタイマを使って晴子さんの宿題(3)を問いてみましょう。

 H8/3664には表1のように3つのタイマが搭載されています。今回使用するのは時計向きの「タイマA」です。

表1 H8/3664に搭載されているタイマ
名称
機能
タイマA
インターバルタイマ/時計用タイムベース機能を内蔵した8ビットのタイマ
タイマV
外部イベントのカウントが可能な8ビットタイマ。コンペアマッチ信号により任意の周期割り込み要求、任意のデューティ比のパルス出力などが可能
タイマW
アウトプットコンペア機能、インプットキャプチャ機能を内蔵した16ビットのタイマ。外部イベントのカウントが可能なほか、任意のデューティ比のパルス出力が可能な多機能タイマ

 図1にタイマAの機能を示します。

図1 タイマAの機能イメージ

 タイマAの中核は8ビットのアップカウンタ(TCA)で、TCAに供給するクロックを選択することで周期的なイベントを発生させる機能を持っています。

 タイマAは、16MHzのシステムクロックと32.768kHzの時計用サブクロックの2種類のクロック源を持ち、それぞれのクロックは分周器によって周波数が分周されます。

 TCAは入力されるクロックによりカウントアップされ、カウンタ値が「255」になった後、クロックが入力されると、「タイマA割り込み要求フラグ(IRRTA)」が「1」にセットされます。

>>次ページでは、C言語によるタイマAの制御について解説する!

  • 連載バックナンバー
  • 全記事インデックス
  • 組み込み開発トップ
  • 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 -