📄 jinjun.asm
字号:
;checksum is #h,use s8asm199J,sn8wt199j
;*******************************************************************************
; FILENAME : jinjun.ASM
; AUTHOR : ZZR
; PURPOSE : CHARGER Code for SN8P1702A
; REVISION : 27/4/2004 V1.1
;完成充电全过程,且充电最终电压可上4.2V,充电电流750MA,转折点为4.1V.充电电压纹波小于100MV
;补偿充电完善.加WATCHDOG.
;Crystal:8M,
;add temprature protect
;*******************************************************************************
;* (c) Copyright 2003, ZZR TECHNOLOGY CO., LTD.
;*******************************************************************************
CHIP SN8P1702a ; Select the CHIP
//{{SONIX_CODE_OPTION
.Code_Option High_Clk 4M_X'tal
.Code_Option High_Clk/2 Disable
.Code_Option Security Enable
.Code_Option Watch_Dog Enable
.Code_Option TC0_Counter 8-Bit
.Code_Option TC1_Counter 8-Bit
.Code_Option Noise_Filter Enable
.Code_Option Int_16K_RC By_CPUM
//}}SONIX_CODE_OPTION
;-------------------------------------------------------------------------------
; Include Files
;-------------------------------------------------------------------------------
.nolist ; do not list the macro file
INCLUDESTD MACRO1.H
INCLUDESTD MACRO2.H
INCLUDESTD MACRO3.H
.list ; Enable the listing function
;-------------------------------------------------------------------------------
; Constants Definition
;-------------------------------------------------------------------------------
; ONE EQU 1
;-------------------------------------------------------------------------------
; Variables Definition
;-------------------------------------------------------------------------------
.DATA
org 0h ;Bank 0 data section start from RAM address 0x000
aBuf ds 1 ;Accumulater buffer
pflagBuf ds 1 ;PFLAG buffer
Temp ds 1
Temp1 ds 1
Temp2 ds 1
temp3 ds 1
temp4 ds 1
time2ms ds 1
time10ms ds 1
Time1s ds 1
timeStemp ds 1
timeMtemp ds 1
timeHtemp ds 1
SysFlag ds 1
SysFlag1 ds 1
sysflagerror ds 1
TimeOfAdc ds 1
adcItempH ds 1
adcItempL ds 1
AdcTempH ds 1
AdcTempL ds 1
adcVtempH ds 1
adcVtempL ds 1
adcIbufH ds 1
adcIbufL ds 1
adcVbufH ds 1
adcVbufL ds 1
adcTtempH ds 1
adcTtempL ds 1
Count ds 1
countwait ds 1
countovt ds 1
countbadbat ds 1
countshort ds 1
cntnoBat ds 1
countnoBati ds 1
cntAdcErr ds 1
countok ds 1
countfinish ds 1
countdelay ds 1
countMobOn ds 1
countOvp ds 1
VolTempH ds 1
VolTempL ds 1
admtemp ds 1
checkSuml ds 1
checkSumh ds 1
frontPoint ds 1
buffer1 ds 16
buffer2 ds 16
.const
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; system const define
;;;;;;;;;;;;;;;;
admItemp equ #93h
admVtemp equ #92h
admTtemp equ #90h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; adcVol data=V/5*4096
;;;;;;;;;;;;;;;;;;;
v01L equ #052h
v01H equ #00h
v28L equ #0f6h
v28H equ #08h
v37L equ #0d7h
v37H equ #0bh
v40h equ #0ch
v40l equ #0cch
v41h equ #0dh
v41l equ #1fh
v42h equ #0dh
v42l equ #70h
v43h equ #0dh
v43l equ #0c3h
v45h equ #0eh
v45l equ #66h
vconsth equ #0dh
vconstl equ #70h
vnoBatH equ #00h
vnoBatL equ #0a4h
vshorth equ #00h
vshortl equ #55h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; adccur data=0.5R*I/5/2*4096
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
inobatl equ #10h
inobath equ #00h
ishortL equ #71h ;900ma
iShortH equ #01h
iokL equ #16h
iokH equ #0h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; adctem data=Rt/(Rt+10k)*4096
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tHighL equ #0a7h ;42.5c
tHighH equ #04h
tLowL equ #0bch ;0c
tLowH equ #0ch
t48cl equ #0a7h ;48c
t48ch equ #04h
tN3cl equ #0bch ;-3c
tN3ch equ #0ch
;;;;;;;;;;;;;;;;;;;;;
;temprature table Vtemp=Rt/(Rt+10k)*5
;0c equ 27.1125k 3.6527v
;5c equ k
;10c equ k
;15c equ k
;20c equ k
;25c equ k
;30c equ k
;35c equ k
;40c equ 5.78215k
;41c equ 5.590625k
;42c equ 5.409375k
;42.5c equ 5.321875k 1.7367v
;43c equ 5.234375k
;44c equ 5.039375k
;45c equ 4.890625k
;46c equ 4.73125k
;47c equ 4.578125k
;48c equ 4.43125k
;49c equ 4.290625k
;50c equ 4.15625k
;-------------------------------------------------------------------------------
; Bit Flag Definition
;-------------------------------------------------------------------------------
flagovp equ SysFlagerror.0
FlagOverTemp equ SysFlagerror.1
FlagShort equ SysFlagerror.2
FlagnoBat equ SysFlagerror.3
FlagBadBat equ SysFlagerror.4
flagopencheck equ sysflagerror.5
flagfinish equ sysflagerror.6
flagAdcErr equ sysflagerror.7
AdcOverTime equ SysFlag.0
Flag130ms equ SysFlag.1
Flag10ms equ sysflag.2
flag1s equ sysflag.3
flagwaitphone equ sysflag.4
FlagChargFast equ SysFlag.7
flag10count equ sysflag1.1
flagwakeup equ sysflag1.2
flagSysErr equ sysflag1.3
flagBufChange equ sysflag1.4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; mcu port define
;;;;;;;;;;;;;;;;;
red equ p5.1
green equ p5.2
rapid equ p5.3
recover equ p5.4
Ibat equ p4.3
Vbat equ p4.2
Temperature equ p4.0
mobileOn equ p1.0
;-------------------------------------------------------------------------------
; Code section
;-------------------------------------------------------------------------------
.CODE
ORG 0 ;Code section start
jmp Reset ;Reset vector
;Address 4 to 7 are reserved
ORG 8
;-------------------------------------------------------------------------------
; Isr (Interrupt Service Routine)
; Arguments :
; Returns :
; Reg Change:
;-------------------------------------------------------------------------------
int:
xch a, abuf
xch a, pflag
xch a, pflagbuf
inttc1r:
bts1 ftc0irq
jmp intEnd
decms Time2ms
jmp intend
bset Flag10ms
mov a, #5
mov Time2ms, a
decms Time10ms
jmp intend
bset flag1s
incms Time1s
nop
mov a, #100
mov time10ms, a
intend:
clr intrq
xch a, pflagBuf
xch a, pflag
xch a, aBuf
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; reset area
Reset:
dint
mov a, #0fh
mov stkp, a
clr pflag
clr oscm
;;;;;;;;;;;;;;;;;;;;;;;
; clear ram
ClrRam:
b0mov y, #0
b0mov z, #7fh
ClrRam1:
clr @YZ
decms z
jmp ClrRam1
clr @YZ
;-------------------------------------------------------------------------------
; SysInit
; Initialize I/O, Timer, Interrupt, etc.
;-------------------------------------------------------------------------------
SysInit: ;System initial
PortSet: ;set port mode
clr p1
clr p4
mov a, #00000010b
mov p1m, a
mov a, #11110000b
mov p4m, a
mov a, #00001000b
mov p5, a
mov A, #00011111b ;close the p5
mov p5m, A
timerSet:
mov a, #00001010b ;tc1x8,tc0gn
mov t0m, a
mov a, #01000100b ;set the timer,fcpu/8,auto load
mov tc0m, a
mov A, #6
mov tc0c, A
mov tc0r, a
mov A, #01000000b ;&pwm clock
mov tc1m, A
clr tc1r
adcSet:
clr adm
mov a, #01100000b
mov adr, a ;adc length=12bits clock=fcpu/8
intSet:
mov A, #00100000b ;enable t0 int
b0mov inten, A
sysTest:
clr y
clr z
yzcheck:
mov a, y
sub a, #1
bts0 fc
jmp yzok
mov a, z
cmprs a, #4
jmp yzok
mov a, #4
add z, a
yzok:
movc
add checkSumL, a
mov a, r
adc checkSumH, a
mov a, #userEnd$l
sub a, z
mov a, #userEnd$m
sbc a, y
bts1 fc
jmp sysStart
incms z
jmp yzcheck
incms y
jmp yzcheck
jmp reset
sysStart:
bclr flag1s
eint ;Enable global interrupt
bset ftc0enb
bset ftc1enb
mov a, #5
mov Time2ms, a
mov a, #100
mov time10ms, a
mov a, #0
sub a, checkSumL
mov a, #0
sbc a, checkSumH
; bts1 fc
; jmp sysError
; b0mov r, #3
;powerOn: ;wait for 3s,and flash orange
; bset fwdrst ;indicate powerOn
; clr TC1R
; mov a, time10ms
; sub a, #50
; bts0 fc
; jmp $+4
; bclr green
; bclr red
; jmp $+3
; bset green
; bset red
; bts1 flag1s
; jmp powerOn
; bclr flag1s
; decms r
; jmp powerOn
;-------------------------------------------------------------------------------
; Main routine
;-------------------------------------------------------------------------------
Main:
call delay50ms
bset fwdrst
bts0 mobileOn
jmp Main
bts0 flagfinish
jmp $+2
clr sysflag
clr sysflag1
Main1:
call AdcTemPro
mov A, tHighL ;temperature High?(7.2vbat)?
sub A, AdcTtempL
mov A, tHighH
sbc A, AdcTtempL
bts0 FC
jmp OverTemp
mov A, tLowL ;temperature Low?(7.2vbat)?
sub A, AdcTtempL
mov A, tLowH
sbc A, AdcTtempH
bts1 FC
jmp OverTemp
bclr FlagOverTemp
Main3:
call AdcPro
mov a, vnoBatl ;>vnobat?
sub a, adcVtempL
mov a, vnoBath
sbc a, adcVtempH
bts0 fc
jmp noBat ;yes,noBat
mov a, v42l ;>4.2V?
sub a, adcVtempL
mov a, v42h
sbc a, adcVtempH
bts1 fc
jmp chargfaststop ;yes,don`t charge
maintofastyn: ;no,
mov A, v28l ;>4.5v(7.2vbat)?
sub A, adcVtempL
mov A, v28h
sbc A, adcVtempH
bts1 fc
jmp ChargFast ;yes,goto charge
ChargPro: ;no,wake up
bset flagwakeup
;jmp chargfast
;----------------------------------------------------------------
; charg fastmode
;--------------------------------------------------------------
ChargFast:
dint
mov a, #10
mov time2ms, a
mov a, #100
mov time10ms, a
clr time1s
clr timestemp
clr timeMtemp
clr timeHtemp
eint
clr countovt
clr cntnoBat
clr countshort
clr countfinish
clr countok
clr adcVbufH
clr adcVbufL
clr adcIbufH
clr adcIbufL
;-----------------------------------------------------
; constant voltage charge
;-----------------------------------------------------
;-----------------------------------------------------
chargfast1:
ChargeVol42v:
bts0 flagfinish
jmp $+4
bclr green ;charge indccation
bset red
jmp $+3
bclr red
bset green
call AdcPro ;get voltage¤t
mov a, adcVtempL
add adcVbufL, a
mov a, adcVtempH
adc adcVbufH, a
clc
rrcm adcVbufH
rrcm adcVbufL
mov a, adcItempL
add adcIbufL, a
mov a, adcItempH
adc adcIbufH, a
clc
rrcm adcIbufH
rrcm adcIbufL
fastNoBatyn:
mov a, iNobatL
sub a, adcItempL
mov a, iNobatH
sbc a, adcItempH
bts1 fc
jmp fastBatOn
mov a, vnoBatl ;noBat?
sub a, adcVbufL
mov a, vnoBath
sbc a, adcVbufH
bts0 fc
jmp fastnoBat ;yes
fastBatOn:
clr cntnoBat
jmp fasttoshortyn
fastnoBat: ;noBat times is enough?
mov a, cntnoBat
add a, #1
mov cntnoBat, a
sub a, #5
bts0 fc
jmp noBat ;yes,goto noBat process
jmp chargVolEnd ;no,goto end
fasttoshortyn:
mov A, iShortl ;short?(3.6vbat)
sub A, adcIbufL
mov A, iShorth
sbc A, adcIbufH
bts0 fc
jmp fasttoshortyn1 ;short
jmp fastShortNo
fasttoshortyn1:
mov a, vShortL
sub a, adcVbufL
mov a, vShortH
sbc a, adcVbufH
bts0 fc
jmp fastShort
fastShortNo:
clr countShort
jmp mobileOnYn
fastShort:
mov a, countshort
add a, #1
mov countshort, a
sub a, #2
bts0 fc
jmp short
jmp ChargVolEnd
mobileOnYn:
bts1 Flag10ms
jmp chargvolend
bclr Flag10ms
bts0 mobileOn
jmp mobileOnYn1
clr countMobOn
jmp TempOverYn
mobileOnYn1:
mov a, countMobOn
add a, #1
mov countMobOn, a
sub a, #5
bts1 fc
jmp TempOverYn
clr countMobOn
jmp main
TempOverYn:
call AdcTemPro
mov A, tHighL ;high(7.2vbat)?
sub A, adcTtempL
mov A, tHighH
sbc A, adcTtempH
bts0 FC
jmp fasttoOverTemp ;yes
mov A, tLowL ;low(7.2vbat)?
sub A, adcTtempL
mov A, tLowH
sbc A, adcTtempH
bts1 FC
jmp fasttoOverTemp ;yes
clr countovt
OvpYn:
mov a, v43L
sub a, adcVtempL
mov a, v43H
sbc a, adcVtempH
bts1 fc
jmp OvpYn1
clr countOvp
jmp wakeUpYn
OvpYn1:
mov a, countOvp
add a, #1
mov countOvp, a
sub a, #5
bts0 fc
jmp ovp
jmp wakeUpYn
;--------------------------------------------------
; fast to temp over
;--------------------------------------------------
fasttoOverTemp:
mov a, countovt
add a, #1
mov countovt, a
sub a, #5
bts0 fc
jmp overtemp
;
wakeUpYn:
bts1 flagWakeUp
jmp chargOkYn
;--------------------------
; wake up
;--------------------------
wakeupOkYn:
bset rapid
bset recover
mov a, v28L
sub a, adcVtempL
mov a, v28H
sbc a, adcVtempH
bts0 fc
jmp wakeUpFailYn
wakeUpsucceedYn:
call adcPro
mov a, v28L
sub a, adcVtempL
mov a, v28H
sbc a, adcVtempH
bts0 fc
jmp ChargVolEnd
bclr flagWakeUp
jmp chargVolEnd
wakeUpFailYn:
mov a, #48
sub a, timeMtemp
mov a, #1
sbc a, timeHtemp
bts0 fc
jmp ChargVolEnd
wakeUpFailYn1:
call adcPro
mov a, v28L
sub a, adcVtempL
mov a, v28H
sbc a, adcVtempH
bts1 fc
jmp ChargVolEnd
wakeUpFail:
bset rapid
bclr recover
bclr green
bclr red
jmp badbat ;yes
;
chargokyn:
bclr rapid
bclr recover
mov A, timestemp ;charge 2s?
sub A, #2
bts1 FC
jmp ChargVolEnd
mov a, iNobatL
sub a, adcIbufL
mov a, iNobatH
sbc a, adcIbufH
bts0 fc
jmp Nobat
mov A, iokl ;<60mA?(7.2vbat)
sub A, adcIbufL
mov A, iokh
sbc A, adcIbufH
bts0 FC
jmp chargokyn2 ;<60ma
clr countok
jmp chargvolend
chargokyn2:
;mov A, v41l ;>8.2v?(7.2vbat)
;sub A, adcVbufL
;mov A, v41h
;sbc A, adcVbufH
;bts1 fc
;jmp chargokyn3 ;>8.2v; ChargVolEnd ;<4.00v,charger isnot ok
;clr countok
;jmp chargvolend
chargokyn3:
mov a, countok
add a, #1
mov countok, a
sub a, #3
bts1 fc
jmp chargvolend
chargfinishyn:
;bclr red
;bset green ;<130mA,send charge ok signel
jmp chargfaststop
ChargVolEnd:
;---------------------
chargevolend1:
bts1 flag1s
jmp chargInTime
bclr flag1s
call timerPro
mov a, #30
sub a, timeMtemp
mov a, #5
sbc a, timeHtemp
bts1 fc
jmp chargFastStop
ChargInTime:
jmp ChargeVol42v ;no,continue
;--------------------------------------------------------------
;fast mode stop
;----------------------------------------------------------------
ChargFastStop:
bclr recover ;stop charge
bset rapid
;bclr red
dint ;wait for 1s
bclr flag1s
eint
ChargFaStopWait2s:
call AdcPro
noBatcheck:
mov A, vnoBatl ;noBat?
sub A, adcVtempL
mov A, vnoBath
sbc A, adcVtempH
bts1 FC
jmp batBadcheck ;no
call delay50ms
call AdcPro
mov A, vnoBatl ;noBat?
sub A, adcVtempL
mov A, vnoBath
sbc A, adcVtempH
bts0 FC
jmp noBat ;no
batBadcheck:
mov A, v28l ;>2.8v?(7.2vbat)
sub A, adcVtempL
mov A, v28h
sbc A, adcVtempH
bts1 FC
jmp batOkcheck ;>2.8v battery ok
call delay50ms
call AdcPro
mov A, v28l ;>2.8v(7.2vbat)
sub A, adcVtempL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -