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

📄 kalibr.asm

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 ASM
字号:
;==============================================================================
;  Procedury kalibracyjne
;  Projekt:	Miernik energii i mocy na ADE7759
;==============================================================================

.cseg
;==============================================================================
; KALIBRACJE miernika wykonywac po kilku minutach od wlaczenia
KALIBRACJA:	; kalibracji miernika -ustawienie parametrow
	sbic	KLAW_PIN, KLAW_TAK	; przeskocz jesli stan niski (klawisz wcisniety)
	ret

	KLAWISZ_WCISNIETY		; ustaw bit wcisniecia klawisza
	rcall	LCD_CLEAR
	ldi	zh, high(2*txt_kalibr)
	ldi	zl,  low(2*txt_kalibr)
	rcall	LCD_STR_FLASH	; komunikat

	lds	temp, Flagi2
	cbr	temp, 1<<f2EN_S	; czyszczenie flagi akumulowania en. poz.
	sbr	temp, 1<<f2EN_WH

	lds	temp, Ade_irqen	; Ade_irqen
	cbr	temp, 1<<I_SAG	; czysc bit przerwania od braku napiecia (kanal CH2)
	mov	r0, temp
	ldi	temp, ADE_IRQEN_ADR
	call	SPI_ADE_WRITE_1B

	lds	zl, Ade_mode	; Ade_mode
	lds	zh, Ade_mode+1
	push	zl
	push	zh		; zachowaj oryginal
	sbr	zl, 1<<M_DISSAG	; wylacz linie SAG
	sbr	zh, 1<<M_DTRT1
	cbr	zh, 1<<M_DTRT0	; ustaw zbieranie probek na 7kHz (140 na okres 50Hz)
	sts	Ade_mode, zl
	sts	Ade_mode+1, zh
	movw	r0, zl
	ldi	temp, ADE_MODE_ADR
	call	SPI_ADE_WRITE_2B
	call	OIP		; przeliczenie ilosci: Probek_ile
	pop	zh
	pop	zl
	sts	Ade_mode, zl	; przywroc oryginal
	sts	Ade_mode+1, zh

	sbr	flagi, 1<<fKAL	; ustaw bit kalibracji
	cbr	flagi, 1<<fTARYFY
	ldi	temp, 1<<STE1_SEK	; wskaz En_SEK
	sts	Status_E1, temp
	ret



;------------------------------------------------------------------------------
KAL_E:	; kalibracja zera probki energii (tzn. jak najmniejszej)
	; wykonywac pod napieciem, ale bez obciazenia
	; przy wsp_E = 675770  --> kazde 100h w APOS oznacza 140,8 Esek.
	lds	r18, Cykli
	dec	r18
	sts	Cykli, r18
	breq	KLE_1
	ret

KLE_1:	lds	n1, Energia1_ses	; Esek * Cykli * 256
	lds	n2, Energia1_ses+1
	lds	n3, Energia1_ses+2
	lds	n4, Energia1_ses+3
	clr	n5
	clr	n0
	sts	Flagi4, n0
	ldi	y0,  low(CYKLI_POM * 1408 /10)
	ldi	y1, high(CYKLI_POM * 1408 /10)
	rcall	DIV_48_16
	movw	r0, n0
	com	r0
	com	r1
	sts	Ade_apos, r0
	sts	Ade_apos+1, r1
	cli
	ldi	temp, ADE_APOS_ADR
	call	SPI_ADE_WRITE_2B
	sei
	ret


;------------------------------------------------------------------------------
KAL_I:	; kalibracja zera pradu
	ldi	zl,  low(Prad_min)
	ldi	zh, high(Prad_min)
	sbrs	temp, f4KAL_CH
	rjmp	KALI_DC
	sbrs	temp, f4KAL_CH0
	rjmp	KALI_CH
	ldi	zl,  low(Prad_min)
	ldi	zh, high(Prad_min)
	rcall	KKCH
	sts	Ade_ch1os, r20
KALI_CH:	lds	r20, Ade_ch1os
	lds	r4, Prad_rms
	lds	r5, Prad_rms+1
	rcall	KAL_CHOS
	mov	r0, r20
	cli
	push	temp
	ldi	temp, ADE_CH1OS_ADR
	sts	Ade_ch1os, r0
	call	SPI_ADE_WRITE_1B	; Ade_ch1os
	pop	temp
	sei
	ret

KALI_DC:	rcall	KAL_DC		; potem kalibracja offsetu DC
	sbrc	temp, f4KAL_DCI
	ret
	sts	Off_I_dc, r0
	sts	Off_I_dc+1, r1
	sbr	temp, 1<<f4KAL_ZI	; teraz flaga kalibracji zera pradu
	sts	Flagi4, temp
	ret

