割り込みは、ハードウエアの要因で、対応する関数を実行する機能です。Windowsのプログラムにおけるイベント処理はこの割り込み機能を拡張した概念です。
割り込み処理を利用することで、main() での処理とは別の処理を並行して実行することができます。たとえば、動的な表示をしながら、シリアルからデータを受信し表示を行うことが可能になります。
enable_interrupts(RTCC_ZERO); enable_interrupts(GLOBAL);
#INT_RTCC
rtcc_int(){ }
enable_interrupts(INT_TIMER1);で許可を行い、割り込み関数の指示として
#device PIC16F84 //PICの指定
#include <16f84.h>
#int_rtcc //タイマ0割込みの指定
rtcc_isr() { //タイマ0割込み処理関数
} //ここまでが割込み処理関数
main() {
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //タイマ0のモード設定
enable_interrupts(RTCC_ZERO); //タイマ0割込み許可
enable_interrupts(GLOBAL); //グローバル割込み許可
while(1){ ..} //割込み待ち
}
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); set_timer1(prd); enable_interrupts(INT_TIMER1); //タイマ1割込み許可 enable_interrupts(GLOBAL);
#int_timer1
void timer1_isr()
{
set_timer1(prd); //次の割り込み設定
}
#include <16f873a.h>
#fuses HS,NOWDT,NOLVP
#use delay(CLOCK=20000000) //クロック20MHz
int flag;
//音階の周期 ララ#シドド#レレ#ミファファ#ソ ソ#ララ#シド ド#レレ#ミ
// 0 2 3 6 5 6 7 8 9 10
unsigned long onkai[30]=
{62695,62854,63005, 63147,63281,63407,63527,63639,
63746,63847,63941,64031,64115,64195,64270,64341,
64408,64471,64531,64587,64641,64691,64738,64783,
64825,64865,64903,64938};
unsigned long prd;
//メロディー ラ シ ドレミファソラ
int melody[30]={0,2,3,5,7,8,10,12,14,15,17,19,20,22,24,26,27};
int i,oto;
#int_timer1
void timer1_isr()
{
output_bit(PIN_C0,flag);
if (flag==1) flag=0; else flag=1;
set_timer1(prd);
}
void main(){
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
set_timer1(10);
enable_interrupts(INT_TIMER1); //タイマ0割込み許可
enable_interrupts(GLOBAL);
while(1){
for(i=0;i<17;i++){
oto=melody[i];
prd=onkai[oto];
set_timer1(prd);
delay_ms(500);
}
disable_interrupts(INT_TIMER1);
delay_ms(500);
enable_interrupts(INT_TIMER1);
set_timer1(65000);
}
}
シリアル受信割り込みの例です。873Aを利用し、ハードウエア受信を設定します。#int-rda で受信割り込み関数を定義します。
ここではハイパーターミナルから受信した文字を返し、さらに、count の値を送ります。ハイパーターミナルの画面は次のようになります。
#int-rda は受信専用で、送信用の送信可能の割り込みは #INT_TBE で指定します。
#include <16f873A.h>
#fuses HS,NOWDT,NOLVP,put,brownout //内部クロック、WDT,LVPなし
#use delay(CLOCK=20000000)
#use RS232(BAUD=9600,xmit=PIN_C6,rcv=PIN_C7)//use delayの後に配置する
//#use RS232(BAUD=9600,xmit=PIN_B2,rcv=PIN_B1)//use delayの後に配置する
int count;
char ch;
#int_rda
void rda_isr(){
ch=getchar();
putchar(ch);
printf("%d",count);
}
void main(){
set_tris_b(0x0b);
count=0;
printf("\n\rHello");
//enable_interrupts(int_ext);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(1){
count++;
delay_ms(500);
}
}
ext_int_edge( H_TO_L );で選択できます。