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

📄 bufor.asm

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	rcall	LCD_CHAR

	sbrc	flagi, fOVER_I
	rjmp	OV_GWI		; jesli flaga =1 to wystapilo przepelnienie
	sbrc	flagi, fOVER_U
	rjmp	OV_GWI		; jesli flaga =1 to wystapilo przepelnienie
	ldi	temp, ' '		; miejsce 16-te
	rcall	LCD_CHAR
	ldi	temp, LCD_D1_C0_B0	; brak przepelnienia, wiec brak migotania
	rcall	LCD_COMMAND
	ret
	; koniec WYSWIETL_WYNIK

OV_GWI:	; przepelnienie sygnalizowane migajacym 'P'
	ldi	temp, 'P'		; informacja o przepelnieniu
	rcall	LCD_CHAR
	ldi	temp, LCD_CURSOR_LEFT	; cofnij
	rcall	LCD_COMMAND
	ldi	temp, LCD_D1_C0_B1	; migaj
	rcall	LCD_COMMAND
	ret


;==============================================================================
;==============================================================================
OBRB_EN:	; test akumulatora energii na wartosc ujemna
	ld	bin0, y+		; zaladowanie wartosci zmiennej
	ld	bin1, y+
	ld	bin2, y+
	ld	bin3, y+
	; test znaku
	sbrs	bin3, 7
	rjmp	OBE_P
	; akumulator ujemny -negacja
	com	bin0
	com	bin1
	com	bin2
	com	bin3
	ldi	temp, 1
	add	bin0, temp
	clr	temp
	adc	bin1, temp
	adc	bin2, temp
	adc	bin3, temp
	ldi	temp, '-'		; znak liczby ujemnej '-'
	std	z+3, temp		; ...zapisz w Buforze

OBE_P:	; sprawdzanie wartosci
	lds	temp, Flagi2
	push	temp		; zachowuje stan Flagi2
	ldi	bcd0,   low(9999999)
	ldi	bcd1, byte2(9999999)
	ldi	bcd2, byte3(9999999)
	ldi	bcd3, byte4(9999999)	; maksymalna wartosc na LCD
	cp	bcd0, bin0
	cpc	bcd1, bin1
	cpc	bcd2, bin2
	cpc	bcd3, bin3
	brsh	OBE_OK		; skacz jesli wartosc "energii" <= od maksymalnej na LCD
	cbr	temp, 1<<f2EN_WH	; czysc flage Wh
	sts	Flagi2, temp
	rjmp	OBE_OK
OBE_OK:	rcall	BIN_32_BCD		; konwersja wartosci na BCD
	rcall	ROZPAKUJ_BCD	; rozpakowanie bcd na cyfry i korekta do wyswietlenia
	rcall	BF_E		; wypelnij bufor znakami
	rcall	WPISZ_WARTOSC_7	; wpis wartosci
	pop	temp		; odtwarza stan Flagi2
	sts	Flagi2, temp
	movw	zl, r24		; adres odpowiedniego tekstu:  r25:r24 -> zh:zl
	ret


;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
BF_P:	; wypelnienie bufora mocy P
	ldi	temp, 'P'
	st	z, temp		; Z trzyma adres poczatku bufora
	ldi	temp, 'W'
	std	z+9, temp
	rjmp	BF_PQS
;--------------------------------------
BF_Q:	; wypelnienie bufora mocy Q
	ldi	temp, 'Q'
	st	z, temp
	ldi	temp, 'v'
	std	z+9, temp
	ldi	temp, 'a'
	std	z+10, temp
	ldi	temp, 'r'
	std	z+11, temp
	rjmp	BF_PQS
;--------------------------------------
BF_S:	; wypelnienie bufora mocy S
	ldi	temp, 'S'
	st	z, temp
	ldi	temp, 'V'
	std	z+9, temp
	ldi	temp, 'A'
	std	z+10, temp
BF_PQS:	ldi	temp, '='
	std	z+1, temp
	ldi	temp, ','
	std	z+7, temp
	ret

