Пятница, Сентябрь 18, 2020

Пример 6.16 PIC18 Си стр219-Множественные прерывания

//приоритеты множественных прерываний
#include<p18cxxx.h>
#pragma config OSC=RC
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config BOR=OFF
#pragma config MCLRE=OFF

void MyHighInt(void);

#pragma interrupt MyHighInt
#pragma code high_vector=0x08
void high_vector(void){
    _asm GOTO MyHighInt _endasm
}

#pragma code
void Int0(void){
    INTCONbits.INT0IF=0;
    PORTBbits.RB7^=1;
}
void Int1(void){
    INTCON3bits.INT1IF=0;
    PORTBbits.RB6^=1;
}
void Int2(void){
    INTCON3bits.INT2IF=0;
    PORTBbits.RB5^=1;
}
void MyHighInt(void){
    if(INTCONbits.INT0IF){         //это прерывание на INT0?
        Int0();
    }
    else if(INTCON3bits.INT1IF){   //это прерывание на INT1?
        Int1();
    }
    else if(INTCON3bits.INT2IF){   //это прерывание на INT2?
        Int2();
    }
}

void main(void){
    ADCON1=0x7f;
    TRISB=0b0000111;
    
    RCONbits.IPEN=1;
    
    INTCON2bits.INTEDG0=0;         //объявление INT0 переключаемым по отрицательному перепаду сигнала
    INTCON2bits.INTEDG1=0;         //объявление INT1 переключаемым по отрицательному перепаду сигнала
    INTCON2bits.INTEDG2=0;         //объявление INT2 переключаемым по отрицательному перепаду сигнала
    
    INTCON3bits.INT1IP=1;          //объявление INT1 высокоприоритетным
    INTCON3bits.INT2IP=1;          //объявление INT2 высокоприоритетным
    
    INTCONbits.INT0IE=1;           //разрешение прерывания от INT0
    INTCON3bits.INT1IE=1;          //разрешение прерывания от INT1
    INTCON3bits.INT2IE=1;          //разрешение прерывания от INT0
    INTCONbits.GIE=1;              //разрешение высокоприоритетных прерываний
    PORTB=0;
    while(1){
    }
}

INTCON3



НАЗАД                                                                                                                                         ДАЛЕЕ


Back to Top