;--------------------------------------
KAL_U:	ldi	zl,  low(Napiecie_min)
	ldi	zh, high(Napiecie_min)
	sbrs	temp, f4KAL_CH
	rjmp	KALU_DC
	sbrs	temp, f4KAL_CH0
	rjmp	KALU_CH
	ldi	zl,  low(Napiecie_min)
	ldi	zh, high(Napiecie_min)
	rcall	KKCH
	sts	Ade_ch2os, r20
KALU_CH:	lds	r20, Ade_ch2os
	lds	r4, Napiecie_rms
	lds	r5, Napiecie_rms+1
	rcall	KAL_CHOS
	mov	r0, r20
	cli
	push	temp
	ldi	temp, ADE_CH2OS_ADR
	sts	Ade_ch2os, r0
	call	SPI_ADE_WRITE_1B	; Ade_ch2os
	pop	temp
	sei
	ret

KALU_DC:	rcall	KAL_DC		; potem kalibracja offsetu DC
	sbrc	temp, f4KAL_DCU
	ret
	sts	Off_U_dc, r0
	sts	Off_U_dc+1, r1
	sbr	temp, 1<<f4KAL_ZU	; teraz flaga kalibracji zera
	sts	Flagi4, temp
	ret



;------------------------------------------------------------------------------
KAL_CHOS:	; kalibracja offsetu w rejestrze CH?OS
	ldi	yl,  low(Off_x1)
	ldi	yh, high(Off_x1)

	lds	r18, Cykli
	dec	r18
	sts	Cykli, r18
	brne	KCH_1
	clr	r20		; kalibracja niemozliwa
	clr	temp
	rjmp	KCH_RET

KCH_1:	ld	r6, y		; stara wartosc ***_rms
	ldd	r7, y+1
	cp	r4, r6
	cpc	r5, r7		; cp nowa, stara
	brlo	KCH_MN
	mov	r21, r20
	andi	r21, 0b00011111
	breq	KCH_RET
	dec	r20
KCH_RET:	cbr	temp, 1<<f4KAL_CH	; koniec kalibracji CH?OS
	sts	Flagi4, temp
	ldi	r18, CYKLI_POM	; ilosc cykli pomiarowych (czyli ilosc sekund)
	sts	Cykli, r18
	clr	r0
	st	y, r0
	std	y+1, r0
	ret

KCH_MN:	inc	r20
	st	y, r4		; zapisz biezaca wartosc ***_rms
	std	y+1, r5
	ret

;--------------------------------------
KKCH:	; rozpoznanie czy offset ujemny czy dodatni
	clr	r20
	ld	r0, z
	ldd	r1, z+1		; ***_min
	ldd	r2, z+2
	ldd	r3, z+3		; ***_max
	cp	r0, r2
	cpc	r1, r3		; cp min, max
	brlo	KCH_P
	ldi	r20, 0x20		; bit znaku
KCH_P:	cbr	temp, 1<<f4KAL_CH0
	sts	Flagi4, temp
	ret


;------------------------------------------------------------------------------
KAL_DC:	; kalibracja offsetu DC pradu
	ldi	yl,  low(Off_x1)
	ldi	yh, high(Off_x1)
	rcall	KLDC_ADD
	adiw	zl, 2		; +2 ==> czyli ***_max
	adiw	yl, 2
	rcall	KLDC_ADD

	lds	r18, Cykli
	dec	r18
	sts	Cykli, r18
	breq	KD_1
	ret

KD_1:	rcall	KLDC_DIV		; usrednianie
	sbiw	yl, 2
	rcall	KLDC_DIV

	ld	r0, y
	ldd	r1, y+1
	ldd	r2, y+2
	ldd	r3, y+3
	sub	r0, r2		; ampl. (min - max)
	sbc	r1, r3
	clc
	sbrc	r1, 7
	sec
	ror	r1		; /2
	ror	r0

	clr	temp		; koniec kalibracji DC
	ret


;------------------
KLDC_ADD:	; dodaje probke do akumulatora
	ld	r2, z
	ldd	r3, z+1
	ld	r0, y
	ldd	r1, y+1
	add	r0, r2
	adc	r1, r3
	st	y, r0
	std	y+1, r1
	ret

KLDC_DIV:	; dzielenie przez ilosc cykli
	ldi	r18, CYKLI_POM
	ld	r0, y
	ldd	r1, y+1
KDD_2:	lsr	r18
	brcc	KDD_1
	st	y, r0
	std	y+1, r1
	ret
KDD_1:	lsr	r1
	ror	r0
	rjmp	KDD_2


.exit
;==============================================================================

⌨️ 快捷键说明

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