📄 ledavr-5k.src
字号:
CALL Input_Module
CALL Detect_Module
CLRWDT
CALL Output_Module
CALL output_regulate
CLRWDT
CALL Display_Module
JR Main_loop
;--------------------------------------------------------------------
INT_Handler:
TM T0CON,#01H
JR NZ,INT_Timer0
IRET
INT_Timer0::
TM ADCON,#ADC_OEC
JR Z,skip_fresh_adc
LD AdataH,ADDATAH
LD AdataL,ADDATAL
OR ADCON,#START_ADC
OR UserFlag,#FreshAdc
skip_fresh_adc:
DEC YuanLaiShiJian
JR NZ,exit_this_interrupt ;6
LD YuanLaiShiJian,#__2ms ;2ms定时
;**************
CP RegulateTime,#0
JR EQ,STOP_REG_VOUT
DEC RegulateTime
JR timer_system
STOP_REG_VOUT:
AND P2,#~(_OUT_INC|_OUT_DEC) ;regulate stop
;**************
timer_system:
CALL display
CP System_Timer,#100 ;100*2ms=0.2s
JR UGE,timer_j2
INC System_Timer
exit_this_interrupt:
AND T0CON,#0F6H ;CLR Interrupt Flag Of T0
IRET
timer_j2:
CLR System_Timer
DEC FreshDipsTime
JR NZ,skip_FreshDispVolt
LD FreshDipsTime,#__600ms
OR UserFlag,#FreshDispVolt
skip_FreshDispVolt:
CP disp_fresh_time,#0
JR EQ,skip_dispfreshtime
DEC disp_fresh_time
skip_dispfreshtime:
CP Buzer_Timer,#0
JR EQ,timer_j9
DEC Buzer_Timer
timer_j9:
CP DIG_BLINK_Time,#0
JR EQ,timer_1s
DEC DIG_BLINK_Time
;-----------timer 1s----------
timer_1s:
DEC system_timer1s
CP system_timer1s,#0
JR NE,EXIT_END
LD system_timer1s,#5
;CP HighProtTime,#0
;JR EQ,ProtTime
;DEC HighProtTime
ProtTime:
CP VOLT_PRTdelay,#0
JR EQ,out_delay
DEC VOLT_PRTdelay
out_delay:
CP OutputDly_Timer,#0
JR EQ,DELAY_OVER
DEC OutputDly_Timer
DELAY_OVER:
EXIT_END:
AND T0CON,#0F6H ;CLR Interrupt Flag Of T0
IRET
;--------------------------------------------------------------------
; Get Delay time switch input and V_ADC,T_ADC A/D input
;--------------------------------------------------------------------
Input_Module:
CALL READ_Key
;=============================
AD_INPUT:
CALL OUTPUT_VOLT_ADC
CALL INPUT_VOLT_ADC
CALL TEMP_ADC
RET
;===================================
READ_Key::
TM P2,#_RELAY
JR NZ,exit_readkey
TM P2,#10H;P2.4
JR Z,outDly_is6S
TM UserFlag,#DLYFlag
JR NZ,exit_readkey ;延时键一直是按下状态(180S延时)
LD OutputDly_Timer,#180 ;延时键由弹起状态到按下状态
OR UserFlag,#DLYFlag ;延时键按下标志(180S延时)
JR exit_readkey
outDly_is6S:
TM UserFlag,#DLYFlag
JR Z,exit_readkey ;延时键一直是弹起状态(6S延时)
LD OutputDly_Timer,#6 ;延时键由按下状态到弹起状态
AND UserFlag,#~DLYFlag ;延时键弹起标志(6S延时)
exit_readkey:
RET
;===================================
OUTPUT_VOLT_ADC::
LD ADCON,#OUTVOLT_ADCONTROL|START_ADC
CALL SampleNew
LD OutVoltRegulate,R6
LD OutVoltRegulate+1,R7
CALL calc_outvolt ;计算输出电压
RET
;===================================
INPUT_VOLT_ADC::
LD ADCON,#INVOLT_ADCONTROL|START_ADC
CALL SampleNew
CALL calc_involt
LD VIn_ADValueL,R1
LD VIn_ADValueH,R0
RET
;===================================
TEMP_ADC::
LD ADCON,#TEMP_ADCONTROL|START_ADC
LD R7,#16 ; 30 * 50us=1.5ms
CLR R6
CALL Get_DCaverage_Data
RCF
RRC R0
RRC R1
RCF
RRC R0
RRC R1
RCF
RRC R0
RRC R1
RCF
RRC R0
RRC R1
LD T_ADValueL,R1
LD T_ADValueH,R0
RET
;===================================
;取当前ADC最大/最小值,用于KEY 和 Temp
;出口: RR0:最大, RR2:最小值
Get_DCaverage_Data::
AND UserFlag,#~FreshAdc
watie_djfdkfjDSL:
CLRWDT
TM UserFlag,#FreshAdc
JR Z,watie_djfdkfjDSL
CLR R0
CLR R1 ;总和
LD R2,#01H ;最大
LD R3,#5EH
start_get_:
AND UserFlag,#~FreshAdc
waite_over__:
CLRWDT
TM UserFlag,#FreshAdc
JR Z,waite_over__
CLR R4
LD R5,AdataH
LD R8,AdataL
AND R8,#03H
RCF
RLC R5
RLC R4
RCF
RLC R5
RLC R4
OR R5,R8
;**********************
ADD R1,R5
ADC R0,R4
JR C,TMPadc_over
;===========取最大值
;CP R4,R0
;JR UGT,set_max
;JR ULT,check_min
;CP R5,R1
;JR ULE,check_min
;set_max:
;LD R0,R4
;LD R1,R5
;JR check_min
check_over_time:
SUB R7,#1 ;采样时间到
SBC R6,#0
JR NC,waite_over__
RET
TMPadc_over:
LD R1,R3
LD R0,R2
RET
;===========取最小值
;check_min:
;CP R4,R2
;JR UGT,check_over_time
;JR ULT,set_min
;CP R5,R3
;JR UGE,check_over_time
;set_min:
;LD R2,R4
;LD R3,R5
;JR check_over_time
;**********************
;===================================
;--------------------------------------------------------------------
; Delay_1ms 1ms
; One period is 15us, if delay 1ms, R1=1000/15=67
;--------------------------------------------------------------------
Delay_1ms:
PUSH R1
LD R1,#140
loop_1ms:
NOP ;6 cycle
NOP
NOP
NOP
NOP
NOP
NOP
DEC R1 ;6
JR NZ,loop_1ms ;12/10
POP R1
RET
;--------------------------------------------------------------------
; Detect regulated output voltage, transformer temperature
;--------------------------------------------------------------------
Detect_Module::
check_volt_disp:
CALL sumallfordisp
TM UserFlag,#FreshDispVolt
JR Z,skip_volt_fresh_dispf
AND UserFlag,#~FreshDispVolt
CALL checkallfordisp
skip_volt_fresh_dispf:
CALL Detect_OverOrUnder_Voltage
CALL Detect_Over_Temperature
CALL Detect_fan_status
RET
;DETECT_EXIT:
;AND UserFlag,#~DetectFlag
;JR check_volt_disp
;-----------------------------------------------------------------
InVoltForDisp: .RAM_DS 2
OutVoltForDisp: .RAM_DS 2
DispCnt: .RAM_DS 1
sumallfordisp:
ADD InVoltForDisp+1,VIn_ADValueL
ADC InVoltForDisp,VIn_ADValueH
ADD OutVoltForDisp+1,Vout_ADValueL
ADC OutVoltForDisp,Vout_ADValueH
INC DispCnt
RET
;===================================
checkallfordisp:
LD R1,InVoltForDisp+1
LD R0,InVoltForDisp
LD R3,DispCnt
CLR R2
CALL dbl_divs
LD Vin_valueL,R1
LD Vin_valueH,R0
LD R1,OutVoltForDisp+1
LD R0,OutVoltForDisp
LD R3,DispCnt
CLR R2
CALL dbl_divs
LD Vout_valueL,R1
LD Vout_valueH,R0
CLR DispCnt
CLR InVoltForDisp+1
CLR InVoltForDisp
CLR OutVoltForDisp+1
CLR OutVoltForDisp
RET
;------------------------------------------------------------------
; 入口: R6:数据高八位 R7:数据低八位
; 出口: BCD码->低:(R2,),R3,R4,R5
BCD_conversion::
CLR R2
CLR R3
_1000_loop:
LD R4,R6 ;转换千位
LD R5,R7
SUB R7,#1000%256
SBC R6,#1000/256
JR C,conversion_next
INC R2
JR _1000_loop
conversion_next:
LD R6,R4 ;转换百位
LD R7,R5
_100_loop:
LD R4,R6
LD R5,R7
SUB R7,#100
SBC R6,#0
JR C,_10_loop
INC R3
JR _100_loop
;转换百位
_10_loop:
LD R6,R5
SUB R5,#10
JR C,end_of_BCD_conversion
INC R4
JR _10_loop ;转换个位
end_of_BCD_conversion:
LD R5,R6
RET
;--------------------------------------------------------------------
; Detect if output voltage great than 260V or less than 180V
;--------------------------------------------------------------------
CJUGTRR0L: .MACRO L,addr
CP R0,#L/256
JP UGT,addr
JR ULT,nxt
CP R1,#L%256
JP UGE,addr
nxt:
.ENDM
CJULTRR0L: .MACRO L,addr
CP R0,#L/256
JP ULT,addr
JR UGT,nxt
CP R1,#L%256
JP ULT,addr
nxt:
.ENDM
;=-===========
Detect_OverOrUnder_Voltage::
LD R1,Vout_valueL
LD R0,Vout_valueH
CJUGTRR0L 256,immediately ;260
CP Volt_PStatus,#VOLT_HIGH
JR EQ,restore_high
CJUGTRR0L 250,overhighvolt;252
JR deal_low
restore_high:
;******************
;CP HighProtTime,#0
;JR NE,voltprot_exit
;******************
CJUGTRR0L 242,voltprot_exit;242
deal_low
CP Volt_PStatus, #VOLT_LOW
JR EQ,restore_low
CJULTRR0L 180,lesslowvolt ;179
JR voltprot_normal
restore_low
CJULTRR0L 185,voltprot_exit ;185
;==================
voltprot_normal:
LD Volt_PStatus,#VOLT_NORMAL
RET
lesslowvolt:
LD Volt_PStatus, #VOLT_LOW
RET
Input_restNormal:
LD Volt_PStatus,#VOLT_NORMAL
RET
overhighvolt:
LD Volt_PStatus,#VOLT_HIGH
LD VOLT_PRTdelay,#3
LD SystemStatus,#SYSTEM_FAILED
JR voltprot_exit
immediately:
LD Volt_PStatus,#VOLT_HIGH
LD VOLT_PRTdelay,#0
LD SystemStatus,#SYSTEM_FAILED
voltprot_exit:
RET
;=====================================
Detect_Over_Temperature::
CP Temp_Status,#TEMP_PROTECTED
JR EQ,temp_restar
CP T_ADValueH,#T_PROTECT_VALUE/256
JR ULT,overtemp
JR UGT,Normaltemp
CP T_ADValueL,#T_PROTECT_VALUE%256
JR ULE,overtemp
JR Normaltemp
temp_restar:
CP T_ADValueH,#T_RESTAR_VALUE/256
JR ULT,temp_exit
JR UGT,Normaltemp
CP T_ADValueL,#T_RESTAR_VALUE%256
JR ULE,temp_exit
Normaltemp:
LD Temp_Status,#TEMP_NOPROTECTED
JP temp_exit
overtemp:
LD Temp_Status,#TEMP_PROTECTED
LD SystemStatus,#SYSTEM_FAILED
temp_exit:
RET
;=====================================
TEMP_45 .EQU 600;550
TEMP_65 .EQU 450;380
FAN_ON: .EQU 55H
FAN_OFF: .EQU 00H
Detect_fan_status:
CP FAN_STATUS,#FAN_ON
JR NE,NO_FAN_ON
CP T_ADValueH,#TEMP_45/256
JR ULT,EXIT_FAN
JR UGT,clr_fan
CP T_ADValueL,#TEMP_45%256
JR ULE,EXIT_FAN
clr_fan
LD FAN_STATUS,#FAN_OFF
AND P2,#~_FAN
EXIT_FAN
RET
NO_FAN_ON
CP T_ADValueH,#TEMP_65/256
JR ULT,SET_FAN
JR UGT,set_no_fan
CP T_ADValueL,#TEMP_65%256
JR ULE,SET_FAN
set_no_fan
LD FAN_STATUS,#FAN_OFF
RET
SET_FAN
LD FAN_STATUS,#FAN_ON
OR P2,#_FAN
RET
;=====================================SYSTEM INIT OUTPUT
SYS_INIT_OUTPUT:
CP SystemStatus,#SYSTEM_INIT
JR NE,SYSTEM_NORMAL_OUT
CP OutputDly_Timer,#00H
JR UGT,SYSTEM_INIT_EXIT
LD SystemStatus,#SYSTEM_NORMAL
SYSTEM_NORMAL_OUT:
SYSTEM_INIT_EXIT:
RET
;==================================
VoltUp MACRO ;电压向上调节,伺服驱动硬件模型 P2.0
AND P2,#~(_OUT_INC|_OUT_DEC)
OR P2,#_OUT_INC
ENDM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -