📄 equ.asm
字号:
;==============================================================================
; Wiekszosc stalych i zmiennych wystepujacych w programie
; Projekt: Miernik energii i mocy na ADE7759
;==============================================================================
;======== S T A L E ===========================================================
.equ F_zegara =8000000 ; czestotliwosc kwarcu taktujacego procesor [Hz]
.equ RAM =0x68 ; adres poczatku danych w RAM
.equ EEPROM =0x8 ; adres poczatku danych w EEPROM
.equ ILE_BAJT_EN =56 ; ilosc bajtow wszystkich energii nieulotnych
.equ STALA_DLA_F =100000000
.equ KLAWISZ_CZAS_TRZYMANIA =25 ; 30 cykli dla czasu =1s
.equ KLAWISZ_CZAS_NIEAKTYWNY =8 ; czas = x * 8,4s
.equ LICZBA_OKIEN_CZASOWYCH =4 ; liczba przedzialow czasowych dla taryfy2
.equ PROG_AKUMULACJI =500 ; prog akumulacji energii ==> 0,13W (500Ws)
.equ CYKLI_POM =32 ; NIE ZMIENIAC!
; zmienna Flagi2:
;.equ f2TARYFY =0 ; ten bit przechodzi do "flag"
.equ f2EN_WH =1 ; =1 wybor wyswietlania energii w Wh (jesli mozliwe)
.equ f2EN_S =2 ; =1 akumulacja energii pozornej
.equ f2EN_AKUM =3 ; =1 akumulacja energii ujemnej (czyli odejmowanie)
.equ f2EN_MI =4 ; =1 energia ujemna w ostatnim odczycie
.equ f2EN_O =5 ; =1 akumulowac Energie_od
.equ f2EN_OO =6 ; =1 akumulowac Energie_oddo
; zmienna Flagi3:
.equ f3EN_RST =0 ; =1 odbierana pierwsza probka energii (po resecie =1)
; poniewaz pierwsza probka jest przeklamana (a czasem i druga)
.equ f3EN_O =1 ; =1 to uzupelnij LCD dla Energii_od
.equ f3EN_OO =2 ; =1 to uzupelnij LCD dla Energii_oddo
; zmienna Flagi4:
.equ f4KAL_DCI =0
.equ f4KAL_ZI =1
.equ f4KAL_DCU =2
.equ f4KAL_ZU =3
.equ f4KAL_CH =4
.equ f4KAL_CH0 =5
.equ f4KAL_E =6
;-------- zmienna Status --------------
.equ ST_M =5 ; bit wyboru mocy
.equ ST_E1 =4 ; bit wyboru energii taryfa1
.equ ST_E2 =3 ; bit wyboru energii taryfa2
.equ ST_F =2 ; bit wyboru okresu (czestotliwosci)
.equ ST_U =1 ; bit wyboru napiecia w zmiennej Status
.equ ST_I =0 ; bit wyboru pradu
.equ ST_MSB =0b00100000 ; najstarszy mozliwy bit w zmiennej Status
.equ ST_MASKA =0b00111111 ; maska na bity zmiennej Status
;-------- zmienna Status_U ------------
.equ STU_RMS =0 ; RMS napiecia
.equ STU_MAV =1 ; wart.srednia napiecia
.equ STU_AP =2 ; amplituda dodatnia
.equ STU_AM =3 ; amplituda ujemna
.equ STU_MSB =0b00001000 ; najstarszy mozliwy bit w zmiennej Status_U
.equ STU_MASKA =0b00001111 ; maska na bity zmiennej Status_U
;-------- zmienna Status_I ------------
.equ STI_RMS =0 ; RMS
.equ STI_MAV =1 ; wart.srednia
.equ STI_AP =2 ; amplituda dodatnia
.equ STI_AM =3 ; amplituda ujemna
.equ STI_MSB =0b00001000 ; najstarszy mozliwy bit w zmiennej Status_I
.equ STI_MASKA =0b00001111 ; maska na bity zmiennej Status_I
;-------- zmienna Status_M ------------
.equ STM_P =0 ; bit wyboru: moc czynna
.equ STM_Q =1 ; bit wyboru: moc bierna
.equ STM_S =2 ; bit wyboru: moc pozorna
.equ STM_PF =3 ; bit wyboru: wsp.mocy
.equ STM_MSB =0b00001000 ; najstarszy mozliwy bit w zmiennej Status_M
.equ STM_MASKA =0b00001111 ; maska na bity zmiennej Status_M
;-------- zmienna Status_E1 ----------- ; energia taryfy1
.equ STE1_SES =0 ; bit wyboru: energia sesji
.equ STE1_OD =1 ; bit wyboru: energia od okresu...
.equ STE1_ODDO =2 ; bit wyboru: energia od okresu do...
.equ STE1_SUMA =3 ; bit wyboru: suma calkowita energii
.equ STE1_POZ =4 ; bit wyboru: energia pozorna
.equ STE1_SEK =5 ; energia sekundowa
.equ STE1_MSB =0b00010000 ; najstarszy mozliwy bit w zmiennej Status_M
.equ STE1_MASKA =0b00011111 ; maska na bity zmiennej Status_M
.equ STE1_MSB_K =0b00100000 ; dla trybu kalibracji
.equ STE1_MASKA_K =0b00111111 ; dla trybu kalibracji
;-------- zmienna Status_E2 ----------- ; ...taryfy2
.equ STE2_SES =0 ; bit wyboru: energia sesji
.equ STE2_OD =1 ; bit wyboru: energia od okresu...
.equ STE2_ODDO =2 ; bit wyboru: energia od okresu do...
.equ STE2_SUMA =3 ; bit wyboru: suma calkowita energii
.equ STE2_POZ =4 ; bit wyboru: energia pozorna
.equ STE2_MSB =0b00010000 ; najstarszy mozliwy bit w zmiennej Status_M
.equ STE2_MASKA =0b00011111 ; maska na bity zmiennej Status_M
;--------------------------------------
;-------- ADE7759 -------------------------------------------------------------
.equ ADE_RESET_PORT =PORTB
.equ ADE_RESET =0
.equ ADE_CS_PORT =PORTB
.equ ADE_CS =4
.equ ADE_SAG_PIN =PINB ; SAG -> tylko wejscie
.equ ADE_SAG =3
.equ ADE_WAVEFORM_ADR =1
.equ ADE_RSTENERGY_ADR =3
.equ ADE_RSTSTATUS_ADR =5
.equ ADE_MODE_ADR =6
.equ ADE_CH1OS_ADR =8
.equ ADE_CH2OS_ADR =9
.equ ADE_GAIN_ADR =0x0A
.equ ADE_APGAIN_ADR =0x0B
.equ ADE_PHCAL_ADR =0x0C
.equ ADE_APOS_ADR =0x0D
.equ ADE_ZXTOUT_ADR =0x0E
.equ ADE_SAGCYC_ADR =0x0F
.equ ADE_IRQEN_ADR =0x10
.equ ADE_SAGLVL_ADR =0x11
.equ ADE_TEMP_ADR =0x12
.equ ADE_CHKSUM_ADR =0x1E
.equ ADE_DIEREV_ADR =0x1F
;.equ ADE_READ =0
;.equ ADE_WRITE =0b10000000
.equ I_WSMP =3
.equ I_SAG =1
.equ M_DISSAG =3
.equ M_DTRT0 =3
.equ M_DTRT1 =4
;--------------------------------------
;-------- TWI, DS1307 -----------------
.equ TWI_WRITE =0
.equ TWI_READ =1
.equ TWI_BR =70 ; bit rate: 32 dla 100kHz, 72 dla 50kHz
; 98 i (TWI_SR=1) dla 10kHz
.equ TWI_SR =0 ; preskaler: 1 -> /4
.equ TWIS_START =0x08 ; kody statusu (dla poprawnej transmisji)
.equ TWIS_MT_SLA_ACK =0x18
.equ TWIS_MT_DATA_ACK =0x28
.equ TWIS_MR_SLA_ACK =0x40
.equ TWIS_MR_DATA_ACK =0x50
.equ TWIS_MR_DATA_NOACK =0x58
.equ DS1307_ADRES =0b11010000
;--------------------------------------
;-------- KLAWISZE --------------------
.equ KLAW_PORT =PORTC ; port do ktorego podpiete sa klawisze
.equ KLAW_PIN =KLAW_PORT-2 ; wejscie klawiszy
.equ KLAW_MASKA =0b11111100 ; maska portu do wyluskania klawiszy
.equ KLAW_TAK =2 ; klawisz TAK
.equ KLAW_NIE =3 ; klawisz NIE
.equ KLAW_L =4 ; klawisz LEWO
.equ KLAW_P =5 ; klawisz PRAWO
.equ KLAW_D =6 ; klawisz DOL
.equ KLAW_G =7 ; klawisz GORA
;--------------------------------------
;------------------------------------------------------------------------------
; kolejnosc zmiennych jest BARDZO WAZNA!
;======== Z M I E N N E =======================================================
.dseg
.org RAM
;----------------------------------------------------------
; zmienne odczytywane z EEPROMu
;----------------------------------------------------------
Ade_ch1os: .byte 1
Ade_ch2os: .byte 1
Ade_gain: .byte 1
Ade_apgain: .byte 2
Ade_phcal: .byte 1
Ade_apos: .byte 2
Ade_zxtout: .byte 2
Ade_sagcyc: .byte 1
Ade_saglvl: .byte 1
Ade_irqen: .byte 1
Ade_mode: .byte 2
Okresy_ile: .byte 1 ; ilosc okresow w ciagu ktorych maja byc zbierane probki
Hist_zera_ile: .byte 1 ; wartosc oczekiwana Hist_zera wymagana do stwierdzenia przejscia U przez zero
Hist_przepel_I_ile: .byte 1 ; - || - przepelnienia probki pradu
Hist_przepel_U_ile: .byte 1 ; - || - analogicznie
;====== definicja: ====================
; Hist_zera_ile =7 | 0x80 ; ilosc KOLEJNYCH probek dodatnich do rozpoznania przejscia przez 0
; ; wartosc 0x80 to bit testowania przejscia przez zero
; Hist_przepel_I_ile =10 ; ilosc KOLEJNYCH przepelnionych probek ktore nie ustawia
; Hist_przepel_U_ile =10 ; flagi przepelnienia
;======================================
Wsp_I: .byte 2 ; wspolczynnik korekcji pradu do rozdzielczosci [mA] (20000)
Wsp_U: .byte 2 ; wspolczynnik korekcji napiecia do rozdzielczosci [0,1V] (3960)
Wsp_P: .byte 2 ; wspolczynnik korekcji mocy do rozdzielczosci [0,1W] (36000) -nie zmieniac!
Wsp_E: .byte 3 ; wspolczynnik korekcji probki energii do rozdz. [Wh] (675770)
Wsp_F: .byte 2 ; wsp. korekcji (offset) mierzonej czestotliwosci napiecia (0)
Off_I_dc: .byte 2 ; ... 14-bit kod U2 +-0x2FFF
Off_Ir_z: .byte 1
Off_Im_z: .byte 1
Off_Ia_z: .byte 1
Off_U_dc: .byte 2 ; offset symetrii probek, 11-bit kod U2 (-767 +767)
Off_Ur_z: .byte 1 ; offset zera wyniku RMS (0-255)
Off_Um_z: .byte 1 ; offset zera wyniku MAV
Off_Ua_z: .byte 1 ; offset zera wyniku amplitudy
Flagi2: .byte 1 ; dodatkowy bajt znacznikow
T21_dzien_st: .byte 1 ; zmienne czasowe w formacie BCD dla taryfy 2
T21_dzien_sp: .byte 1
T21_godz_st: .byte 1
T21_godz_sp: .byte 1
T21_min_st: .byte 1
T21_min_sp: .byte 1
T22_dzien_st: .byte 1
T22_dzien_sp: .byte 1
T22_godz_st: .byte 1 ; w przypadku zmiany kolejnosci, przerobic proc. ZAPISZ_
T22_godz_sp: .byte 1
T22_min_st: .byte 1
T22_min_sp: .byte 1
T23_dzien_st: .byte 1
T23_dzien_sp: .byte 1
T23_godz_st: .byte 1
T23_godz_sp: .byte 1
T23_min_st: .byte 1
T23_min_sp: .byte 1
T24_dzien_st: .byte 1
T24_dzien_sp: .byte 1
T24_godz_st: .byte 1
T24_godz_sp: .byte 1
T24_min_st: .byte 1
T24_min_sp: .byte 1
Od_rok_st: .byte 1 ; dane czasowe dla Energii_od
Od_mies_st: .byte 1
Od_dzien_st: .byte 1
Od_godz_st: .byte 1
Od_min_st: .byte 1
Oddo_rok_st: .byte 1 ; dane czasowe dla Energii_oddo
Oddo_rok_sp: .byte 1
Oddo_mies_st: .byte 1
Oddo_mies_sp: .byte 1
Oddo_dzien_st: .byte 1
Oddo_dzien_sp: .byte 1
Oddo_godz_st: .byte 1
Oddo_godz_sp: .byte 1
Oddo_min_st: .byte 1
Oddo_min_sp: .byte 1
;----------------------------------------------------------
; ------- zmienne ustawiane po resecie --------------------
;----------------------------------------------------------
; !!! Ds_adr -pierwsza zmienna ulotna !!!
Ds_adr: .byte 1 ; adres ds1307 (zmienna pomocna przy transm. TWI)
Sekundy_bcd: .byte 1 ; aktualny czas
Minuty_bcd: .byte 1
Godziny_bcd: .byte 1 ; kolejnosc zmiennych MUSI byc zachowana
Dzien_tyg: .byte 1
Dzien_bcd: .byte 1
Miesiac_bcd: .byte 1
Rok_bcd: .byte 1
Sekundy_bin: .byte 1 ; binarna wartosc sekund
; ---- test! ---\/-------
;Prb: .byte 2 ; test! ilosc probek
;Prb_z: .byte 1 ;
;Okr: .byte 1 ;
; ---- test! ---/\-------
Wsp_LPF1: .byte 2 ; wspolczynnik korekcji nap. w zaleznosci od czestotliwosci (34410) -automatyka!
Prb_na_okr_x2: .byte 2 ; ilosc probek na okres x2 (1/50Hz) zalezna od DTRT
Probek_ile: .byte 2 ; maks. ilosc probek do odebrania = DTRT * (Okresy_ile+1)
; ...DTRT to bity rejestru MODE (predkosc przesylu probek)
Prb_0xff: .byte 2 ; liczenie ilosci probek gdy okresow=0xFF (przebieg napiecia nieokresowy)
Hist_zera: .byte 1 ; b7 -ustawiony znaczy trwa testowanie histerezy przejscia U przez zero
; b5-b0 -wartosc histerezy (licznik)
Hist_przepel_I: .byte 1 ; licznik histerezy przepelnienia probki pradu
Hist_przepel_U: .byte 1 ; - || - napiecia
; --/\ /\ /\ ----- te zmienne musza sie miescic w adresie 0x00FF -- /\ /\ /\ ----
Ak_mavI: .byte 4 ; akumulator wartosci sredniej
Ak_mavU: .byte 4
Prad_min: .byte 2 ; amplituda min
Prad_max: .byte 2 ; ...i max (probka)
Napiecie_min: .byte 2
Napiecie_max: .byte 2 ; j.w.
Bufor: .byte 16 ; 16-bajtowy bufor
Klawisze: .byte 1 ; stan klawiatury
Klaw_dlugo: .byte 1 ; czas trzymania klawisza
Klaw_pusz: .byte 2 ; czas puszczenia klawisza
Prad_rms: .byte 2 ; przechowuje wartosc pradu - nie trzeba zerowac
Prad_mav: .byte 2
Napiecie_rms: .byte 2 ; - || - napiecia
Napiecie_mav: .byte 2
Prad_am: .byte 2
Prad_ap: .byte 2
Napiecie_am: .byte 2
Napiecie_ap: .byte 2
Moc_P: .byte 2 ; - || - mocy czynnej
Moc_S: .byte 2 ; - || - mocy pozornej
Moc_Q: .byte 2 ; - || - mocy biernej
Pf_mocy: .byte 1 ; wspolczynnik mocy
Wypeln: .byte 1 ; wypelnienie okresu napiecia
Czestosc: .byte 2 ; czestotliwosc napiecia
Energia_sek: .byte 4 ; energia sekundowa (probka po korekcji Wsp_E)
Status: .byte 1 ; zmienna zawierajaca bit wyboru pomiaru do wyswietlenia
Status_I: .byte 1 ; ...
Status_U: .byte 1
Status_M: .byte 1
Status_E1: .byte 1
Status_E2: .byte 1 ; ... szczegoly wyzej
Energia1: .byte 7 ; akumulator energii calkowitej (niekasowalnej) -wartosc ze znakiem
Energia2: .byte 7 ; j.w. taryfa 2
Energia1_od: .byte 7 ; - || - od czasu...
Energia2_od: .byte 7 ; j.w. taryfa 2
Energia1_oddo: .byte 7 ; - || - od czasu do czasu
Energia2_oddo: .byte 7 ; j.w. taryfa 2
Energia1_poz: .byte 7 ; energia pozorna
Energia2_poz: .byte 7 ;
Energia1_ses: .byte 7 ; akumulator energii sesji (zerowac po resecie)
Energia2_ses: .byte 7 ; j.w. taryfa 2
Flagi3: .byte 1 ; trzeci bajt flag
Flagi4: .byte 1
Off_x1: .byte 2 ; zmienna tymczasowa do wyliczenia offsetu
Off_x2: .byte 2 ; zmienna tymczasowa do wyliczenia offsetu
Cykli: .byte 1
.exit
;==============================================================================
info:
- zmienne ktorych adres nie musi byc jednobajtowy:
probek_ile, Prb_na_okr_x2, wsp_LPF1
- mozna dorzucic pomiar temperatury oraz zapis braku zasilania
;==============================================================================
ZNANE BLEDY:
- pomiar malych pradow jest obarczony duzym bledem, poniewaz kalibracja zera
powoduje przesuniecie skali o kilka mA
- edycja liczb jednobajtowych ze znakiem (kod U2) dziala niezupelnie zgodnie
z ograniczeniem minimalnym i maksymalnym
- nie mozna za szybko zareagowac na przerwanie od probek, bo probki moga byc zle
przeslane! (rozwiazanie: patrz int2.asm)
- dla czestotliwosci napiecia mniejszej od 46Hz zbieranie probek zostanie przerwane
ze wzgledu na ograniczenie ilosci probek -powoduje to niewielki (jak bardzo?) blad
pomiaru wynikajacy z nieukonczenia zbierania probek w zerze napiecia
;------------------------------------------------------------------------------
Rejestry ADE7759 (poczatek pamieci EEPROM procesora)
adres EE: nazwa: wartosc:
--------------------------------
0 --- ---
1
2
3
4
5
6
7 --- hex:
8 CH1OS 00
9 CH2OS 00
A GAIN 09 ; 0x09 = 0b00001001
B APGAIN_0 00
C APGAIN_1 00
D PHCAL 00
E APOS_0 00
F APOS_1 00
10 ZXTOUT_0 8D ; 0x048D = 1165 (>24Hz)
11 ZXTOUT_1 04 ;
12 SAGCYC 03 ; 3 polowki sinusoidy
13 SAGLVL 47 ; 0x47 = >165V (220V-25%)
14 IRQEN 02 ; 2 = 0b00000010
15 MODE_0 05 ; mode = 0x2805
16 MODE_1 28 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -