2013-09-24 88 views
0

我正在使用SDCC編譯器。在定時器中斷中斷期間重新配置定時器8051

我想要實現的是在模式2自動重新加載時,在自己的中斷處理程序中重新配置Timer0。下面是C代碼:

void reconf(void) __interrupt(1){ 
    TR0=0; 
    TH0=0xC0; 
    TL0=0xC0; 
    TR0=1; 
} 

這裏的問題:

  1. 是否有可能自己的中斷處理程序執行期間重新配置TL0和TH0,定時器0在模式2自動重載模式?

  2. 重新配置期間是否需要停止Timer0,因爲它在中斷期間沒有運行?

  3. 在中斷例程 啓動之前,TH0和TL0值是否被壓入堆棧?如果將這些值壓入堆棧,然後在例程處理程序執行過程中重新配置這些值,這些值是否會從中斷退出時從堆棧彈出的值覆蓋 ?

+0

我查看了編譯C代碼後由sdcc生成的HEX文件,看起來TH0和TL0在執行任何中斷例程之前沒有被壓入堆棧。 – distortedbsd

+0

而且,我試圖通過它的中斷例程來重新配置timer0,它可以工作。 – distortedbsd

回答

1

解決你的問題之前,我認爲這是值得指出的是什麼TR0TH0TL0是。它們是而不是變量局部於函數或坐在堆棧上(假設您有一個調用堆棧,大多數8051應用程序不會查找內存覆蓋)。這些是特殊功能寄存器,通常縮寫爲SFR。您可以read more about SFRs,但出於您的問題的目的,您可以將其視爲範圍透視圖中的全局變量。

  1. 您可以修改TL0TH0寄存器在任何時候,包括定時器0外設的中斷處理程序中。

  2. 沒有必要停止定時器來修改它的值,但要注意它會在你這樣做的時候繼續計數。這可能是一個問題,如果你正在編寫,只要低位字節翻轉,你可能會得到一個不同於你打算的計時器值。

    <previous code> // Timer increments to 0x12fe 
    TH0 = 0xff;  // Timer is now 0xffff 
           // Timer increments to 0x0000 
    TL0 = 0x52;  // Timer is now 0x0052 
           // Timer increments to 0x0053 
    

    您試圖將計時器設置爲0xff52,但您以0x0052結束。這是一個極端的例子,但風險在那裏。編寫TL0後跟TH0可以降低風險,但關閉計時器是最簡單的解決方案。

  3. 由於您現在知道TL0TH0是具有全局作用域的SFR,所以您不必擔心堆棧或任何其他函數參數傳遞機制會干擾它們。