PSoC1 中斷控制

PSoC比較常用的中斷為GPIO中斷。GPIO中斷大多數的情況是需要接收使用者按下按鍵所觸發的中斷。另外一種中斷是各個使用者模組中(User Module, UM)提供的中斷功能。可能我的作品數量還不夠多,經驗還不是很足夠,UM提供的中斷功能目前還不是很常用到。以下就以這兩種中斷功能做介紹:

[前置作業]

先到PSoC Designer的Project\Setting...\Chip Editor\ 勾選"Enable interrupt generation control"。這個預設已經打開了。

再來就是在main.c裡面,要加上
M8C_EnableGInt;
開啟這個程式的中斷功能。
不過要注意的是,宣告變數需要在執行"M8C_EnableGInt;"之前先做好,不然會在編譯的時候出錯。

[中斷方法一:GPIO中斷]

程式碼加上這一行啟用GPIO中斷:
M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);

將想要做為按鍵的GPIO腳位啟動中斷功能(預設是DisableInt),可以選用訊號的下緣觸發(Falling Edge)、上緣觸發(Rising Edge),或是電壓準位只要有變動就觸發(ChangeFromRead)
不過通常按鍵的做法都是平常的時候GPIO以電阻上拉,按鍵按下為GPIO接地。所以這個時候可以選擇驅動方式為Pull UP(同時省掉一顆上拉電阻)並且中斷方式為Falling Edge

[中斷方法二:使用者模組提供中斷]

例如PWM的需要在每個周期結束的時候接發送中斷,這時候需要在使用者模組(User Module, UM)中,將InterruptAPI啟用中斷功能(預設是disable)

[接收中斷後續動作]

中斷接收後,系統將要有進一步處理中斷的動作。只要中斷一觸發,main()中執行的動作將被中斷並且跳到對應中斷該有的動作,這個動作稱之為interrupt service routine(ISR),在PSoC也可以用C function來實現。

要寫ISR的C function需要將以上兩種中斷方法擇一開啟後,PSoC designer才會產生相對應的.asm檔案進行接下來的步驟。

例如,如果要啟用GPIO中斷,需要像上面所說的將想要開啟中斷的腳位設定中斷(FallingEdge, RisingEdge, ChangeFromRead)。設定好之後,執行一次編譯的動作,這個時候會發現檔案瀏覽器會多一個PSoCGPIOINT.asm的檔案。

又例如,如果要啟用使用者模組中斷,需要像上面所說的將使用者模組中的interruptAPI設定成Enable。定好之後,執行一次編譯的動作,這個時候會發現檔案瀏覽器會多一個xxxx_INT.asm的檔案。xxxx代表的是使用者模組,例如範例中使用PWM模組,就會產生PWM8_1INT.asm檔案。

如果都沒問題的話,就可以開始準備寫ISR的function了。

以下是ISR在main.c中的寫法:
#pragma interrupt_handler myISR //與include一樣,放在程式前端。這裡取名ISR為"myISR"

void myISR(void) { 
//中斷發生後需要處理的動作
}

接下來開啟相對應的.asm檔案(例如PSoCGPIOINT.asm),並找到下面的文字,補上紅色部分,這樣整個PSoC1中斷控制部分就完成了。

;@PSoC_UserCode_BODY@ (Do not change this line.)
;---------------------------------------------------
; Insert your custom code below this banner
;---------------------------------------------------
 ljmp _myISR
;---------------------------------------------------
; Insert your custom code above this banner
;---------------------------------------------------
;@PSoC_UserCode_END@ (Do not change this line.)
 reti

參考資料: http://www.cypress.com/?id=4&rID=36720

留言

這個網誌中的熱門文章

樂高像素拼圖之照片像素化教學

照片的後製觀點

Temperature logger