2015-09-04 23 views
1

我目前正在使用3.2768   MHz振盪器編程PIC16F883。我需要在正確的時間使一些LED閃爍,但這在這裏真的不相關。PIC16F883定時器將不起作用

問題是,已經設置Timer0,但它不工作。我將在這裏發佈我的代碼和初始化,以便您可以看到:)。順便說一下,我在MpLap IDE中進行編程,使用Hi-Tech C編譯器在普通C語言中進行編程。

初始化:

T0CS = 0x00;   //Set Timer0 to Timer-Mode 
GIE = 0x01;    //Enable all interrupts 
PSA = 0x00;    //Prescaler enable 
PS0 = 0x01;    //Prescaler set 
PS1 = 0x00;    //Prescaler set 
PS2 = 0x01;    //Prescaler set 

中斷服務子程序:

void interrupt timer() 
{ 
    T0IF = 0x00;    //Reset timer 
    millicounter++;   //Add one to the helper variable 
    PORTA = 0x00; 

    if (millicounter == 25) //Check if one second has passed. 
    { 
     millicounter = 0; //Reset helper variable 
     seconds++;   //Add one to elapsed seconds. 
    } 
} 

的問題是,它並不像定時器運行。現在我已經用不同的設置對不同的時間進行了程序模擬,最近當中斷正在運行時打開一個引腳,然後再次打開主引腳。問題是它從未發生過。計時器沒有運行,我想。爲什麼?

+1

如果我記得很清楚,你必須設置'T0IE = 1;' – LPs

+0

我發現[這](http://ww1.microchip.com/downloads/en/DeviceDoc/51702A.pdf)很好的教程 – LPs

+0

在正確的時間使LED閃爍真的*是*相關的。構建代碼時 - 這是您的第一個參考點。在這種情況下,定時器中斷會使其閃爍。如果速度太快,請使用計數器掩碼或從慢速計時器開始。 –

回答

3

您已經設置了全局中斷使能位。但是要使定時器中斷工作,您還需要設置定時器中斷允許位(T0IE)。

從您的定時器寄存器值和晶振頻率,您的「秒」變量將以每秒256次遞增。即如果您使用此「秒」變量來提供閃爍延遲,則您的LED亮時間將近3.9毫秒。人眼無法檢測到這種快速閃爍。

+0

不幸的是,我已經嘗試過,仍然沒有任何作品,任何其他的想法? –

+0

看來你的計時器配置是正確的。您可以嘗試使用仿真器(如picsimulatorIDE或Proteus)來確保配置值在適當的寄存器中正確寫入。還要確保你的配置位設置正確。忘記禁用看門狗定時器時,它不需要用於困擾我很多。 – sreeyesh

0

謝謝你的幫助,我有計時器工作。我刪除了我的整個配置並重寫了計時器,現在它工作正常。我有另一個問題,我寫了一個新的職位:)檢查出來,如果你想。

New Post