             SYMBOLS
true         equ 1
false        equ 0

;------------------------------poczatkowe ustawienia rejestrow
MyTCon       equ 00010001b
MyTMod       equ 00010001b
MyIP         equ 00000010b; priorytet dla przerw. czasowego

; TH0Init      equ 9eh
; TL0Init      equ 58h; tzn. przerwanie co 50ms  (20 na s) fzeg=6MHz
; TH0Init      equ cfh
; TL0Init      equ 2ch; tzn. przerwanie co 50ms  (20 na s); fzeg=3MHz

;TH0Init      equ f3h
;TL0Init      equ cah; tzn. przerwanie co 12.5 ms  (80 na s); fzeg=3MHz

TH0Init      equ 255
TL0Init      equ  51+4; tzn. przerwanie co 1ms  (80 na s); fzeg=4.9152 MHz
                      ;+4 bo 4 cykle trwa sama inicjaliz. zegara



ex0          equ 0  ;enable external Int0
et0          equ 1  ;enable timer 0
ex1          equ 2  ;enable external Int0
et1          equ 3  ;enable timer 1
ea           equ 7  ;enable all


MaxLInt1     equ 2;   10 na s
MaxLInt2     equ 5;   2 na s
MaxLInt3     equ 2;   1 na s



;----------------------Tylko do programu Przelew--------------
; Co ile przerwan jest prz. glowne, tzn. robiace cos ponad obsluge buzzera
CoIleIntGl   equ 100
CoIle200ms   equ 4   ;Co ile przerwan glownych jest 200 ms
CoIle1s      equ 20  ;Co ile przerwan glownych jest 1s

BuzzNiesk    equ 255  ;buzzer popiskuje w nieskonczonosc

MinTCzuj     equ 40   ;40 przerwan (20ms) musi byc aktywny czujnik


;Bity p1
PinBuzz     equ 7
PinLedPrzel equ 6
PinLedWody  equ 5
PinLedOn    equ 4
PinPompy    equ 3

;Bity p3
CzPrzelewu  equ 0
CzWody      equ 1
Jp1         equ 2
Jp2         equ 3
PinUZm      equ 4 ;Jako wy, bo gdy jako we, to przy resecie przy p3.4=0 wariuje
Jp3         equ 5

;Bity flag (Flagi1)
BuzzerOn    equ 0
FlCzPrzel   equ 1  ;Ustawiona gdy czujnik aktywny kilka ms
FlCzWody    equ 2  ;j.w.
FlPrzel1    equ 3  ;Wstepna flaga, ustawiona gdy wykryto aktywnosc cz.
FlWody1     equ 4  ;j.w.
FlBrakWody  equ 5  ;Ustawiona, gdy byl brak wody (zerowanie tylko resetem)
FlLedOn     equ 6  ;Przerwania zmnieniaja, petla gl. przepisuje do LED-a


;============================== RAM =============================
;00..0f - zespoly rejestrow 0 i 1
;10..1f - stos

;-------------------Komorki z adresowalnymi bitami---------------
; Bedziemy je zapelniac od gory, zeby bylo dalej od stosu

Wolne2_0          equ 20h;
Wolne2_1          equ 21h;
Wolne2_2          equ 22h;
Wolne2_3          equ 23h;
Wolne2_4          equ 24h;
Wolne2_5          equ 25h;
Wolne2_6          equ 26h;
Wolne2_7          equ 27h;
Wolne2_8          equ 28h;
Wolne2_9          equ 29h;
Wolne2_a          equ 2ah;
Wolne2_b          equ 2bh;
Wolne2_c          equ 2ch;
Wolne2_d          equ 2dh;
BityTmp           equ 2eh; zm. pomocn
Flagi1            equ 2fh;

;-------------------Komorki RAM dostepne w 89c1051---------------
LicznInt          equ 30h; Zlicza przerwania do przerwania glownego
LicznDo200        equ 31h; Zlicza przerwania glowne do przerwania co 200ms
LicznDo1s         equ 32h; Zlicza przerwania glowne do przerwania co 1s
LicznBuzz         equ 33h; Zlicza pozostale "pipniecia" buzzera
LOdPrzelM         equ 34h; Zlicza opoznienie do wlaczenia pompy (minuty)
LOdPrzelS         equ 35h; j.w. (sekundy)
TickPrzel         equ 36h; Zlicza czas aktywnosci czujnika przelewu
TickWody          equ 37h; Zlicza czas aktywnosci czujnika wody
Wolne3_8          equ 38h;
Wolne3_9          equ 39h;
Wolne3_a          equ 3ah;
Wolne3_b          equ 3bh;
Wolne3_c          equ 3ch;
Wolne3_d          equ 3dh;
Wolne3_e          equ 3eh;
Wolne3_f          equ 3fh;



;-------------------Komorki RAM dostepne tylko w 89c2051---------------
Wolne4_0          equ 40h;
Wolne4_1          equ 41h;
Wolne4_2          equ 42h;
Wolne4_3          equ 43h;
Wolne4_4          equ 44h;
Wolne4_5          equ 45h;
Wolne4_6          equ 46h;
Wolne4_7          equ 47h;
Wolne4_8          equ 48h;
Wolne4_9          equ 49h;
Wolne4_a          equ 4ah;
Wolne4_b          equ 4bh;
Wolne4_c          equ 4ch;
Wolne4_d          equ 4dh;
Wolne4_e          equ 4eh;
Wolne4_f          equ 4fh;

Wolne5_0          equ 50h;
Wolne5_1          equ 51h;
Wolne5_2          equ 52h;
Wolne5_3          equ 53h;
Wolne5_4          equ 54h;
Wolne5_5          equ 55h;
Wolne5_6          equ 56h;
Wolne5_7          equ 57h;
Wolne5_8          equ 58h;
Wolne5_9          equ 59h;
Wolne5_a          equ 5ah;
Wolne5_b          equ 5bh;
Wolne5_c          equ 5ch;
Wolne5_d          equ 5dh;
Wolne5_e          equ 5eh;
Wolne5_f          equ 5fh;

Wolne6_0          equ 60h;
Wolne6_1          equ 61h;
Wolne6_2          equ 62h;
Wolne6_3          equ 63h;
Wolne6_4          equ 64h;
Wolne6_5          equ 65h;
Wolne6_6          equ 66h;
Wolne6_7          equ 67h;
Wolne6_8          equ 68h;
Wolne6_9          equ 69h;
Wolne6_a          equ 6ah;
Wolne6_b          equ 6bh;
Wolne6_c          equ 6ch;
Wolne6_d          equ 6dh;
Wolne6_e          equ 6eh;
Wolne6_f          equ 6fh;

Wolne7_0          equ 70h;
Wolne7_1          equ 71h;
Wolne7_2          equ 72h;
Wolne7_3          equ 73h;
Wolne7_4          equ 74h;
Wolne7_5          equ 75h;
Wolne7_6          equ 76h;
Wolne7_7          equ 77h;
Wolne7_8          equ 78h;
Wolne7_9          equ 79h;
Wolne7_a          equ 7ah;
Wolne7_b          equ 7bh;
Wolne7_c          equ 7ch;
Wolne7_d          equ 7dh;
Wolne7_e          equ 7eh;
Wolne7_f          equ 7fh;



             ORG 0
             ljmp poczatek

             org 0003h
             ajmp ObslInt0     ; obsluga przerwania Int0 (Zewn.)

             org 000bh         ; obsluga przerwania TF0  (Czasowe)
             ajmp ObslIntTF0

             org 001bh         ; obsluga przerwania TF1 (WatchDog) - tylko 89C2051
             ljmp poczatek

;--------------------Dane zapisane w  pamieci kodu-----------------

TabOpozn:    db  2
             db  5
             db 10
             db ffh

;-------------------Obsluga przerwania czasowego - co 0.5 ms ----------------
ObslIntTF0
             mov TH0, #TH0Init; zainicjuj zegar przerwan
             mov TL0, #TL0Init
               ;jezeli buzzer bez generatora to odkomentowac ponizsze linie
SprBuzz:
             ;jnb Flagi1.BuzzerOn, BuzzOff
             ;cpl p1.PinBuzz

BuzzOff:
             inc TickPrzel
             inc TickWody
             xch a, LicznInt
             dec a
             jz IntGl
             xch a, LicznInt
             reti

IntGl:                ;Wlasciwe przerwanie - co 50ms (wczesniej-tylko buzzer)
             mov a, #CoIleIntGl
             xch a, LicznInt
             push a
             push DPL
             push DPH
             push psw
             setb psw.3; zestaw rejestrow 1

             cpl p3.PinUZm  ;Generuj napiecie zmienne dla czujnikow
             setb Flagi1.FlLedOn; Wygas diode "On"

;Sprawdzanie czujnika:
;jezeli byl on aktywny, to petla glowna ustawila jego flage.
;W takim przypadku flage jest tu (w przerwaniu) brana pod uwage
;i zerowana. Jezeli czujnik bedzie nadal aktywny, to do castepnego
;przerwania petla glowna znowu ustawi flage.

;Sprawdzamy flage przelewu
             jnb Flagi1.FlCzPrzel, BezFlPrzel
             clr p1.PinLedPrzel
             clr Flagi1.FlCzPrzel
             setb p1.PinPompy  ;wylacz pompe
             mov LicznBuzz, #BuzzNiesk
               ;Ustal opoznienie wlaczenia pompy (jumperki)
             mov BityTmp, #0
             mov c, p3.Jp1
             mov BityTmp.0, c
             mov c, p3.Jp2
             mov BityTmp.1, c
             mov a, BityTmp
             xrl a, #03h; Zaneguj bity, zeby brak jumpera oanaczal 0
             mov DPTR, #TabOpozn
             movc a, @a+DPTR
             mov LOdPrzelM, a
             mov LOdPrzelS, #60
             sjmp WyFlPrzel
BezFlPrzel:  setb p1.PinLedPrzel
WyFlPrzel:

;Sprawdzamy flage wody
             jnb Flagi1.FlCzWody, BezFlWody

             jb Flagi1.FlBrakWody, BylBrakW  ;gdy nie bylo braku
             clr p1.PinLedWody               ;zapal LED-a
             sjmp WyJestWoda
BylBrakW                                     ;a gdy brak byl
             cpl p1.PinLedWody               ;migaj
             mov LicznBuzz, #BuzzNiesk       ;i popiskuj

WyJestWoda
             clr Flagi1.FlCzWody
             ;[...]
             sjmp WyFlWody
BezFlWody:   setb p1.PinLedWody
             setb Flagi1.FlBrakWody ;(i tak juz zostanie do resetu)
             setb p1.PinPompy  ;wylacz pompe
             mov LicznBuzz, #BuzzNiesk
WyFlWody:


             xch a, LicznBuzz
             jb Flagi1.BuzzerOn, NegujBuzz
                                 ;Jezeli buzzer jest On, to tylko zaneguj
                                 ;a jezeli jest Off, to zliczaj pipniecia
             jz KoniecBuzz  ;licznik wyzerowany - bez buzzera
             cjne a, #BuzzNiesk, ZmnLBuzz  ;czy w nieskonczonosc
             sjmp NegujBuzz
ZmnLBuzz:    dec a
NegujBuzz:   cpl Flagi1.BuzzerOn
             mov c, Flagi1.BuzzerOn  ;ponizsze 3 linie sa dla wersji z
             cpl c
             mov p1.PinBuzz, c       ; generatorem, ale bez gen. tez moga zostac
KoniecBuzz:  xch a, LicznBuzz

             xch a, LicznDo200  ; sprawdz, czy robic obsluge co 200ms
             dec a
             jnz Bez200ms
             mov a, #CoIle200ms
             xch a, LicznDo200
             ;[...]
             ;Obsluga co 200ms
             ;[...]

             sjmp Spr1s
Bez200ms:    xch a, LicznDo200

Spr1s:       xch a, LicznDo1s
             dec a
             jnz Bez1s
             mov a, #CoIle1s
             xch a, LicznDo1s

                              ;Obsluga co 1s
             clr Flagi1.FlLedOn; Zapal diode "On"

             ;Sprawdz, czy moze jest opoznienie od ustania przelania
             mov a, LOdPrzelM
             jnz TrwaOpozn
             mov LicznBuzz, #0
             jb Flagi1.FlBrakWody, NieWlPompy ;nie wlaczaj jezeli byl brak wody
             clr p1.PinPompy; Pompa wlaczona
NieWlPompy
             sjmp NieOpozn
TrwaOpozn:
             setb p1.PinPompy; Pompa wylaczona - na wszelki wyp.
             mov a, #ffh  ;czy opoznienie nieskonczone
             cjne a, LOdPrzelM, ZmnOpozn
             mov LicznBuzz, #4  ;Przy op niesk. pipnij 4 razy co 1s
             sjmp KonSprOp
ZmnOpozn:    mov a, LOdPrzelS
             dec a
             mov LOdPrzelS, a
             jnz NiePelnaMin
             dec LOdPrzelM  ;Pelna minuta, zmniejsz licznik minut
             mov LOdPrzelS, #60
             mov LicznBuzz, #2  ;przy pelnej minucie pipnij 2 razy
             sjmp KonSprOp
NiePelnaMin: mov LicznBuzz, #1  ;pipnij 1 raz co 1s
             sjmp KonSprOp

KonSprOp:
NieOpozn:  ;Nie opoznienie po ustaniu przelania
             sjmp WyInt

Bez1s:       xch a, LicznDo1s

WyInt:
             pop psw
             pop DPH
             pop DPL
             pop a
          
             reti


;--------------------Obsluga przerwania Int0 (Zewn.)----------------


ObslInt0
             push a
             push DPL
             push DPH
             push psw

WyRxDTMF
             pop psw
             pop DPH
             pop DPL
             pop a
             reti


;-------------------Program glowny--------------------
poczatek

             mov sp, #10h;  {stos bedzie na zespolach rej. 2 i 3; 0 i 1 zostawiamy}

             mov Flagi1, #0

             mov LicznInt, #CoIleIntGl
             mov LicznDo200, #CoIle200ms
             mov LicznDo1s, #CoIle1s
             mov LicznBuzz, #2  ;zamelduj sie dwoma pipnieciami
             mov LOdPrzelM, #0
             mov LOdPrzelS, #0
             mov TickPrzel, #0
             mov TickWody, #0

             mov TH0, #TH0Init;  ustaw zegary i przerwania
             mov TL0, #TL0Init
             mov TMod, #MyTMod
             mov TCon, #MyTCon
             mov IP, MyIP
             setb ie.et0
             setb ie.ea


PetlaGlowna:
             mov c, Flagi1.FlLedOn            ;Przepisz flage do diody
             mov p1.PinLedOn, c               ;Lwd miga = petla dziala

;Sprawdz czujnik przelewu
             jb Flagi1.FlCzPrzel, WyPrzel     ;Juz jest flaga - nie sprawdzaj.
             jb Flagi1.FlPrzel1, ZliczPrzel   ;Jest fl. wstepna - spr. licznik.
             jb p3.CzPrzelewu, WyPrzel        ;Nie ma przel - wyjdz
             setb Flagi1.FlPrzel1             ;Ustaw fl. wstepna
             mov TickPrzel, #0                ;Zeruj licznik
             sjmp WyPrzel
ZliczPrzel:  jnb p3.CzPrzelewu, NadalPrzel    ;Nadal jest przelew
             clr Flagi1.FlPrzel1              ;Nie ma - zeruj fl. wstepna
             sjmp WyPrzel                     ;i wyjdz ze sprawdzania przelewu
NadalPrzel:  mov a, TickPrzel                 ;nadal jest, sprawdz czy dostat. dlugo
             clr c
             subb a, #MinTCzuj
             jc WyPrzel                       ;Za krotko, wyjdz
             setb Flagi1.FlCzPrzel
WyPrzel:

;Sprawdz czujnik wody
             jb Flagi1.FlCzWody, WyWoda       ;Juz jest flaga - nie sprawdzaj.
             jb Flagi1.FlWody1, ZliczWoda     ;Jest fl. wstepna - spr. licznik.
             jb p3.CzWody, WyWoda             ;Cz. nieaktywny - wyjdz
             setb Flagi1.FlWody1              ;Ustaw fl. wstepna
             mov TickWody, #0                 ;Zeruj licznik
             sjmp WyWoda
ZliczWoda:   jnb p3.CzWody, NadalWoda         ;Nadal cz. aktywny
             clr Flagi1.FlWody1               ;Nie ma - zeruj fl. wstepna
             sjmp WyWoda                      ;i wyjdz ze sprawdzania cz.
NadalWoda:   mov a, TickWody                  ;nadal jest, sprawdz czy dostat. dlugo
             clr c
             subb a, #MinTCzuj
             jc WyWoda                        ;Za krotko, wyjdz
             setb Flagi1.FlCzWody
WyWoda:


             ljmp PetlaGlowna
             END
