📄 inne.asm
字号:
cp r1, r5
brts EDP_Z ; jesli T=1 -> liczba ze znakiem
brlo EDP_A ; mniejsza --> zwiekszenie
rjmp ED_KL ; na poczatek petli
EDP_Z: brlt EDP_A
rjmp ED_KL
EDP_A: ldi temp, 1
add r1, temp
rjmp ED_ST ; dane sie zmienily
;==============================================================================
POROWNAJ_CZAS: ; porownuje biezacy czas z czasem do zbierania energii
push r2
push r20
push r21
push yl
push yh
lds r21, Flagi2
cbr r21, (1<<f2EN_O) | (1<<f2EN_OO)
ldi zl, low(Od_rok_st)
ldi zh, high(Od_rok_st)
ldi yl, low(Rok_bcd+1)
ldi yh, high(Rok_bcd+1) ; adres Rok_bcd+1
ldi r20, 5 ; licznik ilosci porownan
PC_LD1: cpi r20, 2
brne PC_LD1D
ld r0, -y ; omija Dzien_tyg
PC_LD1D: ld r0, -y ; pobierz aktualny rok, ...
ld r1, z+ ; pobierz X_start
ser temp
mov r2, temp ; X_stop =0xFF
rcall POROWNANIE_ZAKRES
tst temp
breq PC_NIE ; poza zakresem
dec r20
brne PC_LD1
sbr r21, 1<<f2EN_O ; jest zakres dla Energia_od
PC_NIE: ; porownanie dla Energia_oddo
ldi zl, low(Oddo_rok_st)
ldi zh, high(Oddo_rok_st)
ldi yl, low(Rok_bcd+1)
ldi yh, high(Rok_bcd+1) ; adres Rok_bcd+1
ldi r20, 5 ; licznik ilosci porownan
PC_LD2: cpi r20, 2
brne PC_LD2D
ld r0, -y ; omija Dzien_tyg
PC_LD2D: ld r0, -y ; pobierz aktualny rok, ...
ld r1, z+ ; pobierz X_start
ld r2, z+ ; pobierz X_stop
rcall POROWNANIE_ZAKRES
tst temp
breq PC_K ; poza zakresem
dec r20
brne PC_LD2
sbr r21, 1<<f2EN_OO ; jest zakres dla Energia_oddo
PC_K: sts Flagi2, r21
pop yh
pop yl
pop r21
pop r20
pop r2
ret
;==============================================================================
SPRAWDZ_TARYFE: ; sprawdza biezacy czas i date i porownuje z ustawieniami taryfy
push r2
push r20
push r21
push xl
push xh
push yl
push yh
sbrs flagi, fTARYFY
rjmp ST_K ; licznik jednotaryfowy --> nie sprawdzaj
cbr flagi, 1<<fTARYFA2 ; ustaw taryfe1
ldi r20, LICZBA_OKIEN_CZASOWYCH
ldi xl, low(t21_dzien_st-6)
ldi xh, high(t21_dzien_st-6)
ST_AD: movw zl, xl
adiw zl, 6
movw xl, zl ; kopia adresu
ld r1, z ; pobierz dzien start
tst r1
breq ST_NAST ; dzien start =0 --> okno czasowe nieaktywne
ldi yl, low(Dzien_tyg+1)
ldi yh, high(Dzien_tyg+1) ; adres Dzien_tyg+1
ldi r21, 3 ; licznik ilosci porownan
ST_LD: ld r0, -y ; pobierz aktualny dzien, godz. lub minute
ld r1, z+ ; pobierz X_start
ld r2, z+ ; pobierz X_stop
rcall POROWNANIE_ZAKRES
tst temp
breq ST_NAST ; poza zakresem --> spr nastepne okno
dec r21
brne ST_LD
sbr flagi, 1<<fTARYFA2 ; ustaw taryfe2
rjmp ST_K
ST_NAST: dec r20
brne ST_AD
ST_K: pop yh
pop yl
pop xh
pop xl
pop r21
pop r20
pop r2
ret
;--------------------------------------
POROWNANIE_ZAKRES: ; porownuje r0 z r1 (min) i r2 (max) i ustawia 0xFF w temp jesli w zakresie
ldi temp, 0b00000011
; porownywanie na TAK (zakres np. 2-5)
cp r0, r1 ; ? r0 >= min
brlo PZ_11 ; ...nie
cbr temp, 1 ; ...tak, to zeruj bit (stan OK)
PZ_11: cp r2, r0 ; ? max >= r0
brlo PZ_12 ; ...nie
cbr temp, 2 ; ...tak
PZ_12: cp r2, r1 ; ? max >= min
brlo PZ_2 ; ...nie -> porownywanie na NIE
tst temp
breq PZ_OK ; jesli temp=0 to r0 w zakresie
PZ_NIE: clr temp ; r0 poza zakresem
ret
PZ_OK: ser temp ; r0 w zakresie --> 0xFF to sygnalizuje
ret
; porownywanie na NIE (zakres np. 5-2)
PZ_2: com temp
andi temp, 0b00000011
tst temp
brne PZ_OK ; jesli temp<>0 to r0 w zakresie
rjmp PZ_NIE ; jesli temp=0 to r0 NIE w zakresie
;==============================================================================
BRAK_ZASILANIA: ; wykonuje zapis parametrow do EEPROM oraz do 24Cxxx (jesli trzeba)
cli
rcall ZAP_EN_DS1307 ; zapis energii w pamieci DS1307
BZ_SAG: rcall LCD_CLEAR
ldi zh, high(2*txt_bns)
ldi zl, low(2*txt_bns)
rcall LCD_STR_FLASH ; "brak napiecia sieciowego"
BZ_SP: sbic ADE_SAG_PIN, ADE_SAG ; przeskocz jesli stan niski (brak napiecia)
rjmp RESET ; stan wysoki -> start programu od poczatku
rcall DELAY_5_1ms ; 5ms opoznienia
wdr
rjmp BZ_SP
;------------------------------------------------------------------------------
RESET_ADE: ; reset ADE7759
cbi ADE_RESET_PORT, ADE_RESET
sbi ADE_RESET_PORT-1, ADE_RESET ; jako wyjscie
rcall DELAY_44us
; koniec resetu ADE7759
cbi ADE_RESET_PORT, ADE_RESET
cbi ADE_RESET_PORT-1, ADE_RESET ; jako wejscie (na linii ADE_RESET jest pullup 10k)
; rcall DELAY_44us
rcall DELAY_5_1ms ; 5ms opoznienia
ret
;==============================================================================
ZAP_EN_DS1307: ; zapisuje 8 energii w DS1307
push yl
push yh
ldi yl, low(Energia1-2)
ldi yh, high(Energia1-2)
ld temp, y
push temp
ldd temp, y+1
push temp
ldi temp, DS1307_ADRES | TWI_WRITE
st Y, temp ; zapisz adres DS1307 w buforze
ldi temp, 8 ; adres rejestru w DS1307
std y+1, temp
ldi temp, ILE_BAJT_EN +1 ; 56 bajtow energii + adres rejestru
mov r0, temp ; licznik ilosci danych do wyslania
call TWI_MASTER_WRITE
ldi yl, low(Energia1-2)
ldi yh, high(Energia1-2)
pop temp
std y+1, temp
pop temp
st y, temp
pop yh
pop yl
ret
;------------------------------------------------------------------------------
ZAPISZ_EN_EE: ; zapisuje energie z RAM do EEPROMu
; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
push temp
push ee_adr
push ee_dane
push yl
push yh
ldi temp, ILE_BAJT_EN ; licznik ilosci bajtow wszystkich energii nieulotnych
clr yh
out EEARH, yh
ldi yl, low(Energia1)
ldi yh, high(Energia1)
ldi ee_adr, (low(Ds_adr) -RAM) +EEPROM ; adres poczatkowy w EEPROM
; ...poczatek zmiennych ulotnych jednoczesnie oznacza
; ...wolne miejsce w EEPROM (koniec zmiennych konfiguracyjnych)
ZEE_1: ld ee_dane, y+ ; pobierz bajt z RAM
rcall EE_ZAPIS
inc ee_adr ; zwieksz adres w EEPROM
dec temp
brne ZEE_1 ; nastepny bajt
pop yh
pop yl
pop ee_dane
pop ee_adr
pop temp
ret
;------------------------------------------------------------------------------
CZYTAJ_EN_EE: ; odczytuje energie z EEPROM do RAM
; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
push temp
push ee_adr
push ee_dane
push yl
push yh
ldi temp, ILE_BAJT_EN ; licznik ilosci bajtow wszystkich energii nieulotnych
clr yh
out EEARH, yh
ldi yl, low(Energia1)
ldi yh, high(Energia1)
ldi ee_adr, (low(Ds_adr) -RAM) +EEPROM ; adres poczatkowy w EEPROM
; ...poczatek zmiennych ulotnych jednoczesnie oznacza
; ...wolne miejsce w EEPROM (koniec zmiennych konfiguracyjnych)
CEE_1: out EEARL, ee_adr ; wpisz adres do odczytu bajtu
sbi EECR, EERE ; ustaw znacznik odczytu (procesor czeka 4 cykle na bajt z EE)
in ee_dane, EEDR
st y+, ee_dane ; przepisz bajt z EE do RAM, oraz zwieksz adres (offset) do RAM
inc ee_adr ; zwieksz adres w EEPROM
dec temp
brne CEE_1 ; nastepny bajt
pop yh
pop yl
pop ee_dane
pop ee_adr
pop temp
ret
;------------------------------------------------------------------------------
ZAPISZ_KONF_EE: ; zapisuje konfiguracje do EEPROMu
; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
push ee_adr
push ee_dane
push yl
push yh
clr yh
out EEARH, yh
ldi yl, RAM ; zmiennych nie moze byc wiecej niz 0xFF-0x68 (0xFF-RAM)
ldi ee_adr, EEPROM ; adres poczatkowy w EEPROM
ZKE_1: ld ee_dane, y+ ; pobierz bajt z RAM
rcall EE_ZAPIS
inc ee_adr ; zwieksz adres w EEPROM
cpi yl, low(Flagi2) ; czy koniec danych? (Flagi2 to zmienna ktora jest zmieniana w trybie normalnym)
brlo ZKE_1 ; nastepny bajt
pop yh
pop yl
pop ee_dane
pop ee_adr
ret
;------------------------------------------------------------------------------
ZAPISZ_TAR_EE: ; zapisuje taryfy do EEPROMu
; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
push ee_adr
push ee_dane
push yl
push yh
clr yh
out EEARH, yh
ldi yl, low(T21_dzien_st)
; ldi yh, high(T21_dzien_st)
ldi ee_adr, (low(T21_dzien_st) -RAM) +EEPROM ; adres poczatkowy w EEPROM
ZTE_1: ld ee_dane, y+ ; pobierz bajt z RAM
rcall EE_ZAPIS
inc ee_adr ; zwieksz adres w EEPROM
cpi yl, low(Od_rok_st) ; czy koniec danych?
brlo ZTE_1 ; nastepny bajt
pop yh
pop yl
pop ee_dane
pop ee_adr
ret
;------------------------------------------------------------------------------
ZAPISZ_EO_EE: ; zapisuje dane energii OD do EEPROMu
; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
push ee_adr
push ee_dane
push yl
push yh
clr yh
out EEARH, yh
ldi yl, low(Od_rok_st)
ldi ee_adr, (low(Od_rok_st) -RAM) +EEPROM ; adres poczatkowy w EEPROM
ZEOE_1: ld ee_dane, y+ ; pobierz bajt z RAM
rcall EE_ZAPIS
inc ee_adr ; zwieksz adres w EEPROM
cpi yl, low(Oddo_rok_st) ; czy koniec danych?
brlo ZEOE_1 ; nastepny bajt
pop yh
pop yl
pop ee_dane
pop ee_adr
ret
;------------------------------------------------------------------------------
ZAPISZ_EOO_EE: ; zapisuje dane energii ODDO do EEPROMu
; wykorzystuje rejestr Y (RAM), ee_dane, ee_adr
push ee_adr
push ee_dane
push yl
push yh
clr yh
out EEARH, yh
ldi yl, low(Oddo_rok_st)
ldi ee_adr, (low(Oddo_rok_st) -RAM) +EEPROM ; adres poczatkowy w EEPROM
ZEOOE_1: ld ee_dane, y+ ; pobierz bajt z RAM
rcall EE_ZAPIS
inc ee_adr ; zwieksz adres w EEPROM
cpi yl, low(Ds_adr) ; czy koniec danych?
brlo ZEOOE_1 ; nastepny bajt
pop yh
pop yl
pop ee_dane
pop ee_adr
ret
.exit
;------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -