2014-05-21 71 views
0

我最近開始使用C和Im試圖弄清楚如何爲 PIC16F884做一個10ms延遲。從數據表中的公式我已經成功地創建了以下內容:使用20MHz晶體(初學者級別)在C中延遲

FOSC = 20MHz的和Toscx4 = 200ns的

如果我把一個預置100 => T = 100x200ns = 20US,並得到一個10毫秒延遲

爲10ms/20US = 500

將在C下面的代碼給我什麼進出口尋找(10ms的延遲)?假設我有所有的啓動代碼和變量。

void interrupt ISR(void){ 

    if(TMR0IF){ 
     TMR0IF=0; 
     counter++; 
    } 
    if(counter==100){ 
     delay++; 
     counter=0; 
    } 
} 

int main(void){ 

    TMR0=155; 

    if(delay>4){ 
    //any code 
    delay=0; 
    } 
} 

可能是一個壞榜樣,但希望你明白

+0

如果沒有看門狗定時器,您可以嘗試執行1秒(例如)延遲來自己測試。如果你的1秒延遲是準確的,你應該能夠將你的計數器減100,以延遲10毫秒。 –

回答

0

沒有,因爲在main()實際上從未等待的代碼,也不會實現一個延時。

假設中斷和定時器邏輯正確設置,你仍然會需要循環:

delay = 0; 
TMR0 = 155; /* Start timer. */ 
while(delay < 4) 
    ; /* Do nothing */ 
/* More code here, delay has expired */ 

另外,記得一定要delay一個volatile變量,因爲您從多個並行訪問它執行線程。

+0

我可以像while(1)那樣使用循環,並且在循環中使用if(delay> 4)嗎? – user3660570

+0

@ user3660570是的。你爲什麼不能? – unwind

0

如果你是一個真正的初學者,希望有一個工具,它可以幫助您計算定時器的設置,我建議你看看這個鏈接: http://www.mikroe.com/timer-calculator/

它產生settiing正常了很多不同的微控制器

的CCODE