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

📄 ade7759.lst

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
0000ef e2e2      	ldi	zl,  low(Energia1_od)
0000f0 e0f1      	ldi	zh, high(Energia1_od)	; zaladuj wskaznik do zmiennej Energia1_od
0000f1 012f      	movw	wyn0, zl
0000f2 e3e0      	ldi	zl,  low(Energia1_oddo)
0000f3 e0f1      	ldi	zh, high(Energia1_oddo)	; zaladuj wskaznik do zmiennej Energia1_oddo
0000f4 013f      	movw	wyn2, zl
0000f5 e4ec      	ldi	zl,  low(Energia1_ses)
0000f6 e0f1      	ldi	zh, high(Energia1_ses)	; zaladuj wskaznik do zmiennej Energia1_ses
0000f7 014f      	movw	wsp_en0, zl
0000f8 e3ee      	ldi	zl,  low(Energia1_poz)
0000f9 e0f1      	ldi	zh, high(Energia1_poz)	; zaladuj wskaznik do zmiennej Energia1_poz
0000fa 017f      	movw	aden4, zl
0000fb e1e4      	ldi	zl,  low(Energia1)
0000fc e0f1      	ldi	zh, high(Energia1)	; zaladuj wskaznik do zmiennej Energia1
         
         ; [5]
0000fd 9100 0090 LE_TD:	lds	temp, Flagi2
         	; akumulacja (Energia)
0000ff d054      	rcall	LE_AKUM
         	; akumulacja (Energia_ses)
000100 01f4      	movw	zl, wsp_en0		; zaladowanie nowego wskaznika
000101 d052      	rcall	LE_AKUM
         
         	; jesli data i czas sa odpowiednie to akumulowac energie_od i energie_oddo
000102 ff05      	sbrs	temp, f2EN_O
000103 c002      	rjmp	LE_AOO		; EN_O=0
         	; akumulacja (Energia_od)
000104 01f2      	movw	zl, wyn0		; zaladowanie nowego wskaznika
000105 d04e      	rcall	LE_AKUM
         
000106 ff06      LE_AOO:	sbrs	temp, f2EN_OO
000107 c002      	rjmp	LE_AP		; EN_OO=0
         	; akumulacja (Energia_oddo)
000108 01f3      	movw	zl, wyn2		; zaladowanie nowego wskaznika
000109 d04a      	rcall	LE_AKUM
         
00010a ff02      LE_AP:	sbrs	temp, f2EN_S
00010b c00e      	rjmp	LE_MOC_P		; EN_S=0
         	; akumulacja energii pozornej
00010c 01f7      	movw	zl, aden4
00010d 0125      	movw	wyn0, aden0		; ochrona energii sekundowej (bo jeszcze jest liczona moc)
00010e 0136      	movw	wyn2, aden2
00010f 90a0 010a 	lds	aden0, Energia_sek	; gdy EN_S=1, to Energia_sek przechowuje en. sek. pozorna
000111 90b0 010b 	lds	aden1, Energia_sek+1
000113 90c0 010c 	lds	aden2, Energia_sek+2
000115 90d0 010d 	lds	aden3, Energia_sek+3
000117 d03c      	rcall	LE_AKUM
000118 0152      	movw	aden0, wyn0
000119 0163      	movw	aden2, wyn2
         
         
         ;------------------------------------------------------------------------------
          LE_MOC_P:	; liczenie mocy P z energii
         
         	; mnozenie: r13::r10 x r25:r24 => r23::r18
         	; czyli:    aden3:0  x 36000 (Wsp_P)  => kwd5:0
00011a 9180 007f 	lds	r24, Wsp_P
00011c 9190 0080 	lds	r25, Wsp_P+1	; laduj wspolczynnik mnozenia
00011e 0175      	movw	aden4, aden0	; kopia dwoch mlodszych bajtow energii
00011f 0156      	movw	aden0, aden2	; najpierw mnozenie dwoch starszych bajtow
000120 940e 097f 	call	MUL_16_16		; r11:r10 x r25:r24
000122 0129      	movw	wyn0, kwd0
000123 013a      	movw	wyn2, kwd2		; kopia wyniku mnozenia
000124 0157      	movw	aden0, aden4	; teraz mnozenie mlodszych bajtow energii
000125 940e 097f 	call	MUL_16_16
000127 2766      	clr	kwd4
000128 2777      	clr	kwd5
000129 0d44      	add	kwd2, wyn0
00012a 1d55      	adc	kwd3, wyn1
00012b 1d66      	adc	kwd4, wyn2
00012c 1d77      	adc	kwd5, wyn3
         	; kwd4:kwd3 zawiera moc w [0,1W]
00012d 9350 0100 	sts	Moc_P, kwd3
00012f 9360 0101 	sts	Moc_P+1, kwd4	; zapis mocy do RAM
         
         
         ;--------------------------------------
         	; koniec przerwania
000131 6012      	sbr	flagi, 1<<fINT2	; ustawienie flagi zezwalajacej na rozpoczecie zbierania probek
         
000132 91ff      	pop	r31
000133 91ef      	pop	r30
000134 91df      	pop	r29
000135 91cf      	pop	r28
000136 91bf      	pop	r27
000137 91af      	pop	r26
000138 919f      	pop	r25
000139 918f      	pop	r24
00013a 917f      	pop	r23
00013b 916f      	pop	r22
00013c 915f      	pop	r21
00013d 914f      	pop	r20
00013e 913f      	pop	r19
00013f 912f      	pop	r18
         	;pop	r17	flagi
         	;pop	r16	temp
000140 90ff      	pop	r15
000141 90ef      	pop	r14
000142 90df      	pop	r13
000143 90cf      	pop	r12
000144 90bf      	pop	r11
000145 90af      	pop	r10
000146 909f      	pop	r9
000147 908f      	pop	r8
000148 907f      	pop	r7
000149 906f      	pop	r6
00014a 905f      	pop	r5
00014b 904f      	pop	r4
00014c 903f      	pop	r3
00014d 902f      	pop	r2
00014e 901f      	pop	r1
00014f 900f      	pop	r0
000150 910f      	pop	temp
000151 bf0f      	out	SREG, temp
000152 910f      	pop	temp
000153 9518      	reti	; koniec przerwania
         
         
         ;--------------------------------------
          LE_AKUM:	; akumulacja energii - Z zawiera wskaznik do zmiennej
