Regulisanje temperature vode zatvorenog centralnog grejanja - praktična realizacija
U bazi znanja analizirane su dinamičke karakteristike, odziv i ponašanje sistema centralnog grejanja na zadatu referentnu promenljivu. Određena je prenosna funkcija sistema i izvršena je sinteza digitalnog PI odnosno PID zakona upravljanja. Postupkom simulacije u MATLab-ovom simulink modulu dobijeni su optimalni parametri (konstante) PI tj PID regulatora.Grubo gledano sistem možemo podeliti na dva dela :
1. Elektronski deo – koga čine : mikrokontroler, A/D konvertor, kolo za generisanje referentne promenljive, kolo za generisanje upravljane promen-ljive – senzor za temperaturu vode u sistemu, deo za galvansku izolaciju elektronskog i energetskog dela, kolo za sinhronizaciju sa mrežom i deo za napajanje.
2. Energetski deo čini trofazni tiristorski polu upravljivi ispravljač. Umesto njega bolje je koristiti trofazni tiristorski fazni regulator ali je upravljanje njegovim radom znatno složenije i izlazi iz okvira ovog projekta.

Slika 1. Blok šema sistema za upravljanje centralnim grejanjam.
Mikrokontroler predstavlja mozak sistema i ima glavnu ulogu u njegovom radu. U jednom čipu se nalazi procesor, memorija, registri i sve što je potrebno za obavljanje funkcija tipičnih za jedan procesor informacija. Namenjen je projekto-vanju digitalnih sistema upravljanja u industriji i slično. On generiše upravljačku promenljivu na osnovu merene upravljane promenljive tj temperature vode u povratnoj grani upravljajući radom tiristorskog polu upravljivog ispravljača. Istovremeno kontrolišući celokupan rad uređaja.
Senzor ima važnu ulogu.Njegova osetljivost i stabilnost (nepromenljivost karakteri-stika u odnosu na temperaturu) su vrlo bitni za rad i tačnost celog sistema. Nalazi se na cevi koja vraća ohlađenu vodu iz sistema u kotao.
Izlaz senzora se vodi na pojačavač koji ima ulogu da pojača signal sa senzora i prilagodi ga opsegu A/D konvertora.Njegova stabilnost i otpornost na spoljašnje uticaje kao i mali ofset (razdešenost) ukazuju na njegovu ulogu u celom sistemu.
Sa pojačavača se signal povratne sprege dovodi na ulaz A/D konvertora. Njegova uloga je da analogni signal pretvori u digitalni koji se dalje vodi u mikrokontroler. Ovde bi se mogao koristiti mikrokontroler sa već ugrađenim A/D konvertorom čime bi se data šema znatno uprostila. Priloženo rešenje nije jedino ali je sa stanovišta univerzalnosti i edukativnog značaja bolje.
Galvanska izolacija je neophodan deo svakog uređaja u kome se kombinuju elektronska kola sa kolima energetske elektronike. Usled havarije u energetskom delu, koja je moguća jer su komponente (tiristori i diode) značajno opterećeni, mogao bi se uništiti čitav elektronski sklop. U ovom delu se nalaze i impulsni pojačavači koji slab digitalni signal podižu na viši nivo dovoljan za okidanje tiristora.
Kolo za zadavanje referentnog signala je obavezan deo jer omogućuje korisniku da na jednostavan način zada željenu referentnu temperaturu vode u sistemu. Njegova uloga je ovde i da ograniči opseg zadavanja temperature na MAX 70°C. U isto vreme ovo kolo treba i da obezbedi jednostavno očitavanje zadate temperature na displeju.
Za uspešan rad svih ovih kola potreban je kvalitetan i stabilan izvor napajanja. On treba da obezbedi potrebne napone za funkcionisanje svih kola.
Tiristorski polu upravljivi ispravljač je zbog snage grejača kojim upravljamo vezan na trofaznu mrežu 3x380V . Nije bilo potrebe da se koristi puno upravljivi ispravljač zbog činjenice da grejač ne radi u invertorskom režimu. Na ovaj način su umesto tri tiristora upotrebljene tri diode , čime je postignuta znatna ušteda kako u pogledu cene uređaja tako i sa tačke upravljanja sistemom.
U postojeći sistem se može dodati i EPROM memorija u koju se može smestiti kompletan program za mikrokontroler. Mikrokontroler već u sebi sadrži izvesnu količinu memorije (8KB) koja je u ovom slučaju dovoljna da primi celokupan kod. Iz tog razloga je u ovom projektu izostavljena.
- Normal 0 false false false MicrosoftInternetExplorer4 U nastavku prelazimo na konkretan izbor sklopova i elemenata.
Mikrokontroler koji je ovde korišćen je Atmel-ov AT89C52. Radi se o kontroleru koji je po svom pinskom rasporedu i setu instrukcija kompatibilan sa Intel-ovim 8052 mikrokontrolerom. On sadrži tri 16-to bitna brojača i 8KB flash memorije. Priključen je na kvarcni kristal učestanosti 12 MHz. Postoje 4 ulazno/izlazna porta mada su ovde korišćena samo dva. Napon napajanja je +5V.
A/D konvertor je AD570 firme Analog Devices. U pitanju je 8-mo bitni A/D, sa vremenom konverzije <25μs na bazi sukcesivne aproksimacije. Napajanje mu je +5V i – 12V, a opseg ulaznog napona je 0-10V. Izbor ovakvog konvertora je zasno-van prvenstveno na činjenici da se radi o sporo promenljivom procesu i na što jednostavnijem upravljanju. Proces A/D konverzije započinje na opadajućoj ivici signala B&C . Nakon 25μs po završetku konverzije aktivira se signal DATAREADY . Signal B&C generiše mikrokontroler koji i detektuje DATAREADY signal preko svog INT1 ulaza.
Kolo za generisanje referentne vrednosti je napravljeno pomoću dva BCD UP/DOWN brojača 74HC4510. Pomoću dva tastera biramo smer brojanja a trećim vršimo upis izabrane vrednosti u leč kolo 74HC573.Prikaz se vrši na dva 7-mo segmentna displeja pomoću dva BCD/7-SEG drivera 74HC4511. Napajanje je +5V.
Galvanska izolacija zahteva posebno galvanski odvojeno napajanje i može se izvesti pomoću optokaplera ili malih signalnih trafoa . Ovde će biti prikazano rešenje sa signalnim trafoom, koje je ujedno i najjednostavnije .
Sklop za sinhronizaciju sa mrežom koristi mrežni transformator u delu za napajanje.
Prolaskom mrežnog napona kroz nulu generiše se okidni impuls koji se zatim uobličuje i vodi na INT0 ulaz u mikrokontroler.Ovaj deo je vrlo važan jer na osnovu impulsa sinhronizacije se vrši izračunavanje ugla paljenja tiristora kao i perioda odabiranja. Koristeći mrežni transformator sklop je galvanski odvojen od mreže.
Senzor korišćen u ovom sistemu je LM35 proizvođača National Semiconductor . U pitanju je vrlo jednostavan, precizan, linearan i jeftin senzor.Osetljivost mu je 10mV/°C. Može da meri temperaturu do +150°C. Izlaz je naponski signal. Napajanje može biti u granicama od 4 do 30V.
U pojačavačkom sklopu je korišćen klasičan 741 operacioni pojačavač u neinvertu-jućem spoju sa kompenzovanim ofsetom koji ulazni naponski signal pojačava i prilagođava ulaznom opsegu A/D konvertora 0-10V.
Iz dosad navedenog proizilazi da su za rad ovog uređaja potrebni sledeći naponi :
- +5V,+15V,+15V(galvanski odvojeno) i –12V.
Programska podrška
Nakon hardverske sinteze sistema u celini možemo pristupiti razmatranju problema-tike softvera koji će upravljati celim sistemom. Najpre treba zakon upravljanja predstaviti u nešto drugačijem obliku.

