Re: 如何寫一個 delay_us() function?
|
||||
---|---|---|---|---|
資深會員
|
依 Ryang 的建議,我參考 C:\MCC18\src\traditional\delays\d10tcyx.asm 已經改出了一個 delayus() function. 如前封信的內容。
Ryang, foxjan, thanks for your help. C18 Library 有提供 delay functions, 例如 Delay1TCY(), Delay10TCYx(), Delay100TCYx() ...,不過這些 delay functions 都是以 instruction cycles 為單位。我有點好奇,為什麼 C18 Library 沒有提供以時間為單位的 delay functions 呢? 如果有 delay_ms(), delay_us() 這兩個 functions 的話,應該會帶給使用者很大的方便。 PS: 我在網路上查詢,發現 CCS C Compiler 好像有提供 delay_ms(), delay_us() functions.
發表於: 2010/1/8 11:48
|
|||
|
Re: 如何寫一個 delay_us() function?
|
||||
---|---|---|---|---|
資深會員
|
參照:
1.請先算出1個指令時間多長(因為指令執行時間是由OSC除頻來的) 2.請在副程式段使用組語編譯,這樣要延遲幾個指令時間可以精準算出來,如果要很精準請連呼叫前後的指令時間一併計算 3.要看出TATAL 跑了那些指令 可以在BUILD之後點出VIEW的DISASSEMBLY LISTING 選項,這樣跑了那些指令 你會一目了然 4.c的好處是你前端給需求,他後面都幫妳做好,但是菜怎麼出來的,不知道,組語的壞處是一個蘿蔔一個坑,好處是做了什麼,心裡有"數"
發表於: 2010/1/8 9:58
|
|||
|
Re: 如何寫一個 delay_us() function?
|
||||
---|---|---|---|---|
資深會員
|
哈,直接拿 C:\MCC18\src\traditional\delays\d10tcyx.asm 來改,多加了幾行 NOP,然後變成一個 delayus function for 4550 (48MHz),雖然很笨,不過有效 ^o^
DELAYUSCODE CODE
發表於: 2010/1/6 20:57
|
|||
|
Re: 如何寫一個 delay_us() function?
|
||||
---|---|---|---|---|
版主
|
C18 有提供一些 Delay 函數但都是用組語寫的,參考一下C:\MCC18\src\traditional\delays 裡的 Source Code。
delayus(1); // delay 1 microsecond 用 while 迴圈做,似乎太長了。可以考慮用 In-Line Assembly + C 的方式來完成。
發表於: 2010/1/6 17:28
|
|||
|
Re: 如何寫一個 delay_us() function?
|
||||
---|---|---|---|---|
資深會員
|
Hi Ryang,
Thanks for your reply. Sorry, 可能我表達的不清楚,讓您誤會了。我並不是要測量程式執行的時間。我的疑問是要怎麼寫一個 delayus() function,可以讓我這樣使用:
delayus(1); // delay 1 microsecond
如下,我是簡單寫成一個迴圈,但是用 SIM 測量發現迴圈佔用太多指令週期,delayus() 很不準確:
// Delay in 1 us (approximately) for 48 MHz Internal Clock
還是說得用 assembly 改寫 delayus() ?
發表於: 2010/1/6 17:02
|
|||
|
Re: 如何寫一個 delay_us() function?
|
||||
---|---|---|---|---|
版主
|
用 MPALB SIM 軟體模擬測量程式執行的時間最準,準到毫秒不差(理想狀態)。作法是: Debug Mode 選 MPLAB SIM 後再選 Setting 中的 OSC 設成你所使用的頻率後,用 Stopwatch 配合斷點的設定及按Mouse 右鍵選 Set Course to Here 後量一下程式的執行時間就可以知道了。
發表於: 2010/1/6 16:10
|
|||
|
如何寫一個 delay_us() function?
|
||||
---|---|---|---|---|
資深會員
|
Hi,
我在寫一支程式,想要增加兩個 delay functions: 一個用來 delay miliseconds,另一個用來 delay microsecods,延遲時間皆由傳進來的參數決定。底下是我寫出來的版本,目前遇到一個困難,delay() 誤差還算在可接受的範圍,但 delayus() 因為本身 loop 執行就要一些時間,會造成誤差,實際量測,delayus(1) = 3.58us,delayus(2) = 4.75us... 請問 delay microseconds 要怎麼寫才會比較精準呢? 我用的是 C18 and PIC18F4550。
// Delay in 1 ms (approximately) for 48 MHz Internal Clock
發表於: 2010/1/6 14:40
|
|||
|