各位大虾,我想用TMR0定时1S,TMR1计数。<br /><br />思路是电路4M晶振,256分频,所以16次TMR0溢出得到1S延时。 <br /><br />TMR0采用查询方式,等待1S后调用读取TMR1计数,送上位机。<br /><br />写了段程序。<br /><br />现在的情况是程序运行后,上位机一直显示00 似乎没有计数值。<br /><br />请教是什么原因。<br /><br />CESU<br /> BSF STATUS,RP0 ;选体1<br /> CLRF T1CON<br /> CLRF TMR1L ;清除TMR1计数内容<br /> CLRF TMR1H<br /> MOVLW 07H ;定义TMR0的工作方式<br /> MOVWF OPTION_REG ;TMR0分频比1:256<br /> BCF STATUS,RP0 ;选体0,用以定义TMR1工作方式<br /> MOVLW 0X06 ;设置控制寄存器,预分频比为1:1<br /> MOVWF T1CON ;外部时钟源、异步<br /> BCF INTCON,T0IF ;清TMR0溢出标志位<br /> MOVLW .12 ;开启TMR0<br /> MOVWF TMR0 <br /> BSF T1CON,TMR1ON ;开启TMR1<br /><br />LP1 <br /> BTFSS INTCON,T0IF ;检测是否发生TMR0溢出<br /> GOTO LP1 ;未发生TMR0溢出,跳转到LP1,等待溢出<br /> BCF INTCON,2 ;清空溢出标志位<br />LP2 <br /><br /> BTFSC TMR0,0 ;检测TMR0的末位<br /> GOTO LSB_1 ;末位为1,跳转到LSB_1<br />LSB_0: <br /><br /> BTFSS TMR0,0 ;末位为0,继续检测TMR0的末位<br /> GOTO LSB_0 ;末位仍为0,继续检测<br /> GOTO CHANGE ;末位变1,跳转到CHANGE<br />LSB_1: <br /><br /> BTFSC TMR0,0 ;继续测TMR0的末位<br /> GOTO LSB_1 ;末位仍为1,继续检测<br /> NOP ;末位变0,空操作,插入2条空指令<br /> NOP ;以均衡检测0变1和1变0所用时间<br />CHANGE: <br /><br /> MOVLW 08H ;用于延时<br /> MOVWF TEMP2 ;用于延时<br />LOOP: <br /><br /> DECFSZ TEMP2,1 ;用于延时<br /> GOTO LOOP ;4条指令共产生25个指令周期的延时<br /> INCF TEMP1,1 ;TMR0溢出次数加1<br /> MOVLW .12<br /> ADDWF TMR0,1 ;将TMR0值加12写入TMR0<br /> BTFSC STATUS,0 ;检查进位标志位<br /> GOTO LP2 ;若发生进位,转去执行下一次溢出服务,而省略等待和验证溢出过程<br /> MOVLW .16<br /> SUBWF TEMP1,0<br /> BTFSS STATUS,0 ;判断溢出次数是否达到16<br /> GOTO LP1 ;未达16次,结束本次查询,继续等待下次溢出<br /> CLRF TEMP1 ;达到16次,溢出次数清零<br /> GOTO L3 ;调用取转速程序<br /> RETURN<br /><br /><br />把程序改成不用TMR0定时,而用软件延时,可以在上位机接收到数据。<br /><br />大家帮我看看这个是什么问题,<br /><br />谢谢了。 |
|