;------------------------------------------------------------------------------
BF_U:	; wypelnienie bufora U
	ldi	temp, 'U'
	st	z, temp
	ldi	temp, '='
	std	z+1, temp
	ldi	temp, ','
	std	z+7, temp
	ldi	temp, 'V'
	std	z+9, temp
	sbrs	flagi, fOVER_U
	ret			; brak przepelnienia jesli flaga =0
	; przepelnienie sygnalizowane "max"
BFU_P:	ldi	temp, 'm'
	std	z+10, temp
	ldi	temp, 'a'
	std	z+11, temp
	ldi	temp, 'x'
	std	z+12, temp
	ret

;--------------------------------------
BF_I:	; wypelnienie bufora I
	ldi	temp, 'I'
	st	z, temp
	ldi	temp, '='
	std	z+1, temp
;	ldi	temp, ','
;	std	z+5, temp
	ldi	temp, 'm'
	std	z+7, temp
	ldi	temp, 'A'
	std	z+8, temp
	sbrs	flagi, fOVER_I
	ret			; brak przepelnienia jesli flaga =0
	rjmp	BFU_P

;------------------------------------------------------------------------------
BF_E:	; wypelnienie bufora Energii
	ldi	temp, 'E'
	st	z, temp
	std	z+1, r23		; r23 trzyma znacznik taryfy
	ldi	temp, '='
	std	z+2, temp
	lds	temp, Flagi2
	sbrc	temp, f2EN_WH	; jesli f2EN_WH=0 to wyswietlanie w kWh
	rjmp	BFE_WH
	ldi	temp, 'k'
	std	z+11, temp
	ldi	temp, 'W'
	std	z+12, temp
	ldi	temp, 'h'
	std	z+13, temp
	ret
BFE_WH:	ldi	temp, 'W'
	std	z+11, temp
	ldi	temp, 'h'
	lds	r0, Status_E1
	sbrc	r0, STE1_SEK	; dla Energia_SEK jednostka to [Ws]
	ldi	temp, 's'
	std	z+12, temp
	ret

;------------------------------------------------------------------------------
BF_F:	; wypelnienie bufora czestotliwosci
	ldi	temp, 'F'
	st	z, temp
	ldi	temp, '='
	std	z+1, temp
	ldi	temp, ','
	std	z+5, temp
	ldi	temp, 'H'
	std	z+8, temp
	ldi	temp, 'z'
	std	z+9, temp
	ldi	temp, '%'
	std	z+13, temp
	ret

;------------------------------------------------------------------------------
BF_PF:	; wypelnienie bufora wsp. mocy
	ldi	temp, 'P'
	st	z, temp
	ldi	temp, 'F'
	std	z+1, temp
	ldi	temp, '='
	std	z+2, temp
	ldi	temp, ','
	std	z+5, temp
	ret


;==============================================================================
WPISZ_DATE_O:	; wpisuje date dla Energii_od
	ldi	temp, LCD_LINE_1 | 6
	rcall	LCD_COMMAND
	lds	r0, Od_dzien_st
	rcall	HEX_1B
	ldi	temp, '.'
	rcall	LCD_CHAR
	lds	r0, Od_mies_st
	rcall	HEX_1B
	ldi	temp, '.'
	rcall	LCD_CHAR
	lds	r0, Od_rok_st
	rcall	HEX_1B
	rjmp	WL_LINE2

;--------------------------------------
WPISZ_DATE_OO:	; wpisuje date dla Energii_oddo
	ldi	temp, LCD_LINE_1 | 3
	rcall	LCD_COMMAND
	lds	r0, Oddo_dzien_st
	rcall	HEX_1B
	ldi	temp, '.'
	rcall	LCD_CHAR
	lds	r0, Oddo_mies_st
	rcall	HEX_1B
	ldi	temp, '-'
	rcall	LCD_CHAR
	lds	r0, Oddo_dzien_sp
	rcall	HEX_1B
	ldi	temp, '.'
	rcall	LCD_CHAR
	lds	r0, Oddo_mies_sp
	rcall	HEX_1B
	rjmp	WL_LINE2


