由於之前是用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可用來單獨設定中斷是要高優先還是低優先。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 凱文先生的部落格 的頭像
    凱文先生的部落格

    凱文的八卦俱樂部小天地

    凱文先生的部落格 發表在 痞客邦 留言(0) 人氣()