📄 kalibr.asm
字号:
;==============================================================================
; Procedury kalibracyjne
; Projekt: Miernik energii i mocy na ADE7759
;==============================================================================
.cseg
;==============================================================================
; KALIBRACJE miernika wykonywac po kilku minutach od wlaczenia
KALIBRACJA: ; kalibracji miernika -ustawienie parametrow
sbic KLAW_PIN, KLAW_TAK ; przeskocz jesli stan niski (klawisz wcisniety)
ret
KLAWISZ_WCISNIETY ; ustaw bit wcisniecia klawisza
rcall LCD_CLEAR
ldi zh, high(2*txt_kalibr)
ldi zl, low(2*txt_kalibr)
rcall LCD_STR_FLASH ; komunikat
lds temp, Flagi2
cbr temp, 1<<f2EN_S ; czyszczenie flagi akumulowania en. poz.
sbr temp, 1<<f2EN_WH
lds temp, Ade_irqen ; Ade_irqen
cbr temp, 1<<I_SAG ; czysc bit przerwania od braku napiecia (kanal CH2)
mov r0, temp
ldi temp, ADE_IRQEN_ADR
call SPI_ADE_WRITE_1B
lds zl, Ade_mode ; Ade_mode
lds zh, Ade_mode+1
push zl
push zh ; zachowaj oryginal
sbr zl, 1<<M_DISSAG ; wylacz linie SAG
sbr zh, 1<<M_DTRT1
cbr zh, 1<<M_DTRT0 ; ustaw zbieranie probek na 7kHz (140 na okres 50Hz)
sts Ade_mode, zl
sts Ade_mode+1, zh
movw r0, zl
ldi temp, ADE_MODE_ADR
call SPI_ADE_WRITE_2B
call OIP ; przeliczenie ilosci: Probek_ile
pop zh
pop zl
sts Ade_mode, zl ; przywroc oryginal
sts Ade_mode+1, zh
sbr flagi, 1<<fKAL ; ustaw bit kalibracji
cbr flagi, 1<<fTARYFY
ldi temp, 1<<STE1_SEK ; wskaz En_SEK
sts Status_E1, temp
ret
;------------------------------------------------------------------------------
KAL_E: ; kalibracja zera probki energii (tzn. jak najmniejszej)
; wykonywac pod napieciem, ale bez obciazenia
; przy wsp_E = 675770 --> kazde 100h w APOS oznacza 140,8 Esek.
lds r18, Cykli
dec r18
sts Cykli, r18
breq KLE_1
ret
KLE_1: lds n1, Energia1_ses ; Esek * Cykli * 256
lds n2, Energia1_ses+1
lds n3, Energia1_ses+2
lds n4, Energia1_ses+3
clr n5
clr n0
sts Flagi4, n0
ldi y0, low(CYKLI_POM * 1408 /10)
ldi y1, high(CYKLI_POM * 1408 /10)
rcall DIV_48_16
movw r0, n0
com r0
com r1
sts Ade_apos, r0
sts Ade_apos+1, r1
cli
ldi temp, ADE_APOS_ADR
call SPI_ADE_WRITE_2B
sei
ret
;------------------------------------------------------------------------------
KAL_I: ; kalibracja zera pradu
ldi zl, low(Prad_min)
ldi zh, high(Prad_min)
sbrs temp, f4KAL_CH
rjmp KALI_DC
sbrs temp, f4KAL_CH0
rjmp KALI_CH
ldi zl, low(Prad_min)
ldi zh, high(Prad_min)
rcall KKCH
sts Ade_ch1os, r20
KALI_CH: lds r20, Ade_ch1os
lds r4, Prad_rms
lds r5, Prad_rms+1
rcall KAL_CHOS
mov r0, r20
cli
push temp
ldi temp, ADE_CH1OS_ADR
sts Ade_ch1os, r0
call SPI_ADE_WRITE_1B ; Ade_ch1os
pop temp
sei
ret
KALI_DC: rcall KAL_DC ; potem kalibracja offsetu DC
sbrc temp, f4KAL_DCI
ret
sts Off_I_dc, r0
sts Off_I_dc+1, r1
sbr temp, 1<<f4KAL_ZI ; teraz flaga kalibracji zera pradu
sts Flagi4, temp
ret
;--------------------------------------
KAL_U: ldi zl, low(Napiecie_min)
ldi zh, high(Napiecie_min)
sbrs temp, f4KAL_CH
rjmp KALU_DC
sbrs temp, f4KAL_CH0
rjmp KALU_CH
ldi zl, low(Napiecie_min)
ldi zh, high(Napiecie_min)
rcall KKCH
sts Ade_ch2os, r20
KALU_CH: lds r20, Ade_ch2os
lds r4, Napiecie_rms
lds r5, Napiecie_rms+1
rcall KAL_CHOS
mov r0, r20
cli
push temp
ldi temp, ADE_CH2OS_ADR
sts Ade_ch2os, r0
call SPI_ADE_WRITE_1B ; Ade_ch2os
pop temp
sei
ret
KALU_DC: rcall KAL_DC ; potem kalibracja offsetu DC
sbrc temp, f4KAL_DCU
ret
sts Off_U_dc, r0
sts Off_U_dc+1, r1
sbr temp, 1<<f4KAL_ZU ; teraz flaga kalibracji zera
sts Flagi4, temp
ret
;------------------------------------------------------------------------------
KAL_CHOS: ; kalibracja offsetu w rejestrze CH?OS
ldi yl, low(Off_x1)
ldi yh, high(Off_x1)
lds r18, Cykli
dec r18
sts Cykli, r18
brne KCH_1
clr r20 ; kalibracja niemozliwa
clr temp
rjmp KCH_RET
KCH_1: ld r6, y ; stara wartosc ***_rms
ldd r7, y+1
cp r4, r6
cpc r5, r7 ; cp nowa, stara
brlo KCH_MN
mov r21, r20
andi r21, 0b00011111
breq KCH_RET
dec r20
KCH_RET: cbr temp, 1<<f4KAL_CH ; koniec kalibracji CH?OS
sts Flagi4, temp
ldi r18, CYKLI_POM ; ilosc cykli pomiarowych (czyli ilosc sekund)
sts Cykli, r18
clr r0
st y, r0
std y+1, r0
ret
KCH_MN: inc r20
st y, r4 ; zapisz biezaca wartosc ***_rms
std y+1, r5
ret
;--------------------------------------
KKCH: ; rozpoznanie czy offset ujemny czy dodatni
clr r20
ld r0, z
ldd r1, z+1 ; ***_min
ldd r2, z+2
ldd r3, z+3 ; ***_max
cp r0, r2
cpc r1, r3 ; cp min, max
brlo KCH_P
ldi r20, 0x20 ; bit znaku
KCH_P: cbr temp, 1<<f4KAL_CH0
sts Flagi4, temp
ret
;------------------------------------------------------------------------------
KAL_DC: ; kalibracja offsetu DC pradu
ldi yl, low(Off_x1)
ldi yh, high(Off_x1)
rcall KLDC_ADD
adiw zl, 2 ; +2 ==> czyli ***_max
adiw yl, 2
rcall KLDC_ADD
lds r18, Cykli
dec r18
sts Cykli, r18
breq KD_1
ret
KD_1: rcall KLDC_DIV ; usrednianie
sbiw yl, 2
rcall KLDC_DIV
ld r0, y
ldd r1, y+1
ldd r2, y+2
ldd r3, y+3
sub r0, r2 ; ampl. (min - max)
sbc r1, r3
clc
sbrc r1, 7
sec
ror r1 ; /2
ror r0
clr temp ; koniec kalibracji DC
ret
;------------------
KLDC_ADD: ; dodaje probke do akumulatora
ld r2, z
ldd r3, z+1
ld r0, y
ldd r1, y+1
add r0, r2
adc r1, r3
st y, r0
std y+1, r1
ret
KLDC_DIV: ; dzielenie przez ilosc cykli
ldi r18, CYKLI_POM
ld r0, y
ldd r1, y+1
KDD_2: lsr r18
brcc KDD_1
st y, r0
std y+1, r1
ret
KDD_1: lsr r1
ror r0
rjmp KDD_2
.exit
;==============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -