📄 engine.asm
字号:
PZ3_JC12V_OK:
BSF PQREG,PQ3
GOTO SET_PZ3
PZ3_NO_JC12V:
BCF PQREG,PQ3
SET_PZ3:
MOVF PQREG,W
MOVWF PORTB
MEASURE_PZ3_PYMK:
BSF PZ3_FLAG,PQYC_LOAD_EN ;喷气延迟加载使能
BCF PZ3_FLAG,PQYC_DELAY_EN ;清除喷气延迟使能
INCFSZ PZ3_PYMK,0x1 ;喷油脉宽计数器累加
GOTO EXE_PZ3_OVER
MOVLW 0xFF ;喷油计数器累加为0,
MOVWF PZ3_PYMK
GOTO EXE_PZ3_OVER
PZ3_HIGH:
BTFSS PZ3_FLAG,PQYC_LOAD_EN ;判断喷气延迟加载使能
GOTO EXE_PZ3_PQYC ;PQYC_LOAD_EN=0,已经读取喷气延迟,执行喷气延迟
GET_PZ3_PERIOD_ADDR:
BCF PZ3_FLAG,PQYC_LOAD_EN
MOVF PZ3_PRIODA,W
MOVWF PY_PERIOD
MOVF PZ3_PRIODB,W
MOVWF PY_PERIOD1
RRF PZ3_PRIODA,0x1
RRF PZ3_PRIODA,0x1
RRF PZ3_PRIODA,0x0 ;右移三位
ANDLW 0x1F
MOVWF PERIOD_ADDR ;得到周期低5位
CLRF PZ3_PRIODA
MOVF PZ3_PRIODB,W ;判断是否溢出
SUBLW 0x07
BTFSS STATUS,C
GOTO PZ3_OVFL
RLF PZ3_PRIODB,0x1
SWAPF PZ3_PRIODB,0x0
ANDLW 0xE0
IORWF PERIOD_ADDR,0x1 ;得到周期高3位
MOVF PERIOD_ADDR,W ;判断是否>0xFD
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_PZ3_SPEED_LEVEL
PZ3_OVFL:
MOVLW 0xFD
MOVWF PERIOD_ADDR
GET_PZ3_SPEED_LEVEL:
CLRF PZ3_PRIODB
MOVLW 0xA
MOVWF PCLATH
CALL 0xA00 ;取出喷气延迟
CLRF PCLATH
MOVWF SPEED_LEVEL
LOAD_PZ3_PQYC:
BSF PZ3_FLAG,PQYC_DELAY_EN ;使能喷气延迟
MOVF PZ3_PYMK,W ;取出喷油脉宽值
MOVWF PYMK ;存储喷油脉宽值到PZTIME,由串口送出
CLRF PZ3_PYMK
JUDGE_PZ3_PYMK_OVFL:
MOVF PYMK,W
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_PZ3_PYMK_LEVEL
MOVLW 0xFD
MOVWF PYMK
GET_PZ3_PYMK_LEVEL:
MOVLW 0xB
MOVWF PCLATH
CALL 0xB00
CLRF PCLATH
MOVWF PYMK_LEVEL
GET_PZ3_PQYC:
CALL GET_PZ_PQYC
CLRF PCLATH
MOVWF PQYC ;保存喷气延迟到PQYC,有串口送出
MOVWF PZ3_PQYC ;喷气延迟保存到延迟寄存器
EXE_PZ3_PQYC:
BTFSS PZ3_FLAG,PQYC_DELAY_EN ;判断喷气延迟使能
GOTO EXE_PZ3_OVER
DECFSZ PZ3_PQYC,0x1
GOTO EXE_PZ3_OVER
BCF PZ3_FLAG,PQYC_DELAY_EN
BCF PQREG,PQ3
MOVF PQREG,W
MOVWF PORTB
EXE_PZ3_OVER:
RETURN
;===================================================================================
;======================计算速度表地址=================================================
;===================================================================================
;600 2000 7d0 fa 00
;700 1714 6b2 d6 01
;800 1500 5dc bb 02
;900 1333 535 a6 03
;1000 1200 4b0 96 04
;1200 1000 3e3 7c 05
;1400 857 359 6b 06
;1600 750 2ee 5d
;1800 666 29a 53
;2000 600 258 4b
;2200 545 221 44
;2400 500 1f4 3e
;2600 461 1cd 39
;2800 428 1ac 35
;3000 400 190 32
;3500 342 156 2a
;4000 300 12c 25
;4500 266 10a 21
;5000 240 f0 1e
;5500 218 da 1b
;6000 200 c8 18
;6500 184 b8 17
;7000 171 ab 15
;=====================================================================================
;===========判断 检测12V 和 喷嘴12V,没有电压就不喷气,同时熄灭LED==========================
;=====================================================================================
JUDGE_PZ12VBIT_JC12V:
CALL PAGE0
CLRWDT
BTFSC PORTA,PZ12VIN ;喷嘴12V电源有效, 应该低电平有效
GOTO NO_PZ12VBIT
BSF PZREG,PZ12VBIT
GOTO JUDGE_JC12V
NO_PZ12VBIT:
;没有喷嘴电压,不输出喷气脉冲
BCF PZREG,PZ12VBIT
BCF PZREG,PZ0BIT
BCF PZREG,PZ1BIT
BCF PZREG,PZ2BIT
BCF PZREG,PZ3BIT
JUDGE_JC12V:
BTFSS PORTC,JC12VIN
GOTO JC12V_OK
GOTO NO_JC12V
JC12V_OK:
BSF JCREG,JC12VBIT
BSF PORTC,LED
GOTO JUDGE_PZJC_OVER
NO_JC12V:
;没有检测电压,不输出喷气脉冲,喷气延迟
BCF PORTC,LED
BCF PQREG,PQ0
BCF PQREG,PQ1
BCF PQREG,PQ2
BCF PQREG,PQ3
MOVLW 0x1
MOVWF PQYC
JUDGE_PZJC_OVER:
MOVF PQREG,W
MOVWF PORTB
BCF JCREG,JC12VBIT
RETURN
;=====================================================================================
;===============================A/D采样================================================
AD_SAMPLE:
;判断是否采样
BTFSS TIMER_IF,SMP_EN;
RETURN
BCF TIMER_IF,SMP_EN
;开始采样
CLRF CNT ;采样计数器清零
MOVLW AD_ADDR
MOVWF FSR ;间接寻址采样存储地址
MOVLW 0x0
MOVWF ADCON0 ;采样地址清零
SAMPLE_LOOP:
CALL PAGE1
MOVLW 0x0
MOVWF ADCON1 ;所有PORTA输入为模拟输入
CALL PAGE0
BSF ADCON0,ADON
SAMPLE:
MOVLW 0x1
CALL DELAY2
BSF ADCON0,GO
;采样时间
MOVLW 0x1
CALL DELAY2
SMP_OVER:
BTFSC ADCON0,GO
GOTO SMP_OVER
MOVF ADRESH,W ;10位采样值高8位
MOVWF INDF ;存储采样值
INCF FSR,0x1 ;存储指针递增
MOVLW 0x8
ADDWF ADCON0,0x1 ;采样通道递增
INCF CNT,0x1
BTFSS CNT,0x2
GOTO SAMPLE_LOOP
CLOSE_AD:
CALL PAGE1
MOVLW 0x6
MOVWF ADCON1 ;所有输入都是数字输入,保护AD
CALL PAGE0
;RETURN
JUDGE_ZKYL_OVFL:
MOVF ZKYL,W
SUBLW 0xFD
BTFSC STATUS,C
GOTO GET_ZKYL_LEVEL
MOVLW 0xFD
MOVWF ZKYL
GET_ZKYL_LEVEL:
BCF INTCON,GIE
MOVLW 0xF
MOVWF PCLATH
;MOVF ZKYL,W
CALL 0xF00
CLRF PCLATH
MOVWF ZKYL_LEVEL
BSF INTCON,GIE
RETURN
;===============记忆喷油脉宽==========================================
;根据当前压力,速度读出表格中的记忆喷油脉宽值
;新喷油脉宽稳定256*16=4096转之后,置忙标志
;和表格中的喷油脉宽值比较,相差大于1.6ms,那么写入新值,否则不写
SAVE_JYMK:
BCF INTCON,GIE
CALL GET_REC_JYMK_VALUE ;根据当前压力,速度读出表格中的记忆喷油脉宽值
CLRF PCLATH
MOVWF REC_PYMK
BSF INTCON,GIE
BTFSS REC_FLAG,REC_BUSY ;检测忙标志
RETURN
GOTO GET_JYMK_FLAG
GET_JYMK_FLAG_OVER:
BTFSC REC_FLAG,REC_EN
GOTO JYMK_WR_EXIT
MOVF REC_PYMK,W
ANDLW 0xF0 ;得到当前喷右脉宽的高四位,保存到REC_PYMK_HIGH4BIT
MOVWF REC_JYMK_HIGH4BIT
MOVF REC_PYMKC,W ;得到前一个喷油脉宽的高四位,存到W中
;GOTO JYMK_WR_EXIT
ANDLW 0xF0
XORWF REC_JYMK_HIGH4BIT,0x0 ;比较当前喷油脉宽和前一个喷油脉宽高四位是否相同
BTFSC STATUS,Z
GOTO SAVE_JYMK_OVER
BTFSS REC_FLAG,WR_EN ;判断写使能
GOTO SAVE_JYMK_OVER
;得到记忆脉宽的EEP_ADDRH值
GET_JYMK_EEP_ADDRH:
BTFSS SPEED_LEVEL,0x4
GOTO GET_JYMK_EEP_ADDRH8;
MOVLW 0x9
MOVWF EEP_ADDRH
GOTO GET_JYMK_EEP_ADDRH_OVER
GET_JYMK_EEP_ADDRH8:
MOVLW 0x8
MOVWF EEP_ADDRH
GET_JYMK_EEP_ADDRH_OVER:
;得到记忆脉宽的EEP_ADDRL值
SWAPF SPEED_LEVEL,0x0
ANDLW 0xF0
MOVWF EEP_ADDRL
MOVF ZKYL_LEVEL,W
ADDLW 0x2
ADDWF EEP_ADDRL,0x1
;赋值给 EEP_DATAL
MOVF REC_PYMKC,W
MOVWF EEP_DATAL
CALL PAGE2
MOVF EEP_ADDRL,W ;得到4地址
ANDLW 0xFC
MOVWF EEADR
MOVF EEP_ADDRH,W ;
MOVWF EEADRH
MOVLW EEP_DATAH0 ;保存数据保存地址
MOVWF FSR
CLRF EEP_NUMBER
;读出8个数据到EEP_DATAH0---EEP_DATAL3
JYMK_READ_EEP_LOOP:
;读EEPROM
BSF STATUS, RP0 ;读EEPROM
BSF EECON1, EEPGD
BSF EECON1, RD
NOP
NOP
BCF STATUS, RP0
;保存数据
MOVF EEDATH, W
MOVWF INDF ;保存EEP高8位
INCF FSR,0x1
MOVF EEDATA, W
MOVWF INDF ;保存EEP低8位
INCF FSR,0x1
;地址递增
INCF EEADR,0x1 ;EEP地址+1
INCF EEP_NUMBER,0x1 ;EEP读计数器+1
;循环判断
BTFSS EEP_NUMBER,0x2 ;是否读了四个数据
GOTO JYMK_READ_EEP_LOOP
JYMK_FRESH_EEP_DATA:
;更新EEP_DATAL
RLF EEP_ADDRL,0x0
ANDLW 0x6
ADDLW EEP_DATAL0
MOVWF FSR ; =>FSR
MOVF EEP_DATAL,W ;EEP_DATA
MOVWF INDF ; =>[EEP_ADDR+EEP_ADDR[1:0]]
;写循环准备
MOVLW EEP_DATAH0
MOVWF FSR ;间接寻址EEP_DATA
MOVF EEP_ADDRL,W ;ADDRH,ADDRL为首地址
ANDLW 0xFC
MOVWF EEADR ;调入低8位地址的4偶地址
MOVF EEP_ADDRH,W
MOVWF EEADRH ;调入高8位地址
CLRF EEP_NUMBER ;写入数据计数清零
BCF INTCON,GIE
JYMK_WRITE_EEP_LOOP:
CLRWDT
;调入数据
;MOVLW 0x34
MOVF INDF,W
MOVWF EEDATH ;存入数据高字节
INCF FSR,0x1
MOVF INDF,W
MOVWF EEDATA ;存入数据低字节
INCF FSR,0x1
;保存数据到EEPROM
BSF STATUS,RP0
BSF EECON1,EEPGD
BSF EECON1,WREN
MOVLW 0x55
MOVWF EECON2
MOVLW 0xaa
MOVWF EECON2
BSF EECON1,WR
NOP
NOP
BCF EECON1,WREN
BCF STATUS,RP0
;地址递增
INCF EEP_NUMBER,0x1
INCF EEADR,0x1
BTFSS EEP_NUMBER,0x2
GOTO JYMK_WRITE_EEP_LOOP
BSF INTCON,GIE
CALL PAGE0
;======================回送更改值========================
MOVF REC_PYMKC,W ;真空压力
ANDLW 0x0F
IORLW 0x30
CALL UART_SEND
SWAPF REC_PYMKC,0x0
ANDLW 0x0F
IORLW 0x40
CALL UART_SEND
MOVLW 0x93
CALL UART_SEND
JYMK_WR_EXIT:
SAVE_JYMK_OVER:
CALL PAGE0
BCF REC_FLAG,REC_BUSY
RETURN
PAGE0: BCF STATUS,RP0
BCF STATUS,RP1
RETURN
PAGE1: BSF STATUS,RP0
BCF STATUS,RP1
RETURN
PAGE2: BCF STATUS,RP0
BSF STATUS,RP1
RETURN
PAGE3: BSF STATUS,RP0
BSF STATUS,RP1
RETURN
INI_COM:
CALL PAGE1
MOVLW 0x20
MOVWF BRG
BSF TXSTA,BRGH ;HIGH SPEED
CALL PAGE0
BSF RCSTA,SPEN ;SET SPEN
CALL PAGE1
BCF TXSTA,SYNC
BCF TXSTA,TX9 ;8BIT TRANSMISSION
BSF TXSTA,TXEN
CALL PAGE0
BSF RCSTA,CREN ;DISABEL CONTINUOUS RECIEVE
RETURN
;SET TRANSMISSION CONTROL,8BIT,AYSYN,HIGH SPEED
CALL PAGE1
BSF PORTC,0x6 ;TX
BSF PORTC,0x7 ;RX
CALL PAGE0
BCF RCSTA,RX9 ;8BIT RECIEVE
BCF RCSTA,ADDEN ;DISABLE ADDRESS DETECT,ALL BYTES ARE RECIEVED
BCF RCSTA,FERR
BCF RCSTA,OERR
BSF RCSTA,SPEN ;SET SPEN
BSF RCSTA,CREN ;DISABEL CONTINUOUS RECIEVE
;BSF RCSTA,CREN ;DISABEL CONTINUOUS RECIEVE
CALL PAGE1
;MOVLW 0xC
;MOVLW 0x33
;MOVLW 0x81
MOVLW 0x20
MOVWF BRG ;SET BAUD RATE 9600BPS
BCF TXSTA,TX9 ;8BIT TRANSMISSION
BCF TXSTA,SYNC ;CLEAR SYNC ;ASYNCHRONOUS MODE
BSF TXSTA,BRGH ;HIGH SPEED
BSF TXSTA,TX9D ;ALWAYS ENABLE TX9D AND 9BIT TRANSMISION FOR POSSIBLE TIMING CONFLICT
BSF TXSTA,TXEN
CALL PAGE0
RETURN
;==================================得到记忆标志==========================================
GET_JYMK_FLAG:
CLRWDT
CALL PAGE0
MOVF ZKYL_LEVEL,W
CALL PAGE1
MOVWF ZKYL_LEVEL1 ;保存压力分级
CALL PAGE0
MOVF SPEED_LEVEL,W
CALL PAGE1
MOVWF SPEED_LEVEL1 ;保存速度分级
RLF ZKYL_LEVEL1,1
RLF ZKYL_LEVEL1,0
ANDLW 0x3C
MOVWF JYMK_FLAG_ADDRA ;得到标志表的压力寻址值
MOVLW 0x07
ANDWF SPEED_LEVEL1,0
MOVWF JYMK_FLAG_ADDRB ;得到标志位的寻址
RRF SPEED_LEVEL1,1
RRF SPEED_LEVEL1,1
RRF SPEED_LEVEL1,0
ANDLW 0x03 ;得到转速字节寻址,选定一行四个字节中的一个标志字节
IORWF JYMK_FLAG_ADDRA,0x1 ;得到标志字节寻址
MOVLW 0xB0
ADDWF JYMK_FLAG_ADDRA,0x0
MOVWF FSR ;得到标志字节的绝对地址,给FSR
MOVLW 0x00
XORWF JYMK_FLAG_ADDRB,0
BTFSC STATUS,Z
GOTO JUDGE_FLAG0
MOVLW 0x01
XORWF JYMK_FLAG_ADDRB,0
BTFSC STATUS,Z
GOTO JUDGE_FLAG1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -