會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





PIC18F67K22,用GPIO數pulse
高級會員
註冊日期:
2008/04/13 16:02
所屬群組:
註冊會員
文章: 117
等級: 9; EXP: 84
HP : 0 / 221
MP : 39 / 7392
離線
最近有一個需求,須要計數外面的pulse,原本是用INT腳來接,設好edge之後拿Timer取值就行了

但INT腳因為要拿去做別的功能,變成只能用一般的GPIO,如RB4、RB5
我試了一下好像不行,IO反應速度不夠的感覺

我須要抓大約0 - 1.5 KHz的pulse,請問一般的IO有機會嗎?

1月08日 09:16:21
轉換PDF檔 列印


Re: PIC18F67K22,用GPIO數pulse
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1030
等級: 28; EXP: 34
HP : 0 / 683
MP : 343 / 24558
離線
還有IOC可以用

PORTB Interrupt-on-Change

1月08日 09:29:03
轉換PDF檔 列印


Re: PIC18F67K22,用GPIO數pulse
高級會員
註冊日期:
2008/04/13 16:02
所屬群組:
註冊會員
文章: 117
等級: 9; EXP: 84
HP : 0 / 221
MP : 39 / 7392
離線
謝謝指導啦,原來還有這東西,以前都不知道…

我試了一下,真的可以用,只要打開
RBIE,配RBIF在中斷接就可以了

搜尋過程中,找到這一篇
主要因為中斷進去之後要讀取PORTB來清除,因指令執行順序,在頻繁變化時,有時會讀到還沒更新的值

這篇給的處理方式:

if (INTCONbits.RBIE && INTCONbits.RBIF)
{
   
LastKnownPORTB = PORTB; // clear the mismatch to enable RBIF to be cleared.
   
INTCONbits.RBIF = 0;
   
LastKnownPORTB = PORTB; // read and save the new state of PORTB.
}


給大家參考一下啦

1月08日 11:44:01
轉換PDF檔 列印


Re: PIC18F67K22,用GPIO數pulse
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14807
等級: 73; EXP: 53
HP : 1088 / 1813
MP : 4935 / 81559
離線
有没有想過用 Capture Module 來算 Pulse 的時間?

1月08日 18:42:45
轉換PDF檔 列印


Re: PIC18F67K22,用GPIO數pulse
高級會員
註冊日期:
2008/04/13 16:02
所屬群組:
註冊會員
文章: 117
等級: 9; EXP: 84
HP : 0 / 221
MP : 39 / 7392
離線
我目前只是要計算一秒內有幾個pulse,所以有進INT就遞增一下counter,然後每秒拿出來就行了

這個功能也可以用CCP做?

1月09日 09:18:18
轉換PDF檔 列印


Re: PIC18F67K22,用GPIO數pulse
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14807
等級: 73; EXP: 53
HP : 1088 / 1813
MP : 4935 / 81559
離線
"計算一秒內有幾個pulse"?

這當然可以用 Capture Module 來完成的。
因為 Capture 可以設定進來的 Pulse 的 Trigger 是上升緣還是下降緣的觸發,或是這次是測量上升緣至下降緣的時間,這些都可以設定的。

因為量測的輸入時間較慢,所以 Time Base (Timer1/3/5) 的設定可以配合 Fosc/4 的除頻輸入 + 內建的 1:8 Prescale 來降速。這樣就可以算出最低的測量時間為多少。

如果輸入 Pulse 更慢的話,可以配合啟動 Timer 1/3/5 的中斷來配合計算。 在每次 Capture 抓完後將 Timer 歸零,這時開始抓氣輸入的變化。如果 Input Pulse 改變時,Timer 已經中斷過五次,且目前 Capture 的值為 1000 的話。

如果使用 32MHz Fosc, Timer 的計數頻率為 1MHz (32MHz/4/8 = 1mHz).
所計算出的 Pulse 時間為:

1MHz x ( 65536 x 5 + 1000)
1uS x 328680 = 0.328680 mS 的 Pulse 輸入。

1月09日 10:40:27

Ryang 於 2019年01月09日 11:00:24
轉換PDF檔 列印


Re: PIC18F67K22,用GPIO數pulse
高級會員
註冊日期:
2008/04/13 16:02
所屬群組:
註冊會員
文章: 117
等級: 9; EXP: 84
HP : 0 / 221
MP : 39 / 7392
離線
版大這個方法看起來流程是:
- 開Timer中斷
- 開Capture中斷

1. 計數Timer中斷次數
2. Capture中斷時,讀出目前Timer值,與(1)一起算出兩個pulse的間隔時間,再清除計數值

不過我目前不須要用到pulse的時間長度,所以感覺是capture中斷時計數,另一個Timer數一秒,把capture累計值拿出來就行了,和原本的INT或IOC感覺也差不多

目前心得是以後如果有IO腳的話,可以先挑有INT, IOC, 或CCP的PING,這樣如果突然要數信號才有中斷可以用…

1月10日 15:21:30
轉換PDF檔 列印


Re: PIC18F67K22,用GPIO數pulse
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14807
等級: 73; EXP: 53
HP : 1088 / 1813
MP : 4935 / 81559
離線
基本上是這樣:

輸入是低速訊號,100Hz 以下可以用 I/O 腳的 Interrupt on pin change 功能,INT,或直接用 I/O Polling 的方式處理。

如輸入訊號頻率較高的話,就要考慮使用 Timer, Capture 等周邊。

如在高一點的輸入可以啟動內建的預除器來協助降速。

1月10日 15:44:26
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2019 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project