PIC12F509中的TMR0程序計數器,用以下寫法(C語言)
...
OPTION=0xC3;/250*16=4MS/
...
IF (TMR0>250)
COUNT++;
...
IF (COUNT>250)
{SECOND++;
COUNT=0;}
...
按照4MS*250=1S則程序實現的是1秒的計時.
但如果在下面程序的情況下:
...
OPTION=0xC3;/250*16=4MS/
...
VOID TM()
{IF (TMR0>250)
COUNT++;
IF (COUNT>250)
{SECOND++;
COUNT=0;}}
...
VOID DELAY()
{UNSIGNED INT I;
I=255;
WHILE(I--);
}
...
VOID MAIN()
{WHILE(1);
{ DELAY();
TM();
DELAY();}}
會出現因為DELAY的時間長而忽略掉某個TMR0的溢出,從而使得SECOND的定時出現誤差,這種情況下應該如何處理?特別是當這個DELAY()必須的時候.
關于PIC12F509的定時計數器的問題
全部回復(2)
正序查看
倒序查看
@whatcall
看你的用法可知PIC12F509沒有定時器的中斷功能.既然Delay()會過長影響你的計數檢查,為何不把TM()放到DELAY()中,此時注意DELAY的延時增加(指令多了不少),如下:VOIDDELAY(){UNSIGNEDINTI;I=255;WHILE(I--) TM();}請查一下PIC12F509的Stack深度是否滿足函數的兩級調用.
關鍵是PIC12F509最多支持兩層嵌套,所以不能把TMR0的計數子程序加入DELAY()中,如果直接寫進去呢,如:
DELAY()
{UNSIGNED INT I;
WHILE(I--)
{ IF (TMR0>250)
COUNT++;
IF (COUNT>250)/計數值到一秒跳出
I=0;
}
}
這樣會不會影響DELAY()延時的精度?
如采用509的內部晶振方式,有一個OSCCAL參數值校正,每個芯片都要在燒錄前先讀取數值嗎?如不用的話如何校準TMR0的值?(官方的資料說509的內部晶振誤差在5%)
DELAY()
{UNSIGNED INT I;
WHILE(I--)
{ IF (TMR0>250)
COUNT++;
IF (COUNT>250)/計數值到一秒跳出
I=0;
}
}
這樣會不會影響DELAY()延時的精度?
如采用509的內部晶振方式,有一個OSCCAL參數值校正,每個芯片都要在燒錄前先讀取數值嗎?如不用的話如何校準TMR0的值?(官方的資料說509的內部晶振誤差在5%)
0
回復