Ovde su konstante KP, KI i KDodredjene u tekstu u bazi znanja i iznose:
KP=30 KI=0.6 KD=0.2
Sređivanjem gornjeg izraza i svođenjem na nešto drugačiji oblik dobija se :

Ovo je rekurzivni oblik zakona upravljanja koji je vrlo pogodan za implementaciju jer se vrednost upravljačke promenljive u(kT) u trenutku kT izračunava na osnovu vrednosti upravljačke promenljive i signala greške (e(kT)) u prethodnim trenutcima.
Konstante koje se ovde pojavljuju su :
K1 = KP+KI+KD = 30.8 K2 = KP+2K = 30.4 K3 = KD = 0.2
Očigledno da konstante nisu celobrojne i da ih treba skalirati kako bi se mogle primeniti u softverskoj implementaciji zakona upravljanja . Zato ih množimo sa 4, zaokružujemo i dobijamo nove konstante : K1 = 123 ; K2 = 122 ; K3 = 1 .
Ove konstante su celobrojne i mogu se koristiti u programu predstavljene u hexadecimalnom obliku kao : K1 = 7B H ; K2 = 7A H ; K3 = 01 H ;
Ovo unosi izvesnu grešku u izračunavanju upravljačke promenljive. Upravljačka pro-menljiva, koja ovde predstavlja vrednost napona koju dovodimo na grejač, se nalazi u opsegu 0 – 400V . Teorijski bi se mogla generisati bilo koja vrednost iz tog opsega ali to nema praktičnog značaja . Iz tog razloga je ovde izvršeno skaliranje upravlja-čke promenljive, pa je ona svedena u opseg 0 – 50, deljenjem sa 8 .
Na ovaj način ustvari generišemo samo 50 vrednosti ugla paljenja tiristora, pri čemu se napon menja u koracima od 8V. Ugao paljenja prvog tiristora generiše Timer0 u mikrokontroleru dok su ostali uglovi pomereni za po 1/3 periode. Konsanta kojom se puni Timer0 da bi generisao željeni ugao je 16-to bitna i uzima se iz tabele koja se nalazi u programskoj memoriji. Tabela je data u nastavku .

Tabela 1. Zavisnost napona ispravljačaod ugla paljenja tiristora

Zavisnost izlaznog napona od ugla paljenja je prikazana u tabeli. Uout predstavlja zaokruženu vrednost . Kolona Timer sadrži konstante kojima se puni Timer0 da bi generisao željeni ugao paljenja prvog tiristora. Potrebno je ove vrednosti pretvoriti u hexadecimalni oblik .
Konstante su dvo-bajtne (16 bita) niže bajtove stavljamo u jednu tabelu na lokacije od 100 (64H) do 150 (96H) , a više bajtove u drugu tabelu na lokacije od 151 (97H) do 201 (C9H) . Ovim tabelama pristupamo indirektno .
Timer1 koristimo za generisanje uglova paljenja ostala dva tiristora. On generiše vremenski period koji odgovara 1/3 periode mrežnog napona tj. oko 6.666msec. Konstanta kojom punimo Timer1 je zato 65535 – 6666 =58869 (E5F5 H).
Perioda odabiranja je 75sec što predstavlja 3750 perioda mrežnog napona . Timer2 služi za generisanje periode odabiranja. Nalazi se u auto-reload modu što znači da se pri prekoračenju (kad dostigne 65535 (FFFF H)) automatski napuni vrednošću 65535 – 3750 = 61785 (F159 H).Ovaj Timer je podešen da radi kao Counter tj. brojač događaja odnosno brojač perioda mrežnog napona.
Vrlo važno pitanje je određivanje prioriteta interapta. Najviši prioritet ima INT0 koga generiše mreža. U odnosu na njega se generišu svi uglovi paljenja i određuje perioda odabiranja.
Na osnovu dosad izloženog može se preći na programski kod u asembleru uz oslonac na repertoar instrukcija mikrokontrolera uz kratak komentar.
Programski kod za upravljanja centralnim grejanjem
;ADRESE PROMENLJIVIH VELIČINA
OUT0 DATA 30h ; Izlazna promenljiva u(kT)
OUT1 DATA 31h ; u((k-1)T)
EROR0 DATA 32h ; Signal greške e(kT)
EROR1 DATA 33h ; e((k-1)T)
EROR2 DATA 34h ; e((k-2)T)
EROR0ZN BIT 00h ; Znak greške
EROR1ZN BIT 01h
EROR2ZN BIT 02h
SCRCTRL BIT 03h ; Kontrolni bit za upravljanje SCR-ovima
ZNAK1 BIT 04h ; Pomocna prom.
ZNAK2 BIT 05h ;
ZNAKR BIT 06h ;
;KONSTANTE
K1 EQU 7Bh ; K1 = 123
K2 EQU 7Ah ; K2 = 122
K3 EQU 01h ; K3 = 1
TIM1H EQU E5h ; 65535 – 6666 = E5F5 h za Timer1
TIM1L EQU F5h ;
TIM2H EQU F1h ; 65535 – 3750 = F159 h za Timer2
TIM2L EQU 59h ;
ORG 0000h ; Pri resetu ili uključenju ide se na INIC
JMP INIC
ORG 0003h ; INT0 Rutina SCR123
LCALL SCR123
ORG 000Bh ; Timer0 Rutina
LCALL SCR1 ; Generiše ugao paljenja prvog (SCR1) tiristora
ORG 001Bh ; Timer1 Rutina
LCALL PAUZA ; Generiše pauzu u trajanju 6.666 msec
ORG 002Bh ; Timer2 Rutina
LCALL RACUN ; Generiše upravljačku promenljivu OUT0
; NA OVOM MESTU TREBALO BI DEFINISATI TABELU SA UGLOVIMA PALJENJA
ORG 0064h ; Početak TABELE – niži bajtovi
DB EFh,68h,47h,25h,03h, ……. ; Ovo su samo prvih 5 nižih
DB D8h,DCh,DDh,DEh,DFh, …… ; Ovo su samo prvih 5 viših
; INICIJALIZACIJA
ORG 00CDh ; Adresa (205 dec) od koje počinje prog. kod
INIC: CLR IE.7 ; Zabrana svih prekida
MOV PSW,#00h ; Obriši PSW
MOV TMOD,#11h ; Timer0 i Timer1 u MOD1 kao 16 bitni Timer
MOV TCON,#05h ; IE0 i IE1 interapti na opadajuću ivicu
MOV IP,#01h ; Najviši prioritet za IE0
MOV T2CON,#02h ; Timer2 kao Counter u AUTO-RELOAD modu
MOV OUT0,#00h ; Inicijalizuj promenljive
MOV OUT1,#00h ; -
MOV EROR0,#00h ; -
MOV EROR1,#00h ; -
MOV EROR2,#00h ; -
CLR SCRCTRL ; SCRCTRL=0 za SCR2 i SCRCTRL=1 za SCR3
MOV TL1,TIM1L ; Napuni Timer1 sa E5F5h
MOV TH1,TIM1H ;
MOV RCAP2L,TIM2L ; Napuni Auto-reload registre sa F159h
MOV RCAP2H,TIM2H ;
MOV P1,#10001111b ; U port P0 upiši 10001111
SETB IE.7 ; Omogući prekide
SETB T2CON.2 ; Startuj Timer/Counter2
PETLJA: SJMP PETLJA ; Petlja u kojoj se vrti program
SCR123: MOV R1,OUT0 ; R1 = OUT0 = upravljačka prom.
MOV TL0,@R1+100 ; Indirektno napuni TL0 i TH0 sa
MOV TH0,@R1+151 ; vrednostima iz tabele
SETB TCON.4 ; T0 RUN
RETI ; Gotova IE0 rutina
SCR1: CPL P1.2 ; SCR1 ON
SETB TCON.6 ; T1 RUN
CLR TCON.4 ; T0 OFF
CPL P1.2 ;
RETI
PAUZA: JB SCRCTRL,SCR3 ;
CPL P1.3 ; SCR2 ON
CLR TCON.6 ; T1 OFF
MOV TL1,TIM1L ;
MOV TH1,TIM1H ;
SETB TCON.6 ; T1 ON
SETB SCRCTRL ; SCRCTRL=1 i sledeći put ide na SCR3
CPL P1.3 ;
RETI
SCR3: CPL P1.4 ; SCR3 ON
CLR TCON.6 ; T1 OFF
MOV TL1,TIM1L ;
MOV TH1,TIM1H ;
CLR SCRCTRL ; SCRCTRL=0 i sledeći put ide na SCR2
CPL P1.4 ;
RETI
; Slede potprogrami za 2-vo Bajtno sabiranje i oduzimanje
; operand1 : A niži bajt, B viši bajt ; operand2 : R1 niži bajt, R2 viši bajt
; Rezultat : A niži bajt, B viši bajt ; C = 1 negativan rezultat ; C=0 pozitivan
2BSAB: CLR C ; Priprema za sabiranje
ADD A,R1 ; Saberi niže bajtove
MOV R1,A ;
MOV A,B ;
ADDC A,R2 ; Saberi više bajtove i C
JNC KRSAB ; Ako nema C idi na KRSAB
MOV A,#FFh ; Inače vrati MAX (FFFFh) vrednost
MOV B,#FFh ;
RET
KRSAB: MOV B,A
MOV A,R1
RET
2BODU: CLR C ; Pripremi za oduzimanje
SUBB A,R1 ; Oduzmi niže bajtove
MOV R1,A ;
MOV A,B ;
SUBB A,R2 ; Oduzmi više bajtove i C
JNC KRODU ; Ako nije C (- rezultat) idi na KRODU
MOV R2,A
MOV A,R1 ;
CLR C
CPL A ; Inače nađi drugi komplement nižeg
ADD A,#01h ;
MOV R1,A ;
MOV A,R2 ;
CPL A ;
ADDC A,#01h ; i drugi kompl. Višeg bajta
SETB C ; Postavi C - rezultat je negativan
MOV B,A
MOV A,R1 ; Postavi izlaz i vrati se
RET
KRODU: MOV B,A
MOV A,R1
CLR C ; Postavi izlaz, C=0 (rez. je +) i vrati se
RET
;Sledi potprogram za 2B sabiranje sa predznakom
;operand1 : B:A viši i niži bajt i ZNAK1 = 1 ako je negativan
;operand2 : R2:R1 viši i niži bajt i ZNAK2 = 1 ako je negativan
;rezultat : B:A viši i niži bajt i ZNAKR = 1 ako je negativan
SABIRAJ: JB ZNAK1,PG1 ; operand1 <0
JB ZNAK2,PG2 ; operand2 <0
CLR ZNAKR ; op1>0 i op2>0 onda je rez.>0
CALL 2BSAB ; saberi i vrati se
RET
PG2: CALL 2BODU ; op1>0 i op2<0 zato zovi oduzimanje
JC PG3 ; ako je rez<0 skoči na PG3
CLR ZNAKR ; inače je rez >0 , znakr = 0 , vrati se
RET
PG3: SETB ZNAKR ; rez<0 , znakr = 1 , vrati se
RET
PG1: JNB ZNAK2,PG4 ; op1<0 ako je op2>0 skoči na PG4
SETB ZNAKR ; op1<0 i op2<0 pa je rez<0 , znakr=1
CALL 2BSAB
RET
PG4: MOV R3,A ; Zameni mesta oper1 i oper2 i
MOV R4,B ; skoči na PG2
MOV A,R1
MOV B,R2
MOV R1,R3
MOV R2,R4
SJMP PG2
;Sledi potprogram za računanje upravljačke promenljive OUT0
RACUN: CLR T2CON.7 ; Interapt flag TF2 moramo obrisati
CLR P1.5 ; Startuj signal za konverziju B&C =0
MOV A,P2 ; U A se nalazi REF ali u obliku BCD cifri
MOV R1,A
ANL A,#0Fh ; Odseci donji nibl (4 bita) – cifra desetica
MOV B,#0Ah ; U B stavi 10
MUL AB
MOV R2,A
MOV A,R1
SWAP A ; Zameni niblove u A
ANL A,#0Fh ; Odseci donji nibl – cifra jedinica
CLR C
ADD A,R2 ; U A se nalazi REFerentna vrednost
ADC: JB TCON.3,LOADADC ; Čekaj da se obavi konverzija
SJMP ADC
LOADADC: MOV B,P0 ; U B se nalazi reč iz AD konvertora
SETB P1.5
CLR C
SUBB A,B ; U A se nalazi signal greške = REF – AD
CLR EROR0ZN ; EROR0 >0
JNC NASTAVI ; ako nije C NASTAVI
CPL A ; inače je EROR0<0 , nađi drugi komplem.
ADD A,#01h
SETB EROR0ZN ; EROR0 je negativno
NASTAVI: MOV EROR0,A
MOV B,K1 ;
MUL AB ; B:A = K1*EROR0
MOV R1,A ; R2:R1 = K1*EROR0
MOV R2,B
MOV A,EROR2
MOV B,K3
MUL AB ; B:A = K3*EROR2
MOV ZNAK2,EROR0ZN
MOV ZNAK1,EROR2ZN
CALL SABIRAJ ; B:A = K3*EROR2+K1*EROR0
MOV R1,A ; R2:R1 = ------
MOV R2,B
MOV ZNAK2,ZNAKR
MOV A,EROR1 ;
MOV B,K2
MUL AB ; B:A = K2*EROR1
MOV ZNAK1,EROR1ZN
CPL ZNAK1 ; promeni znak pošto se oduzima
CALL SABIRAJ ; U B:A = ER2*K3+ER0*K1-ER1*K2
;Sada ovu sumu treba podeliti sa 32 što je isto kao i pomeranje u desno 5 mesta
; a to je isto što i pomeranje u levo 3 mesta
RLC A
RLC A ; rotiraj 3 puta u levo = deli sa 32
RLC A
ANL A,#07h ; odseci niža 3 bita (00000xxx)
MOV R7,A
MOV A,B ; u A stavi viši bajt
RLC A
RLC A
RLC A ; i podeli ga sa 32
MOV R6,A
MOV B,07h ; u B stavi masku 00000111
ANL B,A ; i odseci niža 3 bita (00000xxx) višeg B.
MOV A,#F8h ; u A stavi masku (11111000)
ANL A,R6 ; i odseci viših 5 bita (xxxxx000) višeg B.
ORL A,R7 ; zalepi xxxxx000 OR 00000xxx
MOV R1,OUT1 ; u R1 stavi OUT1
MOV R2,#00h ; u R2 stavi 00h
CLR ZNAK2 ; ZNAK2 je +
MOV ZNAK1,ZNAKR ; ZNAK1 = ZNAKR
CALL SABIRAJ ; B:A = OUT0 = OUT1 + SUMA/32
JNB ZNAKR,LAB1 ; ako je >0 skoči na LAB1
MOV OUT0,#00h ; inače OUT0 = 00h (MIN)
JMP KRAJ ; idi na kraj
LAB1: MOV R1,A
MOV A,B ; stavi viši bajt u A
JZ LAB2 ; ako je 0 skoči na LAB2
LAB3: MOV OUT0,#32h ; inače OUT0 = (MAX) = 50
JMP KRAJ ; idi na kraj
LAB2: MOV A,#32h
CLR C
SUBB A,R1 ; A = 50 - OUT0
JC LAB3 ; ako je OUT0 >50 skoči na LAB3
MOV OUT0,R1 ; inače je OUT0<50 i nastavi do kraja
KRAJ: MOV OUT1,OUT0
MOV EROR2,EROR1
MOV EROR1,EOR0
MOV EROR2ZN,EROR1ZN
MOV EROR1ZN,EROR0ZN
RETI ;Kraj rutine RACUN
; Kraj programa
END
FTN Novi Sad, Katedra za elektroniku
OUT0 DATA 30h ; Izlazna promenljiva u(kT)
OUT1 DATA 31h ; u((k-1)T)
EROR0 DATA 32h ; Signal greške e(kT)
EROR1 DATA 33h ; e((k-1)T)
EROR2 DATA 34h ; e((k-2)T)
EROR0ZN BIT 00h ; Znak greške
EROR1ZN BIT 01h
EROR2ZN BIT 02h
SCRCTRL BIT 03h ; Kontrolni bit za upravljanje SCR-ovima
ZNAK1 BIT 04h ; Pomocna prom.
ZNAK2 BIT 05h ;
ZNAKR BIT 06h ;
;KONSTANTE
K1 EQU 7Bh ; K1 = 123
K2 EQU 7Ah ; K2 = 122
K3 EQU 01h ; K3 = 1
TIM1H EQU E5h ; 65535 – 6666 = E5F5 h za Timer1
TIM1L EQU F5h ;
TIM2H EQU F1h ; 65535 – 3750 = F159 h za Timer2
TIM2L EQU 59h ;
ORG 0000h ; Pri resetu ili uključenju ide se na INIC
JMP INIC
ORG 0003h ; INT0 Rutina SCR123
LCALL SCR123
ORG 000Bh ; Timer0 Rutina
LCALL SCR1 ; Generiše ugao paljenja prvog (SCR1) tiristora
ORG 001Bh ; Timer1 Rutina
LCALL PAUZA ; Generiše pauzu u trajanju 6.666 msec
ORG 002Bh ; Timer2 Rutina
LCALL RACUN ; Generiše upravljačku promenljivu OUT0
; NA OVOM MESTU TREBALO BI DEFINISATI TABELU SA UGLOVIMA PALJENJA
ORG 0064h ; Početak TABELE – niži bajtovi
DB EFh,68h,47h,25h,03h, ……. ; Ovo su samo prvih 5 nižih
DB D8h,DCh,DDh,DEh,DFh, …… ; Ovo su samo prvih 5 viših
; INICIJALIZACIJA
ORG 00CDh ; Adresa (205 dec) od koje počinje prog. kod
INIC: CLR IE.7 ; Zabrana svih prekida
MOV PSW,#00h ; Obriši PSW
MOV TMOD,#11h ; Timer0 i Timer1 u MOD1 kao 16 bitni Timer
MOV TCON,#05h ; IE0 i IE1 interapti na opadajuću ivicu
MOV IP,#01h ; Najviši prioritet za IE0
MOV T2CON,#02h ; Timer2 kao Counter u AUTO-RELOAD modu
MOV OUT0,#00h ; Inicijalizuj promenljive
MOV OUT1,#00h ; -
MOV EROR0,#00h ; -
MOV EROR1,#00h ; -
MOV EROR2,#00h ; -
CLR SCRCTRL ; SCRCTRL=0 za SCR2 i SCRCTRL=1 za SCR3
MOV TL1,TIM1L ; Napuni Timer1 sa E5F5h
MOV TH1,TIM1H ;
MOV RCAP2L,TIM2L ; Napuni Auto-reload registre sa F159h
MOV RCAP2H,TIM2H ;
MOV P1,#10001111b ; U port P0 upiši 10001111
SETB IE.7 ; Omogući prekide
SETB T2CON.2 ; Startuj Timer/Counter2
PETLJA: SJMP PETLJA ; Petlja u kojoj se vrti program
SCR123: MOV R1,OUT0 ; R1 = OUT0 = upravljačka prom.
MOV TL0,@R1+100 ; Indirektno napuni TL0 i TH0 sa
MOV TH0,@R1+151 ; vrednostima iz tabele
SETB TCON.4 ; T0 RUN
RETI ; Gotova IE0 rutina
SCR1: CPL P1.2 ; SCR1 ON
SETB TCON.6 ; T1 RUN
CLR TCON.4 ; T0 OFF
CPL P1.2 ;
RETI
PAUZA: JB SCRCTRL,SCR3 ;
CPL P1.3 ; SCR2 ON
CLR TCON.6 ; T1 OFF
MOV TL1,TIM1L ;
MOV TH1,TIM1H ;
SETB TCON.6 ; T1 ON
SETB SCRCTRL ; SCRCTRL=1 i sledeći put ide na SCR3
CPL P1.3 ;
RETI
SCR3: CPL P1.4 ; SCR3 ON
CLR TCON.6 ; T1 OFF
MOV TL1,TIM1L ;
MOV TH1,TIM1H ;
CLR SCRCTRL ; SCRCTRL=0 i sledeći put ide na SCR2
CPL P1.4 ;
RETI
; Slede potprogrami za 2-vo Bajtno sabiranje i oduzimanje
; operand1 : A niži bajt, B viši bajt ; operand2 : R1 niži bajt, R2 viši bajt
; Rezultat : A niži bajt, B viši bajt ; C = 1 negativan rezultat ; C=0 pozitivan
2BSAB: CLR C ; Priprema za sabiranje
ADD A,R1 ; Saberi niže bajtove
MOV R1,A ;
MOV A,B ;
ADDC A,R2 ; Saberi više bajtove i C
JNC KRSAB ; Ako nema C idi na KRSAB
MOV A,#FFh ; Inače vrati MAX (FFFFh) vrednost
MOV B,#FFh ;
RET
KRSAB: MOV B,A
MOV A,R1
RET
2BODU: CLR C ; Pripremi za oduzimanje
SUBB A,R1 ; Oduzmi niže bajtove
MOV R1,A ;
MOV A,B ;
SUBB A,R2 ; Oduzmi više bajtove i C
JNC KRODU ; Ako nije C (- rezultat) idi na KRODU
MOV R2,A
MOV A,R1 ;
CLR C
CPL A ; Inače nađi drugi komplement nižeg
ADD A,#01h ;
MOV R1,A ;
MOV A,R2 ;
CPL A ;
ADDC A,#01h ; i drugi kompl. Višeg bajta
SETB C ; Postavi C - rezultat je negativan
MOV B,A
MOV A,R1 ; Postavi izlaz i vrati se
RET
KRODU: MOV B,A
MOV A,R1
CLR C ; Postavi izlaz, C=0 (rez. je +) i vrati se
RET
;Sledi potprogram za 2B sabiranje sa predznakom
;operand1 : B:A viši i niži bajt i ZNAK1 = 1 ako je negativan
;operand2 : R2:R1 viši i niži bajt i ZNAK2 = 1 ako je negativan
;rezultat : B:A viši i niži bajt i ZNAKR = 1 ako je negativan
SABIRAJ: JB ZNAK1,PG1 ; operand1 <0
JB ZNAK2,PG2 ; operand2 <0
CLR ZNAKR ; op1>0 i op2>0 onda je rez.>0
CALL 2BSAB ; saberi i vrati se
RET
PG2: CALL 2BODU ; op1>0 i op2<0 zato zovi oduzimanje
JC PG3 ; ako je rez<0 skoči na PG3
CLR ZNAKR ; inače je rez >0 , znakr = 0 , vrati se
RET
PG3: SETB ZNAKR ; rez<0 , znakr = 1 , vrati se
RET
PG1: JNB ZNAK2,PG4 ; op1<0 ako je op2>0 skoči na PG4
SETB ZNAKR ; op1<0 i op2<0 pa je rez<0 , znakr=1
CALL 2BSAB
RET
PG4: MOV R3,A ; Zameni mesta oper1 i oper2 i
MOV R4,B ; skoči na PG2
MOV A,R1
MOV B,R2
MOV R1,R3
MOV R2,R4
SJMP PG2
;Sledi potprogram za računanje upravljačke promenljive OUT0
RACUN: CLR T2CON.7 ; Interapt flag TF2 moramo obrisati
CLR P1.5 ; Startuj signal za konverziju B&C =0
MOV A,P2 ; U A se nalazi REF ali u obliku BCD cifri
MOV R1,A
ANL A,#0Fh ; Odseci donji nibl (4 bita) – cifra desetica
MOV B,#0Ah ; U B stavi 10
MUL AB
MOV R2,A
MOV A,R1
SWAP A ; Zameni niblove u A
ANL A,#0Fh ; Odseci donji nibl – cifra jedinica
CLR C
ADD A,R2 ; U A se nalazi REFerentna vrednost
ADC: JB TCON.3,LOADADC ; Čekaj da se obavi konverzija
SJMP ADC
LOADADC: MOV B,P0 ; U B se nalazi reč iz AD konvertora
SETB P1.5
CLR C
SUBB A,B ; U A se nalazi signal greške = REF – AD
CLR EROR0ZN ; EROR0 >0
JNC NASTAVI ; ako nije C NASTAVI
CPL A ; inače je EROR0<0 , nađi drugi komplem.
ADD A,#01h
SETB EROR0ZN ; EROR0 je negativno
NASTAVI: MOV EROR0,A
MOV B,K1 ;
MUL AB ; B:A = K1*EROR0
MOV R1,A ; R2:R1 = K1*EROR0
MOV R2,B
MOV A,EROR2
MOV B,K3
MUL AB ; B:A = K3*EROR2
MOV ZNAK2,EROR0ZN
MOV ZNAK1,EROR2ZN
CALL SABIRAJ ; B:A = K3*EROR2+K1*EROR0
MOV R1,A ; R2:R1 = ------
MOV R2,B
MOV ZNAK2,ZNAKR
MOV A,EROR1 ;
MOV B,K2
MUL AB ; B:A = K2*EROR1
MOV ZNAK1,EROR1ZN
CPL ZNAK1 ; promeni znak pošto se oduzima
CALL SABIRAJ ; U B:A = ER2*K3+ER0*K1-ER1*K2
;Sada ovu sumu treba podeliti sa 32 što je isto kao i pomeranje u desno 5 mesta
; a to je isto što i pomeranje u levo 3 mesta
RLC A
RLC A ; rotiraj 3 puta u levo = deli sa 32
RLC A
ANL A,#07h ; odseci niža 3 bita (00000xxx)
MOV R7,A
MOV A,B ; u A stavi viši bajt
RLC A
RLC A
RLC A ; i podeli ga sa 32
MOV R6,A
MOV B,07h ; u B stavi masku 00000111
ANL B,A ; i odseci niža 3 bita (00000xxx) višeg B.
MOV A,#F8h ; u A stavi masku (11111000)
ANL A,R6 ; i odseci viših 5 bita (xxxxx000) višeg B.
ORL A,R7 ; zalepi xxxxx000 OR 00000xxx
MOV R1,OUT1 ; u R1 stavi OUT1
MOV R2,#00h ; u R2 stavi 00h
CLR ZNAK2 ; ZNAK2 je +
MOV ZNAK1,ZNAKR ; ZNAK1 = ZNAKR
CALL SABIRAJ ; B:A = OUT0 = OUT1 + SUMA/32
JNB ZNAKR,LAB1 ; ako je >0 skoči na LAB1
MOV OUT0,#00h ; inače OUT0 = 00h (MIN)
JMP KRAJ ; idi na kraj
LAB1: MOV R1,A
MOV A,B ; stavi viši bajt u A
JZ LAB2 ; ako je 0 skoči na LAB2
LAB3: MOV OUT0,#32h ; inače OUT0 = (MAX) = 50
JMP KRAJ ; idi na kraj
LAB2: MOV A,#32h
CLR C
SUBB A,R1 ; A = 50 - OUT0
JC LAB3 ; ako je OUT0 >50 skoči na LAB3
MOV OUT0,R1 ; inače je OUT0<50 i nastavi do kraja
KRAJ: MOV OUT1,OUT0
MOV EROR2,EROR1
MOV EROR1,EOR0
MOV EROR2ZN,EROR1ZN
MOV EROR1ZN,EROR0ZN
RETI ;Kraj rutine RACUN
; Kraj programa
END
FTN Novi Sad, Katedra za elektroniku
