⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jinjun.asm

📁 SONIX汇编语言
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;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&current
	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 + -