000154 2422      	clr	r2
000155 9121      	ld	en0, z+
000156 9131      	ld	en1, z+
000157 9141      	ld	en2, z+
000158 9151      	ld	en3, z+
000159 9161      	ld	en4, z+
00015a 9171      	ld	en5, z+
00015b 9181      	ld	en6, z+		; odczyt akumulatora Energii
00015c fd04      	sbrc	temp, f2EN_MI	; przeskocz, jesli probka dodatnia
00015d c008      	rjmp	LEA_MI
00015e 0d2a      	add	en0, aden0		; dodawanie probki energii (aden3:aden0)
00015f 1d3b      	adc	en1, aden1
000160 1d4c      	adc	en2, aden2
000161 1d5d      	adc	en3, aden3
000162 1d62      	adc	en4, r2
000163 1d72      	adc	en5, r2
000164 1d82      	adc	en6, r2
000165 c009      	rjmp	LEA_ST
000166 ff03      LEA_MI:	sbrs	temp, f2EN_AKUM
000167 9508      	ret			; f2EN_AKUM=0  --> nie akumuluj energi ujemnej
000168 192a      	sub	en0, aden0		; odejmowanie probki energii (aden3:aden0)
000169 093b      	sbc	en1, aden1		; ...jesli byla ujemna
00016a 094c      	sbc	en2, aden2
00016b 095d      	sbc	en3, aden3
00016c 0962      	sbc	en4, r2
00016d 0972      	sbc	en5, r2
00016e 0982      	sbc	en6, r2
00016f 9382      LEA_ST:	st	-z, en6
000170 9372      	st	-z, en5
000171 9362      	st	-z, en4
000172 9352      	st	-z, en3
000173 9342      	st	-z, en2
000174 9332      	st	-z, en1
000175 9322      	st	-z, en0		; zapis Energii do RAM
000176 9508      	ret
         
          .exit
          .include "int2.asm"
         ;==============================================================================
         ;  Przerwanie INT2 wywolywane z ADE7759 (probki lub SAG)
         ;  Projekt:	Miernik energii i mocy na ADE7759
         ;  optymalizacja na szybkosc
         ;  !!! rejestry nie sa chronione, temp nie jest wykorzystywany
         ;==============================================================================
         ;.listmac
         
         ; r0, r1, r2 -rejestry operacyjne, r2=0
          .def	sreg_kopia	=r3	; r3 wykorzystywany jako kopia SREG
         
          .def	i_suma0	=r4
          .def	i_suma1	=r5
          .def	i_suma2	=r6
          .def	i_suma3	=r7
          .def	i_suma4	=r8
          .def	i_suma5	=r9	; akumulator kwadratow probek pradu
         
          .def	u_suma0	=r10
          .def	u_suma1	=r11
          .def	u_suma2	=r12
          .def	u_suma3	=r13
          .def	u_suma4	=r14
          .def	u_suma5	=r15	; akumulator kwadratow probek napiecia
         
         ; r16 =temp, r17 =flagi		; temp nie moze byc wykorzystywany
          .def	kwd0	=r18
          .def	kwd1	=r19
          .def	kwd2	=r20
          .def	kwd3	=r21	; kwd3::kwd0 -wynik kwadratu probki
          .def	kwd4	=r22	; inne zastosowanie
          .def	kwd5	=r23	; 
         
          .def	prb0	=r24
          .def	prb1	=r25
          .def	prb2	=r26	;
          .def	prb_znak	=r27	; rejestr X
         
          .def	spi_bufor	=r28
          .def	okresow	=r29	; rejestr Y
         
          .def	probek0	=r30
          .def	probek1	=r31	; rejestr Z
         
         
         
         ;======== M A K R A ===========================================================
         
         ; SPI dziala z predkoscia 2MHz (CLK/4 - spitwi.asm)
          .macro	SPI_BAJT_WYSLIJ
          	out	SPDR, spi_bufor
          SBW_1:	sbis	SPSR, SPIF
          	rjmp	SBW_1		; czekaj na ustawienie flagi zakonczenia transmisji
          	in	spi_bufor, SPSR	; kasuj powyzsza flage
          	in	spi_bufor, SPDR	; j.w.
          .endm	; 4 cykle od zakonczenia transmisji do wyjscia
         
         ;--------------------------------------
          .macro	SPI_BAJT_CZYTAJ	; @0 -rejestr odbiorczy
          	clr	spi_bufor
          	out	SPDR, spi_bufor
          SBC_1:	sbis	SPSR, SPIF
          	rjmp	SBC_1		; czekaj na ustawienie flagi zakonczenia transmisji
          	in	@0, SPSR		; kasuj powyzsza flage
          	in	@0, SPDR		; odczyt bajtu z rejestru danych SPI
          .endm	; 4 cykle od zakonczenia transmisji do wyjscia
         
         ;------------------------------------------------------------------------------
          .macro	KWADRAT16_32:	; (@0:@1)^2 ==> kwd3:kwd2:kwd1:kwd0
         			; korzysta z r0, r1, r2 oraz r2=0
          	clr	r2		; r2 zawsze rowny 0
          	mul	@0, @0
          	movw	kwd2, r0		; kwd3:kwd2 <== r1:r0
          	mul	@1, @1
          	movw	kwd0, r0		; kwd1:kwd0 <== r1:r0
          	mul	@0, @1
          	lsl	r0
          	rol	r1
          	rol	r2		; wynik ostatniego mul razy 2
          	add	kwd1, r0
          	adc	kwd2, r1
          	adc	kwd3, r2		; dodaj podwojony iloczyn
          	clr	r2		; r2 zawsze rowny 0
          .endm	; cykli: 16
         
         ;------------------------------------------------------------------------------
          .macro	SUMA32_48	; @0:@1:@2:@3:@4:@5 += kwd3:kwd2:kwd1:kwd0
          	add	@5, kwd0
          	adc	@4, kwd1
          	adc	@3, kwd2
          	adc	@2, kwd3
          	adc	@1, r2	; r2=0
          	adc	@0, r2
          .endm	; cykli: 6
         ;------------------------------------------------------------------------------
         
         
          .cseg
         ;======== P R O G R A M =======================================================
          INT2_INT:	; rozpoznanie trybu pracy
000177 fd10      	sbrc	flagi, fKAL		; przeskocz, jesli tryb zwykly
000178 c16d      	rjmp	INT2_KAL
         
         
         
         ;======== Wlasciwa procedura odbioru probek ===================================
          INT2_PRB:
000179 9bb3      	sbis	ADE_SAG_PIN, ADE_SAG	; testuj linie SAG
00017a 940c 0ba6 	jmp	BRAK_ZASILANIA
00017c b63f      	in	sreg_kopia, SREG	; zachowaj rejestr SREG
         

⌨️ 快捷键说明

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