簡體   English   中英

在定時器中斷中斷8051期間重新配置定時器

[英]Reconfigure timer during timer interrupt interrupt 8051

我正在使用SDCC編譯器。

我要實現的是在其自己的中斷處理程序中以模式2自動重載方式重新配置Timer0。 這是C代碼:

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

這里是問題:

  1. 在其自身的中斷處理程序執行期間,是否可以在模式2自動重載模式下為Timer0重新配置TL0和TH0?

  2. 是否需要在重新配置期間停止Timer0或是否因為中斷期間未運行而停止它?

  3. 在中斷程序啟動之前,TH0和TL0值是否已壓入堆棧? 如果將這些值壓入堆棧,然后在例程處理程序執行期間重新配置這些值,那么從中斷退出時,堆棧中的POPed值會覆蓋這些值嗎?

在解決您的問題之前,我認為有必要指出TR0TH0TL0是什么。 它們不是函數局部變量,也不是位於堆棧上的變量(假設您有一個調用堆棧,大多數8051應用程序都沒有-而是查找內存覆蓋)。 這些是特殊功能寄存器 ,通常縮寫為SFR 您可以閱讀有關SFR的更多信息 ,但出於問題的考慮,可以從范圍角度將其視為全局變量。

  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,所以您不必擔心堆棧或任何其他函數參數傳遞機制會干擾它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM