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

📄 inne.asm

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	cp	r1, r5
	brts	EDP_Z		; jesli T=1 -> liczba ze znakiem
	brlo	EDP_A		; mniejsza  --> zwiekszenie
	rjmp	ED_KL		; na poczatek petli
EDP_Z:	brlt	EDP_A
	rjmp	ED_KL
EDP_A:	ldi	temp, 1
	add	r1, temp
	rjmp	ED_ST		; dane sie zmienily



;==============================================================================
POROWNAJ_CZAS:	; porownuje biezacy czas z czasem do zbierania energii
	push	r2
	push	r20
	push	r21
	push	yl
	push	yh

	lds	r21, Flagi2
	cbr	r21, (1<<f2EN_O) | (1<<f2EN_OO)

	ldi	zl,  low(Od_rok_st)
	ldi	zh, high(Od_rok_st)
	ldi	yl,  low(Rok_bcd+1)
	ldi	yh, high(Rok_bcd+1)	; adres Rok_bcd+1
	ldi	r20, 5		; licznik ilosci porownan

PC_LD1:	cpi	r20, 2
	brne	PC_LD1D
	ld	r0, -y		; omija Dzien_tyg
PC_LD1D:	ld	r0, -y		; pobierz aktualny rok, ...
	ld	r1, z+		; pobierz X_start
	ser	temp
	mov	r2, temp		;  X_stop =0xFF
	rcall	POROWNANIE_ZAKRES
	tst	temp
	breq	PC_NIE		; poza zakresem
	dec	r20
	brne	PC_LD1
	sbr	r21, 1<<f2EN_O	; jest zakres dla Energia_od

PC_NIE:	; porownanie dla Energia_oddo
	ldi	zl,  low(Oddo_rok_st)
	ldi	zh, high(Oddo_rok_st)
	ldi	yl,  low(Rok_bcd+1)
	ldi	yh, high(Rok_bcd+1)	; adres Rok_bcd+1
	ldi	r20, 5		; licznik ilosci porownan

PC_LD2:	cpi	r20, 2
	brne	PC_LD2D
	ld	r0, -y		; omija Dzien_tyg
PC_LD2D:	ld	r0, -y		; pobierz aktualny rok, ...
	ld	r1, z+		; pobierz X_start
	ld	r2, z+		; pobierz X_stop
	rcall	POROWNANIE_ZAKRES
	tst	temp
	breq	PC_K		; poza zakresem
	dec	r20
	brne	PC_LD2
	sbr	r21, 1<<f2EN_OO	; jest zakres dla Energia_oddo

PC_K:	sts	Flagi2, r21
	pop	yh
	pop	yl
	pop	r21
	pop	r20
	pop	r2
	ret



;==============================================================================
SPRAWDZ_TARYFE:	; sprawdza biezacy czas i date i porownuje z ustawieniami taryfy
	push	r2
	push	r20
	push	r21
	push	xl
	push	xh
	push	yl
	push	yh
	sbrs	flagi, fTARYFY
	rjmp	ST_K		; licznik jednotaryfowy --> nie sprawdzaj

	cbr	flagi, 1<<fTARYFA2	; ustaw taryfe1
	ldi	r20, LICZBA_OKIEN_CZASOWYCH
	ldi	xl,  low(t21_dzien_st-6)
	ldi	xh, high(t21_dzien_st-6)

ST_AD:	movw	zl, xl
	adiw	zl, 6
	movw	xl, zl		; kopia adresu
	ld	r1, z		; pobierz dzien start
	tst	r1
	breq	ST_NAST		; dzien start =0 --> okno czasowe nieaktywne
	ldi	yl,  low(Dzien_tyg+1)
	ldi	yh, high(Dzien_tyg+1)	; adres Dzien_tyg+1
	ldi	r21, 3		; licznik ilosci porownan

ST_LD:	ld	r0, -y		; pobierz aktualny dzien, godz. lub minute
	ld	r1, z+		; pobierz X_start
	ld	r2, z+		; pobierz X_stop
	rcall	POROWNANIE_ZAKRES
	tst	temp
	breq	ST_NAST		; poza zakresem --> spr nastepne okno
	dec	r21
	brne	ST_LD

	sbr	flagi, 1<<fTARYFA2	; ustaw taryfe2
	rjmp	ST_K

ST_NAST:	dec	r20
	brne	ST_AD

ST_K:	pop	yh
	pop	yl
	pop	xh
	pop	xl
	pop	r21
	pop	r20
	pop	r2
	ret


;--------------------------------------
POROWNANIE_ZAKRES:	; porownuje r0 z r1 (min) i r2 (max) i ustawia 0xFF w temp jesli w zakresie
	ldi	temp, 0b00000011
	; porownywanie na TAK (zakres np. 2-5)
	cp	r0, r1		; ? r0 >= min
	brlo	PZ_11		; ...nie
	cbr	temp, 1		; ...tak, to zeruj bit (stan OK)
