📄 ka.asm
字号:
MOVF RCREG,W ;收到的"8bit"数据
MOVF RCREG,W ;清除"帧格式错误".
No_RC_err:
;;;;---------------发送完毕,打开"接收中断"-------------
bcf PCLATH,3 ;选择页面0
CALL RC485MODE ;发送完毕,置为"接收模式"
RegBnk1
MOVLW 21h
MOVWF PIE1 ;open RCIE, open TMR1IE.
TX485OUT:
bcf PCLATH,3 ;选择页面0
GOTO RETRET
;------------------------------------------------------------------
;--------------------RB0中断处理;(已关闭)--------------------------
;------------------------------------------------------------------
;-------------------------------------------------------------------
;-------------TIMR1中断处理(电能脉冲处理)---------------------------
;----------------2ms------------------------------------------------
TR1IF:
RegBnk0
BCF PIR1,TMR1IF ;电能脉冲判定
RegBnk1
bsf TRISA,RA4_kWhsgn ;I/O方向input state
;-------------
tstf Lamp_on
skpnz
goto tst_kWhsg
bsf kWh_stat,kWhsgn_impuls ;LCD脉冲指示,1-有脉冲,0-没有脉冲.
decf Lamp_on,1 ;校表led点亮时间控制变量.
;-------------
tst_kWhsg:
RegBnk0
btfsc RA,RA4_kWhsgn ; RA.kWhsgn = low?
goto tst_kWhsgn_hi ; No, process high level
tst_kWhsgn_lo: ; kWhsign="Lo"
RegBnk1
movlw .10 ; 10*1=10ms
movwf kWhsgn_cnt_hi ; set kWhsign "Hi" counter=4
btfsc kWh_stat,kWhsgn ; already "Lo" ?
decfsz kWhsgn_cnt_lo,1 ; No, kWhsgn_cnt_lo -- =0 ?
goto No_kWh_ret ; Yes or kWhsgn_cnt_lo not zero
bcf kWh_stat,kWhsgn ;说明现在为低电平(并记亿)
goto No_kWh_ret
tst_kWhsgn_hi: ; kWhsign="Hi"
RegBnk1
movlw .10 ; 10*1=10ms
movwf kWhsgn_cnt_lo ; set kWhsign "Lo" counter=4
btfss kWh_stat,kWhsgn ; already "Hi" ?
decfsz kWhsgn_cnt_hi,1 ; No, kWhsgn_cnt_hi --
goto No_kWh_ret ; Yes or kWhsgn_cnt_hi not zero
bsf kWh_stat,kWhsgn ; 说明现在为高电平(并记亿)
;;;;
;;bsf kWh_stat,kWhsgn_impuls ;LCD脉冲指示,1-有脉冲,0-没有脉冲.
bcf TRISC,RC2_led ;RC2为输出口方式.
movlw .80 ;led on 80ms
movwf Lamp_on ;led点亮时间.
RegBnk0
bcf RC,RC2_led ;0---校表led点亮.
bcf dsp_flag3,disp_No_updata ;?????????0-->0.10秒到,更新显示数据项.
;---------------------
;---------------
goto No_kWh_ret ; NOT ZERO!
RegBnk0
movfw Constat ; ZERO! set kWh_cnt=kWh_cnst
RegBnk1
movwf kWh_cnst
bsf kWh_stat,kWhsgn_add1 ;需 ++0.01 kWh
RegBnk0
decfsz Wt_epm_count,1 ;写EPM计数
goto No_kWh_ret
movlw .10
movwf Wt_epm_count ;写 E2PROM 一次.
bsf RWepmSTA,Wt_e2pm_kWh ;set write 0.10 kWh to EEPROM flag
;------------------------------------
No_kWh_ret:
;-------------------------------------
RegBnk0
MOVLW 0FFH
MOVWF TMR1H ;5*2ms=10ms
MOVLW .131 ;(256-131)*8=125*8=1000uS(1ms),new adjusted
MOVWF TMR1L ;256*8=2048uS=2ms
MOVLW 30H ;1mS检测一次"电能脉冲"
MOVWF T1CON
BSF T1CON,0 ;open timer1,start time
bcf PCLATH,3 ;选择页面0
goto RETRET
;---------------------------------------------------------------
;--------------RS485数据接收模块(中断处理)---------------
;---------------------------------------------------------------
USATIF:
clrwdt
RegBnk0
BCF PIR1,RCIF ;GENR0,GENR1,GENR2,GENR3
;;;;
RegBnk1
BTFSC CONTROL485,ir_prs_end ;1--接收的数据已处理完毕(可以发送).
;0--接收的数据未处理,不可以接收.
;;;;
btfsc CONTROL485,ir_Txing ;1--正在发送数据!不可以接收.
goto RX485ERR ;0--已发送完数据,可以接收.
;;;;-------------------
;;;;;------------------
RegBnk0
MOVF RCSTA,W ;RCSTA---收到的数据的"9"
MOVWF GENR0
BTFSC GENR0,1
GOTO RX485ERR ;1---越位错误
BTFSC GENR0,2
GOTO RX485ERR ;1---格式错误
MOVF RCREG,W ;收到的"8bit"数据
MOVWF IR_Rec ;接收数据的LOW8位
BTFSS GENR0,0 ;接收数据的第9位(校验位1:有奇数个1)
GOTO RX485_1
bcf PCLATH,3 ;选择页面0
CALL MKEVENBIT
BTFSS temp_4,0
GOTO RX485ERR ;校验位错误
GOTO RX485_2
RX485_1:
bcf PCLATH,3 ;选择页面0
CALL MKEVENBIT
BTFSC temp_4,0
GOTO RX485ERR ;校验位错误
RX485_2:
;;;;;;;;;;;;
RegBnk1
tstf COUNT485
SKPNZ
GOTO CLR_Cun_byte
;;;;
MOVLW .255 ;2s
SUBWF CSCOM485,W ;"485" 超时检测.
SKPNC
GOTO RX485EXIT
;;;;--------------
CLR_Cun_byte:
RegBnk1
movlw .60 ;60
subwf COUNT485,W ;是大于60个字节吗(包括2个"FE")?
skpnc
goto RX485EXIT ;是大于60,错误数据,不处理.
;;;;;;
tst_IR_long:
RegBnk1
tstf COUNT485 ;是否是开始数据(即"已接收数据长度"是否是00)?
skpz
goto save_ir_data
RegBnk0
movlw 68h
xorwf IR_Rec,W
skpz
GOTO RX485EXIT ;第x个数据,不是"68".
RegBnk1
movlw .03
movwf COUNT485
movlw 68h
movwf IR_TXcv_Buf
bsf CONTROL485,ir_Recing ;1--处在接收状态.
;;RegBnk1 ;??????????
BCF TXSTA,TXEN ;2003.2.18
goto RX485OUT
save_ir_data:
RegBnk0
bcf dsp_flag3,disp_met_Add ;0--半分钟到,关显示表地址.
RegBnk1
bcf broadcast_stat,broad_Add ;广播地址"标志是"1"时,不读时段".
btfss CONTROL485,ir_Recing ;0--接收数据完毕(发送状态)
goto RX485EXIT ;1--处在接收状态.
;;;;;;RegBnk1
INCF COUNT485 ;保存收到的字节数.
movlw IR_TXcv_Buf
addwf COUNT485,W
movwf FSR
movlw .03
SUBWF FSR,1
RegBnk0
movfw IR_Rec
movwf INDF ;保存收到的数据
;;;;;
RegBnk1
movlw .8
xorwf COUNT485,W ;是第12个字节吗?
btfss 3,Z
goto tst_IR_long1
RegBnk0
movfw IR_Rec ;需要继续"接收的数据长度"给"RCOUNT".
RegBnk1
movwf RCOUNT
movlw .2 ;校验吗和结束码(2byte).
addwf RCOUNT,1
goto RX485OUT
tst_IR_long1:
RegBnk1 ;??
movlw .8
subwf COUNT485,W ;是大于12个字节吗(包括2个"FE")?
skpc
goto RX485OUT
;------------------
movlw .48
subwf RCOUNT,W ;是小于47个字节吗(包括2个"FE")?
skpnc
goto RX485EXIT
;------------------
decfsz RCOUNT,1
goto RX485OUT ;已测试
;-------------------------------------------------------------
Rcv_data_end:
CLRF COUNT485 ;接收的"字节数"清0".
bcf CONTROL485,ir_prs_end ;0--接收的数据没处理.
;数据"正确接收"完毕,关闭"红外接收"中断,未处理,不可以接收.
MOVLW 01h
MOVWF PIE1 ;close RCIE, open TMR1IE.
goto RX485OUT1
RX485EXIT: ;第三个不是"68".
RegBnk1
CLRF COUNT485 ;错误数据"不计数".
GOTO RX485OUT1 ;????????
;-------------------清除错误---------------------
RX485ERR:
RegBnk0
bcf RCSTA,CREN ;清"0"越位溢出错误.
;nop ;清除"帧格式错误".
bsf RCSTA,CREN
MOVF RCREG,W ;收到的"8bit"数据
MOVF RCREG,W ;清除"帧格式错误".
RX485OUT1:
RegBnk1
bcf CONTROL485,ir_Recing ;0--红外已接收数据完毕.
RX485OUT:
RegBnk1
CLRF CSCOM485 ;清零超时计数器
;-------------------------------------------------------
RETRET: ;中断返回
RegBnk0 ;BCF STATUS,RP0
MOVF GENR3_TEMP,W ;8
MOVWF GENR3
MOVF GENR2_TEMP,W ;7
MOVWF GENR2
MOVF GENR1_TEMP,W ;6
MOVWF GENR1
MOVF GENR0_TEMP,W ;5 ;ADD BY JI
MOVWF GENR0
MOVF FSR_TEMP, W ;4
MOVWF FSR
MOVF PCLATH_TEMP,W ;3
MOVWF PCLATH
SWAPF STATUS_TEMP,W ;2
MOVWF STATUS
SWAPF W_TEMP,F ;1
SWAPF W_TEMP,W
RETFIE
;----------------------------------------------------------------
;----------------------------------------------------------------
; bsf PCLATH,3 ;选择页面1
; goto meter_initer ;2003 320
;----------------------------------------------------------------
;----------------------------------------------------------------
org 0800h ;page 1
;----------------------------------------------------------------
;------------------两个字节比较子程序(用于标识)------------------
;----------------------------------------------------------------
bsf PCLATH,3 ;选页1
goto meter_initer
;----------------------------------------------------------------
;----------------------------------------------------------------
ir_comparat:
movfw IR_TXcv_Buf+10
subwf temp_ir1,W
skpz
goto No_ident
movfw IR_TXcv_Buf+11
subwf temp_ir2,W
skpz
goto No_ident
bsf CONTROL485,ir_ident ;1--数据标识相等
retlw 0
No_ident:
bcf CONTROL485,ir_id
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -