上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
こんばんわ!
もはや寒くて死にそうなゆってぃです。
明日夜の都内の気温はなんと-6度らしいです。
こんなに寒いと、日本人が全員で上空に向かって扇風機を回したら、気圧が高くなってシベリア寒気団を食い止めることが出来ないかと真剣に考えてしまいます(笑)

さて、今日はPICマイコン講座第二回目です。
今日は前回のお知らせどおり、割り込み制御についてお話しますね。
でもその前に、ゆってぃのマイコンに対する自論をお話します。
「んなもん興味ねぇよハゲ!」
という方は、読み飛ばしてしまってください(笑)


まず言いたいこと。
組み込みシステムにおいて、割り込み制御はです。
これはいつも自信なさげなゆってぃでも断言することができます。でも、念のためフォントは小さくしておきます。

というのも、組み込み業界では必ずしも開発対象にOSが乗っているとは限りません。
OSが乗っていないということは、すなわちタスク管理をしてくれるカーネルがいないということで、(一般的には)複数のタスクを並列に実行することは出来ません。
ごくシンプルなシステムならそれでもどうにかなりますが、実際の製品ではそれでは済まない多くの仕様が要求される場合がほとんどです。

じゃ、なんでOS乗せないの?
という疑問は沸くと思いますが、OSを動かすためにはそれなりのCPUやROMやRAMが必要だったり、そもそもOS自体が有償だったりして、どうしてもコストが上昇しちゃうんですね。
また、ハード・ソフト開発の負荷も増えてしまいます。
売値が数万~数十万円のものでしたらわかりませんが、五千円前後レベルの電化製品では数百円のコスト増がかなりクリティカルに効いてきますからね。

話が脇にそれてしまいました(汗)

さて、割り込み処理とは、あらかじめ設定していた事象が発生した際に、現在の処理しているルーチンを一旦停止(退避)し、即座に割り込みハンドラとして記述していた処理が行われる制御をいいます。
割り込みハンドラとは、割り込み要求が発生した場合に行う処理のことを言います。
たとえば、1秒おきにLEDを点滅させたい場合などは、タイマー割り込みが1秒おきに入るようにセットしておき、その割り込みハンドラの中でLEDをペコペコさせれば良い訳です。割り込みハンドラで記述された処理が完了したら、それまでの処理に制御が戻ります。

言葉で説明するよりも、実際にプログラムを見てみましょう。
今回も、ターゲットデバイスは我らがPIC16F84Aです。
このマイコンにはタイマーモジュールが内蔵されており、タイマー割り込みを発生させることが出来ます。
そこで、前回はメインルーチンの中でLEDをペコペコ光らせましたが、今回は割り込みハンドラの中で光らせてみましょう。


#include "pic.h"

__CONFIG( FOSC_EXTRC & WDTE_OFF & PWRTE_ON & CP_ON);

void main(void){

 //すべての割り込み許可
 GIE = 1;

 //タイマー割り込みを禁止
 T0IE = 0;

 //TIMER0モジュールをタイマーとして使用
 T0CS = 0;

 //プリスケーラをTIMER0モジュール用にセット。
 PSA = 0;

 //CPUクロックを256分周
 OPTION_REG |= 0x07;

 //カウンタ値をリセット
 TMR0 = 0x00;

 //PORTBをすべて出力に。
 TRISA = 0x00;
 TRISB = 0x00;

 //タイマー割り込みを許可
 T0IE = 1;

 while(1);
}

void interrupt tc_int(void){

 //もし、タイマー割り込みなら…
 if(T0IF){
  T0IF = 0;
  PORTA ^= 0xff;
  PORTB ^= 0xff;
  return;
 }
}


今回は前回よりもちょっぴり長いですね。
前回と同じように、少しずつ説明していきます。
コンフィグレーションに関しては、前回説明させていただいたので割愛します。
まず

GIE = 1;

です。
このGIEというレジスタは、このマイコンの全ての割り込みにおける許可・非許可を選択するレジスタです。
1をセットすると許可、0をセットすると非許可になります。
こいつが割り込みはダメといったら、たとえ神様であっても割り込むことは出来ません。
このレジスタは起動時は0になっていますので、割り込み処理をするならば、このように1をセットしてあげる必要があります。

次は

T0IE = 0;

です。
T0IEは、タイマー割り込みの許可・非許可を選択するレジスタです(0で禁止、1で許可です)。
「おい、さっきのGIEと何が違うんだ?え?」
そう怒らないで下さい(涙)
GIEは、このマイコン全体の割り込みを取り仕切るレジスタです。
今回のT0IEは、タイマーに関しての割り込みを取り仕切るレジスタです。
つまり、GIEが「割り込みしてもいいよ」と言っても、T0IEが「でも、タイマーは割り込みしちゃダメね」といったら、割り込みは発生しないわけです。

会社でもあるでしょ?
社長が
「私服通勤を可とする!」(GIE = 1)
と言っても、人事部の部長が
「でも、人事部はスーツしかダメね」(T0IE = 0)
と言ったら、人事部の社員は私服で出勤しちゃダメなんです。
このマイコンも、そういうことです。

どうしてこれから使うタイマー割り込みをここで禁止するかというと、まだタイマー割り込みの初期設定が終わってないからです。
一般的に、使用する割り込みの設定を行っている最中は、その割り込みを念のため禁止します。
ですので、今回もまずはタイマー割り込みを禁止しています。(設定後に解除します)

次は

T0CS = 0;

です。
T0CSは、タイマーをどのように使用するか選択するレジスタです。
今回のように0をセットすると、通常のタイマーとして使用できます。
1をセットすると、RA4/T0CKI端子に入ってきた信号のカウンタになります。
詳細はデータシートの19ページをご覧下さい。


さて、眠いので続きはまた後日追記します!!
ごめんなさい!!

-----

2012/02/05

ごめんなさい、ソースコードを少し改良しました。
また、ソースコード上のコメントが微妙に間違っていたので訂正しました。
関連記事
スポンサーサイト
コメント
はじめまして、情報処理の勉強をしていてこちらにたどり着きました。
割り込み処理、とても楽しく学ばせていただきました!
Re: タイトルなし
> 師子乃 さん

大昔の記事にも関わらず、コメントを下さりありがとうございます^^
情報処理の勉強、頑張ってくださいね~!
コメントの投稿
トラックバック URL
トラックバック
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。