- - PR -
それではC言語によるタイマA割り込みプログラムを考えてみます。
C言語による割り込み処理ルーチンは、関数と同じ形式でコーディングします。割り込み処理ルーチンは、引数も戻り値もないので、
void 割り込み処理ルーチン名(void) |
となります。
しかし、割り込み処理ルーチンは特別なコードが必要なので、
void int_tima(void) __attribute__((interrupt_handler)); |
のように、「__attribute__((interrupt_handler))」を付けてプロトタイプ宣言します。するとCコンパイラは普通の関数と区別して、割り込み処理ルーチンとしてのコンパイルを行います。割り込み処理ルーチンの宣言は、Cコンパイラによって異なります。この方法はH8マイコン用GCC特有のものなので注意してください。
また、割り込み要求を0クリアするのは、割り込み処理ルーチンの仕事です。
IRR1 &= ~IRRTA; |
で、割り込み要求を解除してください。
次に、割り込み許可について説明します。
図6にH8マイコンの割り込みの仕組みを示します。
H8マイコンの周辺機能には、「割り込み要求フラグ」と「割り込みイネーブルビット」があります。割り込みイネーブルビットが「1」のとき、割り込み要求ビットが「1」にセットされると、CPUに対して割り込みが要求されます。割り込みイネーブルビットが「0」ならば、割り込み禁止です。つまり、割り込みイネーブルビットを「1」にセットしないと、割り込みは発生しません。
周辺機能からの割り込み要求は、割り込みコントローラで制御され、CPUに通知されます。
CPUの「コンディションコードレジスタ(CCR)」のIビットが「0」のとき、CPUは割り込みを受け付けます。Iビットが「1」のときは割り込みが保留されます。つまり、割り込み処理を実行するには、Iビットが「0」でなければなりません。
![]() |
図6 H8マイコンの内部割り込み |
それでは、タイマAの割り込みを許可しましょう。
IENTAビットは、「割り込みイネーブルレジスタ1(IENR1)」の第6ビットにあります(図7)。
IENR1を、
#define IENR1 (*(volatile unsigned char *)0xfff4) |
と定義し、IENTAビットを、
#define IENTA 0x40 |
と定義します。
IENTAビットに「1」をセットするには、
IENR1 |= IENTA; |
とします。これで、タイマA割り込みが発生するようになります。
![]() |
図7 割り込みイネーブルレジスタ1(IENR1) |
次に、CCRのIビットを操作します。
メモリ空間に配置されたレジスタは、ポインタによりC言語で操作できますが、CPUのレジスタはC言語で操作できません。このような場合、アセンブリ命令を直接記述します。
多くのマイコン用Cコンパイラでは、C言語の中にアセンブリ命令を組み込めるように言語仕様が拡張されています。
CPUのIビットを0クリアし、CPUが割り込みを受け取るようにするには、
asm("andc.b #0x3f,ccr"); |
とアセンブリ命令を実行させます。
同じように、Iビットをセットし割り込みを保留させるには、
asm("orc.b #0xc0,ccr"); |
とします。
プログラムは次のようになります(ソースコード3)。
/* 1秒間隔でカウント表示する。 |
| ソースコード3 |
| ▼ソースコード3のダウンロード(seccnt2.lzh) |
| ▼コラム(1): 割り込みベクタテーブル | |||||||||||||||||||||||||||||||||||||||||||||
|
H8マイコンは、割り込み要求に応じた処理を呼び出すために、「割り込みベクタテーブル(Interrupt Vector Table)」でアドレス管理しています。H8マイコンの割り込みベクタテーブルは0番地に配置されています。 割り込みベクタテーブルには、割り込み処理ルーチンのスタートアドレスが格納されています。その内容を表2に示します。 もし、タイマA割り込みが発生したならば、CPUは「0x0026」番地のデータをスタートアドレスとして、タイマA割り込み処理ルーチンに飛んでいきます。H8マイコンがリセットした場合も同様で、CPUは0番地のデータを「プログラムカウンタ(PC)」にセットし、そこから最初のプログラムの実行がはじまります。つまり、0番地にはスタートアップルーチンのアドレスが設定されているのです。
|
| ▼コラム(2): リンカスクリプトとC言語の割り込み処理ルーチン | ||||
H8用GCCにおいても、割り込みベクタテーブルは、きちんと管理されています。 リンカスクリプト「3664.x」ファイルをテキストエディタで開くと、
と記述された部分があります。実は、これが割り込みベクタテーブルの記述です。 例えばタイマA割り込みの場合、そのベクタ番号は「19」なので、その19行目を見ます。すると、
と記述されているので、タイマAの割り込み処理ルーチンの名前は「int_tima」であると分かるのです。そこに、もしint_tima関数があるならば、ベクタアドレスにint_tima関数を設定し、int_tima関数がなければ、スタートアップルーチンを設定すると記述されています。 |
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
晴子さんからの宿題(4) 0秒から59秒までカウントするプログラムを作ってね。左右2つの7セグメントLEDを使って、2けた同時に表示できないとダメよ!! |
◇
今回はH8マイコンの周辺機能の1つ、タイマAを使ってみました。タイマAはとてもシンプルで使い方も簡単です。マイコンのタイマは種類も豊富で、もっと多くの機能を持っています。ですから、実際にはさらに複雑なプログラムになることでしょう。
また今回は、割り込み処理についても解説しました。制御プログラミングで、割り込み処理は必修といえます。リアルタイムOSのように、割り込み処理を隠蔽(いんぺい)したり、処理プログラム間の協調動作をサポートするソフトウェアもありますが、今回はその基礎となる技術です。
次回のテーマは「7セグメントLEDのダイナミック点灯」です。お楽しみに!(次回に続く)
関連記事 半導体/エレクトロニクス
- 連載:イチから作って丸ごと学ぶ! H8マイコン道
- 特集:組み込みシステムに吹く“仮想化”の風
- 連載:組み込みマルチコア進化論(連載中)
- 連載:必修! FPGAタイミング解析の基礎(全5回)
- 連載:−ザ・組み込み−ソフトウェアのハードウェア化(連載中)
- 連載:S08ではじめるマイコン制御プログラミング(全6回)
- 連載:マイコン制御基礎の次(連載中)
- 連載:マイコン制御基礎の基礎(全10回)
- 連載:マイコン制御基礎以前(全10回)
- 連載:H8で学ぶマイコン開発入門(全13回)
- 連載:触って学ぼう FPGA開発入門(全6回)
- 連載:FPGA開発テクニック、チューニングの心得(全6回)
- 特集:いまさら聞けない FPGA入門
- 連載:バラして納得! 電子部品入門(全18回)
- 連載:完全マスター! 電子回路ドリル III(全14回)
- 連載:完全マスター! 電子回路ドリル II(全25回)
- 連載:完全マスター! 電子回路ドリル(全25回)
- 目指せ! 電子回路マスターへの道
- 目指せ! 電子回路マスターへの道 Part2
- 分かっておきたい、IP活用の落とし穴
組み込み開発フォーラム 新着記事
- フルスクラッチの“Hello World”を動かしてみよう(2011/3/31)
- FlexRayプロトコルの概要(その2)(2011/3/29)
- JASA、東北地域に拠点を置く会員企業を支援(2011/3/25)
- NEC、震災の影響を受けた4拠点の生産再開を発表(2011/3/23)
- 内部ブロック図の基礎と共通要素(2011/3/22)
- インテル、被災地におけるITインフラの復旧を支援(2011/3/22)
- Facts on AUTOSAR/AUTOSAR導入の現実(2011/3/18)
- 計測器・震災被害ホットラインを開設、テクトロニクス(2011/3/18)
- ZMP、地震の揺れを多角的に計測するアプリ無償配布(2011/3/16)
- メンター、3Dテレビ・マルチメディア検証プラットフォーム(2011/3/16)
- 【番外編】タチの良い計測値、悪い計測値とは?(2011/3/15)
- tarファイルシステムをAndroidに組み込む!!(2011/3/10)















