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

📄 p08003-1.asm

📁 智能多功能太阳能充电器的源程序....采用ETA的MCU
💻 ASM
📖 第 1 页 / 共 3 页
字号:
INCLUDE	"ADAM42K.LIB"
ESD1		EQU		00H
ESD2		EQU		01H
PUSH_A		EQU		10H
TIME0_MARK	EQU		11H
TIME1_MARK	EQU		12H
VARIABLE1	EQU		13H
VARIABLE2	EQU		14H
DELAY_C		EQU		16H
PBDR_MARK	EQU		17H
PHDR_MARK	EQU		18H
PWM_LOCK	EQU		20H
PWM_GRADE1	EQU		21H
PWM_GRADE2	EQU		22H
PWM_GRADE3	EQU		23H
I_STANDARD1	EQU		24H
I_STANDARD2	EQU		25H
ESD3		EQU		40H
FLASH_M		EQU		50H
FLASH_C1	EQU		51H
FLASH_C2	EQU		52H
FLASH_C3	EQU		53H
FLASH_CX1	EQU		54H
FLASH_CX2	EQU		55H
FLASH_CX3	EQU		56H
I_MARK		EQU		60H
I1_DATA1	EQU		61H
I2_DATA1	EQU		62H
I3_DATA1	EQU		63H
I1_DATA2	EQU		64H
I2_DATA2	EQU		65H
I3_DATA2	EQU		66H
FINISH_M	EQU		67H
FINISH_C1	EQU		68H
FINISH_C2	EQU		69H
FINISH_C3	EQU		6AH
ESD4		EQU		80H
ADCR1_M		EQU		90H
ADCR2_M		EQU		91H
ADCR3_M		EQU		92H
ADCR1_S1	EQU		93H
ADCR2_S1	EQU		94H
ADCR3_S1	EQU		95H
ADCR1_S2	EQU		96H
ADCR2_S2	EQU		97H
ADCR3_S2	EQU		98H
ADCR1_S3	EQU		99H
ADCR2_S3	EQU		9AH
ADCR3_S3	EQU		9BH
ADCR1_S4	EQU		9CH
ADCR2_S4	EQU		9DH
ADCR3_S4	EQU		9EH
ADCR1_S5	EQU		9FH
ADCR2_S5	EQU		0A0H
ADCR3_S5	EQU		0A1H
ADCR1_S6	EQU		0A2H
ADCR2_S6	EQU		0A3H
ADCR3_S6	EQU		0A4H
ADCR1_S7	EQU		0A5H
ADCR2_S7	EQU		0A6H
ADCR3_S7	EQU		0A7H
ADCR1_S8	EQU		0A8H
ADCR2_S8	EQU		0A9H
ADCR3_S8	EQU		0AAH
ADCR1_S9	EQU		0ABH
ADCR2_S9	EQU		0ACH
ADCR3_S9	EQU		0ADH
ESD5		EQU		0B0H
PV_ADCR1	EQU		0B1H
PV_ADCR2	EQU		0B2H
PV_ADCR3	EQU		0B3H
PV_ADCR1_S	EQU		0B4H
PV_ADCR2_S	EQU		0B5H
PV_ADCR3_S	EQU		0B6H
PV_ADCRX_S	EQU		0B7H
PV_ADCRXX_S	EQU		0B8H
PV_LOGIC1	EQU		0B9H
PV_LOGIC2	EQU		0BAH
PV_MARK		EQU		0BBH
BV_ADCR1	EQU		0BCH
BV_ADCR2	EQU		0BDH
BV_ADCR3	EQU		0BEH
BV_ADCR1_S	EQU		0BFH
BV_ADCR2_S	EQU		0C0H
BV_ADCR3_S	EQU		0C1H
BV_ADCRX_S	EQU		0C2H
BV_LOGIC	EQU		0C3H
BV_MARK		EQU		0C4H
ESD6		EQU		0FEH
ESD7		EQU		0FFH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OPTION=11110111
;		ORG	0000H
		WDTC
		BR	!RESET
		WDTC
		BR	!RESET
		WDTC
		BR	!RESET
		LDM	TIME0_MARK,#1111B		;定时器0溢出,给自己定义的寄存器赋值
		RETI
		LDM	TIME1_MARK,#1111B		;定时器1溢出,给自己定义的寄存器赋值
		RETI
		WDTC
		BR	!RESET
		WDTC
		BR	!RESET
		WDTC
		BR	!RESET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET:
		DI
		SPC
		WDTC
					
		LRI	TOPSR,#0001B	;初始化IO口的使用模式
		LRI	EIPSR,#0000B
		LRI	APSR1,#0000B
		LRI	APSR2,#0000B
		LRI	R1OD,#0001B	;0-低电平才有驱动能力
		LRI	R1PC,#1111B	;1-没有上拉电阻
		LRI	R1DD,#0001B	;0-输入状态
		LRI	R1DR,#1110B	;1-送数固定状态
		LRI	R1ST,#1111B	;1-IO不可以唤醒IC
		
		LRI	PBOD,#1111B
		LRI	PBPC,#1111B
		LRI	PBDD,#1111B
		LRI	PBDR,#1001B
		LRI	PBST,#1111B
		
		LRI	PGOD,#0000B
		LRI	PGPC,#1111B
		LRI	PGDD,#0000B
		LRI	PGDR,#1111B
		LRI	PGST,#1111B
		
		LRI	PHOD,#0000B
		LRI	PHPC,#0000B
		LRI	PHDD,#0000B
		LRI	PHDR,#1111B
		
		LRI	APSR1,#0000B	;设置PG0口为参考电压输入
		LRI	ADCIS,#1000B
		LRI	WACR,#1010B		;看门狗和AD寄存器初始化
		LRI	ADCM,#1001B
					
		LRI	T01MR,#0000B	;把T0的方波送到ROUT,之后设置PWM口输出ROUT信号
		LRI	CGMR,#1100B		;初始化载波发生器
		LRI	RCR,#0110B
					
		CALL	!CL_RAM				;L清除所有RAM
		LDM	ESD1,#0101B		;特殊处理,可以不用管
		LDM	ESD2,#0101B
		LDM	ESD3,#0101B
		LDM	ESD4,#0101B
		LDM	ESD5,#0101B
		LDM	ESD6,#0101B
		LDM	ESD7,#0101B
		LDM		PBDR_MARK,#1001B
		
		LDM	PWM_GRADE1,#0
		LDM	PWM_GRADE2,#0
		LDM	PWM_GRADE3,#0
		LDM	I_STANDARD1,#0		;1CH=250MA  5CH=950MA
		LDM	I_STANDARD2,#0

