📄 ade7759.lst
字号:
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 + -