📄 qt2chgrdemo.asm
字号:
cmp #$80 ; 80/FF =128/255= 50% duty = max duty allow for Trickle charge
beq exit_CC_Trick
inc PWM_duty_L
bra exit_CC_Trick
error_CC_Trick
clr PWM_duty_L
clr PWM_duty_H
bclr 0,PTA ; output low to PWM_ctrl pin
bclr 0,DDRA ; change the PWM_ctrl pin to input
mov #%00001000,TSC0 ; disable PWM
exit_CC_Trick
mov PWM_duty_H,TCH0H ; write Hi byte first
mov PWM_duty_L,TCH0L
jsr bat_V_chk
lda VOLTAGE
cmp #$91 ; >2.5V?
bhi exit_trikle
jsr check_tim_out ; 10 mins charging time out?
brset time_overflow,FLAG,CHRG_FAULT
;jsr Tx_data ; transmit the data out
; jsr dly_500ms
bra trickle_loop
exit_trikle
bclr TOIE,TSC
clr chrg_tim_cnt_H
clr chrg_tim_cnt_L
bclr trickle,FLAG1
bclr trickle_fin,FLAG1
jmp fast_charge
*----------------------------------------------------------------------------------------
CHRG_FAULT
clr TCH0L
clr TCH0H
clr PWM_duty_L
clr PWM_duty_H
mov PWM_duty_H,TCH0H ; write Hi byte first
mov PWM_duty_L,TCH0L
mov #%00010000,TSC0 ; disable PWM, TCH0 as I/O with o/p Low
bclr TOIE,TSC ; disable TOF interrupt
bclr 0,PTA ; output low to PWM_ctrl pin
bclr 0,DDRA ; change the PWM_ctrl pin to input
Flash_LED
bset Green_LED,PTA ; turn-on Green LED
jsr dly_500ms
jsr check_bat_remove
brset bat_remove_f,FLAG1,bat_rmved ; battery removed?
bclr Red_LED,PTA ; turn on Red LED
jsr dly_500ms
jsr check_bat_remove
brset bat_remove_f,FLAG1,bat_rmved ; battery removed?
bra Flash_LED
bat_rmved
jsr dly_20ms
jsr check_bat_remove
brset bat_remove_f,FLAG1,exit_bf
bra Flash_LED
exit_bf
jmp START
********************************************************************
* Constant Current Charging Control
*
* R sense = 0.5 ohm, VrefH = 4.40V
*-------------------------------------------------------------------
* I (mA) 380 310 200 100 75 50
* Isense(mV) 190 155 100 50 37 25
* CURRENT $0B $09 $06 $03 $02 $01
********************************************************************
CC_Charging
bclr CC_error,FLAG1
jsr bat_I_chk
lda CURRENT
CMP #$0B
BLO Increase_Current ; if current < 380mA
BEQ exit_CC ; if equal then let it be
Decrease_Current ; if current > 380mA
lda PWM_duty_L
cmp #$00 ; 01/FF = 01/255 = 1% duty
beq error_CC
dec PWM_duty_L
bra exit_CC
Increase_Current
lda PWM_duty_L
cmp #$FF ; FF/100 =255/256= 99% duty = max duty
beq exit_CC
inc PWM_duty_L
bra exit_CC
error_CC
bset CC_error,FLAG1
mov #$10,TSC0 ; disable PWM output
bclr 0,PTA ; output low to PWM_ctrl pin
bclr 0,DDRA ; change the PWM_ctrl pin to input
exit_CC
mov PWM_duty_H,TCH0H ; write Hi byte first
mov PWM_duty_L,TCH0L
; lda CURRENT
; sta V_IRbyte
; jsr DSRL_out ; transmit the data out
rts
********************************************************************
* Constant Voltage Charging Control
*
* VrefH = 4.40V
*-------------------------------------------------------------------
* B+ (V) 4.20 4.10 4.00
* $F4 $EE $E7
********************************************************************
CV_Charging
jsr bat_V_chk ; V_B+ (AD3)
LDA VOLTAGE
CMP #$EE
BLO Increase_Voltage ; if Voltage < 4.10V
BEQ exit_CV ; if equal then let it be
Decrease_Voltage ; if Voltage > 4.1V
lda PWM_duty_L
cmp #$00 ; 01/FF = 26/255 = 10% duty
beq exit_CV
dec PWM_duty_L
bra exit_CV
Increase_Voltage
lda PWM_duty_L
cmp #$ff ; ff/FF = max current
beq exit_CV
inc PWM_duty_L
bra exit_CV
error_CV
bclr 0,PTA ; output low to PWM_ctrl pin
bclr 0,DDRA ; change the PWM_ctrl pin to input
exit_CV
mov PWM_duty_H,TCH0H ; write Hi byte first
mov PWM_duty_L,TCH0L
; lda VOLTAGE
; sta V_IRbyte
; jsr DSRL_out ; transmit the data out
rts
********************************************************************
* Check Temperature
*
* R pull-up = 10Kohm (1%), VrefH = 4.40V
*-------------------------------------------------------------------
* T (degC) 50 45 40 25 10 0 -5
* R NTC(K) 3.63 4.40 5.356 10 19.85 32.33 42.81
* Tsense(V) 1.17 1.34 1.53 2.2 2.92 3.36 3.57
* Tsense $44 $4E $59 $7F $A9 $C2 $CF
********************************************************************
Temp_Check
lda #$01 ; selected AD1 as ADC input (VR for Tsense)
jsr AD_Check ; result stored in Acc.
sta TEMPERATURE
cmp #$4E
blo error_Ts ; temperature > 45 degC
cmp #$C2
bhi error_Ts ; temperature < 0 degC
bclr TEMP_FLAG,FLAG
exit_Ts
;lda TEMPERATURE
;sta V_IRbyte
;jsr DSRL_out ; transmit the data out
rts
Error_Ts
bset TEMP_FLAG,FLAG
bra exit_Ts
*-------------------------------------------------
********************************************************************
* Check Battery Valid
********************************************************************
bat_ID_check
brset 2,PTA,bat_not_valid
jsr dly_20ms ; for debounce
brset 2,PTA,bat_not_valid
jsr DLY_500ms
brset 2,PTA,bat_not_valid
bset bat_ID,FLAG ; 1=bat valid
rts
bat_not_valid
bclr bat_ID,FLAG ; 0=not valid
rts
*--------------------------------------------------
check_bat_remove
brset 2,PTA,set_bat_remove_flag ; battery removed?
clr_bat_remove_f
bclr bat_remove_f,FLAG1 ; battery not removed
rts
set_bat_remove_f
bset bat_remove_f,FLAG1 ; battery removed
rts
********************************************************************
* Check Battery voltage valid (ADC3)
*
* VrefH = 4.40V
*-------------------------------------------------------------------
*
* Battery(V) 1.0V 2.5V 4.1V 1.53 2.2 2.92 3.36 3.57
* VOLTAGE $3A $91 $EE $59 $7F $A9 $C2 $CF
********************************************************************
bat_valid_v_chk
lda #$03 ; selected AD3 as ADC input (battery voltage)
jsr AD_Check ; result stored in Acc.
sta VOLTAGE
cmp #$EE ; 4.1V
bhi battery_full
cmp #$3A ; 1.0V
blo bat_v_not_valid
bset bat_v_valid,FLAG
rts
bat_v_not_valid
bclr bat_v_valid,FLAG
rts
battery_full
bset bat_full,FLAG
rts
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bat_V_chk
lda #$03 ; selected AD3 as ADC input (battery voltage)
jsr AD_Check ; result stored in Acc.
SUB CURRENT
sta VOLTAGE
rts
bat_I_chk
lda #$02 ; I_Sense (AD2)
jsr AD_Check
sta CURRENT
rts
bat_T_chk
lda #$01 ; selected AD1 as ADC input (VR for Tsense)
jsr AD_Check ; result stored in Acc.
sta TEMPERATURE
rts
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TOGGLE_IO ; used to check the bus frequency
bset 3,DDRA ; LED's control pin
bclr 3,PTA
bset 3,PTA
bclr 3,PTA
bset 3,PTA
bclr 3,PTA
rts
*********************************************************************
* Enable the MMDS clock. For EM board only *
*********************************************************************
enable_ext_clock
; mov #08,$1E ; enable external oscillator
mov #18,$1E ; enable external crysta
Delay1 deca ; Delay 4096 cycles
bne Delay1
bset 1,$36 ; set ECGON bit
nop
brclr 0,$36,* ; check ECGST bit
bset 4,$36 ; set this unknow bit
rts
*********************************************************************
* Enable the MMDS clock. For EM board only *
*********************************************************************
en_int_3M2_clk
mov #$20,$37 ; turn the ICG to generated 3.2MHz bus
mov #$2E,$38
rts
***********************************************************
* Initialize the Oscillator for internal clock only. *
***********************************************************
Enable_int_Clk
mov #$00,OSCSTAT ; use internal clock only
lda $FFC0
sta OSCTRIM ; use current trim value
rts
*********************************************************************
* Config TIMER module as UNBuffered PWM for channel 0 *
*********************************************************************
Init_TIM_dis_PWM:
MOV #$30,TSC ; stop and reset the TIM counter, disable TOF interrupt
;MOV #$1A,TSC0 ; prescaler, set up channel 0 for unbuffered PWM
mov #%00010000,TSC0 ; ch0 interrupt enable, TCH0 use as port function output Low
MOV #$00,TCH0H ; output low at TCH0
MOV #$00,TCH0L
BCLR 5,TSC ; clear TSTOP, enable timer counter,
; timer counter start only when charger is in ready to charge state
LDA TSC0 ; read TCH0 status and control register to clear CH0F flag
bclr CH0F,TSC0 ; clear CH0F flag
lda TSC ; clear TOF flag
bclr TOF,TSC
rts
ORG $FC00
************************************************
KBIRQ_ISR:
NOP
BSET 2,KBSCR ; clear KBIF
NOP
RTI
IRQ_ISR:
NOP
BSET 2,INTSCR ; CLEAR IRQF
NOP
RTI
*
* DMY_ISR - dummy Interrupt Service Routine(with no operation) *
* In : <nil> *
* Out : <nil> *
* Call : <nil> *
* --------------------------------------------------------------------- *
DMY_ISR:
nop
* ------------------------------------------------------------------------
rti
TIM0_ISR ;
LDA TSC0 ; read TCH0 status and control register to clear CH0F flag
bclr CH0F,TSC0
rti
TOF_ISR
dbnz tim_cnt_low,exit_tof ; [5]
dbnz ms500_cnt,nexxt ; 512ms = 1/12.5K * 256 * $19
bset rs232_tick,FLAG1
nexxt
dbnz tim_cnt_high,exit_tof ; [5]
bset timer_tick,FLAG ; [4] this flag set every 65536 TOF = 5.24288s
exit_tof
lda TSC ; [3]
bclr TOF,TSC ; [4]
rti ; [7]
********************************************************************************************************
; org $FFC0
; fdb $73 ; ICG trimmed value for this QT2 sample
org $FFE0
ADCIRQ DW DMY_ISR
org $FFDE
KBIRQ DW KBIRQ_ISR
org $FFF2
TOFIRQ DW TOF_ISR
TIMCH1IRQ DW DMY_ISR
TIMCH0IRQ DW TIM0_ISR
org $FFFA
EXT_IRQ DW IRQ_ISR
SWI_IRQ DW DMY_ISR
RESET DW START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -