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