PZ_11:	cp	r2, r0		; ? max >= r0
	brlo	PZ_12		; ...nie
	cbr	temp, 2		; ...tak

PZ_12:	cp	r2, r1		; ? max >= min
	brlo	PZ_2		; ...nie -> porownywanie na NIE

	tst	temp
	breq	PZ_OK		; jesli temp=0 to r0 w zakresie
PZ_NIE:	clr	temp		; r0 poza zakresem
	ret
PZ_OK:	ser	temp		; r0 w zakresie --> 0xFF to sygnalizuje
	ret

	; porownywanie na NIE (zakres np. 5-2)
PZ_2:	com	temp
	andi	temp, 0b00000011
	tst	temp
	brne	PZ_OK		; jesli temp<>0 to r0 w zakresie
	rjmp	PZ_NIE		; jesli temp=0 to r0 NIE w zakresie



;==============================================================================
BRAK_ZASILANIA:	; wykonuje zapis parametrow do EEPROM oraz do 24Cxxx (jesli trzeba)

	cli
	rcall	ZAP_EN_DS1307	; zapis energii w pamieci DS1307
BZ_SAG:	rcall	LCD_CLEAR
	ldi	zh, high(2*txt_bns)
	ldi	zl,  low(2*txt_bns)
	rcall	LCD_STR_FLASH	; "brak napiecia sieciowego"
BZ_SP:	sbic	ADE_SAG_PIN, ADE_SAG	; przeskocz jesli stan niski (brak napiecia)
	rjmp	RESET		; stan wysoki -> start programu od poczatku
	rcall	DELAY_5_1ms		; 5ms opoznienia
	wdr
	rjmp	BZ_SP


;------------------------------------------------------------------------------
RESET_ADE:	; reset ADE7759
	cbi	ADE_RESET_PORT, ADE_RESET
	sbi	ADE_RESET_PORT-1, ADE_RESET	; jako wyjscie
	rcall	DELAY_44us
	; koniec resetu ADE7759
	cbi	ADE_RESET_PORT, ADE_RESET
	cbi	ADE_RESET_PORT-1, ADE_RESET	; jako wejscie (na linii ADE_RESET jest pullup 10k)
;	rcall	DELAY_44us
	rcall	DELAY_5_1ms			; 5ms opoznienia
	ret


;==============================================================================
ZAP_EN_DS1307:	; zapisuje 8 energii w DS1307
	push	yl
	push	yh
	ldi	yl,  low(Energia1-2)
	ldi	yh, high(Energia1-2)
	ld	temp, y
	push	temp
	ldd	temp, y+1
	push	temp

	ldi	temp, DS1307_ADRES | TWI_WRITE
	st	Y, temp		; zapisz adres DS1307 w buforze
	ldi	temp, 8		; adres rejestru w DS1307
	std	y+1, temp
	ldi	temp, ILE_BAJT_EN +1	; 56 bajtow energii + adres rejestru
	mov	r0, temp		; licznik ilosci danych do wyslania
	call	TWI_MASTER_WRITE

	ldi	yl,  low(Energia1-2)
	ldi	yh, high(Energia1-2)
	pop	temp
	std	y+1, temp
	pop	temp
	st	y, temp
	pop	yh
	pop	yl
	ret



;------------------------------------------------------------------------------
ZAPISZ_EN_EE:	; zapisuje energie z RAM do EEPROMu
		; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
	push	temp
	push	ee_adr
	push	ee_dane
	push	yl
	push	yh
	ldi	temp, ILE_BAJT_EN	; licznik ilosci bajtow wszystkich energii nieulotnych
	clr	yh
	out	EEARH, yh
	ldi	yl,  low(Energia1)
	ldi	yh, high(Energia1)
	ldi	ee_adr, (low(Ds_adr) -RAM) +EEPROM  ; adres poczatkowy w EEPROM
			; ...poczatek zmiennych ulotnych jednoczesnie oznacza
			; ...wolne miejsce w EEPROM (koniec zmiennych konfiguracyjnych)
ZEE_1:	ld	ee_dane, y+		; pobierz bajt z RAM
	rcall	EE_ZAPIS
	inc	ee_adr		; zwieksz adres w EEPROM
	dec	temp
	brne	ZEE_1		; nastepny bajt
	pop	yh
	pop	yl
	pop	ee_dane
	pop	ee_adr
	pop	temp
	ret


;------------------------------------------------------------------------------
CZYTAJ_EN_EE:	; odczytuje energie z EEPROM do RAM
		; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
	push	temp
	push	ee_adr
	push	ee_dane
	push	yl
	push	yh
	ldi	temp, ILE_BAJT_EN	; licznik ilosci bajtow wszystkich energii nieulotnych
	clr	yh
	out	EEARH, yh
	ldi	yl,  low(Energia1)
	ldi	yh, high(Energia1)
	ldi	ee_adr, (low(Ds_adr) -RAM) +EEPROM  ; adres poczatkowy w EEPROM
			; ...poczatek zmiennych ulotnych jednoczesnie oznacza
			; ...wolne miejsce w EEPROM (koniec zmiennych konfiguracyjnych)
CEE_1:	out	EEARL, ee_adr	; wpisz adres do odczytu bajtu
 	sbi	EECR, EERE		; ustaw znacznik odczytu (procesor czeka 4 cykle na bajt z EE)
	in	ee_dane, EEDR
	st	y+, ee_dane		; przepisz bajt z EE do RAM, oraz zwieksz adres (offset) do RAM
	inc	ee_adr		; zwieksz adres w EEPROM
	dec	temp
	brne	CEE_1		; nastepny bajt
	
	pop	yh
	pop	yl
	pop	ee_dane
	pop	ee_adr
	pop	temp
	ret



;------------------------------------------------------------------------------
ZAPISZ_KONF_EE:	; zapisuje konfiguracje do EEPROMu
		; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
	push	ee_adr
	push	ee_dane
	push	yl
	push	yh

	clr	yh
	out	EEARH, yh
	ldi	yl, RAM		; zmiennych nie moze byc wiecej niz 0xFF-0x68 (0xFF-RAM)
	ldi	ee_adr, EEPROM	; adres poczatkowy w EEPROM

ZKE_1:	ld	ee_dane, y+		; pobierz bajt z RAM
	rcall	EE_ZAPIS
	inc	ee_adr		; zwieksz adres w EEPROM
	cpi	yl, low(Flagi2)	; czy koniec danych? (Flagi2 to zmienna ktora jest zmieniana w trybie normalnym)
	brlo	ZKE_1		; nastepny bajt
	
	pop	yh
	pop	yl
	pop	ee_dane
	pop	ee_adr
	ret

;------------------------------------------------------------------------------
ZAPISZ_TAR_EE:	; zapisuje taryfy do EEPROMu
		; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
	push	ee_adr
	push	ee_dane
	push	yl
	push	yh
	clr	yh
	out	EEARH, yh
	ldi	yl,  low(T21_dzien_st)
;	ldi	yh, high(T21_dzien_st)
	ldi	ee_adr, (low(T21_dzien_st) -RAM) +EEPROM	; adres poczatkowy w EEPROM

ZTE_1:	ld	ee_dane, y+		; pobierz bajt z RAM
	rcall	EE_ZAPIS
	inc	ee_adr		; zwieksz adres w EEPROM
	cpi	yl, low(Od_rok_st)	; czy koniec danych?
	brlo	ZTE_1		; nastepny bajt
	
	pop	yh
	pop	yl
	pop	ee_dane
	pop	ee_adr
	ret

;------------------------------------------------------------------------------
ZAPISZ_EO_EE:	; zapisuje dane energii OD do EEPROMu
		; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
	push	ee_adr
	push	ee_dane
	push	yl
	push	yh
	clr	yh
	out	EEARH, yh
	ldi	yl,  low(Od_rok_st)
	ldi	ee_adr, (low(Od_rok_st) -RAM) +EEPROM	; adres poczatkowy w EEPROM

ZEOE_1:	ld	ee_dane, y+		; pobierz bajt z RAM
	rcall	EE_ZAPIS
	inc	ee_adr		; zwieksz adres w EEPROM
	cpi	yl, low(Oddo_rok_st)	; czy koniec danych?
	brlo	ZEOE_1		; nastepny bajt
	
	pop	yh
	pop	yl
	pop	ee_dane
	pop	ee_adr
	ret


;------------------------------------------------------------------------------
ZAPISZ_EOO_EE:	; zapisuje dane energii ODDO do EEPROMu
		; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
	push	ee_adr
	push	ee_dane
	push	yl
	push	yh
	clr	yh
	out	EEARH, yh
	ldi	yl,  low(Oddo_rok_st)
	ldi	ee_adr, (low(Oddo_rok_st) -RAM) +EEPROM	; adres poczatkowy w EEPROM

ZEOOE_1:	ld	ee_dane, y+		; pobierz bajt z RAM
	rcall	EE_ZAPIS
	inc	ee_adr		; zwieksz adres w EEPROM
	cpi	yl, low(Ds_adr)	; czy koniec danych?
	brlo	ZEOOE_1		; nastepny bajt
	
	pop	yh
	pop	yl
	pop	ee_dane
	pop	ee_adr
	ret



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

⌨️ 快捷键说明

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