?? time_over.txt.txt
字號(hào):
[原創(chuàng)]數(shù)據(jù)接收時(shí)檢測(cè)時(shí)間是否溢出的方法!
大家經(jīng)常使用到用MCU來接收外部發(fā)送的波形,如接收方波、計(jì)算波形頻率、紅外接收等,如果數(shù)據(jù)出現(xiàn)長(zhǎng)期的高電平或低電平,我們將作如何處理?現(xiàn)總結(jié)幾種個(gè)人常用的方法,很可能此舉是班門弄斧,各位見笑了。
1)利用看門狗,在合適的程序處喂狗,一旦數(shù)據(jù)長(zhǎng)期高或低則系統(tǒng)復(fù)位;此舉簡(jiǎn)單易用,但很多產(chǎn)品要求當(dāng)出現(xiàn)無數(shù)據(jù)時(shí)必須給出提示,也可能系統(tǒng)復(fù)位時(shí)要求顯示一個(gè)“歡迎XX”之類的提示符,那么此時(shí)用WDT來做似乎就不是那么的好了。
2)建立一個(gè)子函數(shù)來檢測(cè)數(shù)據(jù)是否溢出,此舉相對(duì)來說比較麻煩,因?yàn)榻邮找欢螖?shù)據(jù)其數(shù)據(jù)位可能是N位,也就是說我們得在這N個(gè)地方分別調(diào)用這個(gè)子函數(shù)來檢測(cè)數(shù)據(jù)是否發(fā)生了時(shí)間溢出,不太實(shí)用。
其一可用一個(gè)“循環(huán)超時(shí)”來做:
unsigned int counter="0";
while(沒有有效數(shù)據(jù) && ++counter)
;//沒有有效數(shù)據(jù)時(shí)等待
if(counter==0)
{
do something;//等待接收時(shí)超時(shí)
return;
}
do otherthing;//有效數(shù)據(jù)到來
其二可在定時(shí)中斷里定義一個(gè)time_counter值,每次中斷其值加1,當(dāng)加到一定值時(shí)置TIME_OVER_FLAG標(biāo)志為1,在主接收程序中檢測(cè)TIME_OVER_FLAG是否為1,另外接收程序中一檢測(cè)到有效數(shù)據(jù)時(shí)必須清time_counter的值;
timerx_ovf_interrupt()//定時(shí)中斷函數(shù)
{
if(++time_counter==COUNTER_MAX);
{
time_counter=0;
TIME_OVER_FLAG=1;
}
}
.....
check_data()//檢測(cè)數(shù)據(jù)
{
if(收到一個(gè)有效數(shù)據(jù))//主程序
{
do sth..;
time_counter=0;
}
else if(TIME_OVER_FLAG)//如果時(shí)間溢出
{
do sth....;//說明時(shí)間溢出了
}
}
3)利用定時(shí)中斷,溢出將出錯(cuò)處理函數(shù)段的pc壓入堆棧,覆蓋原有堆棧,定時(shí)中斷函數(shù)一檢測(cè)到時(shí)間溢出時(shí),則將溢出將出錯(cuò)處理函數(shù)段的pc覆蓋原有堆棧中的pc值.以下為本人在應(yīng)用在Sonix上的一例:
;定時(shí)中斷檢測(cè)TIME_COUNTER是否溢出
INCMS TIME_COUNTER
JMP EXIT_Isr;沒有溢出退出
MOV A,#0X86
B0MOV STKP,A;一檢測(cè)到溢出則復(fù)位堆棧地址為初始值
MOV A,#TIME_OVER$M;將出錯(cuò)處理程序的pc壓入堆棧,使程序跳出中斷時(shí)執(zhí)行 ;出錯(cuò)處理程序
B0MOV STK0H,A
MOV A,#TIME_OVER$L
B0MOV STK0L,A
;同樣,此程序必須在主程序中一檢測(cè)到有效數(shù)據(jù)則清TIME_COUNTER的值,此方法簡(jiǎn)單實(shí)用,經(jīng)本人測(cè)試暫沒發(fā)現(xiàn)問題,但可能其適用范圍有限。因?yàn)檫M(jìn)入中斷時(shí)不知壓了幾層堆棧,也不知主程序跑到哪了?我用此法的場(chǎng)合是:主程序接收數(shù)據(jù)+中斷數(shù)碼管顯示+蜂鳴器報(bào)警。
-------------------------------------------------------------------
以上為本人的一點(diǎn)經(jīng)驗(yàn),忘各路英雄拍磚!!
系統(tǒng)分類: 單片機(jī) | 用戶分類: | 來源: 原創(chuàng)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -