標(biāo)題: STC8單片機(jī)串口2中斷后程序運(yùn)行變慢 [打印本頁(yè)]

作者: 溫柔的郎    時(shí)間: 2022-2-11 11:39
標(biāo)題: STC8單片機(jī)串口2中斷后程序運(yùn)行變慢
各位大神,我在學(xué)校STC8A8K64S4A12單片機(jī),用到串口2中斷通信,
屏蔽掉中斷程序時(shí),其他程序運(yùn)行速度很快,但一旦投入中斷程序,且下載進(jìn)去,程序進(jìn)入串口2中斷程序時(shí),整個(gè)程序運(yùn)行就變得很慢很慢了,
這是哪的問(wèn)題。空(qǐng)有明白的大神指點(diǎn)指點(diǎn)。「兄x感謝!!
我用的串口2中斷程序如下
void commIntProc(void) interrupt 8
{


  if (!S2RI) return;//S2RI串口2接收中斷請(qǐng)求標(biāo)志位
        S2CON &= ~S2RI;//S2RI不能位操作。復(fù)位串口2接收中斷請(qǐng)求標(biāo)志位
        //S2RI = 0;//這樣操作錯(cuò)誤。復(fù)位串口2接收中斷請(qǐng)求標(biāo)志位


        a3++;//顯示累計(jì)進(jìn)入中斷的次數(shù)
        receTimeOut = 100;
        receBuf[receCount] = S2BUF;
                //S2CON=S2CON & 0xfe;//清零接收標(biāo)志位S2RI
        receCount ++;
        receCount &= 0x1f;                // 最多只接收32個(gè)字節(jié)數(shù)據(jù)
}


為了能證實(shí)進(jìn)入中斷,我在中斷程序里放了個(gè)a3++的指令(如上代碼a3++;),a3值顯示在OLED屏上,明顯能看出這個(gè)a3在大幅度的變化。
可以確定程序進(jìn)入了中斷程序,而且頻繁進(jìn)入中斷,導(dǎo)致a3不停的高速自加,所以屏才顯示a3的數(shù)值大幅度變化的。
后來(lái),我在后面加入了行清零指令,就是S2CON=S2CON & 0xfe;//清零接收標(biāo)志位S2RI這行,但還是沒(méi)有啥效果,
請(qǐng)有明白的大神指點(diǎn)指點(diǎn)。「兄x感謝!
我的屏顯示a3如下


OLED觀察如下





作者: TEC    時(shí)間: 2022-2-11 13:38
為什么會(huì)頻繁進(jìn)入串口接收中斷?要檢查一下其它代碼。因?yàn)槟愕某绦蝾l繁執(zhí)行中斷函數(shù),所以其它的功能運(yùn)行就受到影響了。
作者: lkc8210    時(shí)間: 2022-2-11 14:45
void commIntProc(void) interrupt 8
{
  if (!S2RI) return;//S2RI串口2接收中斷請(qǐng)求標(biāo)志位
//下略。。。
}
S2RI在STC8.h里#define 為0x01(314行), 可以算是常數(shù)

當(dāng)串口2有收到數(shù)據(jù)時(shí), 串口2中斷標(biāo)志(SCON2位0)置位
進(jìn)入串口2中斷,if(!S2RI) => if(!0x01) => 永遠(yuǎn)為真-> return 跳出串口2中斷
但是串口2標(biāo)志(SCON2位0)沒(méi)有被清零,立刻再次進(jìn)入串口2中斷
不斷循環(huán)

修改方法在我的貼子中已經(jīng)回答
但正被admin審查中



作者: Y_G_G    時(shí)間: 2022-2-11 16:25
if (!S2RI) return;
這就是錯(cuò)的
串口2的中斷標(biāo)志位不能位尋址
只能用 if ((SCON2&S2RI)來(lái)進(jìn)行判斷





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1