2010年12月1日水曜日

INTポートにスイッチを付けて割り込み-高優先割込-PIC18F2550


RB2/INT2に繋がっているスイッチを押すと割り込みが発生。
割り込みでRC1のLEDを点滅させる

/*
概要:外部割込みINT2を使ってみる

HID - Bootloaderを使った書き込み

マイコン:PIC18F2550

ファイル名:nain.c

開発環境:MPLAB C18

*/

#include <p18f2550.h>
#include <delays.h>
#include <portb.h>

void high_isr (void);
void low_isr (void);

// リセットベクタ  
#pragma code reset_vector=0x1000
extern void _startup(void);
void remapped_reset(void) { 
 _asm goto 
  _startup 
 _endasm
}

#pragma code

// 高優先割込み関連の記述 ====
#pragma code high_vector=0x1008
void high_interrupt (void) {
 _asm
  GOTO high_isr
 _endasm
}
#pragma code

#pragma interrupt high_isr
void high_isr (void) {
/* ここに高優先割込み処理を記述する */
                                 
        INTCON3bits.INT2IE = 0;   //外部割込みINT2の禁止
  INTCONbits.PEIE = 0;      //低位割込み禁止
  INTCONbits.GIE = 0;       //全割込み禁止
     
        INTCON3bits.INT2IF = 0;   // INT2の割込みフラグをリセット       

  LATCbits.LATC1 = !LATCbits.LATC1;//RC1のLED点滅点<->灯点滅
 
        INTCON3bits.INT2IE = 1;   //外部割込みINT2の許可
  INTCONbits.PEIE = 1;      //低位割込み許可
        INTCONbits.GIE = 1;       //全割込み許可
}

// 低優先割込み関連の記述 ====
#pragma code low_vector=0x1018
void low_interrupt (void) {
 _asm
  GOTO low_isr
 _endasm
}
#pragma code

#pragma interruptlow low_isr
void low_isr (void) {
/* ここに低優先割込み処理を記述する */

}

void main(void) {
        TRISB = 0b00000100;     // B portのRB2を入力モードに その他を出力モードに設定
        TRISC=0;                // ポートCをすべて出力ピンにする

        OpenRB2INT(PORTB_CHANGE_INT_ON &    //ポートRB2の外部割込みON
                   FALLING_EDGE_INT &       //立下りエッジでON
                   PORTB_PULLUPS_OFF        //Bポートの抵抗プルアップOFF
                                );
        RCONbits.IPEN = 1;      //割込み優先順位制御ON  (0:優先順位制御OFF)
        INTCON3bits.INT2IP = 1; //INT2の割り込みを高位割込みにセット(0:低位割込み)
        INTCON3bits.INT2IE= 1;  //INT2割込みの許可
  INTCONbits.PEIE = 1;    //低位割込み許可
        INTCONbits.GIE = 1;     //全割込み許可

        LATCbits.LATC1 = 1;    //電源投入でRC1のLED消灯

        while(1)
        {                       //通常の処理
         
         PORTCbits.RC0=1; //RC0ポートのLED点滅        
         Delay10KTCYx(0); //0=>256 48MHzで213.3 ms
         PORTCbits.RC0=0;
         Delay10KTCYx(0);
        }
}

0 件のコメント:

コメントを投稿