close
由於之前是用MCC寫周邊程式都是用polling的方式,現在特別寫一篇關於中斷的使用,使用ADC當作範例
其設定方式如下,
打開MCC設定完ADC後,照下圖勾選"Enable ADC Interrupt"

最後按下Generate去產生Code
但MCC只是建立好部分中斷初始化程式,要使用前還需要家幾段程式
在main.c內,取消mark
line 75,
line 78

但是這樣只是把中斷給打開,還沒有完成ADC的中斷
要完成ADC中斷,需要在main.c加上啟動ADC

另外真正取ADC值的程式是放在void ADC_ISR(void)內,此位於adc.c

這邊我驗證使用PICkit 3在Debugger模式下去試,可以正確動作了。
這邊順便研讀一下PIC18F45K22的datasheet關於Interrupt部分
PIC18F4XK22有許多中斷源以及有一個中斷優先特性,可以設置大部分的中斷源為高優先或低優先
注意:
INT0沒有priority bit可設置,所以永遠是高優先
高優先中斷向量位於0008H,而低優先中斷向量位於0018H
高優先中斷向量將能夠中斷正在處理的低優先中斷向量
有19各registers用來操作中斷
INTCON,INTCON2,INTCON3
PIR1,PIR2,PIR3,PIR4,PIR5,
PIE1,PIE2,PIE3,PIE4,PIE5,
IPR1,IPR2,IPR3,IPR4,IPR5,
RCON
一般來說,中斷源有三個bit用來控制這些動作,他們是
Flag bit,用來指示有中斷事件發生
Enable bit,當這個bit被設,將會允許程式跳到中斷向量地址
Priority bit,用來選擇高優先或低優先
Mid-Range Compatibility
預設狀態下,IPEN bit是被清掉,中斷優先feature是被關閉的
在Compatibility mode,那IPRx register的interrupt priority bits是沒有影響的。
Register INTCON的PEIE/GIEL bit是這global interrupt enable是針對peripherals
Register INTCON的GIE/GIEH bit是這global interrupt enable是針對non-peripheral的中斷源和關閉所有中斷源包含peripherals
當GIE/GIEH被set,而PEIE/GIEL被清掉,表示只關閉peripheral interrupt
Interrupt Priority
要使用中斷優先feature是藉由設定RCON register內的IPEN bit。
當中斷優先feature被啟動,Compatibility mode下的GIE/GIEH,PEIE/GIEL

Datasheet關於Interrupt的意思我的理解若是沒有設置IPEN bit(位於RCON),則是一種稱為compatibility mode,在此mode下
所有中斷源沒有分優先,一律都走Low Priority Interrupt (0008H),所以ADC中斷的PATH這樣走,如果沒有設置GIE及PEIE bit
就沒辦法觸發中斷。

如果IPEN bit(位於RCON)有被設,則Compatibility mode則被取代成GIEH High Priority及GIEL Low Priority ,而IPRx可用來單獨設定中斷是要高優先還是低優先。
全站熱搜