/********************************************************* MPLAB-C18テストプログラム No9 割込みのテストNo2  優先順位を使わない複数割込みのテスト   タイマ0とタイマ1を両方とも割込みで使用する 機能   アイドルループ:0.5秒間隔でLED1を点滅   タイマ0   :0.1秒間隔でLED2を点滅   タイマ1   :1秒間隔でLED3を点滅 ********************************************************/  #include // PIC18C452のヘッダ・ファイル #include // タイマ関数のヘッダ・ファイル #include #include //********* コンフィギュレーションの指定 #pragma romdata config=0x300000 unsigned char rom _CONFIG0 = _CP_OFF_0; unsigned char rom _CONFIG1 = _OSCS_OFF_1 & _HS_OSC_1; unsigned char rom _CONFIG2 = _BOR_ON_2 & _BORV_45_2 & _PWRT_ON_2; unsigned char rom _CONFIG3 = _WDT_OFF_3; unsigned char rom _CONFIG5 = _CCP2MX_OFF_5; unsigned char rom _CONFIG6 = _STVR_ON_6; //******************************************************** //***** 変数、定数の定義 unsigned char cnt=4; // cnt,cnt2はLED更新周期用カウンタ unsigned char cnt1=5; //****** メインプログラム void main(void) // メイン関数 { TRISC=0; // ポートCをすべて出力ピンにする OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_256); // タイマ0の設定, 8ビットモード, 割込みを使う, //内部クロック、1:256プリスケーラ OpenTimer1(TIMER_INT_ON & T1_8BIT_RW & T1_SOURCE_INT & T1_PS_1_8 & T1_OSC1EN_OFF); //タイマ1の設定,8ビットモード,割込み使用 //内部クロック,1:8プリスケーラ //***** 割込み許可 周辺割込みと全体割込み INTCONbits.PEIE=1; INTCONbits.GIE=1; // 割り込みをイネーブルにする //***** メインループ(アイドルループ) while(1) { PORTCbits.RC0=1; //LED1を0.5秒間隔で点滅 Delay10KTCYx(100); PORTCbits.RC0=0; Delay10KTCYx(100); } } //***************************************************************** //****** 割込みの定義(優先レベルなし) #pragma interrupt isr save = PROD //***** 割込みベクタへジャンプ命令セット #pragma code isrcode = 0x8 void isr_direct(void) // 割り込みベクタから割り込み関数へ跳ぶための関数 { _asm goto isr _endasm } //**** 割込み処理関数 #pragma code void isr(void) // 割り込み関数 { if(INTCONbits.T0IF){ // タイマ0割り込み? INTCONbits.T0IF=0; // タイマ0割り込みフラグを0にする if(--cnt==0){ // cntを-1して結果が0? cnt=4; // cntにLEDの更新周期を書き戻す if(PORTCbits.RC1) PORTCbits.RC1=0; //LED2を0.1秒間隔で点滅 else PORTCbits.RC1=1; } } if(PIR1bits.TMR1IF){ // タイマ1割り込み? PIR1bits.TMR1IF=0; // タイマ1割り込みフラグを0にする if(--cnt1==0){ // cnt1を-1して結果が0? cnt1=5; // cnt1にLEDの更新周期を書き戻す if(PORTCbits.RC2) //LED3を1秒間隔で点滅 PORTCbits.RC2=0; else PORTCbits.RC2=1; } } }