功能:<br /> 定时器0工作于16位定时模式,没有使用预分频器,每次定时中断时间约20ms,18次中断后把一状态标志(变量dddd)置1,主程序循环检测变量dddd,发现其值为1,则发一脉冲,并清除标志。<br /><br />问题:<br /> 长时间用示波器观察,程序执行一段时间后,脉冲消失,经过一段时间后有恢复。 <br /> 请大家帮忙分析一下原因。谢谢!<br /><br /><br />程序代码如下:<br /><br />#include "p18f45j10.h"<br /><br />void InterruptH_isr(void);<br /><br />void init_board(void)<br />{<br /> LATA=0x18;<br /> TRISA=0x00;<br /> T0CON=0x08;<br /> TMR0H=0x28;<br /> TMR0L=0x30;<br /> INTCON=0x20;<br /> RCONbits.IPEN=1;<br /> INTCON2bits.TMR0IP=1;<br />}<br /><br />volatile unsigned char dddd;<br /><br />void main(void)<br />{<br /> init_board();<br /> T0CONbits.TMR0ON=1;<br /> INTCONbits.GIEH=1;<br /> while(1)<br /> {<br /> if(dddd)<br /> {<br /> dddd=0;<br /> PORTAbits.RA1=0;<br /> PORTAbits.RA1=1;<br /> }<br /> }<br />}<br /><br />#pragma code InterruptVectorHigh=0x08<br /><br />void Interrupt_High(void)<br />{<br /> _asm<br /> goto InterruptH_isr<br /> _endasm<br />}<br />#pragma code<br /><br />#pragma interrupt InterruptH_isr<br />void InterruptH_isr(void)<br />{<br /> static unsigned char cnt20ms=0;<br /> if(INTCONbits.TMR0IF)<br /> {<br /> INTCONbits.TMR0IF=0;<br /> TMR0H=0x28;<br /> TMR0L=0x30;<br /> cnt20ms++;<br /> if(cnt20ms==18)<br /> {<br /> dddd=1;<br /> cnt20ms=0;<br /> }<br /> }<br />}<br /> |
|