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

📄 equ.asm

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 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 + -