我们老师非要我看懂程序自己去想,都不和我解释的,本人好歹还不是学这个的啊,能看懂C就不错了。谁能帮忙解释下为什么是2197MS? 以下是读时间程序:
RD_TIMER
MOVLW BASE_TIME
SUBWF TMR0,W;TMR0自身85us加1
BTFSS STATUS,C;TMR0减BAS_TIME>=0,即C为1,则跳转,加基本时钟为1
RETLW 0
MOVWF TMR0 ;不对TMR0进行校正了
INCF CLOCKER,1 ;约11MS(12MHZ晶体)加一次1
MOVLW MULTI_TIME
SUBWF CLOCKER, W
BTFSS STATUS, C
RETLW 0 ;到此处共18条指令周期
MOVF POW_G,W ;到了2197ms了,需要对数据进行处理了。
MOVWF DISP_G
MOVF POW_S, W
MOVWF DISP_S
MOVF POW_B, W
MOVWF DISP_B
MOVF POW_Q, W
MOVWF DISP_Q
BCF FLAG,BEF_EXC_2W ;保存标志位(数据量小的标志位)。
BTFSS FLAG, EXC_2W
GOTO SET_DATA
BSF FLAG, BEF_EXC_2W
SET_DATA
CLRF POW_G
CLRF POW_S
CLRF POW_B
CLRF POW_Q
CLRF CLOCKER
BSF FLAG,COU_TIME_OUT ;置需要处理数据标志位。
BCF FLAG,EXC_2W ;清超过2W标卖位。
RETLW 0
主程序是
MAIN
CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)
CALL RD_PULSE;读脉冲的上升沿,并计入总脉冲数及计功率的脉冲。此子程序正常10指令周期,有脉冲时不影响
CALL RD_TIMER;统计时间,每2秒计一次时
CALL LOW_VOLT_CHK;就当是掉电检测子程序。由于嵌套层数不够,只能如此,至此37条指令运行中
CALL READ_KEY;就当是掉READ_KEY子程序,由于嵌套层数不够,故此处改为READ_KEY响应按键功能
BTFSS FLAG,COU_TIME_OUT;是否计时时间到,是否有数据要处理
GOTO MAIN
BTFSS FLAG,GET_600US;是否有时间来处理
GOTO IS_PULSE_LESS
Pagesel DISP_POW_LETT
CALL DISP_POW_LETT
CALL DISP_INS_POW
pagesel $
BCF FLAG,COU_TIME_OUT;位清零
BTFSS FLAG,RE_NEW_TOL_POW
GOTO MAIN;无更新标志位,返回主程序
Pagesel DISP_TOL_POW
CALL DISP_TOL_POW ;如要减少此处给计量精度带来的影响,可将更新总脉冲标志位放在TOL_POW_X1处,即只有0.1度的进位才更新总功率的显示。
CALL DISP_TOL_LETT
BCF FLAG, RE_NEW_TOL_POW;位清零
pagesel $
GOTO MAIN;结束显示
IS_PULSE_LESS
BTFSC FLAG,BEF_EXC_2W ;无空余时间产生的原因,是不是因为脉冲数太少了。大多数时候到此46条指令,/3=15.33US,实际测量也确实是15US
GOTO MAIN;结束显示
Pagesel DISP_POW_LETT
CALL DISP_POW_LETT
CALL DISP_INS_POW
CALL DISP_TOL_LETT
CALL DISP_TOL_POW
Pagesel $
BCF FLAG, RE_NEW_TOL_POW;位清零
BCF FLAG, COU_TIME_OUT;位清零
BSF FLAG, BEF_EXC_2W;在2秒时,瓦数仍很低,强制处理数据,处理完后致标志位。
GOTO MAIN;结束显示
END
RD_TIMER
MOVLW BASE_TIME
SUBWF TMR0,W;TMR0自身85us加1
BTFSS STATUS,C;TMR0减BAS_TIME>=0,即C为1,则跳转,加基本时钟为1
RETLW 0
MOVWF TMR0 ;不对TMR0进行校正了
INCF CLOCKER,1 ;约11MS(12MHZ晶体)加一次1
MOVLW MULTI_TIME
SUBWF CLOCKER, W
BTFSS STATUS, C
RETLW 0 ;到此处共18条指令周期
MOVF POW_G,W ;到了2197ms了,需要对数据进行处理了。
MOVWF DISP_G
MOVF POW_S, W
MOVWF DISP_S
MOVF POW_B, W
MOVWF DISP_B
MOVF POW_Q, W
MOVWF DISP_Q
BCF FLAG,BEF_EXC_2W ;保存标志位(数据量小的标志位)。
BTFSS FLAG, EXC_2W
GOTO SET_DATA
BSF FLAG, BEF_EXC_2W
SET_DATA
CLRF POW_G
CLRF POW_S
CLRF POW_B
CLRF POW_Q
CLRF CLOCKER
BSF FLAG,COU_TIME_OUT ;置需要处理数据标志位。
BCF FLAG,EXC_2W ;清超过2W标卖位。
RETLW 0
主程序是
MAIN
CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)
CALL RD_PULSE;读脉冲的上升沿,并计入总脉冲数及计功率的脉冲。此子程序正常10指令周期,有脉冲时不影响
CALL RD_TIMER;统计时间,每2秒计一次时
CALL LOW_VOLT_CHK;就当是掉电检测子程序。由于嵌套层数不够,只能如此,至此37条指令运行中
CALL READ_KEY;就当是掉READ_KEY子程序,由于嵌套层数不够,故此处改为READ_KEY响应按键功能
BTFSS FLAG,COU_TIME_OUT;是否计时时间到,是否有数据要处理
GOTO MAIN
BTFSS FLAG,GET_600US;是否有时间来处理
GOTO IS_PULSE_LESS
Pagesel DISP_POW_LETT
CALL DISP_POW_LETT
CALL DISP_INS_POW
pagesel $
BCF FLAG,COU_TIME_OUT;位清零
BTFSS FLAG,RE_NEW_TOL_POW
GOTO MAIN;无更新标志位,返回主程序
Pagesel DISP_TOL_POW
CALL DISP_TOL_POW ;如要减少此处给计量精度带来的影响,可将更新总脉冲标志位放在TOL_POW_X1处,即只有0.1度的进位才更新总功率的显示。
CALL DISP_TOL_LETT
BCF FLAG, RE_NEW_TOL_POW;位清零
pagesel $
GOTO MAIN;结束显示
IS_PULSE_LESS
BTFSC FLAG,BEF_EXC_2W ;无空余时间产生的原因,是不是因为脉冲数太少了。大多数时候到此46条指令,/3=15.33US,实际测量也确实是15US
GOTO MAIN;结束显示
Pagesel DISP_POW_LETT
CALL DISP_POW_LETT
CALL DISP_INS_POW
CALL DISP_TOL_LETT
CALL DISP_TOL_POW
Pagesel $
BCF FLAG, RE_NEW_TOL_POW;位清零
BCF FLAG, COU_TIME_OUT;位清零
BSF FLAG, BEF_EXC_2W;在2秒时,瓦数仍很低,强制处理数据,处理完后致标志位。
GOTO MAIN;结束显示
END

