TOP>MPLAB XC8編(PIC12F675)> (03)LEDを点滅させる(TMR0割込み,PIC12F675 XC8)
LEDを点滅させる − TMR0割込み −
(PIC12F675 XC8)
更新日2012.5.20
|
作成日2008.10.5
|
LEDの点滅実験その2です。
前のページと同様0.5秒毎にLEDを点滅させますが、待ち時間はTMR0割込みにより作ります。
実験回路
|
・ |
|
|
今回の実験回路は、前のページと全く同じです。
クロックも内部4MHzです。
LEDと直列の抵抗は、300〜800Ω程度の範囲であれば明るさが変わるだけで点灯は確認できます。
-
-
- ブレッドボードに組んだ状態
-
| | 右下の6ピンヘッダ周りは、回路図には有りませんがICSP(In-Circuit Serial Programming)用です。秋月のPICライタなどを使う場合は不要です。
|
|
TMR0割込み
|
|
(1)割込み処理手続き
-
割込み処理の手続きは以下のように定義します。赤字部分はこの通りに記述し、それ以外は任意です。
static void interrupt intr(void) {
| | 割込み発生時の処理
| } |
|
割込みの種類によらず全ての割込みに共通です。
今回はTMR0割込みしか使いませんが、複数の割込みを使う場合は処理の先頭で、どの割込みが発生したかを判定して処理を振り分ける必要があります。
(2)TMR0割込みの設定
-
- TMR0割込みは次のように設定します。
-
- クロックは4MHzですので、1命令の時間は1uSです。
-
クロック | 4MHz
| 1命令 | 1uS ((1秒/4MHz)×4)
|
- 従って、TMR0割込みの周期は以下のようになります。
-
- TMR0割込みを61回カウントすれば、約500mSになります。
-
(3)TMR0割込みのレジスタ設定
-
- TMR0レジスタ
- 8ビットのカウンタで、1命令サイクル毎に+1されます。(プリスケーラで変更できます)
最初に設定した値からカウントアップが始まります。
そして、最大値の255から0に戻る時にTMR0割込みが発生します。
今回は、初期処理で0をセットし、後は設定しません(フリーラン)。
結果として、256カウント毎に割込みが発生します。
- OPTIONレジスタ
- OPTIONレジスタの構成は以下のようになっています。
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| ^GPPU | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0
| 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0
|
TMR0割込みで使用するビットについて説明します。
T0CS | TMR0クロックソース選択ビット 1=RA4/T0CKIピンの入力 0=内部命令サイクルクロック(今回は0にします)
| PSA | プリスケーラ割り当てビット 1=プリスケーラはWDTへ割り当て 0=プリスケーラはTMR0へ割り当て(今回は0にします)
| PS2-PS0 | プリスケーラレート選択ビット
PS2-PS0 | 倍率
| 000 | 2
| 001 | 4
| 010 | 8
| 011 | 16
| 100 | 32
| 101 | 64
| 110 | 128
| 111 | 256
|
TMR0レジスタをカウントアップする命令サイクル数を設定します。
今回は、プリスケーラとして32を使いますので、設定値は100です。
|
- INTCONレジスタ
- INTCONレジスタは割込みの種類毎に、割込みの有効/無効を設定します。
また、割込み発生時は、どの割込みが発生したかを判断できるように割込みフラグがセットされます。
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
| GIE | PEIE | T0IE | INTE | GPIE | T0IF | INTF | GPIF
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0
|
TMR0割込みで使用するビットは以下の3つです。
GIE | グローバル割込みイネーブルビット 1=全てのマスクされていない割込み発生を許可する 0=全ての割込み発生を禁止する
| T0IE | TMR0割込みイネーブルビット 1=TMR0割込みを許可する 0=TMR0割込みを禁止する
| T0IF | TMR0割込みフラグビット 1=TMR0割込みが発生した(ソフトウェアでクリア要) 0=TMR0割込みが発生していない
|
|
プログラム
|
|
プログラムの各ブロックで行っている処理は以下通りです。
- main
- PICの初期化(pic_init)を行った後、0.5秒毎にGPIO4,5を点滅させます。
0.5秒の時間は、TMR0割込み処理で設定する500mSフラグにより判断します。
- pic_init
- PICの初期化処理を行います。
使わないコンパレータとA/D変換を無効にして、GPIO4,5を出力に設定し、TMR0割込みの初期設定を行います。
- intr(割込み処理)
- TMR0割込みの処理を行います。
割込み毎に500mSカウンタを+1し、61になったら500mSフラグを立てます。
- 注意事項
-
PIC12F675は、リセット時にコンパレータとA/D変換機能が有効になっています。
このままでは、各ピンをデジタル入出力として使えませんので、初期処理で以下の設定を行っておきます。
-
CMCON = 0x07; | // コンパレータ未使用
| ANSEL = 0x00; | // AN未使用
|
|