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