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

📄 ade7759.lst

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
         ; minimalne opoznienie dla wyslania komendy odczytu probek to 7us (dla takiej konfiguracji int2.asm)
         
         	; sumowanie wartosci sredniej napiecia - rejestry prb1 i prb0 nie zmieniaja
         	; zawartosci po opuszczeniu przerwania (petla glowna czeka na koniec zbierania probek)
00017d 2422      	clr	r2
00017e   +  	KWADRAT16_32	prb1, prb0
00018b   +  	SUMA32_48	u_suma5, u_suma4, u_suma3, u_suma2, u_suma1, u_suma0
000191 9120 00d0 	lds	kwd0, Ak_mavU
000193 9130 00d1 	lds	kwd1, Ak_mavU+1
000195 9140 00d2 	lds	kwd2, Ak_mavU+2
000197 9150 00d3 	lds	kwd3, Ak_mavU+3	; akumulator wartosci sredniej
000199 0f28      	add	kwd0, prb0
00019a 1f39      	adc	kwd1, prb1
00019b 1d42      	adc	kwd2, r2
00019c 1d52      	adc	kwd3, r2		; sumowanie wartosci sredniej
00019d 9320 00d0 	sts	Ak_mavU, kwd0
00019f 9330 00d1 	sts	Ak_mavU+1, kwd1
0001a1 9340 00d2 	sts	Ak_mavU+2, kwd2
0001a3 9350 00d3 	sts	Ak_mavU+3, kwd3	;20cykli = 2,5us
0001a5 d15b      	rcall	DELAY_2us
         	;7,25us opoznienia
         ;	rcall	DELAY_3_5us
         ;	;8us opoznienia
         
0001a6   +  	SPI_ADE_ON
0001a7 e0c1      	ldi	spi_bufor, ADE_WAVEFORM_ADR	; komenda odczytu probek
0001a8   +  	SPI_BAJT_WYSLIJ		; wyslij bajt poprzez SPI
         ;	clr	r2
0001ad 94e8      	clt
0001ae d15a      	rcall	DELAY_3_5us		; min czas miedzy bajtami = 4us
         
         ;--1-----	; czytanie pierwszego bajtu
0001af   +  	SPI_BAJT_CZYTAJ	prb_znak	 ;4 cykle od zakonczenia transmisji
         	
         	; sprawdzenie przejscia przez zero napiecia (kanal 2)
0001b5 2e0b      	mov	r0, prb_znak	; prb_znak przechowuje pierwszy odczytany bajt z SPI
0001b6 e8c0      	ldi	spi_bufor, 0b10000000
0001b7 220c      	and	r0, spi_bufor	; maska na bit znaku napiecia
0001b8 f0a2      	brmi	I2P_U_MINUS	;8c	; skacze, jesli bit znaku ustawiony (minus)
         	; probka dodatnia:
0001b9 9010 00c9 	lds	r1, Hist_zera	; zaladuj licznik histerezy przejscia przez zero
0001bb 2011      	tst	r1
0001bc f0a1      	breq	I2P_U_PLUS	;12c	; jesli Hist_zera=0, to nie jest testowane przejscie przez 0
         	; testowanie wartosci histerezy
0001bd 9413      	inc	r1		; zwieksz licznik histerezy
0001be 91c0 0078 	lds	spi_bufor, Hist_zera_ile	; laduj wartosc oczekiwana histerezy
0001c0 161c      	cp	r1, spi_bufor
0001c1 f040      	brlo	I2P_HIST_MNIEJ  ;17c	; skacz, jesli nie osiagnieto wartosci histerezy
         	; jest przejscie przez zero
0001c2 9220 00c9 	sts	Hist_zera, r2	; wyzeruj licznik histerezy i skasuj bit testowania histerezy
0001c4 95d3      	inc	okresow		; zwieksz liczbe przejsc przez zero
0001c5 91c0 0077 	lds	spi_bufor, Okresy_ile	; sprawdzenie czy osiagnieto koniec zliczania
0001c7 17dc      	cp	okresow, spi_bufor ;23c
0001c8 f0a8      	brlo	I2P_OKRESOW_MNIEJ	; jesli mniej, to pobieraj dalej
0001c9 c113      	rjmp	I2P_KONIEC_OKRESOW	; jesli rowne, to zliczonych jest wymagana ilosc okresow
         
         
          I2P_HIST_MNIEJ:
0001ca 9210 00c9 	sts	Hist_zera, r1	; zapisz licznik histerezy
0001cc c00d      	rjmp	I2P_11
          I2P_U_MINUS:
0001cd e8c0      	ldi	spi_bufor, 0b10000000	; ustaw bit rozpoczenia testowania histerezy
0001ce 93c0 00c9 	sts	Hist_zera, spi_bufor	; zapisz
0001d0 0000      	nop
0001d1 0000      I2P_U_PLUS:	nop	;14c
0001d2 0000      	nop
0001d3 0000      	nop
0001d4 0000      	nop
0001d5 0000      	nop
0001d6 0000      	nop
0001d7 0000      	nop
0001d8 0000      	nop
0001d9 0000      	nop
0001da 0000      I2P_11:	nop	;23c
0001db 3fdf      	cpi	okresow, 0xFF	; jesli okresow = -1 to nie zbieraj probek
0001dc f411      	brne	I2P_ZLICZAJ
0001dd c0e9      	rjmp	I2P_NIEZL
         
          I2P_OKRESOW_MNIEJ:
0001de 0000      	nop	;26c
          I2P_ZLICZAJ:
0001df 0000      	nop
0001e0 0000      	nop
0001e1 0000      	nop
0001e2 9631      	adiw	probek0, 1		; zwieksz licznik probek
         
         
         ;17us...
         ;--2-----
0001e3   +  I2P_BAJT2:	SPI_BAJT_CZYTAJ	prb1	; odczyt drugiego bajtu - prad starszy bajt
         	;4c
0001e9 2fab      	mov	prb2, prb_znak
0001ea 9010 00ca 	lds	r1, Hist_przepel_I	; laduj zmienna
0001ec 9000 0079 	lds	r0, Hist_przepel_I_ile
         	; test ilosci probek
0001ee 91c0 00c5 	lds	spi_bufor, Probek_ile
0001f0 17ec      	cp	probek0, spi_bufor
0001f1 91c0 00c6 	lds	spi_bufor, Probek_ile+1
0001f3 07fc      	cpc	probek1, spi_bufor	; porownanie liczby zebranych probek z liczba maksymalna
0001f4 f008      	brlo	I2P_B3		; jesli mniej, to zbieraj dalej
0001f5 9468      	set			; jesli rowne, to ustaw flage T
         	;17c
0001f6 9120 0086 I2P_B3:	lds	kwd0, Off_I_dc
0001f8 9130 0087 	lds	kwd1, Off_I_dc+1	; offset DC, czyli symetrii probek
0001fa 2e23      	mov	r2, kwd1
0001fb 9422      	swap	r2		; dolna polowka r2 to bity znaku offsetu
0001fc 9140 00d4 	lds	kwd2, Prad_min
0001fe 9150 00d5 	lds	kwd3, Prad_min+1	; probka o najmniejszej amplitudzie
000200 9160 00d6 	lds	kwd4, Prad_max
000202 9170 00d7 	lds	kwd5, Prad_max+1	; probka o najwiekszej amplitudzie
         	;31c
         
         ;25us...
         ;--3-----
000204   +  	SPI_BAJT_CZYTAJ	prb0	; odczyt trzeciego bajtu - prad mlodszy bajt
00020a 95a6      	lsr	prb2
00020b 9597      	ror	prb1
00020c 9587      	ror	prb0
00020d 95a6      	lsr	prb2
00020e 9597      	ror	prb1
00020f 9587      	ror	prb0		; /4
         	;10c
000210 178c      	cp	prb0, spi_bufor	; spi_bufor jest zerowany w SPI_BAJT_CZYTAJ
000211 079c      	cpc	prb1, spi_bufor
000212 f419      	brne	I2P_I_DOB		; probka nie przepelniona
000213 ffa0      	sbrs	prb2, 0		; bit 16 - jesli H to przepelnienie
000214 c001      	rjmp	I2P_I_DOB
000215 6014      	sbr	flagi, 1<<fOVER_I	; ustaw flage przepelnienia probki z ADE7759
         
          I2P_I_DOB:	;14c, 16c
000216 0f82      	add	prb0, kwd0
000217 1f93      	adc	prb1, kwd1		; kompensacja offsetu
000218 1da2      	adc	prb2, r2
         	;17c; 19c
         
         	; sprawdzenie znaku probki pradu
000219 ffa1      	sbrs	prb2, 1		; sprawdzenie bitu znaku - bit 17 (bo bylo /4)
00021a c010      	rjmp	I2P_PRAD_PLUS
         
         	; probka pradu ujemna
00021b 9580      	com	prb0
00021c 9590      	com	prb1
00021d 95a0      	com	prb2		; tylko odwrocenie bitow
00021e ffa0      	sbrs	prb2, 0		; bit 16 - jesli H to przepelnienie
00021f c003      	rjmp	I2P_IM_DOB		; jesli L to probka dobra
000220 6014      	sbr	flagi, 1<<fOVER_I	; ustaw flage przepelnienia probki z ADE7759
000221 ef8f      	ser	prb0
000222 ef9f      	ser	prb1		; ustaw probke na maks.
          I2P_IM_DOB:	; 25, 27;   27, 29  cykli
         	; sprawdzenie amplitudy probki ujemnej
000223 1784      	cp	prb0, kwd2
000224 0795      	cpc	prb1, kwd3
000225 f098      	brlo	I2P_PRAD_DAL	; probka mniejsza --> dalej
000226 9380 00d4 	sts	Prad_min, prb0
000228 9390 00d5 	sts	Prad_min+1, prb1	; probka wieksza --> zapisz
00022a c00e      	rjmp	I2P_PRAD_DAL
         
         
          I2P_PRAD_PLUS: ;20c; 22c
00022b ffa0      	sbrs	prb2, 0		; bit 16 - jesli H to przepelnienie
00022c c003      	rjmp	I2P_IP_DOB		; jesli L to probka dobra
00022d 6014      	sbr	flagi, 1<<fOVER_I	; ustaw flage przepelnienia probki z ADE7759
00022e ef8f      	ser	prb0
00022f ef9f      	ser	prb1		; ustaw probke na maks.
          I2P_IP_DOB:	; 23c, 25c;   25c, 27c
         	; sprawdzenie amplitudy probki dodatniej
000230 1786      	cp	prb0, kwd4
000231 0797      	cpc	prb1, kwd5
000232 f020      	brlo	I2P_PRAD_DALx	; probka mniejsza --> dalej
000233 9380 00d6 	sts	Prad_max, prb0
000235 9390 00d7 	sts	Prad_max+1, prb1	; probka wieksza --> zapisz
          I2P_PRAD_DALx:
000237 0000      	nop
000238 0000      	nop
         
          I2P_PRAD_DAL: ;plus: (29, 32), (31, 34), (33, 36)
         	; minus: (29, 34), (31, 36), (33, 38)
         
000239 0000      	nop
00023a 0000      	nop
         
         ;--4a----	odbior czwartego bajtu
00023b 27cc       	clr	spi_bufor
00023c b9cf      	out	SPDR, spi_bufor
         ;33us...
         
         	; test przepelnienia probki pradu
00023d fd12      	sbrc	flagi, fOVER_I	; flaga ustawiana wczesniej
00023e c002      	rjmp	I2P_PRAD_OVER
00023f 2411      	clr	r1		; zeruj licznik histerezy (wystapila dobra probka)
000240 c004      	rjmp	I2P_PRAD_OK		; jesli L to probka dobra
          I2P_PRAD_OVER:	; testowanie histerezy przepelnienia (kolejnych probek)
000241 9413      	inc	r1		; zwieksz licznik histerezy
000242 1401      	cp	r0, r1		; sprawdz, czy osiagnieto maks. ilosc
000243 f008      	brlo	I2P_PRAD_OK		; ...jesli przekroczono, to zostaw flage ustawiona
000244 7f1b      	cbr	flagi, 1<<fOVER_I	; ...jesli nie przekroczono histerezy, to kasuj flage
          I2P_PRAD_OK:
