單片機(jī)型號(hào)是AT89LS52
現(xiàn)在的程序結(jié)構(gòu)是:
timer0:由蜂鳴器操作觸發(fā),觸發(fā)期間大概每0.3毫秒中斷一次,中斷服務(wù)函數(shù)處理少量蜂鳴器代碼(7行);
timer1:從系統(tǒng)啟動(dòng)到關(guān)機(jī)結(jié)束一直開啟,每2毫秒中斷一次,中斷服務(wù)函數(shù)處理代碼較多。
串口波特率:115200,由timer2產(chǎn)生; 中斷優(yōu)先級(jí)串口最高,也即設(shè)置IP=0X10; 串口接收數(shù)據(jù)以中斷方式,發(fā)送數(shù)據(jù)以輪詢方式。
出現(xiàn)的問題是:
當(dāng)timer0中斷觸發(fā)時(shí)(由蜂鳴器操作觸發(fā)),會(huì)嚴(yán)重影響串口通信,單片機(jī)在收到數(shù)據(jù)后要向上位機(jī)回復(fù)數(shù)據(jù),上位機(jī)每次都能收到數(shù)據(jù),但是收到的回復(fù)數(shù)據(jù)100次中會(huì)有30次左右為錯(cuò)誤數(shù)據(jù),最常見的是幀頭的首字符錯(cuò)誤(應(yīng)該為2,但是收到的為0)。
當(dāng)屏蔽掉timer0中斷后,只有timer1中斷和串口中斷工作,上位機(jī)還是會(huì)有收到數(shù)據(jù)錯(cuò)誤的問題,但錯(cuò)誤的次數(shù)大為減少,而且若精簡(jiǎn)timer1中斷服務(wù)函數(shù)中的代碼,錯(cuò)誤還會(huì)繼續(xù)下降。若將timer1中斷由2ms改為30ms一次后,再不會(huì)發(fā)生串口發(fā)送數(shù)據(jù)錯(cuò)誤問題。
我也是該開始接觸嵌入式編程,51也是第一次見,很多技術(shù)細(xì)節(jié)不甚清楚,那位仁兄有這方面的經(jīng)驗(yàn),還望不吝賜教,尤其是怎么理清這些中斷間的關(guān)系和干擾?還串口發(fā)送數(shù)據(jù)(輪詢方式)時(shí)要注意的關(guān)鍵問題等。
估計(jì)是中斷時(shí)序混亂問題,我已經(jīng)被困擾了2天了,很郁悶。
|