發表文章

目前顯示的是 2013的文章

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檔案進行接下來的步驟。

Bitwise TRUE and FLASE

今天發現的錯誤,底子太弱了。找到問題之後接下來就順多了。 這個敘述句不能正常執行我想要的動作 if (( PRT0DR & 0x40 ) != 0) 但是換成下面這一行就可以了 if (( PRT0DR & 0x40 ) == 1) 當時一直把0與1當作是布林代數,後來才想到既然操作元是bitwise的操作,自然後面也要跟著是bitwise的形式而不能是布林代數。(PSoC的&是bitwise AND, &&才是logic AND) 所以if (( PRT0DR & 0x40 ) == 1 ) 要改成 if (( PRT0DR & 0x40 ) == 0x40 ) 才會得到預期的動作。