各位大侠,我现在做了一个44B0驱动彩色LCD的项目,串口通信协议中是采用超时来判断一帧数据的结束,我用了一个定时器中断+一个超时计数来判断超时与否,但不知道为什么,虽然大多数情况下都可以正常判断帧的结束,但是有时就判断不出来,以至于把两个甚至三帧算作一帧数据,我判断最有可能是定时器的中断出了问题,不让为什么在不接收串口数据的情况下,超时计数会达不到超时时间呢?但是为什么定时器会出现不稳定呢,我很迷惑,请各位高手帮忙诊断一下,下面是这段三个中断服务程序和定时器初始化程序,Timer0为超时计算,Timer2用于定时键盘扫描:<br />void __irq UartIsr(void)<br />{<br /> rINTMSK|=BIT_GLOBAL|BIT_URXD0;<br /> rI_ISPC|=BIT_URXD0;<br /> if (RevFlag)<br /> {<br /> TimerCount=0;<br /> RevBuffTemp[RevCountTemp++]=rURXH0;<br /> }<br /> else<br /> {<br /> if (rURXH0==0xAA)<br /> {<br /> RevFlag=1;<br /> RevCountTemp=0;<br /> FrameOverFlag=0;<br />// TimerStart(0);<br /> }<br /> }<br /> rINTMSK&=~(BIT_GLOBAL|BIT_URXD0);<br />}<br /><br />void __irq Timer0Isr(void)<br />{<br /> rINTMSK|=BIT_GLOBAL|BIT_TIMER0;<br /> rI_ISPC|=BIT_TIMER0;<br /> if (RevFlag)<br /> TimerCount++;<br />/* if (((TimerCount++)>=TimeOutValue)&&RevFlag)<br /> {<br /> TimerCount=0;<br /> RevFlag=0;<br /> FrameOverFlag=1;<br />// TimerStop(0);<br /> }*/<br /> rINTMSK&=~(BIT_GLOBAL|BIT_TIMER0);<br />}<br /><br />void __irq Timer2Isr(void)<br />{<br /> rINTMSK|=BIT_GLOBAL|BIT_TIMER2;<br /> rI_ISPC|=BIT_TIMER2;<br /> KeyFlag=1;<br /> rINTMSK&=~(BIT_GLOBAL|BIT_TIMER2);<br />}<br />/************************Timer***********************************/<br />void TimerInit(U8 TimerNum,U8 Prescale,U8 Mux)<br />{<br /> switch (TimerNum)<br /> {<br /> case 0:<br /> rTCFG0&=0xffffff00;<br /> rTCFG0|=Prescale;<br /> rTCFG1&=0xfffffff0;<br /> rTCFG1|=Mux;<br /> rTCON&=0xffffff00;<br /> rTCON|=0x8;<br /> rTCMPB0=0;<br /> rTCNTB0=0x1;<br /> rTCON&=0xffffff00;<br /> rTCON|=0xA;<br /> rTCON&=0xffffff00;<br /> rTCON|=0x8;<br /> break;<br /> case 1:<br /> rTCFG0&=0xffffff00;<br /> rTCFG0|=Prescale;<br /> rTCFG1&=0xffffff0f;<br /> rTCFG1|=(Mux<<4);<br /> rTCON&=0xfffff0ff;<br /> rTCON|=(0x8<<8);<br /> rTCMPB1=0;<br /> rTCNTB1=0x3E8;<br /> rTCON&=0xfffff0ff;<br /> rTCON|=(0xA<<8);<br /> rTCON&=0xfffff0ff;<br /> rTCON|=(0x8<<8);<br /> break;<br /> case 2:<br /> rTCFG0&=0xffff00ff;<br /> rTCFG0|=(Prescale<<8);<br /> rTCFG1&=0xfffff0ff;<br /> rTCFG1|=(Mux<<8);<br /> rTCON&=0xffff0fff;<br /> rTCON|=(0x8<<12);<br /> rTCMPB2=0;<br /> rTCNTB2=0x3E8;<br /> rTCON&=0xffff0fff;<br /> rTCON|=(0xA<<12);<br /> rTCON&=0xffff0fff;<br /> rTCON|=(0x8<<12);<br /> break;<br /> case 3:<br /> rTCFG0|=(Prescale<<8);<br /> rTCFG1=(Mux<<12);<br /> rTCON=(0x8<<16);<br /> rTCMPB3=0;<br /> rTCNTB3=0xA;<br /> rTCON=(0xA<<16);<br /> rTCON=(0x8<<16);<br /> break;<br /> case 4:<br /> rTCFG0=(Prescale<<16);<br /> rTCFG1=(Mux<<16);<br /> rTCON=(0x8<<20);<br /> rTCMPB4=0;<br /> rTCNTB4=0xA;<br /> rTCON=(0xA<<20);<br /> rTCON=(0x8<<20);<br /> break;<br /> case 5:<br /> rTCFG0=(Prescale<<16);<br /> rTCFG1=(Mux<<20);<br /> rTCON=(0x4<<24);<br /> rTCNTB5=0xA;<br /> rTCON=(0xA<<24);<br /> rTCON=(0x8<<24);<br /> break;<br /> default:<br /> break;<br /> }<br />} |
|