新聞中心

        PIC——MCC18中斷寫法

        作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
        MPLABC18不自動把中斷服務(wù)程序放在中斷向量處。通常將GOTO 指令放在中斷向量處,從而把控制權(quán)轉(zhuǎn)交給相應(yīng)的中斷服務(wù)程序。

        PIC18系列的低優(yōu)先級中斷入口地址在0x0018地址,下面的代碼是在入口地址處放置一個向量函數(shù),這個向量函數(shù)里就是一個內(nèi)嵌匯編的GOTO指令,GOTO到低優(yōu)先級的中斷服務(wù)函數(shù)InterruptHandlerLow。

        //----------------------------低優(yōu)先級中斷入口-----------------------------------
        1#pragmacodeInterruptVectorLow=0x18//用#pragma偽指令定義一個名字叫InterruptVectorLow的段,并把這個段放到0x18地址起始的代碼空間
        2voidInterruptVectorLow(void)//低優(yōu)先級中斷向量函數(shù)
        3{
        4  _asm
        5  gotoInterruptHandlerLow//內(nèi)嵌匯編指令
        6  _endasm
        7}
        8#pragmacode//這里不是多余的,它是告訴連接器回到默認(rèn)的代碼段,如果不加的話,連接器就會傻傻地把后面的代碼緊跟著上面的代碼一直放下去。而LKR文件里定義了向量區(qū)最多到0x29地址,所以如果沒加此行通常會報錯
        9
        10#pragmainterruptlowInterruptHandlerLow//這里使用interruptlow這個關(guān)鍵詞來聲明InterruptHandlerLow這個函數(shù)是低優(yōu)先級中斷服務(wù)函數(shù),用了關(guān)鍵詞后,這個函數(shù)將會由編譯器自動產(chǎn)生基本的現(xiàn)場保護,并且這個函數(shù)的返回將是使用RETFIE返回的。
        11
        12
        13voidInterruptHandlerLow(void)
        14{
        15/*低優(yōu)先級服務(wù)函數(shù)的代碼寫在這里*/
        16}

        PIC18系列的高優(yōu)先級中斷入口地址在0x0008地址,下面的代碼是在這個入口地址處放置一個向量函數(shù),這個向量函數(shù)里就是一個內(nèi)嵌匯編的GOTO指令,GOTO到高優(yōu)先級的中斷服務(wù)函數(shù)InterruptHandlerHigh。

        本文引用地址:http://www.104case.com/article/201611/316959.htm

        //----------------------------高優(yōu)先級中斷入口-----------------------------------

        1#pragmacodeInterruptVectorHigh=0x08//用#pragma偽指令定義一個名字叫InterruptVectorHigh的段,并把這個段放到0x08地址起始的代碼空間
        2voidInterruptVectorHigh(void)//高優(yōu)先級中斷向量函數(shù)
        3{
        4  _asm
        5  gotoInterruptHandlerHigh//內(nèi)嵌匯編指令
        6  _endasm
        7}
        8#pragmacode//回到默認(rèn)代碼段,原因同上
        9#pragmainterruptInterruptHandlerHigh
        10
        11voidInterruptHandlerHigh(void)
        12{
        13/*高優(yōu)先級服務(wù)函數(shù)的代碼寫在這里*/
        14
        15  if(INTCONbits.TMR0IF)
        16  {//checkforTMR0overflow
        17INTCONbits.TMR0IF=0;//clearinterruptflag
        18 ;
        19    ;
        20  }
        21}

        對于MPLAB C18,上面的高低優(yōu)先級的中斷向量函數(shù)和中斷服務(wù)函數(shù),各只能出現(xiàn)一次,不能有多個中斷服務(wù)函數(shù),如果多個中斷都是高優(yōu)先級的,在高優(yōu)先級中斷服務(wù)函數(shù)里通過判斷各自的中斷標(biāo)志位來做對應(yīng)處理。

        CONbits.IPEN = 1; //使能中斷優(yōu)先級
        INTCONbits.GIEH = 1; //允許/禁止 所有高優(yōu)先級中斷
        INTCONbits.GIEL = 1; //允許/禁止 所有低優(yōu)先級中斷

        //RCONbits.IPEN = 0; //禁止中斷優(yōu)先級
        //INTCONbits.GIE = 1; //允許/禁止 所有中斷源
        //INTCONbits.PEIE = 1; //允許/禁止 所有外設(shè)中斷源


        當(dāng)IPEN=1時,中斷源使用高優(yōu)先級中斷時GIEH = 1;GIEL 可以=0;
        中斷源使用低優(yōu)先級中斷時GIEH = 1;GIEL =1;

        當(dāng)IPEN=0時,所有中斷均跳轉(zhuǎn)到08H(使用高優(yōu)先級中斷向量入口)
        GIEH = 1;GIEL =1;




        關(guān)鍵詞: PICMCC18中斷寫

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 文安县| 当涂县| 乌鲁木齐县| 葵青区| 大同县| 紫阳县| 手游| 静宁县| 保定市| 东海县| 永泰县| 宜丰县| 璧山县| 惠来县| 双流县| 武汉市| 如东县| 土默特右旗| 东莞市| 日照市| 廊坊市| 库尔勒市| 库车县| 蒙山县| 泰安市| 清原| 吴江市| 古蔺县| 稷山县| 安庆市| 遂溪县| 岗巴县| 密云县| 伊春市| 衡阳县| 甘孜县| 乃东县| 广安市| 宣武区| 湟中县| 新和县|