2012-04-12 58 views
2

我使用的是高科技型ANSI C編譯器和MPLAB v8.43一個PIC18F14K50。我的PIC代碼終於正常運行並正在工作,除了延遲功能外。這對我的應用程序至關重要 - 我需要它在特定的毫秒數,秒數或分鐘數的狀態。延遲的PIC18F

我一直在試圖找到這個約2周的解決方案,但一直不成功至今。我放棄了,並在asm("nop");的循環中編寫了自己的延遲函數,但是這給出了非常不可預知的結果。如果我告訴它等待半秒或5秒鐘,它就足夠準確。但是一旦我告訴它等待更長時間 - 比如10分鐘,延遲只會持續大約10 - 20秒,而2分鐘和更長的時間會比500毫秒的延遲更短。

這裏是我的配置保險絲和wait()功能:

#include <htc.h> 

__CONFIG(1, FOSC_IRC & FCMEN_OFF & IESO_OFF & XINST_OFF); 
__CONFIG(2, PWRTEN_OFF & BOREN_OFF & WDTEN_OFF); 
__CONFIG(3, MCLRE_OFF); 
__CONFIG(4, STVREN_ON & LVP_OFF & DEBUG_OFF); 
__CONFIG(5, 0xFFFF); 
__CONFIG(6, 0xFFFF); 
__CONFIG(7, 0xFFFF); 

void wait(int ms) 
{ 
    for (int i = 0; i < ms; i++) 
    for (int j = 0; j < 12; j++) 
     asm("nop"); 
} 

就像我說的,如果我叫wait(500)高達wait(30000)話,我會得到半秒到30秒延遲到耐性我感興趣內在 - 然而,如果我撥打wait(600000),那麼我不會像我所期望的那樣得到10分鐘的延遲,而是大約10-15秒,而wait(120000)不會給出2分鐘的延遲,而是快速眨眼。

理想情況下,我想獲得內置的__delay_ms()函數工作,並從我的wait()中調用,但是我沒有取得任何成功。如果我嘗試#include <delay.h>那麼我的MPLAB抱怨沒有這樣的文件或目錄。如果我看看我的高科技型樣品中delay.h,有定義的DelayUs(unsigned char)extern void DelayMs(unsigned char),我還沒有嘗試過,但是當我試圖直接把EXTERN到我的C代碼,我在聯得到一個未定義的符號錯誤。

中等延遲和長期拖延短期之間的差異是沒有意義的。我唯一的解釋是編譯器已經優化了NOP或其他東西。

就像我說的,這是與上述配置熔絲一個PIC18F14K50。我沒有很多PIC的經驗,但是我假設在這個設置下它運行在4MHz。

我很高興與來自庫或宏,或與NOP指令手寫功能的外部函數。我需要的只是每分鐘在幾秒鐘內精確到幾秒鐘。

回答

4

是PIC的16位微控制器?我的猜測是你的等待值溢出了,這會在2^15之後溢出(32,767是一個帶符號的16位int的最大值)。

+0

這聽起來很合理!我將更新代碼並查看會發生什麼。 – Ozzah 2012-04-12 04:39:17

+0

謝謝。我寫了一個'wait_sec(int sec)',它只是循環並執行'wait(1000)';多次。 :) – Ozzah 2012-04-12 05:16:04

3

如果您改變int變量unsigned,你可以去到65535ms。要走得更高,您需要使用long作爲參數類型,並將您的循環嵌套得更深。

1

一個更好的長期解決辦法是編寫使用內置的硬件定時器,在你的芯片的延遲功能。如果你有類似其他中斷觸發和使用一些CPU週期的事情,你的NOP延遲將不會很準確