MPLABX XC8 PIC16F84を使った例題3です。
今回は、TMR0のオーバーフロー割り込みを利用してRB3に接続したLEDを0.5秒ごとに点滅させます。
回路図です。
ブレッドボードは省略
プログラムです。「PICで遊ぶ電子工作」というサイトからのコピペです。参考にしたのは、こちらのページ。ありがとうございました。
クロックが10MHzなので、それに合わせてプリスケーラの値を変更しました。
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#define XTAL_FREQ 10000000
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
unsigned char T500mS; // 500mS経過フラグ
unsigned char cnt500mS; // 500mSカウンタ
void main() {
TRISB = 0b11110111; // RB3:output
/* クロックが10MHzなので、命令サイクル=1/10MHz*4=0.4us
* プリスケーラを1:32とするとTMRのオーバーフローは、
* 0.4*32*256=3276.8us=3.2768ms
*/
OPTION_REG = 0x84; // TMR0のクロックソースは、命令サイクルクロック、プリスケーラ1:32
TMR0 = 0x00; //TMR0クリア
INTCONbits.T0IE = 1;// TMR0割り込み許可
INTCONbits.GIE = 1; // 全体割り込み許可
TRISB = 0b11110111; // RB3:output
/* クロックが10MHzなので、命令サイクル=1/10MHz*4=0.4us
* プリスケーラを1:32とするとTMRのオーバーフローは、
* 0.4*32*256=3276.8us=3.2768ms
*/
OPTION_REG = 0x84; // TMR0のクロックソースは、命令サイクルクロック、プリスケーラ1:32
TMR0 = 0x00; //TMR0クリア
INTCONbits.T0IE = 1;// TMR0割り込み許可
INTCONbits.GIE = 1; // 全体割り込み許可
PORTB = 0x00;
cnt500mS = 153; // 3.2768mS*153=501mS
T500mS = 0; // 500mS経過フラッグクリア
T500mS = 0; // 500mS経過フラッグクリア
while(1) {
if (T500mS) {
T500mS = 0;
PORTB ^= 0x08; // RB3のLEDを点滅
}
}
if (T500mS) {
T500mS = 0;
PORTB ^= 0x08; // RB3のLEDを点滅
}
}
//割り込みサービスルーチン
}
}
void interrupt isr(void){
INTCONbits.T0IF = 0; // TMR0割り込みクリア
INTCONbits.T0IF = 0; // TMR0割り込みクリア
cnt500mS--; //counter ディクリメント
if (cnt500mS == 0) {
cnt500mS = 153; // 3.2768mS*153=501mS
T500mS = 1; // 500mSフラグセット
}
}
if (cnt500mS == 0) {
cnt500mS = 153; // 3.2768mS*153=501mS
T500mS = 1; // 500mSフラグセット
}
}
今回のトラブルシューティング
今回のプログラムをコンパイル(build)しようとすると割り込みサービスルーチン
void interrupt isr(void){
}
で、エラーが発生して、buildできません。
Webサイトを検索したり、福島マイコン愛好会のメーリングリスト(FMCA ML)で問い合わせても、原因が良く分かりませんでした。
2,3日MLでやりとりしていると、メンバーの一人から、「buildできたよ」という報告がありました。環境は、MPLAB X IDE v3.61とXC8 V1.42とのこと。
エラー発生時の私の環境は、MPLABX v5.05とXC8 v2.0でした。
ひょっとしてと思い、XC8のバージョンをv1.45に下げて、buildを試みました。
なんと、エラーも出ず、すんなりbuildできました。めでたしめでたし。
XC8 v2.0の不具合と思われます。こんなことってあるんですね。何でも新しけりゃ良いってものではないようです。