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