000245 9210 00ca 	sts	Hist_przepel_I, r1	; zapisz zmienna
         	; 7c -ok, 9c -over
         
000247   +  	KWADRAT16_32	prb1, prb0
         	;23c, 25c
000254   +  	SUMA32_48	i_suma5, i_suma4, i_suma3, i_suma2, i_suma1, i_suma0
         	;29c, 31c
00025a 9120 00cc 	lds	kwd0, Ak_mavI
00025c 9130 00cd 	lds	kwd1, Ak_mavI+1
00025e 9140 00ce 	lds	kwd2, Ak_mavI+2
000260 9150 00cf 	lds	kwd3, Ak_mavI+3	; akumulator wartosci sredniej
000262 0f28      	add	kwd0, prb0
000263 1f39      	adc	kwd1, prb1
000264 1d42      	adc	kwd2, r2
000265 1d52      	adc	kwd3, r2		; sumowanie wartosci sredniej
         
         
         ;--4b----	; odczyt czwartego bajtu - starszy bajt U
000266 b1ce      	in	spi_bufor, SPSR	; kasuj flage
000267 b19f      	in	prb1, SPDR		; odczyt bajtu z rejestru danych SPI
         
         
000268 9320 00cc 	sts	Ak_mavI, kwd0
00026a 9330 00cd 	sts	Ak_mavI+1, kwd1
00026c 9340 00ce 	sts	Ak_mavI+2, kwd2
00026e 9350 00cf 	sts	Ak_mavI+3, kwd3
         	;51c, 53c
000270 2fab      	mov	prb2, prb_znak
000271 95a2      	swap	prb2
000272 9010 00cb 	lds	r1, Hist_przepel_U	; laduj zmienna
000274 9000 007a 	lds	r0, Hist_przepel_U_ile
         	;57c
000276 9120 008b 	lds	kwd0, Off_U_dc
000278 9130 008c 	lds	kwd1, Off_U_dc+1	; offset DC, czyli symetrii probek
00027a 2e23      	mov	r2, kwd1
00027b 9422      	swap	r2		; dolna polowka r2 to bity znaku offsetu
         	;63c
00027c 0000      	nop
         
         ;--5a----	odbior piatego bajtu
00027d 27cc      	clr	spi_bufor
00027e b9cf      	out	SPDR, spi_bufor
         
00027f 9140 00d8 	lds	kwd2, Napiecie_min
000281 9150 00d9 	lds	kwd3, Napiecie_min+1	; probka o najmniejszej amplitudzie
000283 9160 00da 	lds	kwd4, Napiecie_max
000285 9170 00db 	lds	kwd5, Napiecie_max+1	; probka o najwiekszej amplitudzie
         	;8c
         
         ;42us...
         
         ;--5b----	odczyt piatego bajtu
000287 9b77      SBC_5:	sbis	SPSR, SPIF
000288 cffe      	rjmp	SBC_5		; czekaj na ustawienie flagi zakonczenia transmisji
000289 b1ce      	in	spi_bufor, SPSR	; kasuj flage
00028a b18f      	in	prb0, SPDR		; odczyt bajtu z rejestru danych SPI
00028b 27cc      	clr	spi_bufor
00028c   +  	SPI_ADE_OFF
         
00028d 95a6      	lsr	prb2
00028e 9597      	ror	prb1
00028f 9587      	ror	prb0
000290 95a6      	lsr	prb2
000291 9597      	ror	prb1
000292 9587      	ror	prb0		; /4
         	;11c
000293 178c      	cp	prb0, spi_bufor	; spi_bufor jest zerowany w SPI_BAJT_CZYTAJ
000294 079c      	cpc	prb1, spi_bufor
000295 f419      	brne	I2P_U_DOB		; probka nie przepelniona
000296 ffa0      	sbrs	prb2, 0		; bit 16 - jesli H to przepelnienie
000297 c001      	rjmp	I2P_U_DOB
000298 6018      	sbr	flagi, 1<<fOVER_U	; ustaw 

⌨️ 快捷键说明

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