RESET_VOL:
		CALL		!PVOLTAGE_F
		CALL		!SLOW_F
		CMNE		PV_LOGIC1,#0
		BR		!RESET_VOL
		CMNE		PV_LOGIC2,#0
		BR		!RESET_VOL
		CALL		!BVOLTAGE_F
		
		LRI	IEDS,#0000B		;中断标识初始化
		LRI	IENR,#1000B
		LRI	IENR2,#0000B
		LRI	IRQR,#0000B
		LRI	IRQR2,#0000B
		LRI	CGHMD,#0001B
		LRI	CGHLD,#1001B
		LRI	CGLMD,#0001B
		LRI	CGLLD,#1001B
		LRI	CGMR,#1001B
		LRI	T1HD,#0111B		;定时器1初始化
		LRI	T1LD,#1000B
		LRI	T1MR,#1111B		;开启定时器1
		LRI	ABR0,#<PWM_TAB
		LRI	ABR1,#>PWM_TAB
		LRI	ABR2,#[PWM_TAB
		LRI	ABR3,#]PWM_TAB
		CLRC
		LDA	PWM_GRADE1
		ADDC	ABR0,A
		LDA	PWM_GRADE2
		ADDC	ABR1,A
		LDA	PWM_GRADE3
		ADDC	ABR2,A
		ADDC	ABR3,#0
		LDW	@ABR			;把表值读取出来
		CALL	!LOAD_PWM		;装载time0数据,开启TIME0计数器,把time0送到PB2输出PWM信号
		EI
		BR			!TIME_1_1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;MAIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIME_1:
		WDTC
		LDM		TIME0_MARK,#0000B
		LDM		TIME1_MARK,#0000B
		;FUNCTION
		LRI		ABR0,#<PWM_TAB
		LRI		ABR1,#>PWM_TAB
		LRI		ABR2,#[PWM_TAB
		LRI		ABR3,#]PWM_TAB
		CLRC
		LDA		PWM_GRADE1
		ADDC		ABR0,A
		LDA		PWM_GRADE2
		ADDC		ABR1,A
		LDA		PWM_GRADE3
		ADDC		ABR2,A
		ADDC		ABR3,#0
		LDW		@ABR			;把表值读取出来
		DI
		LRI		IENR,#1100B
		LRI		IRQR,#0000B
		EI