;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
WPISZ_WARTOSC_4_1:	; wpis wartosci 5-cio cyfrowej -- przecinek za 1 miejscem od konca
	ldi	temp, 3		; licznik cyfr PRZED przecinkiem
	mov	r0, temp
	clr	yh
	ldi	yl, adrcyfra0+5	; adres rejestrow cyfra + cyfra5
	adiw	zl, 3		; ustaw adres bufora na poczatku pola wartosci
	clt			; czysc flage zer nieznaczacych

WW51_1:	ld	temp, -y		; laduj cyfre
	brts	WW51_2		; jesli T=1 to nie sprawdzaj zer nieznaczacych
	cpi	temp, '0'
	breq	WW51_3		; jesli ='0' to skacz
	set			; ustaw flage zer nieznacz.
WW51_2:	st	z, temp		; zapisz cyfre w buforze
WW51_3:	adiw	zl, 1
	dec	r0
	brne	WW51_1

	st	z, cyfra1
	std	z+2, cyfra0
	ret

;------------------------------------------------------------------------------
WPISZ_WARTOSC_2_2:	; wpis wartosci 4-cio cyfrowej -- przecinek za 2 miejscem od konca
	tst	r3		; jesli wartosc <256 to rozdzielczosc 1mA
	breq	WW22_2

	mov	temp, cyfra4
	cpi	temp, '0'
	breq	WW22_1		; jesli rowne, to skacz
	std	z+3, temp		; jesli <> to zapisz cyfre w buforze
WW22_1:	std	z+4, cyfra3
	std	z+6, cyfra2		; omin przecinek
	std	z+7, cyfra1
	ldi	temp, ','
	std	z+5, temp
	ret
WW22_2:	mov	temp, cyfra2
	cpi	temp, '0'
	breq	WW22_3		; jesli rowne, to skacz
	std	z+4, temp		; jesli <> to zapisz cyfre w buforze
WW22_3:	mov	temp, cyfra1
	cpi	temp, '0'
	breq	WW22_4
	std	z+5, temp
WW22_4:	std	z+6, cyfra0
	ret

;------------------------------------------------------------------------------
WPISZ_WARTOSC_3_2:	; wpisywanie wartosci 5-cyfrowej (dla F i PF)
	mov	temp, cyfra4
	cpi	temp, '0'
	breq	WW32_1		; jesli rowne, to skacz
	std	z+2, temp		; jesli <> to zapisz cyfre w buforze
WW32_1:	mov	temp, cyfra3
	cpi	temp, '0'
	breq	WW32_2
	std	z+3, temp
WW32_2:	std	z+4, cyfra2
	std	z+6, cyfra1		; omin przecinek
	std	z+7, cyfra0
	ret



;------------------------------------------------------------------------------
WPISZ_WARTOSC_7:
	ldi	temp, 6
	mov	r0, temp		; licznik cyfr
	clr	yh

	ldi	yl, adrcyfra0+7+3	; adres rejestrow cyfra + cyfra10 (kWh)
	lds	temp, Flagi2
	sbrc	temp, f2EN_WH	; przeskocz jesli EN_WH=0 (kWh)
	ldi	yl, adrcyfra0+7	; adres rejestrow cyfra + cyfra7 (Wh)
	adiw	zl, 4		; ustaw adres bufora na poczatku pola wartosci
	clt			; czysc flage zer nieznaczacych

WW7_1:	ld	temp, -y		; laduj cyfre
	brts	WW7_2		; jesli T=1 to nie sprawdzaj zer nieznaczacych
	cpi	temp, '0'
	breq	WW7_3		; jesli ='0' to skacz
	set			; ustaw flage zer nieznacz.
WW7_2:	st	z, temp		; zapisz cyfre w buforze
WW7_3:	adiw	zl, 1
	dec	r0
	brne	WW7_1

	ld	temp, -y		; ostatnia cyfra
	st	z, temp

	ret

	

.exit
;------------------------------------------------------------------------------

⌨️ 快捷键说明

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