PWM_INT:
		CMNE		TIME0_MARK,#1111B
		BR		!PWM_INT
		CALL		!LOAD_PWM
		DI
		LRI		IENR,#1000B
		LRI		IRQR,#0000B
		EI
		CALL		!SLOW_F
		CALL		!FLASH_F
		CALL		!PVOLTAGE_F
		CALL		!BVOLTAGE_F
		CALL		!CURRENT_F
		CALL		!FINISH_F
		CALL		!ESD
		;FUNCTION
TIME_1_1:
		CMNE		TIME1_MARK,#1111B
		BR		!TIME_1_1
		BR		!TIME_1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;FIRST LAYER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FINISH_F:
		CMNE		PV_MARK,#0
		BR		!FINISH_F_A
		CLRC
		SUBC		I1_DATA1,#06H
		SUBC		I2_DATA1,#01H
		TSTC
		BR		!FINISH_F_1
FINISH_F_A:
		LDM		FINISH_C1,#0
		LDM		FINISH_C2,#0
		LDM		FINISH_C3,#0
		LDM		FINISH_M,#0
		RET
FINISH_F_1:
		CLRC
		ADDC		FINISH_C1,#1
		LDM		FINISH_C1,A
		ADDC		FINISH_C2,#0
		LDM		FINISH_C2,A
		ADDC		FINISH_C3,#0
		LDM		FINISH_C3,A
		CLRC
		SUBC		FINISH_C1,#05H
		SUBC		FINISH_C2,#00H
		SUBC		FINISH_C3,#0DH
		TSTC
		BR		!FINISH_F_2
FINISH_F_R:
		LDM		FINISH_M,#1111B
		LRI		R1DR,#1111B
		LRI		PBDR,#0000B
		LRI		TOPSR,#0000B
		LRI		T0MR,#0000B
		LRI		T1MR,#0011B
		CALL		!ESD
		WDTC
		BR		!FINISH_F_R
FINISH_F_2:
		RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SLOW_F:
		LAR		PHDR			;读取IO口状态
		LDM		VARIABLE1,A
		LDA		#0100B
		AND		VARIABLE1
		LDM		VARIABLE1,A
		XOR		PHDR_MARK		;和原来IO口的值比较
		LDM		VARIABLE2,A		;存起发生改变的输入口
		CANE		#0
		BR		!SLOW_F_1		;如果不同就进行去抖处理,相同就没有任何事情发生
		LDM		DELAY_C,#0
		RET
SLOW_F_1:
		CLRC
		ADDC		DELAY_C,#1		;去抖处理寄存器加1
		LDM		DELAY_C,A
		TSTC
		BR		!SLOW_F_2
		RET
SLOW_F_2:
		LDM		DELAY_C,#0
		LDA		VARIABLE1		;去抖结束后把输入按键最新值放入状态寄存器保存
		XMA		PHDR_MARK
		CALL		!SET_CURRENT
		RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CURRENT_F:
		CALL	!I_AD_F
		LDA	ADCR1_M
		LDM	ADCR1_S1,A
		LDA	ADCR2_M
		LDM	ADCR2_S1,A
		LDA	ADCR3_M
		LDM	ADCR3_S1,A
		CALL	!I_AD_F
		LDA	ADCR1_M
		LDM	ADCR1_S2,A
		LDA	ADCR2_M
		LDM	ADCR2_S2,A
		LDA	ADCR3_M
		LDM	ADCR3_S2,A
		CALL	!I_AD_F
		LDA	ADCR1_M
		LDM	ADCR1_S3,A
		LDA	ADCR2_M
		LDM	ADCR2_S3,A
		LDA	ADCR3_M
		LDM	ADCR3_S3,A
		CALL	!I_AD_F
		LDA	ADCR1_M
		LDM	ADCR1_S4,A
		LDA	ADCR2_M
		LDM	ADCR2_S4,A
		LDA	ADCR3_M
		LDM	ADCR3_S4,A
		CALL	!I_AD_F
		LDA	ADCR1_M
		LDM	ADCR1_S5,A
		LDA	ADCR2_M
		LDM	ADCR2_S5,A
		LDA	ADCR3_M
		LDM	ADCR3_S5,A
		CALL	!I_AD_F
		LDA	ADCR1_M
		LDM	ADCR1_S6,A
		LDA	ADCR2_M
		LDM	ADCR2_S6,A
		LDA	ADCR3_M
		LDM	ADCR3_S6,A
		;取出6个数中间的2个数据
		LDM	I_MARK,#0
		CALL	!I_ANALYSE
		CALL	!I_ANALYSE
		LDM	I_MARK,#1
		CALL	!I_ANALYSE
		LDA	I1_DATA2
		LDM	I1_DATA1,A
		LDA	I2_DATA2
		LDM	I2_DATA1,A
		LDA	I3_DATA2
		LDM	I3_DATA1,A
		CALL	!I_ANALYSE
		;求2个数的平均值
		CLRC
		LDA	I1_DATA2
		ADDC	I1_DATA1,A
		LDM	I1_DATA1,A
		LDA	I2_DATA2
		ADDC	I2_DATA1,A
		LDM	I2_DATA1,A
		LDA	I3_DATA2
		ADDC	I3_DATA1,A
		LDM	I3_DATA1,A
		LDA	I3_DATA1		;右移
		ARRC
		LDM	I3_DATA1,A
		LDA	I2_DATA1
		ARRC
		LDM	I2_DATA1,A
		LDA	I1_DATA1
		ARRC
		LDM	I1_DATA1,A
		;按照测试出来的电流去控制PWM
		CLRC
		LDA	I_STANDARD1
		SUBC	I1_DATA1,A
		LDM	VARIABLE1,A
		LDA	I_STANDARD2
		SUBC	I2_DATA1,A
		LDM	VARIABLE2,A
		TSTC
		BR	!CURRENT_F_2
		CMNE	VARIABLE2,#0		;分级别降低电流
		BR	!CURRENT_F_A
		CMLE	VARIABLE1,#8
		BR	!CURRENT_F_Y
		BR	!CURRENT_F_W
CURRENT_F_A:
		CMNE	VARIABLE2,#1
		BR	!CURRENT_F_B
		CMLE	VARIABLE1,#8
		BR	!CURRENT_F_W
		BR	!CURRENT_F_V
CURRENT_F_B:
		CMNE	VARIABLE2,#2
		BR	!CURRENT_F_U
		BR	!CURRENT_F_V
CURRENT_F_U:
		CLRC
		SUBC	PWM_GRADE1,#4
		LDM	PWM_GRADE1,A
		BR	!CURRENT_F_Z
CURRENT_F_V:
		CLRC
		SUBC	PWM_GRADE1,#3
		LDM	PWM_GRADE1,A
		BR	!CURRENT_F_Z
CURRENT_F_W:
		CLRC
		SUBC	PWM_GRADE1,#2
		LDM	PWM_GRADE1,A
		BR	!CURRENT_F_Z
CURRENT_F_Y:
		CLRC
		SUBC	PWM_GRADE1,#1
		LDM	PWM_GRADE1,A
CURRENT_F_Z:
		SUBC	PWM_GRADE2,#0
		LDM	PWM_GRADE2,A
		SUBC	PWM_GRADE3,#0
		LDM	PWM_GRADE3,A
		TSTC
		BR	!CURRENT_F_1
		LDM		PWM_LOCK,#0001B
		RET
CURRENT_F_1:
		LDM	PWM_GRADE1,#0
		LDM	PWM_GRADE2,#0
		LDM	PWM_GRADE3,#0
		LDM		PWM_LOCK,#0000B
		RET
CURRENT_F_2:
		TM	BV_MARK.#0		;如果电压超过8.4V就PWM减少
		BR	!CURRENT_F_Y
		CLRC
		SUBC	PWM_GRADE1,#0CH
		SUBC	PWM_GRADE2,#1
		SUBC	PWM_GRADE3,#2
		TSTC
		BR	!CURRENT_F_3
		LDM	PWM_GRADE1,#0CH
		LDM	PWM_GRADE2,#1
		LDM	PWM_GRADE3,#2
		LDM		PWM_LOCK,#0010B
		RET
CURRENT_F_3:
		CLRC
		ADDC	PWM_GRADE1,#1
		LDM	PWM_GRADE1,A
		ADDC	PWM_GRADE2,#0
		LDM	PWM_GRADE2,A
		ADDC	PWM_GRADE3,#0
		LDM	PWM_GRADE3,A
		LDM		PWM_LOCK,#0001B
		RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PVOLTAGE_F:
		CALL		!PV_AD_F	;取电源电压
		CLRC
		LDA		ADCR1_M		;累加电源电压
		ADDC		PV_ADCR1_S,A
		LDM		PV_ADCR1_S,A
		LDA		ADCR2_M
		ADDC		PV_ADCR2_S,A
		LDM		PV_ADCR2_S,A
		LDA		ADCR3_M
		ADDC		PV_ADCR3_S,A
		LDM		PV_ADCR3_S,A
		ADDC		PV_ADCRX_S,#0
		LDM		PV_ADCRX_S,A
		ADDC		PV_ADCRXX_S,#0
		LDM		PV_ADCRXX_S,A
		TSTC
		BR		!RESET
		CLRC
		ADDC		PV_LOGIC1,#1
		LDM		PV_LOGIC1,A
		ADDC		PV_LOGIC2,#0
		LDM		PV_LOGIC2,A
		CMLE		PV_LOGIC2,#0001B	;电压累加满32次就计算平均值
		BR		!PVOLTAGE_F_RET
		LDM		PV_LOGIC1,#0
		LDM		PV_LOGIC2,#0
		;;;;;;;;;;;;;;;;电源电压计算
		TM		PV_ADCR2_S.#0	;是否需要四舍五入
		BR		!PVOLTAGE_F_1
		BR		!PVOLTAGE_F_2
PVOLTAGE_F_1:
		CLRC
		ADDC		PV_ADCR2_S,#1
		LDM		PV_ADCR2_S,A
		ADDC		PV_ADCR3_S,#0
		LDM		PV_ADCR3_S,A
		ADDC		PV_ADCRX_S,#0
		LDM		PV_ADCRX_S,A
		ADDC		PV_ADCRXX_S,#0
		LDM		PV_ADCRXX_S,A
		TSTC
		BR		!RESET
PVOLTAGE_F_2:
		CLRC
		LDA		PV_ADCRXX_S		;右移
		ARRC
		LDA		PV_ADCRX_S
		ARRC
		LDM		PV_ADCR3,A
		LDA		PV_ADCR3_S
		ARRC
		LDM		PV_ADCR2,A
		LDA		PV_ADCR2_S
		ARRC
		LDM		PV_ADCR1,A
		LDM		PV_ADCR1_S,#0
		LDM		PV_ADCR2_S,#0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -