119
1 1. Uvodni deo RAM (Random Access Memory) je termin koji ozna~ava memoriju kojoj korisnik mo`e slobodno da pristupa, radi upisa i ~itanja. U ovu memoriju se sme{taju programi koje korisnik unese, privremene promenljive i druge informacije neophodne za pravilan rad ra~unara. Najve}i broj RAM memorija ima jednostrani pristup (single-port). Upravo ovakvo re{enje predstavlja usko grlo u radu sistema, sa aspekta propusnosti, koji se u najve{}em broju slu~ajeva realizuju kao vi{eprocesorski. To zna~i da se u jednom trenutku javlja potreba da ve}i broj ra~unara istovremeno pristupa nekom memorijskom modulu. Re{enje se obi~no sastoji u tome {to se umesto single-port koriste multi-port memorije. U ovom radu bi}e obja{njen na~in komuniciranja dva ra~unara koji imaju memoriju preko dvostrukog pristupa. Dual-port RAM omogu}ava simultani pristup jednom istom memorijskom ~ipu od strane dva nezavisna korisnika. Komunikacija se svodi na razmenu podataka izme|u dva korisnika (ra~unara). Ra~unari koji razmenjuju podatke mogu biti dva mikroprora~unarska sistema koji obavljaju razli~ite, ali me|usobno povezane zadatke. Dual-port pristup memoriji je koristan zato {to omogu}ava simultani pristup radi potrebe ~itanja i upisa. Pri ovome oba ra~unara mogu da vide tu memoriju kao jedinstveni prostor ili kao razli~iti. Komunikacija izme|u dva ra~unara preko deljive memorijske oblasti mo`e da se realizuje na jedan od slede}a dva na~ina: - Dual-port RAM-om i - FIFO RAM-om U nastavku teksta bi}e ukratko opisana tehnika prenosa preko FIFO RAM-a, a detaljnije tehnika prenosa preko Dual-Port RAM-a. U poglavlju 2. bi}e opisana komunikacija izme|u dva procesora preko Dual-Port RAM-a; U poglavlju 3. bi}e opisana serijska komunikacija izme|u procesora PC-a; Poglavlje 4. rezervisano je za obja{njenje softverskog dela. Poglavje 5. predstavlja zadatak namenjen studentima; U poglavlju 6. nalaze se softveri u izvornom obliku, blok {eme i literatura kori{}ena u ovom zadatku.

1. Uvodni deo - es.elfak.ni.ac.rses.elfak.ni.ac.rs/Papers/Seminarski rad iz Mikroprocesorskih sistema-finish.pdf · 1 1. Uvodni deo RAM (Random Access Memory) je termin koji ozna~ava

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

1

1. Uvodni deo

RAM (Random Access Memory) je termin koji ozna~ava memoriju kojoj korisnik mo`e slobodno da pristupa, radi upisa i ~itanja. U ovu memoriju se sme{taju programi koje korisnik unese, privremene promenljive i druge informacije neophodne za pravilan rad ra~unara. Najve}i broj RAM memorija ima jednostrani pristup (single-port). Upravo ovakvo re{enje predstavlja usko grlo u radu sistema, sa aspekta propusnosti, koji se u najve{}em broju slu~ajeva realizuju kao vi{eprocesorski. To zna~i da se u jednom trenutku javlja potreba da ve}i broj ra~unara istovremeno pristupa nekom memorijskom modulu. Re{enje se obi~no sastoji u tome {to se umesto single-port koriste multi-port memorije. U ovom radu bi}e obja{njen na~in komuniciranja dva ra~unara koji imaju memoriju preko dvostrukog pristupa. Dual-port RAM omogu}ava simultani pristup jednom istom memorijskom ~ipu od strane dva nezavisna korisnika. Komunikacija se svodi na razmenu podataka izme|u dva korisnika (ra~unara). Ra~unari koji razmenjuju podatke mogu biti dva mikroprora~unarska sistema koji obavljaju razli~ite, ali me|usobno povezane zadatke. Dual-port pristup memoriji je koristan zato {to omogu}ava simultani pristup radi potrebe ~itanja i upisa. Pri ovome oba ra~unara mogu da vide tu memoriju kao jedinstveni prostor ili kao razli~iti. Komunikacija izme|u dva ra~unara preko deljive memorijske oblasti mo`e da se realizuje na jedan od slede}a dva na~ina:

- Dual-port RAM-om i - FIFO RAM-om

U nastavku teksta bi}e ukratko opisana tehnika prenosa preko FIFO RAM-a, a detaljnije tehnika prenosa preko Dual-Port RAM-a. U poglavlju 2. bi}e opisana komunikacija izme|u dva procesora preko Dual-Port RAM-a; U poglavlju 3. bi}e opisana serijska komunikacija izme|u procesora PC-a; Poglavlje 4. rezervisano je za obja{njenje softverskog dela. Poglavje 5. predstavlja zadatak namenjen studentima; U poglavlju 6. nalaze se softveri u izvornom obliku, blok {eme i literatura kori{}ena u ovom zadatku.

2

2. Komunikacija preko deljivog memorijskog prostora

2.1 Komuniciranje preko FIFO Memorije

Organizacija spre`ne logike preko FIFO RAM-a, za bidirekciono ~itanje i pisanje pokazano je na slici 1:

sl.1 Pristup FIFO RAM prostoru od strane dva procesora Pea i Peb

Napomena: skra}enice imaju slede}e zna~enje FFa – pun FIFO RAM (full FIFO); EFa – prazan FIFO RAM (empty FIFO) Kao {to se vidi sa slike a1. spre`nu logiku ~ine dva bloka FIFO RAM-a. Svaki od procesora (PEa ili PEb) upisuje u jedan FIFO blok a ~ita iz drugog bloka. Treba naglasiti da FIFO RAM nije prava Random Access Memory tj. memorija kojoj se mo`e slobodno pristupati. To zna~i da nema potrebe za dekodiranjem adresa uzastopnih re~i kada je ~ip jednom selektovan. Podatak se uvek upisuje na vrh FIFO-a a ~ita sa repa. Procesor Pex upisuje u FIFO RAM ako marker EFx ukazuje da je FIFO prazan, a ~ita podatke ako marker FFx ukazuje da je FIFO pun. U ovom seminarskom radu bi}e diskutirano re{enje zasnovano na kori{}enju Dual-Port RAM-a.

2.2. Princip interprocesorskog komuniciranja preko Dual-Port RAM-ova

Slika 2. ilustruje na~in prenosa podataka izme|u dva procesora kada je sprega ostvarena kori{}enjem dual-port RAM-a.

sl.2 Sprega dva procesora pomo}u Dual-Port RAM-a

3

Memorijska oblast dual-port RAM-a je zajedni~ka za oba procesorska elementa (PE1 i PE2). Svaki od procesora mo`e da pristupiti dual-port RAM-u nezavisno od drugog. U najve}em broju slu~ajeva PE1 i PE2 pristupaju Dual-Port RAM-u na razli~itim lokacijama. U slu~aju kada oba procesora pristupaju istoj adresi arbitra`na logika odre|uje da jedan pristup mora da se odgodi dok se prvi ne zavr{i.; aktivni BUSY signal ukazuje da se sa obe strane pristupa istoj lokaciji. Vi{e detalja o ovoj problematici bi}e dato u sekciji Dizajn BUSY logike. Kao {to je pokazano na slici a2, deljiva memorija izme|u PE1 i PE2 se obi~no, radi smanjenja konflikta kod pristupa, logi~ki deli na gornju i donju polovinu. Pri tome, PE1 upisuje u gornju polovinu, a ~ita iz donje polovine. Sli~no, PE2 upisuje u donju polovinu, a ~ita iz gornje. Na ovaj na~in minimizira se mogu}nost sukoba u pristupu. Da bi preneo paket poruke ka PE2 (PE1), procesor PE1 (PE2) upisuje paket u zajedni~ku memoriju (gornju(donju) polovinu) koju deli sa procesorom PE2 (PE1). Komunikacija izme|u susednih procesora bez posredne logike.

2.3. Opis strukture Dual-Port RAM-a

Struktura Dual-port memorije prikazana je na slici 3. Dual-Port memoriji mo`e se pristupiti preko dve sistemske magistrale. Svaka sistemska magistrala se sastoji od tri magistrale: DATA, ADDRESS, CONTROL (R/W, BUSY, INTERRUPT, SEMAPHORE).

2.3.1. Dual-port RAM ~ip: princip rada Dual port memorija omogu}ava nezavisni i simultani pristup memorijskim }elijama od strane oba ra~unara. Logika Dual-Port memorijske }elije prikazana je na slici 3. Kod ove }elije, kako leva (L. SELECT) tako i desna (R. SELECT) linija za selektovanje mo`e simultano i nezavisno da bira }eliju ~iji sadr`aj `eli da pro~ita. Tako|e, svaka strana mo`e da upisuje podatke u }eliju nezavisno od one druge. Jedini problem se javlja kada obe strane poku{aju da upi{u podatke u istu }eliju. O ovome }e vi{e biti re~i u daljem tekstu.

4

2.3.2.Problem interakcije i njegovo re{avanje Kod dual-port memorija se javlja ozbiljan problem kada se istovremeno istoj lokaciji pristupa i preko leve i desne sistemske magistrale. Kod ovakvog pristupa mogu da se jave slede}a dva karakteristi~na slu~aja: 1) Jedan procesora poku{ava da ~ita podatke koje drugi procesor a`urira; 2) Oba procesora poku{avaju da istovremeno a`uriraju istu lokaciju. Ako procesor sa jedne strane ~ita dok procesor sa druge strane vr{i upis tada podaci u toku operacije ~itanja ne}e biti stabilni. Ako oba procesora poku{aju istovremeno da vr{e upis u istu lokaciju, sadr`aj memorije ne}e biti korektno definisan.. Upotreba BUSY logike mo`e uspe{no da re{i pomenute probleme. 2.3.2.1. BUSY logika BUSY logika sadr`i hardverske komponente koje odlu~uju koja }e strana generisati BUSY signal, ukoliko obe strane zahtevaju pristup istoj adresi. Ova logika se sastoji od kola za detekciju adrese i le~ kola za odlu~ivanje. Dijagram rada BUSY logike koja se koristi kod IDT dual-port RAM-a prikazan je na slici 5. Ovo kolo sadr`i par adresnih komparatora, par bafera za ka{njenje, le~ kolo i par BUSY izlaznih drajvera. Izlaz adresnog komparatora postaje TRUE (istinit) kada su adrese na njegovim ulazima jednake. Adresa pristupa na ulazu jednog komparatora se dovodi direktno a na drugom preko bafera ka{njenja. Ako pretpostavimo da se leva adresa ne menja, a desna treba da se izjedna~i sa njom, tada }e desni komparator (R) generisati signal TRUE, dok }e levi komparator (L) postati aktivan nakon propagacionog ka{njenja koje odre|uje bafer.

Le~ kolo,formirano od L i R kola, postavlja se u saglasnosti sa izlazima adresnih komparatora. Ovo kolo ima tri stabilna stanja:

1) oba izlaza HIGH – stanje ostaje nepromenjeno 2) A LOW / B HIGH – izlaz kola L na niskom, a kola R na visokom logi~kom nivou - aktivan je

BUSYL 3) A HIGH / B LOW - izlaz kola R na niskom, a kola L na visokom logi~kom nivou – aktivan je

BUSYR . Ekstremni slu~aj u odlu~ivanju je kada obe adrese stignu u isto vreme. U tom slu~aju }e izlazi oba adresna komparatora postati aktivni, aktiviraju}i time obe strane le~ kola. Tada }e, zbog nesimetrije u kolu, ili izlaz A ili izlaz B postati aktivan. Ulazi CEL i CER se koriste za dozvolu rada le~-a.

5

2.3.2.2. Privremena dodela memorije jednoj strani ^esto u toku rada javlja se potreba za privremenu dodelu Dual – Port memorije jednoj strani. Ovakav pristup se naziva blokovska dodela memorije. Blokovskom dodelom se lak{e re{ava problem da se iste adrese ne koriste istovremeno od strane oba procesora. Ovaj metod se tako|e naziva i softversko odlu~ivanje, zato {to softver odlu~uje koja strana ima pravo da koristi odre|eni blok memorije. Softversko dodeljivanje ima prednost jer ne zahteva BUSY logiku, {to je pogodno za implementaciju kod sistema koji ne podr`avaju rad sa BUSY signalom. Problem koji se javlja pri projektovanju blokovskog dodeljivanja se odnosi na komunikaciju izme|u procesora. Kada procesor A zahteva dodelu bloka memorije od procesora B,ovaj tada predaje signal dozvole procesoru A. Kada jedan CPU zavr{i sa kor{}enjem memorijskog bloka, on predaje signal da je memorija slobodna. Tada se drugi CPU odaziva signalom da je poruka primljena. Korektna razmena zahteva ~etiri poruke za dodelu i osloba|anje memorijskog prostora. 2.3.2.3. Upotreba semafora za dodelu memorije Da bi se skratilo vreme za razmenu poruka kod pojedinih dual-port ram-ova koristiti se logika za rad sa semaforom. Za pristup semaforima koriste se markeri. Marker mo`e biti postavljen na nuli ili na jedinici, ~ime ukazuje da li je resurs zauzet ili slobodan. Kod memorija firme IDT stanje semafor markera se menja operacijom tipa TEST & SET. Ako su inicijalno svi semafor bitovi postavljeni u stanje logi~ke jedinice, to ukazuje da RAM nije dodeljen ni jednoj strani. Procesor najpre zahteva dodelu jednog marker bita i poku{ava da upi{e nulu na toj lokaciji. Nakon upisa CPU ~ita sadr`aj memorije, kako bi utvrdio da li je upisivanje uspe{no zavr{eno. Ako jeste, tj ako je pro~itana nula, procesor mo`e koristiti memorijski blok. U slu~aju da je pro~itana jedinica, zna~i da drugi procesor koristi memorijski blok. Zbog toga prvi procesor mora da ~eka dok se marker bit ne postavi na nuli, odnosno dok druga strana ne oslobodi pristup memoriji. Semaforski markeri imaju jedan poseban zahtev: marker mo`e biti dodeljen samo jednoj strani. Nedopustiva je situacija da obe strane istovremeno smatraju da imaju dozvolu kori{}enja memorijskog bloka. Upotrebom semafora ovaj problem se uspe{no re{ava. Ako obe strane istovremeno poku{aju da postave marker, tada }e samo jedna od njih u tome uspeti.

Semaforski markeri se sastoje od 8 individualno adresibilnih le~ kola. Iz svakog le~ kola se mo`e ~itati ili upisivati sa obe strane. Logi~ki dijagram semaforskog markera je prikazan na slici 7. Neka su u kolu na slici 7. oba flip-flopa i oba GRANT izlaza postavljena na logi~koj jedinici. Ukoliko se jedan od flip-flop-ova postavi na nulu, njegov odgovaraju}i GRANT izlaz }e postati nula. Ukoliko se drugi flip-flop setuje kasnije, to ne}e imati nikakvog efekta. Ako se pak oba flip-flopa setuju u isto vreme, le~ kolo }e samo jedan izlaz postaviti na nulu,osigurvaju}i time da samo jedna strana dobije dozvolu za kori{}enje memorije.

6

3. SERIJSKA KOMUNIKACIJA

Serijska komunikacija je popularan na~in prenosa podataka izme|u ra~unara i perifernog ure|aja kakav mo`e biti programibilni instrument ({to je slu~aj u ovoj ve`bi), ili nekog drugog ra~unara. Serijska komunikacija koristi predajnik za slanje podataka, jedan bit po vremenskom intervalu (one bit at a time), preko komunikacione linije do prijemnika. Ovaj metod se mo`e koristiti kada je brzina prenosa podataka mala, ili kod prenosa podataka na velikim rastojanjima. Serijska komunikacija je popularna zato {to svi ra~unari imaju jednan ili ve}i broj serijskih portova. Razlikujemo serijsku sinhronu i asinhronu komunikaciju. Kod asinhrone komunikacije informacija se prenosi podatak po podatak, npr. znak po znak. Sinhronizacija izme|u prijemnika i predajnika se ostvaruje na nivou prenosa jednog znaka a protokoli koji se koriste za prenos se nazivaju start-stop protokoli. Kod sinhronog prenosa cela poruka se prenosi integralno, bez prekida. Po~etak prenosa se karakteri{e zaglavljem (karakteristi~an znak ili vi{e koji se ne mogu javiti u poruci), a kraj prenosa prati zaglavlje koje ukazuje na proveru ispravnosti prenosa (CRC, CHECKSUM, FCS i dr.) S obzirom da se sprega izme|u PC ma{ine i programibilnog instrumenta ostvaruje preko interfejsa RS 232 a prenos podataka je asinhroni, u tekstu koji sledi bi}e dat format prenosa jednog znaka. Asinhrona serijska komunikacija za prenos jednog znaka zahteva da se specificiraju slede}a ~etiri parametra:

- baud-ova brzina prenosa - broj bitova kojim se kodiraju podaci - bit parnosti - broj stop bitova.

Format prenetog znaka je prikazan na slici 8. Kada se ne prenosi informacija stanje na liniji je MARK. Po~etak prenosa po~inje Start Bit-om, tada linija prelazi u stanje SPACE u trajanju od jednog taktnog intervala. Nakon toga sledi prenos podatka koji mo`e biti obima od 5 do 8 bitova. Prvo se predaje LSB a na kraju MSB bit. Opciono sledi bit parnosti. Parnost mo`e biti programirana kao parna ili neparna. Na kraju poruka zavr{ava sa 1, 1.5 ili 2 Stop bita. Broj Stop bitova je programibilan. Pre po~etka prenosa neophodno je da se izme|u prijemnika i predajnika uskladi bitska brzina prenosa. Znak se sastoji od posebnog startnog bita zatim idu bitovi podatka, zatim opcioni bit pariteta, i stop bita. Na slici 8 prikazan je talasni dijagram asinhronog prenosa ASCII znaka koji odgovara slovu m, za slu~aj da je selektovana neparna parnost, prenos znaka sa 7 bitova, i dva Stop bita. Shodno RS 232 standardu Stanju MARK odgovaraju naponski nivoi od –3 do –12V a stanju SPACE od 3 do 12V.

7

sl.8. talasni dijagram prenosa ASCII znaka m

3.1. Kolika mo`e biti brzina prenosa

Pojam Baud-ova brzina se odnosi na koli~inu informacija koja se prenosi, a pojam Bitska brzina se odnosi na vreme koje je potrebno da se prenese koli~ina informacija o jednom bitu. U konkretnom slu~aju, imaju}i u vidu da se pored korisnih bitova podatka (7-bitni ASCII kod) prenose i dodatni bitovikakvi su Start, Parity i Stop bitovi, zaklju~ujemo da bitska i Baud-ova brzina nisu iste. U konkretnom slu~aju koristi se 11 bita za prenos jednog znaka. Ako je brzina prenosa pode{ena na 9600 bps, ima}emo:

87211

9600= znaka po sekundi.

3.2. RS-232 povezivanje

sl.9. Fizi~ki izgled 9-pinskog konektora

Ure|aji koji koriste serijsku komunikaciu dele se na dve kategorije. To su DCE i DTE. DCE su ure|aji tipa modem, dok je TDE ra~unar. RS-232 serijski port se mo`e izvesti u dve varijante, kao D-tip 25-pinski i D-tip 9-pinski. U tabeli 1 dat je raspored pinova kod 9-pinskog konektora.

8

4. Softver

9

Analiza algoritma za levi processor project1

Prvo defini{emo promenljive, pinove … ;RECEIVE PC ,LEVI MIKROKONTROLER=IC1 STATUS EQU 20H NOTSEND EQU STATUS.0 ;BAJT NIJE POSLAT RECEIVED EQU STATUS.1 FULL EQU STATUS.2 FLAGS EQU 21H SOH EQU FLAGS.0 ;START OF HEADER STX EQU FLAGS.1 ;START OF TEXT ETX EQU FLAGS.2 ;END OF TEXT FLAG PAUSE EQU 30H REC EQU 31H ;PRIMLJENI BAJT IZ SBUF-a ADRHI EQU 32H ADRLO EQU 33H BROREC EQU 34H ;hardware- in/out pins BUSY EQU P1.3 CE EQU P1.4 RSEG CODE START JMP MAIN ORG START+SINT ;obrada serijskog interapta JB RI,RX JB TI,TX RX JMP RECEIVE TX JMP TRANS Nakon definisanja promenljivih i hardverskih I/O pinova sledi inicijalizacija: ;******* inicijalizacija TIMER-a ******* MAIN MOV IE,#00H ;zabrana svih interapta MOV SP,#70H ;definisanje steka ;(0FDH - 9600 Q=11.0592MHz) INIC: MOV TH1,#0FDH ;definisanje brzine tajmera T1 MOV TL1,TH1 MOV TMOD,#020H ;T1 = AUTORELOAD MOV SCON,#050H ;dozvola serijskog prijema SETB TR1 ;STARTUJE tajmer 1 Sada sledi resetovanje internog RAM-a procesora i Dual-Port RAM-a: ;******* resetovanje rama ***** MOV R0,#08 RESR MOV A,#0 MOV @R0,A INC R0

10

MOV A,R0 CJNE A,#070H,RESR ;RESETUJE INTERNI RAM MOV IE,#090H ;DOZVOLA INTERUPT-A SER.PORTA CALL CLRMEM ;CLEAR DUAL PORT RAM CLR STX CLR SOH CLR ETX Potprogram CLRMEM slu`i za brisanje dela Dual-Port RAM-a dodeljenog levom procesoru. On glasi: CLRMEM MOV ADRHI,#0 MOV ADRLO,#0 CLR FULL WRT0 MOV REC,#0 ;BRISE MEMORIJU CALL WRITE JNB FULL,WRT0 CLR FULL RET Zna~i obri{emo ADRHI, ADRLO, FULL i u petlji WRT0 obri{emo sve memorijske lokacije. ;***** GLAVNI PROGRAM ***** GP JNB RECEIVED,$ Komanda JNB RECEIVED,$ znači da se vraća na tu istu naredbu sve dok ne naiđe neki podatak sa serijskog porta,koji se prima u interrupt-u. Kada nešto stigne na serijski port, fleg RI se postavi na 1i skače se na vektor za obradu serijskog interrupt-a (SERIAL INPUT INTERRUPT ROUTINE u programu). ;*** SERIAL INPUT INTERRUPT ROUTINE *** RECEIVE PUSH ACC PUSH PSW ;SAVE ACC AND CURRENT BANK SELECT PUSH DPH PUSH DPL MOV REC,SBUF PPI SETB RECEIVED CLR RI POP DPL POP DPH POP PSW POP ACC RETI Najpre u stek memoriju gurnemo sadržaj registara ACC,PSW (program status word), DPH, DPL (data pointer high and low), kako bi zapamtili njihovo stanje pre interrupt-a. U promenljivu REC upisujemo sadržaj serijskog bafera(SBUF), zatim setujemo fleg RECEIVED (da znamo da je nešto stiglo) i obrišemo RI. RI nismo koristil zato što se on proizvede momentalno čim naiđe prekid, ali tad još ne znamo da li je u REC upisan sadržaj serijskog bafera. Zatim se iz steka vrate vrednosti ACC,PSW,DPH,DPL i vraćamo se nazad u glavni program.

11

Nastavak glavnog programa: CLR RECEIVED Obrišemo fleg RECEIVED kako bi on mogao da primi sledeći podatak sa serijskog porta. STHED JB STX,PRIMAX JB SOH,VIMOD. ;SOH=01 (ASCII) MOV A,REC CJNE A,#01,VIMOD SETB SOH Ukoliko je STX(start of text) setovan, skačemo na PRIMAX, a ukoliko nije onda ispitujemo dali je SOH setovan (JB SOH,VIMOD), zna~i ako jeste ska~emo na VIMOD . Ako SOH nije setovan, u ACC se upiše sadržaj REC i ispituje dali je sadržaj ACC #01(CJNE A,#01,VIMOD). Ukoliko sadržaj ACC jeste 1 onda setujemo SOH(SETB SOH). MOV ADRHI,#0 MOV ADRLO,#0 MOV BROREC,#01 CALL WRITE JMP GP Resetujemo adrese ADRHI,ADRLO, jer su to adrese koje se koriste za upisivanje u memoriju i BROREC postavimo na 1(to je pomoćna promenljiva kojom utvrđujemo dali heder stiže pravilno). Zatim pozivamo potprogram za upis WRITE, koji u prvi deo rama upisuje podatke koji su stigli, a koji naravno moraju imati header i futer. Ukoliko je SOH nekad ranije bio setovan, prelazimo na VIMOD: VIMOD MOV A,BROREC CJNE A,#01,VIBP MOV A,REC CJNE A,#0,VIMOD1 INC BROREC ;SADA JE BROREC 2 CALL WRITE JMP GP VIMOD1 CJNE A,#01,MCLEAR INC BROREC ;SADA JE BROREC 2 CALL WRITE JMP GP U ACC upišemo BROREC i upoređujemo da li je A=01, ako nije idemo na VIMOD1 da utvrdimo koji je broj poruke, a ako jeste onda u ACC upišemo REC kako bi utvrdili da li je sadržaj promenljive REC 0 ili 1. Ukoliko nije nula a nije ni jedan, onda se skače na labelu MCLEAR. Ukoliko je REC=0 onda se uvećava BROREC (*), poziva se potprogram za upis i iza start of header (SOH) upisuje mod i vraća se glavni program. MCLEAR CJNE A,#02,VIBP ;MOD2=CLEARRAM CALL CLRMEM CALL RDALL CLR SOH JMP GP U ovoj labeli ispitujemo dali je REC=2 i ukoliko jeste, obrišemo memoriju (potprogramom CLRMEM) ,obrišemo header i vratimo se u glavni program. Vraćamo se na VIMOD: Ako BROREC nije 1, onda idemo na VIBP da utvrdimo broj poruke.

12

VIBP MOV A,BROREC ;BROJ PORUKE CJNE A,#02,VISTX INC BROREC ;SADA JE BROREC 3 CALL WRITE JMP GP VIBP: Ako je broj primljenih bajtova 2 (primljen je SOH i mod), onda poveća BROREC (sada je BROREC=3), izvrši upis i vrati se na glavni program. Ukoliko broj primljenih bajtova nije =2,onda prelazimo na labelu VISTX: VISTX MOV A,BROREC CJNE A,#03,GP MOV A,REC CJNE A,#02,GP SETB STX CALL WRITE JMP GP Ovde ispitujemo dali je BROREC=3, ako nije vraćamo se na glavni program. Ako jeste,onda utvrđujemo dali je REC=2,ako nije vraćamo se u glavni program, a ako jeste setujemo bit za početak teksta STX i vraćamo se u glavni program. Sada u glavnom programu, ukoliko je setovan STX, prelazi se na labelu PRIMAX ( JB STX,PRIMAX). Znači,ova prethodno objašnjena procedura služi da se utvrdi da li je prošao header. ;***** PRIMAX ***** PRIMAX JB ETX,CEKRAJ MOV A,REC CJNE A,#03,NORMAL SETB ETX CLR SOH CALL WRITE ;UPISUJE ETX MOV R7,ADRHI ;STORE ACTAUL RAM ADRESS MOV R6,ADRLO MOV ADRHI,#001H MOV ADRLO,#0FFH ;1FFH=511dec MOV REC,#01 ;BYTE FOR WRITE CALL WRITE ;SETUJE SEMAFOR NA KRAJU PRVOG DELA RAMA MOV ADRHI,R7 MOV ADRLO,R6 ;RESTORE ADRESS JMP GP NORMAL CALL WRITE ;UPISUJE PRISTIGLI PODATAK U PRVI DEO RAMA JMP GP Najpre ispitujemo da li je setovan bit ETX i ako jeste, prelazimo na labelu CEKRAJ (JB ETX,CEKRAJ). Ukoliko nije,onda ispitujemo da li je brimljeni bit REC=3. Ako je taj uslov ispunjen,onda setujemo bit ETX i obrišemo SOH, a zatim potprogram WRITE upisuje vrednost REC na odgovarajuću lokaciju. Nadalje,pošto je naišao ETX,sada u pomoćne registre R6 i R7 ubacimo adrese kraja (ADRHI i ADRLO), zatim u ADRHI i ADRLO ubacimo adresu kraja, ADRHI=001H, ADRLO=0FFH, tj adresa kraja je 1FFH=511 decimalno. Zatim u REC upišemo 1 i pozovemo WRITE da na mesto semafora upiše 1. Nakon toga iz R7 i R6 vratimo adresu u ADRHI i ADRLO i vratimo se u glavni program gde čekamo sledeći bajt.

13

Ako je ETX setovan, onda prelazimo na labelu CEKRAJ: CEKRAJ MOV A,REC CJNE A,#04,NOTEOT CALL WRITE CLR STX CLR ETX CLR SOH CLR FULL JMP GP CEKRAJ: Najpre ispitujemo da li je REC=4, ako jeste onda je to end of transmission i priprema se inicijajizacija za sledeći header.A ako nije onda se labelom NOTEOT ispituje da li je REC=1. NOTEOT MOV A,REC CJNE A,#01,NOTSOH CLR STX CLR ETX CLR SOH CLR FULL JMP STHED ;START HEADER NOTSOH JMP GP NOTEOT: Ako nije REC=1 onda to nije start of header i vraća se u glavni program.Ako je REC=1,onda brišemo bitove STX,ETX,SOH,FULL,što ustvari predstavlja inicijalizaciju za novi header, tj skačemo na labelu STHED. ;***** UPIS U MEM. ADRESU ADRHI, ADRLO ***** WRITE JB FULL,EXWRITE ;NE UPISUJE AKO JE RAM NAPUNJEN PISHI SETB BUSY ;BUSY PIN DUAL PORT RAMA MOV A,REC MOV DPH,ADRHI MOV DPL,ADRLO CLR CE ;CHIP ENABLE DUAL PORT RAMA NOP JNB BUSY,$ MOVX @DPTR,A NOP SETB CE CLR C MOV A,ADRLO ;INC ADRHI,LO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A CJNE A,#04,EXWRITE ;400H JE PREKORACENJE MEMORIJE SETB FULL EXWRITE RET Labela PISHI:Setujemo bit BUSY,u akumulator upišemo vrednost BUSY i u data pointer registar upišemo trenutnu vrednost adrese. Zatim chip enable (CE) dual port rama obrišemo, jer se on tako aktivira. Zatim ispitujemo da li je signal BUSY aktivan,ako nije onda nastavljamo dalje.

14

Naredbom MOVX @DPTR,A sadržaj akumulatora prebacimo na adresu koju sadrži data pointer regiser(DPTR). Zatim setujemo CE jer nije više prozvan dual port ram, i povećamo adresu za 1, tako da pri sledećem pozivu vršimo upis u narednu memorijsku lokaciu. Potprogram za čitanje sa memorijske adrese, RDALL Princip je sličan kao kod upisa u mem. lokaciju, s tom razlikom što se sada u ACC ubacuje adresa koju sadrži DPTR. Zatim se poziva potprogram za slanje CHAR, a zatim inkrementira adresu i proverava da li je viši adresni bajt ADRHI=04H. Ako nije,vraća se na RDX,a ako jeste onda izlazi iz potprograma. ;**** CITANJE OD ADRESE 00 DO 0400H *** RDALL MOV ADRHI,#0 ;RESETUJE ADRESU ZA CITANJE MOV ADRLO,#0 RDX MOV DPH,ADRHI MOV DPL,ADRLO CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR ;CITA RAM SA DPH,DPL NOP SETB CE CALL SCHAR ;SALJE BAJT NA SER.PORT CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A MOV A,ADRLO JNZ RDX MOV A,ADRHI CJNE A,#04,RDX CLR RECEIVED RET ;**** SLANJE 1 KARAKTERA *** SCHAR JB NOTSEND,$ SETB NOTSEND MOV SBUF,A RET ;******** PREDAJA ********** TRANS CLR TI CLR NOTSEND RETI END START

15

16

Analiza algoritma za levi processor project1 Kao i kod prvog procesora, najpre definišemo promenljive i hardverske zahteve BUSY i CE. Zatim sledi defnicija za komunikaciju, tajmer, dozvola serijskog prijema, resetovanje rama. ;READ IDT7130 & SEND TO PC ,DESNI MIKROKONTROLER=IC3 STATUS EQU 20H NOTSEND EQU STATUS.0 ;BAJT NIJE POSLAT RECEIVED EQU STATUS.1 ;'STIGAO' BAJT NA SER. PORT EOT EQU STATUS.2 ;EOT FLAG ADRHI EQU 30H ADRLO EQU 31H UPIHI EQU 32H UPILO EQU 33H BROPOR EQU 34H ;hardware- in/out pins BUSY EQU P1.3 CE EQU P1.4 RSEG CODE START JMP MAIN ORG START+SINT ;obrada serijskog interapta JB RI,RX JB TI,TX RX JMP RECEIVE TX JMP TRANS **** inicijalizacija TIMER-a,reset.RAM-a i sl. **** MAIN MOV IE,#00H ;zabrana svih interapta MOV SP,#70H ;definisanje steka ;(0FDH - 9600 bauda Q=11.0592MHz) INIC: MOV TH1,#0FDH ;definisanje brzine tajmera T1 MOV TL1,TH1 MOV TMOD,#020H ;T1 = AUTORELOAD MOV SCON,#050H ;dozvola serijskog prijema SETB TR1 ;STARTUJE tajmer 1 ;******* resetovanje rama ***** MOV R0,#08 RESR MOV A,#0 MOV @R0,A INC R0 MOV A,R0 CJNE A,#070H,RESR ;BRISE INTERNI RAM MOV IE,#090H ;DOZVOLA INTERUPT-A SER. PORTA ;******** GLAVNI PROGRAM ********* GP MOV ADRHI,#001H MOV ADRLO,#0FFH CALL READ1 CJNE A,#01,GP ;semafor

17

MOV R1,#0FFH MOV R0,#06 PAUSE15 DJNZ R1,$ ;PAUZA 1.536 mS MOV R1,#0FFH DJNZ R0,PAUSE15 Glavni program stalno gleda adresu 511 decimalno, tj semafor, i dok se ne pojavi 1, on se vrti u toj petlji. Registri R0....R7 su registri opšte namene, a među njima R0 i R1 imaju mogućnosti da operišu sa komandom DJNZ (decrement and jump if not zero). Zatim je napravljena softverska pauza od 1.5 ms koja služi da kada naiđe ETX, podigne semafor, ali posle ETX može naići ETR. Zato ova pauza služi da ako postoji ETR, on bude i upisan. MOV ADRHI,#0 MOV ADRLO,#01 najpre adresu postavimo na 1 na kojoj se nalazi header CALL READ1 ovim potprogramom pročitamo njen sadržaj JZ CELAPOR ukoliko je header 0 skačemo na potprogram CELAPOR JMP RAZLPOR ako nije, onda prelazimo na RAZLPOR CELAPOR MOV BROPOR,#0 ;UPISUJE CELU PORUKU KAO 0-tu CALL UPIPOR ;UPISUJE celu PORUKU u drugi deo RAMA MOV ADRHI,#0 MOV ADRLO,#01 MOV R7,#0FFH CALL WRITE ;SEMAFOR KRAJA UPISA PORUKA CALL RDALL ;salje celu memoriju NAZAD U PC MOV ADRHI,#001H MOV ADRLO,#0FFH MOV R7,#0 ;VREDNOST ZA UPIS U RAM CALL WRITE ;RESETUJE SEMAFOR JMP GP CELAPOR: Najpre upišemo da je BRPOR=0, zatim pozovemo potprogram UPIPOR za upisivanje poruka u drugi deo rama. Zatim kontroler na adresi 01 upiše FF, tamo gde je mesto za mod i to vrati u PC. A to je semafor za PC da je poruka konačna,tj da je cela poruka primljena. Zatim pozivamo potprogram RDALL koji pročita celu memoriju i šalje je nazad u PC. Posle toga adresu 1FF, na kojoj se nalazi semafor,resetujemo. Registar R7 koristimo za upis u memoriju, odnosno ono što želimo da upišemo u memoriju stavljamo najpre u R7. Kad poruka nije cela,već razlomljena, koristimo potprogram RAZLPOR. RAZLPOR MOV ADRHI,#0 MOV ADRLO,#02 CALL READ1 MOV BROPOR,A CALL UPIPOR ;UPISUJE PORUKU NA ODGOVARAJUCU POZ. CALL ISPEOT JNB EOT,NENDPOR ;NEMA KRAJNJE PORUKE MOV ADRHI,#0 MOV ADRLO,#01 MOV R7,#0FFH CALL WRITE ;SEMAFOR KRAJA UPISA PORUKA Najpre čitamo adresu broj 02 i to ubacujemo u BROPOR, to je deo headera. Zatim pozivamo potprogram za upisivanje poruka UPIPOR, i potprograma ISPEOT-za ispitivanje EOT. Ako nemamo bit EOT (JNB EOT,NENDPOR), onda se opet pročita celi ram, odnosno osveži se, kako bi mogli da vidimo šta se sada

18

tamo nalazi. Znači poruka je upisana na odgovarajuću poziciju i ceo ram se ponovo pročita, resetuje semfor i obriše EOT u slučaju da je bio setovan: NENDPOR CALL RDALL MOV ADRHI,#001H MOV ADRLO,#0FFH MOV R7,#0 CALL WRITE ;RESETUJE SEMAFOR CLR EOT ;SPREMAN ZA SLEDECI BLOK NOTFLAG JMP GP Nakon toga se vraćamo na glavni program, gde čekamo da se ponovo semafor podigne, čitamo sledeću poruku i sve to ide u krug. ;***** ISPITIVANJE EOT ****** ISPEOT CLR C ;UVECAVA AKTUELNU ADRESU ZA CITANJE MOV A,ADRLO ;IZ PRVOG DELA RAMA ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A CALL READ1 MOV R7,A CJNE A,#04,EXISP SETB EOT EXISP RET Potprogram za upisivanje poruke UPIPOR: ;***** UPIS PORUKE NA ODG.POZ U DRUGI DEO RAMA ***** UPIPOR MOV UPIHI,#0 MOV UPILO,#0 MOV A,BROPOR JZ NOMATH MOV R1,A ;U R1 JE BROJ PORUKE ADD16 CLR C ;DODAJE PO 16 BAJTA ZA SVAKU PORUKU MOV A,UPILO ADDC A,#016 MOV UPILO,A MOV A,UPIHI ;UPIHI,LO=MEM. ADRESA ZA UPIS U ADDC A,#0 ;DRUGI DEO RAMA MOV UPIHI,A DJNZ R1,ADD16 NOMATH MOV ADRHI,#0 ;POCETAK TEKSTA POSLE HEADER-A MOV ADRLO,#04 ;JE UVEK NA ADRESI 004 RDPOR CALL READ1 CJNE A,#03,CLASIC ;03=ETX (ASCII) JMP EXUPI

19

CLASIC MOV R7,A ;U R7 JE VREDNOST ZA UPIS CALL WRMSG ;UPISUJE BAJT PO BAJT U DRUGI DEO RAMA CLR C ;UVECAVA AKTUELNU ADRESU ZA CITANJE MOV A,ADRLO ;IZ PRVOG DELA RAMA ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A JMP RDPOR EXUPI RET UPIPOR: Najpre resetujemo UPIHI i UPILO i u akumulator upišemo BROPOR. Ukoliko je BROPOR=0 prelazimo na NOMATH. Ukoliko nije 0 , u R1 se ubaci sardžaj akumulatora(tj br. poruke) i na UPIHI,UPILO se dodaje po 16 onoliko puta koliko je vrednost BROPOR da bi odredili početnu adresu koju upisujemo. Ako je broj poruke 0, adresu postavimo na 04 jer je to adresa odakle počinje poruka, pre te adrese ide header. Zatim se pročita ta lokacija( RDPOR CALL READ1 )I i ako A nije 03, onda idemo na klasičan način upisa (labela CLASSIC), tj da to što je pročitao u prvom delu upiše u drugi deo memorije.A ako jeste 03 onda izlazi iz upisa ( JMP EXUPI ). WRMSG- služi za upis bajt po bajt iz jednog u drugi deo rama. ;***** UPIS BAJTA PORUKE NA ODGOVARAJUCU POZICIJU **** WRMSG CLR C MOV DPTR,#0200H ;DRUGA POLOVINA RAMA POCINJE NA 200H MOV A,DPL ADDC A,UPILO MOV DPL,A MOV A,DPH ADDC A,UPIHI MOV DPH,A ;DPH,DPL ADRESA U RAMU GDE UPISUJE BAJT MOV A,R7 SETB BUSY CLR CE NOP JNB BUSY,$ ;UPISUJE ACC NA ADRESI DPH,DPL MOVX @DPTR,A NOP SETB CE CLR C MOV A,UPILO ;INC UPIHI,LO ADDC A,#01 MOV UPILO,A MOV A,UPIHI ADDC A,#0 MOV UPIHI,A EXWRMSG RET ;**** UPIS U MEM. ADRESU ADRHI,LO ***

20

WRITE SETB BUSY ;busy je ulazni pin u mikrokontroler MOV A,R7 MOV DPH,ADRHI MOV DPL,ADRLO CLR CE ;SELEKTUJE DUAL PORT RAM NOP ;(CHIP ENABLE) JNB BUSY,$ ;BUSY PIN IDT7130 MOVX @DPTR,A NOP SETB CE EXWRITE RET WRMSG: Najpre data pointer (DPTR) postavimo na adresu 200H. To je početna adresa drugog dela rama. Na ovu adresu dodamo preračunatu adresu UPIHI,UPILO i sve to opet vratimo u DPTR (MOVX @DPTR,A-sadržaj akumulatora prebacimo na adresu koju pokazuje DPTR). Kad se to završi povećamo UPIHI,UPILO za 1 kako bi se pomerili na sledeću lokaciju. Na taj način se upisuje poruka sve dok se ne naiđe na lokaciju na kojoj je upisano 03(ASCII), što predstavlja ETX, kada se vraća nazad. Vratimo se sada na ISPEOT (ISPITIVANJE EOT). Pošto smo stigli do lokacije na kojoj je upisano 03, sada sadržaj adresnog registra povećamo za 1 i pročitamo sadržaj te memorijske lokacije. Ukoliko je sadržaj te lokacije 04, setujemo EOT a ako nije vraćamo se nazad. Sada u RAZLPOR ispitujemo da li je setovan EOT, ako nije onda na adresi za mod (001) upišemo FF kako bi PC znao da mu kontroler vraća složenu poruku. ;**** CITANJE SA MEM. ADRESE ADRHI,LO *** READ1 MOV DPL,ADRLO MOV DPH,ADRHI ;UBACUJE ADRESU U DATA POINTER CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE RET Čitanje sa memorijske adrese za ovaj kontroler je slično kao kod prvog, s tom razlikom sto se ovde sa adrese koju pokazuje DPTR sadržaj ubacuje u akumulator ;**** CITANJE OD ADRESE 00 DO 0400H *** RDALL MOV ADRHI,#0 ;RESETOVANJE ADRESE ZA CITANJE MOV ADRLO,#0 RDX MOV DPH,ADRHI MOV DPL,ADRLO CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR

21

NOP SETB CE CALL SCHAR ;SLANJE PROCITANOG BAJTA NA SER.PORT CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A ;INC ADRHI,LO MOV A,ADRLO JNZ RDX MOV A,ADRHI CJNE A,#04,RDX ;ADRESA 400H JE PREKORACENJE RAMA RET Labela RDALL: Resetuje se adresa, pročita se sadržaj te adrese i pošalje na serijski port. Zatim se adresa poveća i proverava da nije ADRHI=4, jer 400H je prekoračenje rama. Ova petlja se vrti sve dok se ne pošalje celi ram. ;**** SLANJE 1 KARAKTERA ** SCHAR JB NOTSEND,$ SETB NOTSEND MOV SBUF,A ;UBACUJE BAJT U SERIJSKI BAFER RET ;**** SERIAL INPUT INTERRUPT ROUTINE **** RECEIVE CLR RI RETI Serjski interrupt: Pošto ovaj kontroler ne prima podatke korišćenjem interrupt-a, ako se ovaj desi samo se vrati nazad. RECEIVE CLR RI obrišemo fleg za prijem RETI ;******** PREDAJA ********** TRANS CLR TI CLR NOTSEND RETI END START

22

23

Analiza algoritma za levi processor project1

Prvo defini{emo promenljive, pinove … ;IDT7130 PC-READ/WRITE , levi MIKROKONTROLER STATUS EQU 20H TIME EQU STATUS.0 SINTE EQU STATUS.1 NOTSEND EQU STATUS.2 ;BAJT NIJE POSLAT RECEIVED EQU STATUS.3 FULL EQU STATUS.4 FIRST EQU 21H MODE EQU 22H MODE0 EQU MODE.0 ;SAMO PISE MODE1 EQU MODE.1 ;PISE,CITA MODE2 EQU MODE.2 ;CITA 1 PO 1 MODE3 EQU MODE.3 ;CITA BLOK LOB EQU 23H HIB EQU 24H PAUSE EQU 30H REC EQU 31H ;PRIMLJENI BAJT IZ SBUF-a BRECHI EQU 32H BRECLO EQU 33H ADRHI EQU 34H ADRLO EQU 35H ;hardware- in/out pins BUSY EQU P1.3 CE EQU P1.4 INT EQU P3.2 SEND1 EQU P1.1 ;PRVI uC SALJE SEND2 EQU P1.0 ;DRUGI uC SALJE RSEG CODE START JMP MAIN ORG START+TIMER0 JMP IRQ ORG START+SINT ;obrada serijskog interapta JB RI,RX JB TI,TX RX JMP RECEIVE TX JMP TRANS Nakon definisanja promenljivih i hardverskih I/O pinova sledi inicijalizacija: ; ***** inicijalizacija TIMER-a,reset.RAM-a i sl. ***** MAIN MOV IE,#00H ;zabrana svih interapta MOV SP,#70H ;definisanje steka ;(0FDH - 9600 Q=11.0592MHz) INIC: MOV TH1,#0FDH ;definisanje brzine tajmera T1

24

MOV TL1,TH1 MOV TMOD,#021H ;T1 = AUTORELOAD, T0 = 16b_TIMER MOV IP,#010H ;definisanje prioriteta MOV SCON,#050H ;dozvola serijskog prijema SETB TR1 ;STARTUJE tajmer 1 MOV TL0,#066H MOV TH0,#0FCH SETB TR0 ;******* resetovanje rama ***** MOV R0,#08 RESR MOV A,#0 MOV @R0,A INC R0 MOV A,R0 CJNE A,#070H,RESR MOV IE,#092H ;DOZVOLA INTERUPT-A MOV MODE,#0 ;** GLAVNI PROGRAM ** GP NOP MOD2 JNB MODE2,RECTST CLR RECEIVED JB SEND2,GP MOV DPH,ADRHI MOV DPL,ADRLO CALL READ CALL SCHAR CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A JNB SEND2,$ JMP GP RECTST JNB RECEIVED,$ CLR RECEIVED MOD3 JNB MODE3,MOD1 CALL RDALL MOD1 JNB MODE1,MOD0 CALL WRITE CALL READ1 CALL SCHAR JMP GP MOD0 JNB MODE0,GP CALL WRITE JMP GP

25

Zna~i u glavnom programu posmatramo MOD (levi procesor posmatra mod u drugom bajtu u zaglavlju, a desni procesor mod u tre}em bajtu zaglavlja. U tome je razlika izme|u asemblera za levi i desni procesor ve`be project2). U zavisnosti od toga koji je MOD ska~e se na odre|ene potprograme: ;**** UPIS U MEM. ADRESU ADRHI,LO *** WRITE JB FULL,EXWRITE PISHI SETB BUSY MOV A,REC MOV DPH,ADRHI MOV DPL,ADRLO CLR CE NOP JNB BUSY,$ MOVX @DPTR,A NOP SETB CE CLR SEND1 MOV PAUSE,#02 SETB TIME CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A CJNE A,#04,EXWRITE SETB FULL EXWRITE RET Labela PISHI:Setujemo bit BUSY,u akumulator upišemo vrednost BUSY i u data pointer registar upišemo trenutnu vrednost adrese. Zatim chip enable (CE) dual port rama obrišemo, jer se on tako aktivira. Zatim ispitujemo da li je signal BUSY aktivan,ako nije onda nastavljamo dalje. Naredbom MOVX @DPTR,A sadržaj akumulatora prebacimo na adresu koju sadrži data pointer regiser (DPTR). Zatim setujemo CE jer nije više prozvan dual port ram, i povećamo adresu za 1, tako da pri sledećem pozivu vršimo upis u narednu memorijsku lokaciu. Ovim potprogramom se upisuje poruka u Dual-Port RAM. Nakon upisa resetuje se signal SEND1. ;**** CITANJE ***** READ CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE RET Ovim potprogramom se vr{i is~itavanje podataka iz RAMA. ;**** CITANJE SA MEM. ADRESE ADRHI,LO-1 ***

26

READ1 CLR C MOV A,ADRLO SUBB A,#01 MOV DPL,A MOV A,ADRHI SUBB A,#0 MOV DPH,A CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE EXREAD RET ;**** CITANJE OD ADRESE 00 DO 0400H *** RDALL MOV ADRHI,#0 ;RESETUJE ADRESU ZA CITANJE MOV ADRLO,#0 RDX MOV DPH,ADRHI MOV DPL,ADRLO CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR ;CITA RAM SA DPH,DPL NOP SETB CE CALL SCHAR ;SALJE BAJT NA SER.PORT CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A MOV A,ADRLO JNZ RDX MOV A,ADRHI CJNE A,#04,RDX CLR RECEIVED RET ;**** SLANJE 1 KARAKTERA ** SCHAR JB NOTSEND,$ SETB NOTSEND MOV SBUF,A RET ;***** SERIAL INPUT INTERRUPT ROUTINE ***** RECEIVE PUSH ACC

27

PUSH PSW ;SAVE ACC AND CURRENT BANK SELECT PUSH DPH PUSH DPL MOV REC,SBUF ;GET SERIAL INTERUPT BYTE MOV A,REC CJNE A,#0244,KLASIC ;'ô' MOV BRECHI,#0 MOV BRECLO,#0 MOV ADRHI,#0 MOV ADRLO,#0 CLR FULL KLASIC CLR C MOV A,BRECLO ADDC A,#01 MOV BRECLO,A MOV A,BRECHI ADDC A,#0 MOV BRECHI,A JNZ GIGY MOV A,BRECLO CJNE A,#01,VIMOD JMP PPI VIMOD CJNE A,#02,MABY2 CALL MODESEL ;LEVI uC NOP JMP PPI MABY2 CJNE A,#03,GIGY ; CALL MODESEL ;DESNI uC NOP JMP PPI GIGY SETB RECEIVED PPI CLR RI POP DPL POP DPH POP PSW POP ACC RETI ;***** SELEKCIJA MODA ****** MODESEL MOV MODE,#0 MOV A,REC CALL ASCBCD VM0 CJNE A,#0,VM1 MOV MODE,#01 JMP EXMOD VM1 CJNE A,#01,VM2 MOV MODE,#02 JMP EXMOD VM2 CJNE A,#02,VM3

28

MOV MODE,#04 JMP EXMOD VM3 CJNE A,#03,EXMOD MOV MODE,#08 EXMOD RET ;0123456789 ;------------------------------- ; PREVOD ASCII-BCD ;------------------------------- ASCBCD CLR C SUBB A,#048 ; U A JE BCD BROJ RET ;******** PREDAJA ********** TRANS CLR TI CLR NOTSEND RETI ;****** INTERRUPT TIMER-a 0 NA ~200uS ************* IRQ MOV TL0,#037H MOV TH0,#0FFH PUSH ACC PUSH PSW DALIT JNB TIME,IZIRQ DEC PAUSE MOV A,PAUSE JNZ IZIRQ CLR TIME SETB SEND1 IZIRQ POP PSW POP ACC RETI END START

29

5. Ve`ba

• Objasniti kroz primer kako se izvr{avaju koraci za jednu ve`bu, objasniti prozore u kojima se unosi tekst, kako se predaju poruke i kako se analiziraju.

Ve`ba se sastoji iz dva dela: Prvi deo se radi sa programom project1 , pri ~emu se koristi {tampana plo~a sa oznakom project1. Kada se startuje program project1 na monitoru }e se pojaviti slede}a slika:

U ovom programu vide}emo kako se zapravo podaci upisuju u RAM memoriju, u ASCII kodu, zatim }emo objasniti zna~enje header-a i footer-a, vide}emo kako se {alje poruka u paketima i vide}emo princip rada semafora.. U prvom delu ovog programa, bi}e ra|eno sa porukama, zna~i, bi}e ozna~eno polje “poruke” u gornjem levom delu. RAM memorija podeljena je na dva dela, kao {to je prikazano na slici. Svaki od ovih delova sadr`i po 512 bajta za upisivanje podataka (poruke). Vrste i kolone ozna~ene su rednim brojevima u heksadecimalnom sistemu (00-1F), tako da lako mo`emo odrediti lokaciju bilo kog upisanog bajta. Poruka koju `elimo smestiti u RAM memoriju upisuje se u gornje levo polje, kao {to je prikazano na slede}oj slici. Broj karaktera koje mo`emo uneti u ovo polje ograni~en je na 512 (uklju~uju}i i znakove interpunkcije i blanko). “Levi” procesor poruku upisuje u RAM memoriju pritiskom na polje “po{alji”.

30

Dakle kada poruku “Elektronski fakultet u Nisu” upisemo u RAM memoriju, dobi}emo slede}e:

31

Dok procesor upisuje poruku u RAM memoriju, semafor }e svetleti crveno. To zna~i da “desni” procesor ne}e mo}i da pro~ita ni{ta iz RAM memorije dok takozvani “levi” procesor ne zavr{i upisivanje poruke. To je zapravo princip rada semafora. Kada se poruka upi{e, semafor }e opet zasvetleti zelenom bojom. Tada “desni” procesor ~ita poruku iz desne polovine rama koja je rezervisana za njega, i poruka biva ispisana u gornjem desnom polju, kao {to je prigazano na prethodnoj slici. Primeti}emo, tako|e, da se bajtovi u levoj i desnoj polovini RAM memorije razlikuju. Zapravo, desna polovina RAM memorije sadr`i samo poruku, dok leva polovina RAM-a ispred poruke sadr`i header (za~elje), a iza poruke je footer (zaglavlje). Vidimo da header sadr`i ~etiri bajta, koja u stvari zna~e (kao {to je obja{njeno u poglavlju 5): 01 – start of header FF - 00 – broj poruke 02 – start of text dok footer sadr`i: 03 – end of text i 04 – end of transmition. Zapravo ba{ bajt 04 (end of transmition) setuje semafor. Kada se on pojavi, semafor postaje zelene boje i “desni” procesor ~ita podatke iz dela RAM-a rezervisanog za “levi” procesor. Ovo zapravo pokazuje princip rada dual-port RAM-a. Slede}a slika obja{njava rad sa paketima poruka. Zna~i, pre svega treba biti selektovano polje sa natpisom “paketi” u gornjem levom uglu. Dobi}emo slede}u sliku:

Upisivanjem poruke u gornje levo polje za upis, ona }e se automatski deliti na pakete od po 16 bajta. Razlika kod slanja paketa je u tome {to sada svaki paket posebno ima svoj header i footer. Pritiskom na polje “posalji sve”, levi procesor u levu polovinu RAM-a upisuje redom paket po paket. Dok se paket upisuje, naravno, semafor je crvene boje. Upisivanjem paketa u levu polovinu RAM-a, u desnoj polovini se sklapa cela poruka (slede}a slika)

32

Primeti}emo da svi paketi, osim poslednjeg, imaju footer 03. Samo poslednji sadr`i i 03 i 04 tj. end of tekst i end of transmition. Nakon poslatog bajta 04, u desnom polju pojavi}e se ispisana poslata poruka u celini (slede}a slika)

33

Sada }emo videti kako se sklapa poruka kada se paketi ne {alju redom. Slede}a slika upravo to pokazuje. Ne}emo selektovati polje ”posalji sve”, ve} }emo poslati prvo, recimo, tre}i paket, pritiskom polja “posalji” koji se nalazi desno od paketa.

34

Vide}mo da se paket u desnu polovinu RAM-a upisuje u tre}u vrstu. Po{aljimo sada zadnji paket. Vidimo da i on preska~e ~etvrtu i upisuje se u petu vrstu.

Tek nakon slanja i zadnjeg paketa, poruka }e biti ispisana, ali pravilno, iako pakete nismo slali svojim redom.

Zna~i na osnovu informacije o rednom broju paketa, koja se nalazi u header-u, poruka }e biti prene{ena ta~no iako nije poslata redom, kako je ispisana. Ovo slanje paketa veoma je zna~ajno jer se u telekomunikacijama poruke (zbog bropusnog opsega prenosnog puta) ~esto dele na pakete. Sklapanje ovih paketa na prijemu, zapravo predstavlja upravo princip koji smo sada pokazali.

35

Drugi deo se radi sa programom project2 , pri ~emu se koristi {tampana plo~a sa oznakom project2. Kada se startuje program project2 na monitoru }e se pojaviti slede}a slika:

U ovom delu vide}emo prakti~no kako dva procesora (mikrokontrolera) koriste zajedni~ki Dual-port RAM. Polje “PC bafer za slanje” slu`i samo za upis poruke koju `elimo smestiti u RAM. Broj karaktera je ograni~en na 1024 bajta (1 Mbajt). Kada upi{emo poruku u bafer, moramo ozna~iti {ta `elimo od kog procesora. Recimo:

- Ako levi procesor bude u modu “samo pi{e” a desni u modu “nije aktivan”, tada kada kliknemo na polje “Posalji PC bafer” levi procesor }e u RAM memoriju upisati poruku, koju ne}emo videti.

- Ako je aktivan mod “PISE,CITA” onda }e procesor poslati poruku i ona }e se prikazati u polju “DUAL PORT RAM”.

- Mo~e biti recimo da je levi (desni) procesor u modu “samo pise”, a desni (levi) procesor u modu “samo cita”. To zna~i da }e levi (desni) procesor da upise poruku u RAM a desni(levi) procesor }e je pro~itati.

Mo`emo probati razne kombinacije. U svakom slu~aju, sadr`aj RAM-a }e biti prikazan uvek kada se klikne na polje “Procitaj Dual port RAM”, bez obzira od kog procesora to zahtevamo. Jedan primer dat je na slede}oj slici.

36

Prvo upi{emo tekst poruke u “PC bafer za slanje”, i selektujemo modove procesora (levi - samo pise, desni – samo ~ita). Pritiskom na polje “Posalji PC bafer” ispisa}e se poruka u polju DUAL PORT RAM koju je poslao levi, a pro~itao desni procesor.

37

• Zadatak 1. Pove`ite plo~u project1 na PC i priklju~ite napajanje. 2. Aktivirajte program project1. 3. Neka je program u modu “poruke”. 4. U gornje levo polje upi{ite poruku koju `elite poslati u Dual Port RAM. 5. Po{aljite poruku. 6. Obratite pa`nju na to kako izgleda poruka u levoj, a kako u desnoj polovini RAM-a.

pitanja:

a. Objasni {ta sve sadr`i jedna poruka. b. Koji bajtovi ~ine header a koji footer? c. Koja je uloga semafora? d. [ta ozna~ava bajt 04 ? 7. Prebacite program u mod “paketi”. 8. U gornje levo polje za upis, upisite poruku. Najbolje je da ta poruka sadr`i vi{e od 64 karaktera. 9. Kliknite na “Posalji sve” i pogledajte {ta se de{ava. 10. Obri{ite RAM i ponovite slanje ali slanjem svakog paketa posebno (ne redom).

pitanja:

a. Koja je svrha slanja poruke u paketima? b. Na osnovu ~ega se poruka u desnoj polovini RAM-a sklapa u pravom redu? 11. Pove`ite sada plo~icu project2 i aktivirajte program project2. 12. Upi{ite poruku u bafer za slanje. 13. Postavljajte procesore u razli~ite modove i pratite {ta se de{ava.

Pitanja: a. Objasniti koje su prednosti Dual Port RAM-a u odnosu na klasi~ni ili FIFO RAM.

38

6. DODACI 6.1.Dual-Port RAM – Opis

Uvod Dual port RAM omogućava simultani pristup jednoj istoj memoriji od strane dva nezavisna uređaja.Ovakav pristup omogućava komunikaciju putem razmene podataka kroz zajednicku memoriju.Ovi uređaji mogu biti mikroprocesor i disk kontroler ili dva mikroprocesora koji obavljaju različite,ali međusobno povezane zadatke.Dual-port pristup memoriji je korisan zato što omogućava da se ista memorija koristi kako za smeštanje podataka,tako i za komunikaciju između uređaja,čime se izbegava potreba za korišćenjem posebnog hardvera za prenos podataka.Najnovija dostignuća u razvoju dual port RAM-ova su u povećanju brzine pristupa,čime se minimizira kašnjenje i interferencija. Dual port RAM:Simulani pristup memoriji Dual port memorija ima dve grupe adresnih,kontrolnih i magistrala podataka pri ~emu svaka od njih pristupa istoj grupi memorijskih }elija,kao sto je prikazano na slici 1.Svaki set memorijskih kontrolnih linija mo`e nezavisno jedna od druge ~itati bilo koju re~ u memoriji,uklju~uju}i i slu~aj kada obe strane pristupaju istoj memorijskoj lokaciji u isto vreme.Standardne memorije imaju samo jednu grupu kontrolnih linija za adrese,podatke i kontrolu upis/~itanje (R/W), tako da ako `elite ostvariti dual-port ram sa standardnom memorijom,potrebno je projektovati posebnu logiku kojm bi simulirali ovakav pristup.

Koncept korišćenja konvencionalne memorije za simulaciju dual-port ram-a je čest u kompjuterskim sistemima i poznat je pod imenom direktan pristup memoriji (Direct memory access-DMA).Kod ovog pristupa se jedna memorija deli između procesora (CPU) i jednog ili više ulazno/izlaznih (I/O) uređaja,kao što je prikazano na slici 2.

39

Svaki uređaj koji želi da koristi memoriju šalje zahtev upravljačkoj logici (DMA arbitration logic), koja zatim memorijske kontrolne,adresne i linije podataka povezuje sa jednim od podnosilaca zahteva,pri čemu ostalima javlja da čekaju izdavanjem signala BUSY. U sistemima sa DMA pristupom CPU mora da čeka dok neki I/O uređaj vrši razmenu podataka sa memorijom. Ovakav pristup dobro funkcioniše u tipičnim sistemima,gde I/O koriste mali deo radnog vremena,tako da je njihov uticaj na rad procesora minimalan. međutim,ova pretpostavka ne važi kada dva procesora koriste istu memoriju. U ovom slučaju jedan CPU mora da čeka dok drugi koristi memoriju,a kao rezultat toga njegova brzina se smanjuje skoro upola. Dual-port RAM čip: princip rada Dual port memorija omogućava nezavisni i simultani pristup memorijskim ćelijama od strane oba uređaja. Primer dual port memorijske ćelije prikazan je na slici 3. kod ove ćelije i leva i desna linija za selektovanje može simultano i nezavisno da selektuje ćeliju čiji sadržaj želi da pročita. Takođe,svaka strana može da upisuje podatke u ćeliju nezavisno od one druge. Jedini problem se javlja kada obe strane pokušaju da upišu podatke u istu ćeliju.O ovome će više biti reči u daljem tekstu.

Ova vrsta memorijskog pristupa zahteva određenu kontrolnu logiku kako bi se rešili određeni aplikativni problemi kao što su: signalizacija između procesora, podešavanje vremena interakcije kada oba koriste istu memorijsku lokaciju i hardversku podršku za privremenu dodelu dela memorije samo jednoj strani.

40

Najčešći problem kod dual-procesorskih sistema je njihova međusobna signalizacija, koja se treba odvijati u oba smera. Vrlo čest način signalizacije je da jedan procesor izazove prekid kod drugog procesora. Hardverska podrška za ovakav način signalizacije data je blok dijagramom na slici 4.Kod ovih uređaja dve najviše adrese u memorijskom čipu služe i kao generatori prekida iza levi i za desni port. Ako levi CPU upisuje u parne adrese (3FF u 1KB RAM) , aktivira se desno leč kolo, a samim tim i linija prekida za desni port (interrupt ot R side). Ovaj perkid se ukida kada desni CPU počne da čita iz istih adresa. Slična logika se koristi i za desni CPU, pri čemu se sada koriste neparne adrese (3FE) za prekid rada levog porta. Na ovaj način se izbegava projektovanje posebne logike za realizaciju prekida.

Problem interakcije i njegovo rešavanje Kod dual-port memorija se javlja problem kada i levi i desni port istovremeno pokušavaju da pristupe istim memorijskim lokacijama. Postoje dva slučaja: 1)kada jedan port pokušava da čita iste podatke koje drugi port upisuje; 2)kada oba pokušavaju da istovremeno upišu istu reč. Ako levi port čita dok desni upisuje, podaci na levoj strani će se menjati tokom perioda čitanja,te se mogu pojaviti pogrešni podaci.Ako oba porta pokušaju da upisuju istovremeno,u memoriji će se pojaviti nasumični podaci upisani i sa jedne i sa druge strane,umesto podaci samo sa jednog ulaza. Upotreba BUSY logike može uspešno da reši ove probleme. Mora se primetiti da, iako jedan ili drugi procesor moraju povremeno da čekaju, gubitak u brzini je minimalan, tipično je oko 0.1%. Ovo je zato što je verovatnoća da oba procesora istovremeno koriste iste memorijske lokacije veoma mala, skoro jedan prema milion. Dizajn BUSY logike BUSY logika sadrži hardverske komponente koje odlučuju koja će strana primiti BUSY signal, ukoliko obe zahtevaju pristup istim adresama. Ona se sastoji od kola za detekciju adresa i leč kola za odlučivanje. Dijagram BUSY logike koja se koristi kod IDT dual port ram-a prikazan je na slici 5. Ovo kolo sadrži par adresnih komparatora, par bafera za kašnjenje, leč kolo i set BUSY izlaznih drajvera. Izlaz adresnog komparatora postaje TRUE kada su adrese na njegovim ulazima jednake. Detekcija zadnje pristigle adrese je ostvarena pomoću bafera za kašnjenje između adresnih linija i komparatora. Ako pretpostavimo da se leva adresa ne menja, a desna treba da se izjednači sa njom, desni komparator(R) ce postati TRUE, dok će levi komparator(L) postati aktivan posle nekog vremena koje je određeno kolom za kašnjenje.

41

Leč kolo za odlučivanje,formirano od L i R kola, reflektuje izlaz adresnog komparatora. Ovo kolo ima tri stabilna stanja: oba izlaza HIGH, A LOW/B HIGH i A HIGH/ B LOW. Neka je L adresa stabilna a desna adresa stiže kasnije. Kada R komparator postane aktivan, njegov izlaz postaje HIGH i B izlaz postaje LOW. Izlaz A ostaje HIGH zato što će izlaz njegovog adresnog komparatora postati HIGH nešto kasnije i ulaz L kola koji je povezan na Bizlaz će postati LOW pre ove promene. Kao rezultat ovoga izlaz B će biti aktivan, onemogućavajući time upis u dual-port ram sa desne strane, istovremeno aktivirajući BUSY signal za desni port. Ekstremni slučaj u dolučivanju je kada obe adrese stignu u isto vreme. U tom slučaju će izlazi oba adresna komparatora postati aktivni, aktivirajući time obe strane leč kola. Tada će ili A ili B izlaz iz leč-a postati aktivan. Linije za dozvolu (chip enable lines- CE) su dovdene direktno do leč kola za odlučivanje, iako su mogle biti dovedene i u adresne komparatore. Ovo iz razloga kada je CE za jednu stranu neaktivan, i upis i čitanje nisu dozvoljeni, tako da odlučivanje nije ni potrebno. Ukoliko su adrese jednake, CE koji stigne zadnji izgubiće u odlučivanju. Ukoliko su oba CE aktivna, onda je odlučivanje rešeno preko adresa. Privremena dodela memorije jednoj strani Čest problem kod primene dual-port ram-a je potreba za privremenom doelom memorije jednoj strani. Ovakav pristup se naziva blokovska dodela memorije. Blokovska dodela se može upotrebiti da se izbegne problem adresnog odlučivanja, pošto se na ovaj način osigurava da obe strane istovremeno ne koriste istu adresu. Ovaj metod se takođe naziva i softversko odlučivanje, zato što softver odlučuje koja strana ima pravo da koristi određeni blok memorije. Softversko dodeljivanje ima prednost jer ne zahteva BUSY logiku, što je podesno kod sistema koji ne podržavaju BUSY signal. Problem pri projektovanju blokovskog dodeljivanja je komunikacija između procesora. Jednostavan,ali vremenski zahtevan metod je prosleđivanje poruka između CPU-a, uz koršćenje logike prekida. U tom slučaju, kada procesor A zahteva dodelu bloka memorije od procesora B,ovaj tada šalje signal dozvole nazad procesoru A. Kada prvi CPU završi sa koršćenjem ovog bloka memorije, on tada šalje signal da je memorija slobodna, a drugi CPU tada javlja da je signal primljen. Tako da je potrebno poslati četiri poruke za dodelu i oslobađanje memorijskog bloka.

42

Upotreba semafora za dodelu memorije Kako je kod dodele memorije razmenom poruka potrebno razmeniti četiri poruke, čime se usporava rad, moguće je kod pojedinih dual-port ram-ova koristiti semaforsku logiku, čime se ovaj problem uspešno eliminiše. Semaforski pristup koristi flegove kao indikatore koji CPU ima dozvolu korišćenja bloka memorije. Svaki fleg može biti postavljen bilo na jednu,bilo na drugu stranu ali nikako na obe. Ovim je osigurano da samo jedna strana ima pristup odrđenom bloku memorije. Kod memorija firme IDT semaforski bitovi su projektovani u sekvenci postavljanje-testiranje. Na početku su svi bitovi u stanju logičke jedinice, što znači da nema dodele ni jednoj strani. Procesor najpre zahteva dodelu jednog bita i pokušava da upiše nulu na toj lokaciji. Posle upisa CPU čita sadržaj memorije, kako bi utvrdio da li je da li je upisivanje uspešno završeno. Ako jeste, tj ako je pročitana nula, procesor može koristiti memorijski blok. U slučaju da je pročitana jedinica, znači da drugi procesor koristi memorijski blok. Prvi procesor mora čekati dok bit ne postane nula, odnosno dok druga strana ne oslobodi pristup memoriji. Semaforske zastavice (flags) imaju jedan poseban zahtev: podignuta zastavica može biti dodeljena samo jednoj strani. Nedopustiva je situacija da obe strane istovremeno smatraju da imaju dozvolu korišćenja memorijskog bloka. Upotrebom semagora ovaj problem je uspešno rešen. Ako obe strane istovremeno pokušaju da postave fleg, samo jedna od njih će u tome uspeti.

Semaforske zastavice se sastoje od 8 individualno adresibilnih leč kola. Svako leč kolo može biti čitano i upisano sa obe strane. Selektovane su posebnim signalima dozvole, adresirane sa tri zadnja bita adresnih linija ičitaju se i upisuju preko D0 bita podataka.Izuzev što dele adresne, pinove podataka i pinove za upis/čitanje sa RAM-om, semaforska kola su potpuno nezavisna, kao što je prikazano na slici 6. Logički dijagram semaforske zastavice je je prikazan na slici 7. u ovom kolu oba flip-flopa su na logičkoj jedinici i oba GRANT izlaza su na logičkoj jedinici. Ukoliko se jedan od njih postavi na nulu, njegov odgovarajući GRANT izlaz će postati nula. Ukoliko se drugi flip-flop setuje kasnije, to neće imati nikakvog efekta. Ako se pak oba flip-flopa setuju u isto vreme, leč kolo će samo jedan izlaz postaviti na nulu,osigurvajući time da samo jedna strana dobije dozvolu za korišćenje memorije.

43

Dual-port ram sadrži prost statički ram interfejs, kao i proste vremenske zahteve,međutim postoje izvesni zahtevi u pogledu BUSY signala. Vremenski dijagram prikazan na slici 8. pokazuje relaciju između signala za adrese, podatke, upis/čitanje, selekciju čipa kao i BUSY signal kod dual-port rama sa BUSY logikom. Na ovom dijagramu signal dodele se koristi da dozvoli čipu operaciju upis/čitanje nakon što su postvljene adrese. Odlučivanje se vrši na uzlaznom delu signala dozvole.

44

6.2. Procesor – Opis

MIKROKONTROLER AT89S52 Osobine

• Kompatibilan sa MCS-51 proizvodima • 8 KB ugradjene programabilne fleš memorije

- Trajnost: 1000 Piši/Briši ciklusa • Radni opseg od 4.0V do 5.5V • Puni statički rad: 0Hy do 33MHz • Tro-nivoski osigurač programske memorije • 256×8-bita unutrašnji RAM • 32 programabilne U/I linije • Tri 16-bitna tajmera/brojača • 8 izvora prekida • Puni dupleks UART serijski kanal • Režimi niskonaponskog praznog hoda i prekida napajanja • Oporavak prekida nakon režima prekida napajanja • Watchdog(Vočdog) tajmer • Dva pokazivača podataka • Zastavica koja ukazuje da li je napon isključen

Opis AT89S52 je niskonaponski, visokoperformansni CMOS 8-bitni mikrokontroler sa 8KB ugradjene programabilne fleš memorije. Uredjaj je proizveden korišćenjem Atmelove tehnologije izrade nestalne memorije velike gustine i kompatibilan je sa skupom instrukcija i izlazima pinova industrijskog standarda 80C51. Fleš na čipu dozvoljava da programska memorija bude reprogramirana u sistemu ili od strane konvencionalnog programera nestalne memorije. Kombinovanjem različitih 8-bitnih CPU sa ugrađenom programabilnom fleš memorijom na monolitnom čipu, Atmel 89S52 je moćan mikrokontroler koji omogućava veoma fleksibilno i jeftino rešenje za mnoge ugrađene aplikacije za kontrolu. AT89S52 obezbeđuje sledeće standardne osobine: 8KB fleša, 256 bajta RAM-a, 32 U/I linije, Vočdog tajmer, dva pokazivača podataka, tri 16-bitna tajmera/brojača, šestovektorsku dvonivosku arhitekturu prekida, serijski port za puni dupleks, oscilator na čipu i taktnu mrežu. Kao dodatak, AT89S52 je dizajniran sa statičkom logikom za radnu frekvenciju ka nuli i podržava dva softverski birana režima smanjenja potrošnje. Režim praznog hoda zaustavlja CPU dok dozvoljava RAM memoriji, tajmerima/brojačima, serijskom portu i sistemu prekida da obavljaju funkcije. Režim prekida napajanja čuva sadržaj RAM memorije ali zaustavlja oscilator, onemogućavajući sve ostale funkcije čipa do sledećeg prekida ili resetovanja hardvera.

45

Konfiguracija pinova

46

Port 0 drivers – drajveri porta 0 RAM ADDR REGISTER – adresni registar ram memorije PORT 0 LATCH – Leč kolo Port 0 Flash –Fleš Stack pointer – pokazivač steka Program address register - adresni registar programske memorije Interrupt,serial port and timer blocks – prekid, serijski port i blokoivi tajmera Program counter – programski brojač Timing and control – izbor vremena i kontrola Instruction register – registar instrukcija Program logic – programska logika

47

Opis pinova VCC Napon napajanja GND Uzemljenje Port 0 Port 0 je 8-bitni dvosmerni U/I port sa otvorenim drejnom. Kao izlazni port, svaki pin moze da primi 8 TTL ulaza. Kada su prvi upisani u port 0 pinovi mogu biti korisćeni kao visoko impendansni ulazi. Port 0 takođe može biti konfigurisan da bude multipleksn niskoredna magistrala podataka/adresa za vreme pristupa spoljašnjem programu i memoriji podataka. U ovom režimu, P0 ima unutrašnju vuču. Port 0 takođe prima bajtove koda tokom fleš programiranja i šalje bajtove koda tokom verifikacije programa. Port 1 Port 1 je 8-bitni dvosmerni U/I port sa unutrašnjom vučom. Izlazni baferi porta 1 mogu da prime 4 TTL ulaza. Kada su prvi upisani u pinove porta 1, oni se jako vuku od strane unutrašnje vuče i mogu biti korišćeni kao ulazi.Kao ulazni, pinovi porta 1 koji se vuču spolja nisko će dati struju (IIL) zbog unutrašnje vuče. Kao dodatak, P1.0 i P1.1 mogu biti konfigurisani da budu tajmer/brojač 2 spoljašnja brojačka ulaza (P1.0/T2) i tajmer/brojač 2 okidačka ulaza(P1.1/T2EX), respektivno, kao što je pokazano u sledećoj tabeli. Port 1 takođe prima nisko-redne adresne bajtove tokom fleš programiranja i verifikacije. Tabela Pin porta Razne funkcije P1.0 T2(spoljni b rojački ulaz do tajmera/brojača 2),izlaz takta P1.1 T2EX (triger hvatanja/punjenja tajmera/brojača 2 i kontrola smera) P1.5 MOSI (koristi se za programiranje u sistemu) P1.6 MISO (koristi se za programiranje u sistemu) P1.7 SCK (koristi se za programiranje u sistemu) Port 2 Port 2 je 8-bitni dvosmerni U/I port sa unutrašnjom vučom. Izlazni baferi porta 2 mogu da prime 4 TTL ulaza. Kada su prvi upisani u pinove porta 2, oni se jako vuku od strane unutrašnje vuče i mogu biti korišćeni kao ulazi.Kao ulazni, pinovi porta 2 koji se vuču spolja nisko će dati struju (IIL) zbog unutrašnje vuče. Port 2 šalje adresne bajtove višeg reda tokom dobavljanja od spoljašnje programske memorije i tokom pristupa spoljašnjoj memoriji podataka koja koristi 16-bitne adrese (MOVX@DPTR). U ovoj aplikaciji, port 2 koristi jake unutrašnje vuče kada šalje prvi. Tokom pristupa spoljašnjoj memoriji podataka koja koristi 8-bitne adrese (MOVX@RI), port 2 šalje sadržaj specijalnog funkcijskog registra P2. Port 2 takođeprima Više adresne bitove i neke kontrolne signale tokom fleš programiranja i verifikacije.

48

Port 3 Port 3 je 8-bitni dvosmerni U/I port sa unutrašnjom vučom. Izlazni baferi porta 3 mogu da prime 4 TTL ulaza. Kada su prvi upisani u pinove porta 3, oni se jako vuku od strane unutrašnje vuče i mogu biti korišćeni kao ulazi.Kao ulazni, pinovi porta 3 koji se vuču spolja nisko će dati struju (IIL) zbog unutrašnje vuče. Port 3 takođe uslužuje funkcije raznih specijalnih osobina uređaja AT89S52, kao što je pokazano u sledećoj tabeli. Port 3 takođe prima kontrolne signale za fleš programiranje i verifikaciju. Tabela Pin porta Razne funkcije P3.0 (serijski ulazni port) P3.1 (serijski ulazni port) P3.2 (spoljnji prekid 0) P3.3 (spoljnji prekid 1) P3.4 (spoljnji ulaz tajmera 0) P3.5 (spoljnji ulaz tajmera 1) P3.6 (strob upisa spoljnje memorije podataka) P3.7 (strob čitanja spoljnje memorije podataka) RST ulaz. Jedinica na ovom pinu za dva mašinska ciklusa dok oscilator radi resetuje uređaj. Ovaj pin ima stanje 1 tokom 96 perioda oscilatora nakon što vočdog istekne. DISRTO bit u SFRAUXR(adresa 8EH) se može koristiti da onemogući ovu osobinu. U difoltnom stanju bita DISRTO, izlaz RESET HIGH je omogućen. ALE/PROG Address Latch Enable (ALE) je izlazni impuls za lečovanje nižeg bajta adrese tokom pristupa spoljnoj memoriji. Ovaj pin je takođe ulaz programskog impulsa(PROG) tokom fleš programiranja. U normalnom režimu, ALE se šalje konstantnom brzinom koja iznosi 1/6 frekvencije oscilatora i može se koristiti za spoljašnji tajming i taktne svrhe. Treba napomenuti da jedan ALE impuls se preskače tokom svakog pristupa spoljnoj memoriji podataka. Po želji. ALE funkcija se može onesposobiti postavljanjem bita 0 SFR lokacije 8EH. Sa postavljenim bitom,ALE je aktivan samo tokom MOVX ili MOVC instrukcije.U suprotnom slučaju, pin je slabo vučen naviše. Postavljanje ALE-onemogućavajućeg bita nema nikakvog efekta ako je mikrokontroler u spoljnom izvršnom modu. PSEN Omogućavanje skladištenja programa (PSEN) je strob čitanja spoljašnje programske memorije. Kada je AT89S52 izvršni kod za spoljnu programsku memoriju,PSEN se aktivira dvaput svakog mašinskog ciklusa, osim kada se dve PSEN aktivacije preskaču tokom svakog pristupa spoljnoj memoriji podataka. EA/VPP Omogućen spoljašnji pristup. EA mora biti vezan za masu da bi omogućio uređaju da preuzme kod od lokacija spoljne programske memorije počev od 0000H do FFFFH.

49

Ipak, treba napomenuti da ako je programiran bit zaklučavanja 1, EA će biti unutrašnje postavljen na reset. EA bi trebao da bude vezan na Vcc za izvršavanje unutrašnjeg programa. Ovaj pin takođe prima 12V napon za omogućavanje programiranja tokom fleš programiranja. XTAL1 Ulaz do invertujućeg oscilatorskog pojačavača i ulaz do unutrašnjeg taktnog kola. XTAL2 Izlaz do invertujućeg oscilatorskog pojačavača. Specijalni funkcijski registri Mapa memorijske oblasti na čipu nazvane prostor specijalnog funkcijskog registra (SFR) je prikazana u tabeli 1. Zapazite da nisu sve adrese iskorišćene i da nezauzete adrese ne mogu biti implementirane na čipu. Pokušaj čitanja ovih adresa će u opštem slučaju vratiti slučajne podatke a pokušaji upisivanja će imati neodređšen efekat. Korisnički softver nebi prvo trebao da upisuje na ovim neizlistanim lokacijama, pošto će se one možda koristiti u budućim proizvodima za pozivanje novih osobina. U tom slučaju, resetovane ili neaktivne vrednosti novih bitova će uvek biti 0. Tajmer 2 registri: Kontrolni i statusni bitovi su sadržani u registrima T2CON (prikazano u tabeli 2) i T2MOD (prikazano u tabeli 3) za tajmer 2. Registarski par (RCAP2H, RCAP2L) su registri uhvati/napuni za tajmer 2 u 16-bitnom režimu hvatanja ili 16-bitnom režimu auto-punjenja. Registri prekida: Bitovi koji omogućavaju individualne prekide su u IE registru. Dva prioriteta mogu biti uspostavljena za svaki od 6 izvora prekida u IP registru.

50

Tabela 2. T2CON – Kontrolni registar tajmera/brojača 2. Simbol Funkcija TF2 Zastavica prekoračenja tajmera 2 postavljena prekoračenjem tajmera 2 i mora se

softverski obrisati. TF2 neće biti postavljen kada je RCLK=1 ili TCLK=1 EXF2 Spoljnja zastavica tajmera 2 koja se postavlja kada je nastalo hvatanje ili punjenje usled

negativnog prelaza na T2EX i EXEN2 =1. Kada je dozvoljen prekid tajmera 2 ,EXF2=1 će prouzrokovati CPU-vektor-Tajmer 2 rutinu. EXF2 se mora softverski obrisati. EXF2 ne izaziva prekid u režimu brojanja unapred/unazad (DCEN=1).

RCLK Dozvola prijema takta. Kada je postavljen uzrokuje da serijski port koristi impulse prekoračenja tajmera 2 kao svoj prijemni takt u režimima 1 i 3 serijskog porta.RCLK=0 uzrokuje da se prekoračenja tajmera 1 koriste za prijemni takt

TCLK Dozvola predaje takta. Kada je postavljen uzrokuje da serijski port koristi impulse prekoračenja tajmera 2 kao svoj predajni takt u režimima 1 i 3 serijskog porta.RCLK=0 uzrokuje da se prekoračenja tajmera 1 koriste za predajni takt

EXEN2 Spoljnja dozvola tajmera 2. Kada je postavljen dozvoljava da se hvatanje ili punjenje javljaju kao rezultat negativnog prelaza na T2EX ako se tajmer 2 ne koristi da taktuje serijski port. EXEN2=0 uzrokuje da tajmer 2 ignoriše događaje na T2EX.

TR2 Start/stop kontrola za tajmer 2. TR2=1 startuje tajmer. C/T2 Izbor da li će tajmer 2 da radi kao brojač/tajmer. C/T2=0 za funkciju brojača. C/T2=1 za

brojač spoljnjih događaja (okidan padajućom ivicom). CP/RL2 Izbor hvatanje/punjenje.CP/RL2=1 uzrokuje da se hvatanje javlja kao rezultat negativnih

prelaza na T2EX ako je EXEN2=1. CP/RL2=0 izaziva da se automatsko punjenje javi kada tajmer 2 napravi prekoračenje ili da se javi negativan prelazna T2EX kada je EXEN2=1. Kada je RCLK ili TCLK=1 ovaj bit se ignoriše i tajmer se primmorava da da se automatski puni pri prekoračenju tajmera 2.

Tabela 3a. AUXR: Pomoćni registar

Not bit Addressable- nije bit adresabilan - Rezervisan za buduća proširenja DISALE Dozvoli/zabrani ALE DISALE Radni režim

0 ALE se šalje pri konstantnoj brzini od 1/6 frekvencije oscilatora 1 ALE je aktivan samo tokom MOVX ili MOVC instrukcija

51

DISRTO Dozvoli/zabrani reset izlaz DISRTO 0 reset pin se postavlja na visoko nakon tajm auta WDT 1 reset pin je isključivo ulazni WDIDLE Dozvoli/zabrani WDT u režimu praznog hoda WDIDLE

0 WDT nastavlja da broji u režimu praznog hoda 1 WDT zaustavlja brojanje u režimu praznog hoda

Dva registra pokazivača podataka: Da bi olakšali pristup unutrašnjoj i spoljnoj memoriji podataka obezbeđenje su dve banke 16-bitnih registara pokazivača podataka: DP0 na SFR adresnim lokacijama 82H-83H i DP1 na 84H-85H. Bit DPS+0 u SFR AUXR1 selektuje DP0 a DPS+1 selektuje DP1. Korisnik bi uvek trebao da inicijalizuje DPS bit na odgovarajuću vrednost pre pristupa odgovarajućem registru pokazivaču podataka. Zastavica koja ukazuje da li je napon isključen: Zastavica Power-off (POF) je locirana na bitu 4 (PCON.4) u PCON SFR. POF je podešeno na 1 dok ima napajanja. Može se setovati i držati pod softverskom kontrolom i na njega ne utiče resetovanje. Tabela 3b. AUXR1: Pomoćni registar 1

- Rezervisan za buduća proširenja DPS Izbor registra pokazivača podataka DPS

0 Selektuje DPTR registre DP0L i DP0H 1 Selektuje DPTR registre DP1L i DP1H

52

Organizacija memorije Uređaji MCS-51 imaju odvojeni adresni prostor za programsku i memoriju podataka. Do 64KB spoljne programske i memorije podataka može biti adresirano. Programska memorija Ako je EA pin vezan za masu, svi programski pozivi su usmerni ka spoljnoj memoriji. Na AT89S52, ako je EA vezan za VCC, programski pozivi adresama 0000H do 1FFFH se usmeravaju ka unutrašnjoj memoriji a pozivi adresama 2000H do FFFFH ka spoljnoj memoriji. Memorija podataka AT89S52 sadrži 256B RAM memorije na čipu. Viših 128B zauzima paralelni adresni prostor do specijalnih funkcijskih registara. Ovo znači da viših 128B ima iste adrese kao SFR prostor ali fizički odvojen od SFR prostora. Kada instrukcija pristupi unutrašnjoj lokaciji iznad adrese 7FH, adresni mod korišćen u instrukciji oređuje dali CPU pristupa višim 128B RAM memorije ili prostoru SFR. Instrukcije koje koriste direktno adresiranje pristupaju SFR prostoru. Na primer, sledeća direktno adresirajuća instrukcija pristupa SFR na lokaciji 0A0H (što je P2). MOV 0A0H, #data Instrukcije koje koriste indirektno adresiranje pristupaju višim 128B RAM memorije. Na primer, sledeća indirektno adresirajuća instrukcija, gde R0 sadrži 0A0H, pristupa bajtu podataka na adresi 0A0H, pre nego P2 (čija je adresa 0A0H). MOV @RO, #data Zapazite da su operacije skladištenja primeri indirektnog adresiranja, tako da viših 128B RAM-a podataka je slobodno kao prostor za skladištenje. Vočdog tajmer (Jedanput omogućen sa reset izlazom) WDT je zamišljen kao metod oporavka u situacijama kada CPU može biti predmet softverskih poremećaja. WDT se sastoji od 13-bitnog brojača i vočdog tajmer reset (WDTRST) SFR. WDT je difoltno podešen da onesposobi postojeći reset. Da bi omogućio WDT, korisnik mora upisati 01EH i 0E1H u sekvenci u WDTRST registar (SFR lokacija 0A6H). Kada je WDT omogućen, on će se inkrementirati svakog mašinskog ciklusa dok oscilator radi. WDT tajm aut period zavisi od spoljne taktne frekvencije. Ne postoji način da onesposobite WDT osim preko reseta (bolo hardverskog reseta ili WDT reseta prekoračenja). Kada WDT napravi prekoračenje, pobudiće izlazni impuls RESET HIGH na RST pinu. Korišćenje WDT Da bi osposobio WDT, korisnik mora da upiše 01EH i 0E1H u sekvenci u WDTRST registar (SFR lokacija 0A6H). Kada je WDT osposobljen, korisnik mora da ga održava upisivanjem 01EH i 0E1H u WDTRST da bi izbekao prekoračenje. 13-bitni brojač pravi prekoračenje kada dostigne 8191 (1FFFH), i ovo će resetovati uređaj. Kada je WDT osposobljen, on će se inkrementirati svakog mašinskog ciklusa dok oscilator radi. To znači da korisnik mora resetovati WDT najmanje jedanput svakih 8191 mašinskih ciklusa. Da bi resetovao WDT korisnik mora da upiše 01EH i 0E1H u WDTRST. WDTRST je registar u koji može samo da se upisuje. WDT brojač ne može da se čita ili da se u njega upisuje. Kada WDT napravi prekoračenje, on generiše izlani impuls RESET na RST pinu. Trajanje RESET impulsa je 96×TOSC, gde je TOSC=1/FOSC. Da bi ostvarili najbolju upotrebu WDT, on bi trebao biti servisiran u onim sekcijama koda koje će se periodično izvršavati unutar vremena potrebnog za sprečavanje WDT reseta.

53

WDT za vreme režima praznog hoda i prekida napajanja U režimu prekida napajanja oscilator se zaustavlja, što znači da se i WDT takođe zaustavlja. Dok je uređaj u režimu prekida napajanja korisnik ne mora da opslužuje WDT. Postoje dva metoda napuštanja režima pada napona: preko hardverskog reseta preko nivoski aktiviranog spoljnjeg prekida koji je prioritetan u odnosu na unošenje režima prekida napajanja. Kada je režim prekida napajanja napušten hardverskim resetom,opsluživanje WDT se treba vršiti normalno kao kada je AT89S52 resetovan. Napuštanje režima prekida preko prekida je značajno drugačije. Prerkid se drži nisko dovoljno dugo da se oscilator stabilizuje. Kada se prekid dovede na visoko, prekid se opslužuje. Da bi sprečili da WDT resetuje uređaj dok se pin prekida drži na nisko, WDT se ne startuje dok se prekid ne podigne na visoko. Preporučuje se da da WDT bude resetovan tokom opsluživanja prekida koji se koristi da bi se napustio režim prekida napajanja. Da bi se osiguralo da WDT ne napravi prekoračenje unutar nekoliko stanja izlaska iz režima prekida napajanja, najbolje je resetovati WDT pre nego što se unese režim prekida napajanja. Pre prelaska u režim praznog hoda,WDIDLE bit u SFR AUXR se koristi da odredi da li WDT nastavlja sa brojanjem ako je osposobljen. WDT nastavlja sa brojanjem tokom IDLE (WDIDLE bit =0) kao difoltno stanje. Da bi sprečili WDT da resetuje AT89S52 dok je u režimu praznog hoda, korinik treba uvek da podesi tajmer tako da periodično napusti režim praznog hoda,opsluđujući WDT, i zatim ponovo unese režim praznog hoda. Sa osposobljenim WDIDLE bitom WDT će zaustaviti brojanje u režimu praznog hoda i obnoviti brojanje nakon izlaska iz režima praznog hoda. UART UART u AT89S52 radi na isti na;in kao i UART u AT89C51 i AT89C52. Za dalje informacije o radu UART pogledajte ATMEL-ov web sajt (http://www.atmel.com). Sa početne strane sajta izaberite Products, a zatim 8051-Archicteture Flash Microcontroller a zatim Product overview. Tajmer 0 i 1 Tajmer 0 i tajmer 1 u AT89S52 rade na isti način kao i tajmer 0 i tajmer 1 u AT89C51 i AT89C52. Za dalje informacije o tajmerima pogledajte ATMEL-ov web sajt (http://www.atmel.com). Sa početne strane sajta izaberite Products, a zatim 8051-Archicteture Flash Microcontroller a zatim Product overview. Tajmer 2 Tajmer 2 je 16-bitni tajmer/brojač koji može da radi bilo kao tajmer ili brojač. Tip rada se bira bitom C/T2 u SFR T2CON (prikazan u tabeli 2). Tajmer 2 ima tri radna režima: hvatanje, auto-punjenje (brojanje naviše ili naniže) i generatora baud brzine. Režimi se biraju bitovima u T2CON, kao što je pokazano u tabeli 3. Tajmer 2 se sastoji od dva 8-bitna registra, TH2 i TL2. U funkciji tajmera registar TL2 se inkrementira svakog maašinskog ciklusa. Pošto se mašinski ciklus sastoji od 12 oscilatorskih perioda bruina brojanja je 1/12 frekvencije oscilatora. Tabela 3. Režimi rada tajmera 2. RCLK+TCLK CP/RL2 TR2 Režim 0 0 1 16-bitno auto-punjenje 0 1 1 16-bitno hvatanje 1 X 1 Generator baud brzine X X 0 (isključeno) U funkciji brojača, registar se inkrementira usled prelaska sa 1 na 0 na odgovarajućem spoljnjem ulaznom pinu, T2. U ovoj funkciji, spoljnji ulaz se uzorkuje tokom S5P2 svakog mašinskog ciklusa. Kada uzorci pokazuju visoko u jednom ciklusu a nisko u sledećem ciklusu brojač je inkrementiran. Nova vrednost brojanja se pojavljuje u registru tokom S3P1 ciklusa koji sledi onaj u kome je detektovan prelaz. Pošto dva mašinska ciklusa (24 perioda oscilatora) su potrebna za prepoznavanje

54

prelaska sa 1 na 0, maksimalna brzina brojanja je 1/24 frekvencije oscilatora. Da bi se osiguralo da je dati nivo uzorkovan najmanje jedanput pre nego što se promeni, nivo se mora držati bar jedan pun mašinski ciklus. Režim hvatanja U režimu hvatanja biraju se dve opcije pomoću bita EXEN2 u T2CON. Ako je EXEN2=0, tajmer 2 je 16-bitni tajmer ili brojač koji nakon prekoračenja postavlja bit TF2 u T2CON. Slika 5. Tajmer u režimu hvatanja

OVERFLOW-prekoračenje Capture-hvatanje TRANSITION DETECTOR-detektor prelaza TIMER 2 INTERRUPT-tajmer 2 prekid Ovaj bit zatim može biti korišćen da generiše prekid. Ako je EXEN2+1, tajmer 2 izvodi istu operaciju, ali prelaz sa 1 na 0 na spoljnjem ulazu T2EX takođe izaziva da tekuća vrednost u TH2 i TL2 bude uhvaćena u RCAP2H i RCAP2L, respektivno. Pored toga, prelaz u T2EX izaziva postavljanje bita EXF2 u T2CON. EXF2 bit, kao i TF2 može da generiše prekid. Režim hvatanja je ilustrovan na slici 5. Auto-punjenje (Brojač naviše ili naniže) Tajmer 2 se može programirati da broji naviše ili naniže kada je konfigurisan u njegovom 16-bitnom režimu auto-punjenja. Ova osobina se poziva bitom DCEN (Omogućavanje brojanja unazad) koji se nalazi u SFR T2MOD (vidi tabelu 4). Nakon resetovanja, DCEN bit je postavljen na 0 tako da tajmer 2 može da broji unapred ili unazad, zavisno od vrednosti T2EX pina. Slika 6 prikazuje tajmer 2 koji automatski broji unapred kada je DCEN=0. U ovom režimu, biraju se dve opcije pomoću bita EXEN2 u T2CON. Ako je EXEN2=0, tajmer 2 broji do 0FFFFH a zatim postavlja TF2 bit nakon prekoračenja. Prekoračenje izaziva da se tajmer registri napune 16-bitnom vrednošću u RCAP2H i RCAP2L. Vrednosti u tajmeru u režimu hvatanja RCAP2H i RCAP2L je unapred podešen softverski. Ako je EXEN2=1, !&-bitno punjenje se može okidati bilo prekoračenjem ili prelaskom sa 1 na 0 na spoljnjem ulazu T2EX. Ovaj prelaz takođe postavlja EXF2 bit. TF2 i EXF2 bitovi mogu da generišu prekid ako su osposobljeni. Postavljanje DCEN bita omogućava tajmer 2 da broji unapred ili unazad, što je prikazano na slici 6. U ovom režimu T2EX pin kontroliše smer brojanja. Logička 1 na T2EX omogućava da tajmer 2 broji unapred. Tajmer će napraviti prekoračenje pri vrednosti 0FFFFH i postaviti TF2 bit. Ovo prekoračenje takođe uzrokuje da se 16-bitna vrednost u RCAP2H i RCAP2L napuni u tajmer registre, TH2 i TL2, respektivno. Logička 0 na T2EX omogućava da tajmer 2 broji unazad. Tajmer pravi potkoračenje kada TH2 i TL2 se izjednači sa vrednošću koja se nalazi u RCAP2H i RCAP2L. Potkoračenje postavlja TF2 bit i uzrokuje da se tamer registre učita 0FFFFH. EXF2 bit se prebacuje uvek kada tajmer 2 prekorači ili potkorači i može se koristiti kao 17. bit rezolucije. U ovom režimu rada EXF2 ne postavlja zastavicu prekida.

55

Slika 6. Tajmer 2 u režimu auto punjenja (DCEN=0)

Tabela 4. T2MOD – Registar kontrole režima tajmera 2 Simbol Funkcija - Slobodan, rezervisan za naredne verzije T2OE Bit dozvole izlaza tajmera 2 DCEN Kada je postavljen ovaj bit dozvoljava da se tajmer 2 konfiguriše kao brojač

unapred/unazad Slika 7. . Tajmer 2 u režimu auto punjenja (DCEN=1)

(DOWN COUNTING RELOAD VALUE)-vrednost punjenja za brojanje unazad TOGGLE-prebabivač, prelaz COUNT DIRECTION 1=UP 0=DOWN- smer brojanja 1= unapred 0= unazad (UP COUNTING RELOAD VALUE)- vrednost punjenja za brojanje unapred

56

Slika 8 Tajmer 2 u režimu generatora baud brzine

NOTE: itd – frekvencija oscilovanja je podeljena sa 2 a ne sa 12 Generator baud brzine Tajmer 2 radi kao generator baud brzine postavljanjem TCLK i/ili RCLK u T2CON (tabela 2). Primetimo da baud brzine za predaju i prijem mogu biti različite ako se tajmer 2 koristi kao predajnik ili prijemnik a tajmer 1 za druge funkcije. Postavljanjem RCLK i/ili TCLK stavlja tajmer 2 u režim generatora baud brzine, kao što je prikazano na slici 8. Režim generatora baud brzine je sličan režimu auto-punjenja u tome što promena u TH2 uzrokuje da se registri tajmera 2 napune 16-bitnom vrednošćuiz registara RCAP2H i RCAP2L koji su unapred postavljeni softverski. Baud brzine u modovima 1 i 3 su određenje prekoračenjem brzine tajmera 2 prema sledećoj jednačini.

Baud brzina modova 1 i 3 = 16

2tajmerajaprekoracenBrzina

Tajmer može biti konfigurisan da obavlja funkciju tajmera ili brojača. U većini aplikacija konfigurisan je da radi kao tajmer (CP/T2=0). Tajmerski rad tajmera 2 je različit kada se koristi kao generator baud brzine. Uobičajeno, kao tajmer, on se uvećava svakog mašinskog ciklusa (na svaku 1/12 frekvencije oscilatora). Međutim, kao generator baud brzine uvećava svako stanje vremena ( na svaku 1/2 frekvencije oscilatora). Formula baud brzine je data ispod.

( )[ ]LRCAPHRCAPaoscilovanjafrekvencij

brzinaBaudiModovi

2,2655363231

−×=

Gde je ( LRCAPHRCAP 2,2 ) sadržaj RCAP2H i RCAP2L uzet kao 16-bitni neoznačeni intedžer. Tajmer 2 kao generator baud brzine je prikazan na slici 8. Ova slika je odgovarajuća samo ako je RCLK ili TCLK=1 u T2CON. Zapazimo da promene u TH2 ne postavljaju TF2 i neće generisati prekid. Takođe zapazimo da ako je EXEN2 postavljen, prelazak sa 1 na 0 će postaviti EXF2 ali neće prouzrokovati punjenje (TH2,TL2) iz (RCAP2H,RCAP2L). Tako kada se tajmer 2 koristi kao baud generator, T2EX se može koristiti kao dodatni spoljni prekid.

57

Primetimo da kada tajmer 2 radi kao tajmer u režimu baud brzine (TR2=1), TH2 ili TL2 ne bi trebali da se čitaju ili da se u njih upisuje. Pod ovim uslovima tajmer se uvećava svakog stanja vremena pa rezultati čitanja ili upisa mogu da ne budu tačni. RCAP2 registri se možda mogu čitati Ali se u njih ne treba upisivati, zato što upisivanje može da preklopi punjenje i da izazove greške upisa i/ili punjenja. Tajmer treba da bude isključen (TR2 obrisan) pre pristupa tajmeru 2 ili RCAP2 registrima. Slika 9 Tajmer 2 u režimu taktnog izlaza

Programabilni taktni izlaz 50% trajanja taktnog impulsa se može programirati da dođe na P1.0 kao što je prikazano na slici 9. Ovaj pin, pored toga što je običan U/I pin , ima dve različite funkcije. Može biti programiran da daje spoljašnji takt za tajmer/brojač 2 ili da šalje 50% trajanja taktnog impulsa počev od 61Hz do 4 MHz pri radnoj frekvenciji od 16MHz. Da bi konfigurisao tajmer/brojač 2 kao taktni generator, bit C/T2 (T2CON.1) se mora obrisati a bit T2OE (T2MOD.1) postaviti. Bit TR2 (T2CON.2) pokreće i zaustavlja tajmer. Frekvencija taktnog izlaza zavisi od frekvencije oscilatora i vrednosti punjenja registara hvatanja tajmera 2 (RCAP2H,RCAP2L), što je pokazano sledećom jednačinom.

Frekvencija taktnog izlaza = ( )[ ]LRCAPHRCAPjaaoscilovanfrekvencij

2,2655364 −×

U režimu taktnog izlaza promene tajmera 2 neće generisati prekid. Ovo ponašanje je slično onom kada se tajmer 2 koristi kao generator baud brzine. Moguće je istovremeno koristiti tajmer 2 i kao generator baud brzine i kao generator takta. Primetimo ipak da frekvencije baud brzine i izlaznog takta ne mogu biti određene jedna nezavisno od druge pošto obe koriste RCAP2H i RCAP2L.

58

Prekidi AT89S52 ima ukupno 6 vektora prekida: dva spoljna prekida (INT0 i INT1), tri tajmerska prekida (tajmeri 0,1 i 2) i prekid sa serijskog porta. Svi ovi prekidi su prikazani na slici 10. Svaki od ovih izvora prekida se može pojedinačno omogućiti ili onesposobiti postavljanjem ili brisanjem bita u specijalnom funkcijskom registru IE. IE takođe sadrži globalni bit za onesposobljavanje,EA, koji onesposobljava sve prekide istovremeno. Primetite da tabela 5 pokazuje da je pozicija bita IE6 neiskrišćena. U AT89S52, bit pozicija IE.5 je takođe neiskorišćena. Korisnički softver ne bi trebao da upisuje na ovim bitskim pozicijama, pošto one mogu biti korišćenje u narednim proizvodima AT89. Prekid tajmera 2 se generiše logičkim OR kolom bitova TF2 i EXF2 u registru T2CON. Nijedna od ovih zastavica nije obrisana hardverski kada je uslužni program takođe vektorisan. U stvari, uslužni program može da odredi koji je TF2 ili EXF2 generisao prekid, i taj bit mora biti deklarisan u softveru. Zastavice tajmera 0 i 1, TF0 i TF1, su postavljene u S5P2 u ciklusu u kome tajmeri prave prekoračenje. Vrednosti se tada pozivaju od strane strujnog kola u sledećem ciklusu. Ipak, zastavica tajmera 2 je postavljena u S2P2 i poziva se u istom ciklusu u kome tajmer pravi prekoračenje. Tabela 5 Registar(IE) dozvole prekida Bit dozvole=1 omogućava prekid Bit dozvole= 0 zabranjuje prekid Simbol Pozicija Funkcija EA IE.7 Zabranjuje sve prekide. Ako je EA=0 ne potvrđuje se nijedan prekid. Ako

je EA=1 svaki izvor prekida se pojedinačno dozvoljava ili zabranjuje postavljanjem ili brisanjem njegovog bita dozvole.

- IE.6 Rezarvisano. ET2 IE.5 Bit dozvole prekida tajmera 2 ES IE.4 Bit dozvole prekida serijskog porta ET1 IE.3 Bit dozvole prekida tajmera 1 EX1 IE.2 Bit dozvole spoljnjeg prekida 1 ET0 IE.1 Bit dozvole prekida tajmera 0 EX0 IE.0 Bit dozvole spoljnjeg prekida 0 Korisnički softver ne bi trebao da piše po rezervisanim bitovima zato što će se oni možda koristiti u budućim AT89 proizvodima. Slika 10 Izvori prekida

59

Karakteristike oscilatora XTAL1 i XTAL2 su ulaz i izlaz, respektivno, invertujućeg pojačavača koji se može konfigurisati tako da se upotrebljava kao oscilator ugrađen u čip, kao što je pokazano na slici 11. Može se koristiti bilo kvarcni ili keramički rezonator.Da bi upravljali uređajem sa spoljnjeg izvora takta, XTAL2 bi trebao da ostane nepovezan sa leve strane dok se sa XTAL1 upravlja, što je prikazano na slici 12. Ne javlja se potreba za ciklusom trajanja spoljnjeg taktnog signala pošto je ulaz u unutrašnje taktno strujno kolo prolazi kroz flip-flop delitelj sa 2, ali se minimalni i maksimalni napon visokog i niskog stanja impulsa moraju održavati. Režim praznog hoda U režimu praznog hoda, CPU stavlja sebe u stanje hibernacije dok svi krajevi čipa ostaju aktivni. Ovaj režim se poziva softverski. Sadržaj RAM memorije ugrađene u čipu i svih specijalnih funkcijskih registara ostaju nepromenjeni tokom ovog režima. Režm praznog hoda se može prekinuti svakim dozvoljenim prekidom ili hardverskim resetom. Treba napomenuti da kada se režim praznog hoda prekine hardverskim resetom, uređaj nastavlja sa izvršenjem programa tamo gde je program bio prekinut, do dva mašinska ciklusa pre nego što unutrašnji algoritam resetovanja preuzme kontrolu. Ugrađeni hardver u čipu zabranjuje u ovom slučaju pristup unutrašnjoj RAM memoriji, ali pristup pinovima porta nije zabranjen. Da bi sprečio mogućnost neočekivanog upisa u pin porta kada se režim praznog hoda okonča resetom, instrukcija koja sledi onu koja poziva režim praznog hoda ne bi trebalo da upisuje u pin porta ili spoljnju memoriju. Rezim prekida napajanja U režimu prekida napajanja, oscilator se zaustavlja a instrukcija koja poziva režim prekida napajanja je poslednja instrukcija koja je izvršena. RAM ugrađena u čip i specijalni funkcijski registri zadržavaju svoje vrednosti dok se režim prekida napajanja ne izvrši. Izlazak iz režima prekida napajanja se može inicirati bilo hardverskim resetom ili dozvoljenim spoljnjim prekidom. Reset redefiniše SFR registre ali ne menja RAM ugrađenu u čip. Reset ne treba aktivirati pre nego što se Vcc ponovo postavi na njegov normalni radni nivo i mora se držati aktivnim dovoljno dugo da omogući oscilatoru da se restartuje i stabilizuje. Tabela 6. Status spoljašnjih pinova tokom režima praznog hoda i prekida napajanja

60

Režim Programska memorija

ALE PSEN PORT0 PORT1 PORT2 PORT3

Praznog hoda

unutrašnja 1 1 podatak podatak podatak podatak

Praznog hoda

spoljnja 1 1 Plivajuće,neodređeno stanje

podatak adresa podatak

Prekida napajanja

unutrašnja 0 0 podatak podatak podatak podatak

Prekida napajanja

spoljnja 0 0 Neodređeno stanje podatak podatak podatak

Slika 11 Veze oscilatora

Napomena: C1,C2 = za kristale = za keramičke rezonatore Slika 12 Konfiguracija upravljanja spoljnim taktom

EXTERNAL OSCILLATOR SIGNAL- signal spoljneg oscilatora

61

Bitovi zaključavanja programske memorije AT89S52 ima tri bita zaključavanja koji mogu biti ostavljeni neprogramirani (U) ili mogu biti programirani (P) da opslužuju dodatne osobine izlistane u sledećoj tabeli. Tabela 7 Režimi zaštite bita zaključavanja Bitovi zaključavanja programa LB1 LB2 LB3

Tip zaštite

1 U U U Bez osobine zaključavanja programa 2 P U U MOVC instrukcije koje se izvršavaju iz

spoljnje programske memorije se zabranjuju od pozvanih bajtova koda iz unutrašnje memorije, EA se uzorkuje i lečuje na resetu, a dalje programiranje fleš memorije onemogućava

3 P P U Isto kao u režimu 2 ali se i verifikacija takođe zabranjuje

4 P P P Isto kao u režimu 3 ali se zabranjuje i spoljnje izvršenje

Kada je bit zaključavanja 1 programiran, logički nivo na EA pinu se uzorkuje i lečuje tokom reseta. Ako se uređaj napaja bez reseta, leč kolo se inicijalizuje na slučajnu vrednost i drži tu vrednost dok se reset ne aktivira. Lečovana vrednost EA se mora poklopiti sa trenutnim logičkim nivoom na ovom pinu da bi uređaj ispravno funkcionisao. Programiranje fleša – paralelan režim AT89S52 je opremljen sa ugrađenim nizom fleš memorije spremnim za programiranje. Programski interfejs zahteva visokonaponski (12V) programski dozvoljen signal i kompatibilan je sa ostalim fleš ili EPROM programerima. Kodni memorijski niz za AT89S52 je programiran bajt-po-bajt. Programiranje algoritma: Pre programiranja AT89S52, adresni,kontrolni i signali podataka treba da se podese po tabeli režima fleš programiranja i slikama 13 i 14. Da bi programirali AT89S52 sledite naredne korake:

1. Unesite željenu memorijsku lokaciju na adresne linije. 2. Unesite odgovarajući bajt podataka na linijama podataka. 3. Aktivirajte odgovarajuću kombinaciju kontrolnih signala 4. Podignite EA/Vpp na 12V 5. Pobudite ALE/PROG jedanput da bi programirali bajt u fleš nizu ili bitovima zaključavanja.

Ciklus upisa bita je samopodešen i obično ne traje više od 50µs. Ponovite korake od 1 do 5, menjajući adresu i podatak za ceo niz ili dok se ne dosegne kraj fajla

Poziv podataka (Data Polling): AT89S52 poseduje osobinu Data Polling da ukaže na kraj ciklusa upisa bajta. Tokom upisnog ciklusa, pokušaj čitanja poslednje upisanog bajta će rezultovati komplementom upisanog podatka na P0.7. Jednom kada se upisni ciklus komplementira, pravi podatak je validan na svim izlazima tako da sledeći ciklus može da počne. Data Polling može da počne bilo kad nakon što je upisni ciklus započet. Ready/Busy (slobodan/zauzet): Napredak bajt programiranja se takođe može nadgledati pomoću RDZ/BSZ izlaznog signala. P3.0 se uzima nisko nakon što ALE postane visoko tokom programiranja da bi pokazivao BUSZ. P3.0 se ponovo uzima visoko kada je programiranje završeno da bi pokazivao READY. Verifikacija programa: Ako bitovi zaključavanja LB1 i LB2 nisu programirani, programirani kod podataka se može ponovo pročitati preko adrese i linija podataka za verifikaciju. Status pojedinačnih bitova zaključavanja može biti verifikovan njihovim ponovnim čitanjem.

62

Čitanje bajtova znaka: Bajtovi znaka se čitaju istom procedurom kao i normalna verifikacija lokacija 000H, 100H i 200H, osim što P3.6 i P3.7 moraju biti uzeti kao logičko nisko. Vraćene vrednosti su. (000H) = 1EH ukazuje da je proizvod Atmelov (100H) = 52H ukazuje na 89S52 (200H) = 06H Brisanje čipa: U režimu paralelnog programiranja operacija brisanja čipa se poziva korišćenjem određene kombinacije kontrolnih signala i pobuđujući ALE/PROG nisko u trajanju od 200-500ns. U režimu serijskog programiranja operacija brisanja čipa se poziva instrukcijom za brisanje čipa. U ovom režimu brisanje čipa je samopodešeno i iznosi oko 500ms. Tokom brisanja čipa, serijsko čitanje sa bilo koje adresne lokacije će vratiti 00H na ulaz podataka. Programiranje fleša – serijski režim Memorijski niz koda se može programirati korišćenjem serijskog ISP interfejsa dok je RST podešen naq Vcc. Serijski interfejs se sastoji od pinova SCK, MOSI (ulaz) i MISO (izlaz). Nakon što je RST postavljen na visoko, instrukcija dozvole programiranja se mora prvo izvršiti da bi se zatim ostale operacije mogle izvršiti. Da bi se sekvenca reprogramiranja mogla javiti zahteva se operacija brisanja čipa Operacija brisanja čipa pretvara sadržaj svake memorijske lokacije u kodnom nizu u FFH. Ili se takt spoljnjeg sistema napaja na pinu XTAL1 ili kristal mora da bude povezan preko pinova XTAL1 i XTAL2. Maksimalna frekvencija serijskog takta (SCK) bi trebalo da bude manja od 1/16 frekvencije kristala. Sa taktom oscilatora od 33MHz maksimalna SCK frekvencija je 2 MHz. Algoritam serijskog programiranja Da bi programirali i verifikovali AT89S52 u režimu serijskog programiranja potrebna je sledeća sekvenca:

1. Sekvenca napajanja: Dovedite napon između Vcc i GND pinova.

Postavite RST pin na “H”. Ako kristal nije povezan preko pinova XTAL1 i XTAL2 primenite takt od 3-33MHz na XTAL1 pin i čekajte najmanje 10 milisekundi. 2. Omogućite serijsko programiranje slanjem instrukcije serijskog programiranja na pin

MOSI/P1.5. Frekvencija takta pomeranja na pinu SCK/P1.7 treba da bude manja od takta CPU na XTAL1 podeljeno sa 16.

3. Kodni niz se programira bajt po bajt slanjem adrese i podatka zajedno sa odgovarajućom instrukcijom upisa. Upisni ciklus je samopodešen i obično iznosi manje od 1ms na 5 V

4. Svaka memorijska lokacija se može verifikovati korišćenjem instrukcije čitanja koja vraća sadržaj izabrane adrese na serijski izlaz MISO/P1.6.

5. Na kraju sesije programiranja RST se može postaviti na nisko da bi se započeo normalni rad uređaja.

Sekvenca prekida napajanja (ako je potrebna): Postavite XTAL1 na “L” (ako se ne koristi kristal). Postavite RST na “L”. Isključite napajanje Vcc. Data Polling (poziv podataka): Osobina Data Polling je takođe dostupna u serijskom režimu. U ovom režimu, tokom upisnog ciklusa pokušaj čitanja poslednje upisanog bajta će rezultovati komplementom bita MSB serijskog bajt izlaza na MISO. Skup instrukcija za serijsko programiranje Skup instrukcija za serijsko programiranje prati 4-bajtni protokol i prikazan je u tabeli 10.

63

Programiranje Interfejsa- Paralelni mod Svaki bajt koda u Flash polju može se programirati korišćenjem odgovarajuće kombinacije kontrolnih signala. Ciklus operacije upisa je samo taktujući i po inicijalizaciji se automatski taktuje do završetka. Sve veće programerske kompanije širom sveta nude podršku za Atmel-ove serije mikrokontrolera. Da biste došli do odgovarajućih verzija softvera kontaktirajte svoju lokalnu programersku kompaniju Tabela 8. Flash modovi programiranja

P2.4-0

P1.7-0 Mod VCC RST

PSEN ALE/

______________

PROG ___ EA/ VPP

P2.6 P2.7 P3.3 P3.6 P3.7 P0.7-0 Data Adresa

Upis podataka koda

5V H L 12V

L H H H H DIN A12-8

A7-0

Čitanje podataka koda

5V H L H H L L L H H DOUT A12-8

A7-0

Upis zaključanog bita 1

5V H L 12V

H H H H H X X X

Upis zaključanog bita 2

5V H L 12V

H H H L L X X X

Upis zaključanog bita 3

5V H L 12V

H L H H L X X X

Čitanje zaključanih bitova 1, 2, 3

5V H L H H H H L H L P0.2,P0.3,P.0.4

X X

Brisanje čipa 5V H L 12V

H L H L L X X X

Čitanje Atmel-ovog ID

5V H L H H L L L L L 1EH X 0000

00H

Čitanje ID komponente

5V H L H H L L L L L 52H X 0001

00H

Čitanje ID komponente

5V H L H H L L L L L 06H X 0010

00H

Napomene:

1. Svaki PROG impuls je 200 ns – 500 ns za brisanje čipa 2. Svaki PROG impuls je 200 ns – 500 ns za upis podataka koda 3. Svaki PROG impuls je 200 ns – 500 ns za upis zaključanih bitova 4. RDY / BSY signal je izlaz na P0.3 za vreme programiranja

64

Slika 13. Programiranje Flash memorije (Paralelni mod)

sl.13 sl.14 ADDR. 0000H/1FFFH (Adrese od 0000H do 1FFFH= SEE FLASH PROGRAMMING MODES TABLE ( Videti tabelu modova programiranja Flash – a) Slika 14. Verifikacija Flash memorije (Paralelni mod) SEE FLASH PROGRAMMING MODES TABLE ( Videti tabelu modova programiranja Flash – a) PGM DATA (koristiti 10k prevlačenje) Programiranje Flash-a i karakteristike verifikacije (Paralelni mod) TA = 20°C do 30°C, VCC = 4.5 do 5.5V

65

Slika 15 Talasni oblici signala za vreme programiranja i verifikacije Flash-a Paralelni mod

DATA IN Ulaz podataka DATA OUT Izlaz podataka ENABLE (Aktiviranje) BUSY (Zauzet) READY (Spreman) LOGIC 1 (Logička jedinica) LOGIC 0 (Logička nula) Slika 16 Serijsko daunloadovanje Flash memorije

INSTRUCTION INPUT – Ulaz za instrukcije Data output – Izlaz za podatke Clock in – Ulaz za takt Talasni oblici za programiranje i verifikaciju – Serijski mod

66

Slika 17. Talasni oblici serijskog programiranja

SERIAL DATA INPUT – serijski input za podatke SERIAL DATA OUTPUT – serijski izlaz za podatke SERIAL CLOCK INPUT – serijski ulaz za takt Tabela 9 Skup instrukcija za serijsko programiranje

Napomene:

1. Bajtovi potpisa nisu čitljivi u modu zaključanih bitova 3 i 4 2. B1 = 0, B2 = 0 ---> Mod 1, nema zaštite zaključavanjem

B1 = 0, B2 = 1 ---> Mod 2, zaključani bit 1 aktiviran B1 = 1, B2 = 0 ---> Mod 3, zaključani bit 2 aktiviran B1 = 1, B2 = 1---> Mod 4, zaključani bit 3 aktiviran

Svaki od zakljušanih bitova mora da bude aktiviran sekvencijalno pre nego što se Mod 4 može izvršiti

Posle postavljanja reset signala na visoko SCK treba da bude na nisko najmanje 64 sistemska takta pre nego što ode na visoko radi aktivacije bajtova podataka ??? Pulsiranje Reset signala nije potrebno. SCK ne treba da bude brži od 1/16 sistemskog takta na XTAL1. Za čitanje / upis stranice, podaci uvek počinju od bajta 0 do bajta 255. Pošto su komandni bajt i gornji bajt adrese zapamćeni, svaki bajt posle tretira se kao podatak dok se svih 256 bajtova ne pomeri unutra/van. Onda će sledeća instrukcija biti spremna za dekodiranje

67

Karakteristike serijskog programiranja Slika 18 Vremenski dijagram serijskog programiranja

Tabela 10 Karakteristike serijskog programiranja TA = -40° C do 85° C, VCC = 4.0 - 5.5V (Ukoliko nije drugačije navedeno) Simbol Parametar Min Tip Max Jedinica

mere 1/tCLCL Frekvencija Oscilatora 0 33 MHz tCLCL Perioda oscilovanja 30 ns TSHSL SCK širina impulsa

visoko 2 tCLCL ns

TSLSH SCK širina impulsa nisko

2 tCLCL ns

TOVSH Podešavanje MOSI na SCK visoko

tCLCL ns

TSHOX Zadržavanje MOSIpošto je SCK na visoko

2 tCLCL ns

TSLIV SCK nisko na MISO validno

10 16 32 ns

TERASE Vreme ciklusa brisanja instrukcije na čipu

500 ms

TSWC Vreme ciklusa serijskog upisa bajta

64 tCLCL+400

µs

Apsolutni maksimalni granični uslovi Radna temperatura -55°C do +125°C Temperatura skladištenja -65°C do +150°C Napon na bilo kom pinu u odnosu na uzemljenje -1.0V to +7.0V Maksimalni radni napon 6.6 V DC izlazna struja 15.0 mA Uslovi izvan ovih granica mogu izazvati trajno oštećenje komponente. Rad komponente pod navedenim graničnim uslovima (ili pod uslovima van ovih granica) se ne podrazumeva. Izlaganje komponente maksimalnim graničnim uslovima u dužem vremenskom periodu može uticati na pouzdanost komponente.

68

DC karakteristike Vrednosti prikazane u ovoj tabelivalidne su za T

A = -40°C do 85°C and V

CC = 4.0V do 5.5V,

ukoliko nije naznačeno drugačije.

Napomene:

1. u stabilnom stanju (ne tokom prelaza) Iol mora biti eksterno ogrančena u skladu sa sledećim Maksimalma Iol po pinu porta 10 mA Maksimalma Iol po osmobitnom portu Port 0 26 mA Portovi 1,2,3 15 mA Maksimalna ukupna Iol za sve izlazne pinove 71 mA Ukoliko Iol premaši uslove testa, Vol može premašiti odgovarajušu specifikaciju. Nije garantovano da pinovi mogu provoditi struje veće od navedenih uslova testiranja.

2. Minimalni Vcc za mod isključenja napajanja (power down) je 2 V.

AC karakteristike Pod radnim uslovima kapacitivnost opterećenja na portu 0, ALE / PROG i PSEN je 100pF, kapacitivnost opterećenja svim ostalin portovima je 80 pF

69

Karakteristike eksterne programske i memorije podataka

Ciklus čitanja eksterne programske memorije

Ciklus čitanja eksterne memorije podataka

70

Ciklus upisa u eksternu memoriju podataka

Talasni oblici uređaja (drajva) za eksterno taktovanje

Uređaj za eksterno taktovanje Simbol Parametar Min Max Jedinica

mere 1/tCLCL Frekvencija Oscilatora 0 33 MHz tCLCL Perioda takta 30 ns TCHCX Vreme - visoko 12 ns TCLCX Vreme - nisko 12 ns TCLCH Vreme uspona 5 ns TCHCL Vreme opadanja 5 ns Sinhronizacija serijskog porta: Uslovi testiranja moda pomeračkg registra Vrednosti u ovoj tabeli validne su za Vcc = 4.0 V do 5.5 V i kapacitivnost opterećenja = 80 pF

12 Mhz Oscilator Promenljivi Oscilator

Jedinica mere

Simbol Parametar

Min Max Min Max TXLXL Vreme ciklusa takta

serijskog porta 1.0 12tCLCL µs

TQVXH Podešavanje izlaznih podataka na rastuću ivicu takta

700 10tCLCL-133

ns

TXHQX Zadržavanje izlaznih podataka posle rastuće ivice takta

50 2tCLCL-80

ns

TXHDX Zadržavanje ulaznih podataka posle rastuće ivice takta

0 0 ns

TXHDV Rastuća ivica takta na ulaz validnih podataka

700 10tCLCL-133

ns

71

Talasni oblici sinhronizacije moda pomeračkg registra

Ulazni / Izlazni talasni oblici AC testiranja “Plutajući”talasni oblici

Ulazni / Izlazni talasni oblici AC testiranja Napomena: AC ulazi za vreme testiranja su na Vcc -05 V za logičku jedinicu i 0.45 V za logičku nulu Merenja sinhronizacije izvršena su na VIH min za logičku jedinicu i VIL max za logičku nulu “Plutajući”talasni oblici Timing reference points - Referentne tačke sinhronizacije Napomena: Za potrebe sinhronizacije pin porta nije više “plutajući” kada dođe do promene od 100 mV od napona opterećenja. Pin porta počinje da plutakada dođe do promene od 100 mV od nivoa VOH / VOL

Podaci o naručivanju

Brzina (MHz)

Napon napajanja Kod naručivanja Pakovanje Opseg rada

24 4.0V to 5.5V AT89S52-24AC 44A Komercijalni AT89S52-24JC 44J (0°C to 70°C)

AT89S52-24PC 40P6 AT89S52-24AI 44A Industrijski

AT89S52-24JI 44J (-40°C to 85°C)

AT89S52-24PI 40P6 33 4.5V to 5.5V AT89S52-33AC 44A Komercijalni AT89S52-33JC 44J (0°C to 70°C)

AT89S52-33PC 40P6

= Preliminarna dostupnost Tip pakovanja

44A 44-nožice, tanko plastično (galeblje krilo) kvadratno plosnato kućište (TQFP)

44J 44- nožice, plastični J-provodni nosač čipa (PLCC)

40P6 40-pina, 0.600" široko, plastično dualno Inline pakovanje (PDIP)

72

Podaci o pakovanju 44A – 44 nožice, tanko (1.0 mm) plastično kvadratno pljosnato pakovanje (TQFP) Dimenzije u milimetrima i (inčima)* *Kontrolna dimenzija: milimetri 44J – 44 nožice, plastični J-provodni nosač čipa (PLCC) Dimenzije u inčima i (milimetrima) 40P6 – 40 pina, 0.600" široko, plastično dualno Inline pakovanje (PDIP) Dimenzije u inčima i (milimetrima)

73

Podaci o pakovanju

74

6.3. Softveri u izvornom obliku

Project1

Asembler za levi mikrokontroler

;RECEIVE PC ,LEVI MIKROKONTROLER=IC1 STATUS EQU 20H NOTSEND EQU STATUS.0 ;BAJT NIJE POSLAT RECEIVED EQU STATUS.1 FULL EQU STATUS.2 FLAGS EQU 21H SOH EQU FLAGS.0 ;START OF HEADER STX EQU FLAGS.1 ;START OF TEXT ETX EQU FLAGS.2 ;END OF TEXT FLAG PAUSE EQU 30H REC EQU 31H ;PRIMLJENI BAJT IZ SBUF-a ADRHI EQU 32H ADRLO EQU 33H BROREC EQU 34H ;hardware- in/out pins BUSY EQU P1.3 CE EQU P1.4 RSEG CODE START JMP MAIN ORG START+SINT ;obrada serijskog interapta JB RI,RX JB TI,TX RX JMP RECEIVE TX JMP TRANS ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;º inicijalizacija TIMER-a, reset.RAM-a i sl. º ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ MAIN MOV IE,#00H ;zabrana svih interapta MOV SP,#70H ;definisanje steka ;(0FDH - 9600 Q=11.0592MHz) INIC: MOV TH1,#0FDH ;definisanje brzine tajmera T1 MOV TL1,TH1 MOV TMOD,#020H ;T1 = AUTORELOAD MOV SCON,#050H ;dozvola serijskog prijema SETB TR1 ;STARTUJE tajmer 1 ;******* resetovanje rama ***** MOV R0,#08 RESR MOV A,#0 MOV @R0,A INC R0 MOV A,R0

75

CJNE A,#070H,RESR ;RESETUJE INTERNI RAM MOV IE,#090H ;DOZVOLA INTERUPT-A SER.PORTA CALL CLRMEM ;CLEAR DUAL PORT RAM CLR STX CLR SOH CLR ETX ;** GLAVNI PROGRAM ** GP JNB RECEIVED,$ CLR RECEIVED JB STX,PRIMAX STHED JB SOH,VIMOD. ;SOH=01 (ASCII) MOV A,REC CJNE A,#01,VIMOD SETB SOH MOV ADRHI,#0 MOV ADRLO,#0 MOV BROREC,#01 CALL WRITE JMP GP VIMOD MOV A,BROREC CJNE A,#01,VIBP MOV A,REC CJNE A,#0,VIMOD1 INC BROREC ;SADA JE BROREC 2 CALL WRITE JMP GP VIMOD1 CJNE A,#01,MCLEAR INC BROREC ;SADA JE BROREC 2 CALL WRITE JMP GP MCLEAR CJNE A,#02,VIBP ;MOD2=CLEARRAM CALL CLRMEM CALL RDALL CLR SOH JMP GP VIBP MOV A,BROREC ;BROJ PORUKE CJNE A,#02,VISTX INC BROREC ;SADA JE BROREC 3 CALL WRITE JMP GP VISTX MOV A,BROREC CJNE A,#03,GP MOV A,REC CJNE A,#02,GP SETB STX CALL WRITE JMP GP PRIMAX JB ETX,CEKRAJ MOV A,REC

76

CJNE A,#03,NORMAL SETB ETX CLR SOH CALL WRITE ;UPISUJE ETX MOV R7,ADRHI ;STORE ACTAUL RAM ADRESS MOV R6,ADRLO MOV ADRHI,#001H MOV ADRLO,#0FFH ;1FFH=511dec MOV REC,#01 ;BYTE FOR WRITE CALL WRITE ;SETUJE SEMAFOR NA KRAJU PRVOG DELA RAMA MOV ADRHI,R7 MOV ADRLO,R6 ;RESTORE ADRESS JMP GP NORMAL CALL WRITE ;UPISUJE PRISTIGLI PODATAK U PRVI DEO RAMA JMP GP CEKRAJ MOV A,REC CJNE A,#04,NOTEOT CALL WRITE CLR STX CLR ETX CLR SOH CLR FULL JMP GP NOTEOT MOV A,REC CJNE A,#01,NOTSOH CLR STX CLR ETX CLR SOH CLR FULL JMP STHED ;START HEADER NOTSOH JMP GP ;**** CLEAR RAM ********************* CLRMEM MOV ADRHI,#0 MOV ADRLO,#0 CLR FULL WRT0 MOV REC,#0 ;BRISE MEMORIJU CALL WRITE JNB FULL,WRT0 CLR FULL RET ;**** UPIS U MEM. ADRESU ADRHI,LO *** WRITE JB FULL,EXWRITE ;NE UPISUJE AKO JE RAM NAPUNJEN PISHI SETB BUSY ;BUSY PIN DUAL PORT RAMA MOV A,REC MOV DPH,ADRHI MOV DPL,ADRLO CLR CE ;CHIP ENABLE DUAL PORT RAMA NOP JNB BUSY,$

77

MOVX @DPTR,A NOP SETB CE CLR C MOV A,ADRLO ;INC ADRHI,LO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A CJNE A,#04,EXWRITE ;400H JE PREKORACENJE MEMORIJE SETB FULL EXWRITE RET ;**** CITANJE OD ADRESE 00 DO 0400H *** RDALL MOV ADRHI,#0 ;RESETUJE ADRESU ZA CITANJE MOV ADRLO,#0 RDX MOV DPH,ADRHI MOV DPL,ADRLO CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR ;CITA RAM SA DPH,DPL NOP SETB CE CALL SCHAR ;SALJE BAJT NA SER.PORT CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A MOV A,ADRLO JNZ RDX MOV A,ADRHI CJNE A,#04,RDX CLR RECEIVED RET ;**** SLANJE 1 KARAKTERA ** SCHAR JB NOTSEND,$ SETB NOTSEND MOV SBUF,A RET ;************************************************ ;SERIAL INPUT INTERRUPT ROUTINE ;************************************************ RECEIVE PUSH ACC PUSH PSW ;SAVE ACC AND CURRENT BANK SELECT PUSH DPH

78

PUSH DPL MOV REC,SBUF PPI SETB RECEIVED CLR RI POP DPL POP DPH POP PSW POP ACC RETI ;******** PREDAJA ********** TRANS CLR TI CLR NOTSEND RETI END START

79

Asembler za desni mikrokontroler

;READ IDT7130 & SEND TO PC ,DESNI MIKROKONTROLER=IC3 STATUS EQU 20H NOTSEND EQU STATUS.0 ;BAJT NIJE POSLAT RECEIVED EQU STATUS.1 ;'STIGAO' BAJT NA SER. PORT EOT EQU STATUS.2 ;EOT FLAG ADRHI EQU 30H ADRLO EQU 31H UPIHI EQU 32H UPILO EQU 33H BROPOR EQU 34H ;hardware- in/out pins BUSY EQU P1.3 CE EQU P1.4 RSEG CODE START JMP MAIN ORG START+SINT ;obrada serijskog interapta JB RI,RX JB TI,TX RX JMP RECEIVE TX JMP TRANS ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;º inicijalizacija TIMER-a,reset.RAM-a i sl. º ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ MAIN MOV IE,#00H ;zabrana svih interapta MOV SP,#70H ;definisanje steka ;(0FDH - 9600 bauda Q=11.0592MHz) INIC: MOV TH1,#0FDH ;definisanje brzine tajmera T1 MOV TL1,TH1 MOV TMOD,#020H ;T1 = AUTORELOAD MOV SCON,#050H ;dozvola serijskog prijema SETB TR1 ;STARTUJE tajmer 1 ;******* resetovanje rama ***** MOV R0,#08 RESR MOV A,#0 MOV @R0,A INC R0 MOV A,R0 CJNE A,#070H,RESR ;BRISE INTERNI RAM MOV IE,#090H ;DOZVOLA INTERUPT-A SER. PORTA ;****** GLAVNI PROGRAM ******** GP MOV ADRHI,#001H MOV ADRLO,#0FFH CALL READ1 CJNE A,#01,GP ;semafor MOV R1,#0FFH

80

MOV R0,#06 PAUSE15 DJNZ R1,$ ;PAUZA 1.536 mS MOV R1,#0FFH DJNZ R0,PAUSE15 MOV ADRHI,#0 MOV ADRLO,#01 CALL READ1 JZ CELAPOR JMP RAZLPOR CELAPOR MOV BROPOR,#0 ;UPISUJE CELU PORUKU KAO 0-tu CALL UPIPOR ;UPISUJE celu PORUKU u drugi deo RAMA MOV ADRHI,#0 MOV ADRLO,#01 MOV R7,#0FFH CALL WRITE ;SEMAFOR KRAJA UPISA PORUKA CALL RDALL ;salje celu memoriju NAZAD U PC MOV ADRHI,#001H MOV ADRLO,#0FFH MOV R7,#0 ;VREDNOST ZA UPIS U RAM CALL WRITE ;RESETUJE SEMAFOR JMP GP RAZLPOR MOV ADRHI,#0 MOV ADRLO,#02 CALL READ1 MOV BROPOR,A CALL UPIPOR ;UPISUJE PORUKU NA ODGOVARAJUCU POZ. CALL ISPEOT JNB EOT,NENDPOR ;NEMA KRAJNJE PORUKE MOV ADRHI,#0 MOV ADRLO,#01 MOV R7,#0FFH CALL WRITE ;SEMAFOR KRAJA UPISA PORUKA NENDPOR CALL RDALL MOV ADRHI,#001H MOV ADRLO,#0FFH MOV R7,#0 CALL WRITE ;RESETUJE SEMAFOR CLR EOT ;SPREMAN ZA SLEDECI BLOK NOTFLAG JMP GP ;***** ISPITIVANJE EOT ****** ISPEOT CLR C ;UVECAVA AKTUELNU ADRESU ZA CITANJE MOV A,ADRLO ;IZ PRVOG DELA RAMA ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A CALL READ1 MOV R7,A

81

CJNE A,#04,EXISP SETB EOT EXISP RET ;***** UPIS PORUKE NA ODG.POZ U DRUGI DEO RAMA ***** UPIPOR MOV UPIHI,#0 MOV UPILO,#0 MOV A,BROPOR JZ NOMATH MOV R1,A ;U R1 JE BROJ PORUKE ADD16 CLR C ;DODAJE PO 16 BAJTA ZA SVAKU PORUKU MOV A,UPILO ADDC A,#016 MOV UPILO,A MOV A,UPIHI ;UPIHI,LO=MEM. ADRESA ZA UPIS U ADDC A,#0 ;DRUGI DEO RAMA MOV UPIHI,A DJNZ R1,ADD16 NOMATH MOV ADRHI,#0 ;POCETAK TEKSTA POSLE HEADER-A MOV ADRLO,#04 ;JE UVEK NA ADRESI 004 RDPOR CALL READ1 CJNE A,#03,CLASIC ;03=ETX (ASCII) JMP EXUPI CLASIC MOV R7,A ;U R7 JE VREDNOST ZA UPIS CALL WRMSG ;UPISUJE BAJT PO BAJT U DRUGI DEO RAMA CLR C ;UVECAVA AKTUELNU ADRESU ZA CITANJE MOV A,ADRLO ;IZ PRVOG DELA RAMA ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A JMP RDPOR EXUPI RET ;***** UPIS BAJTA PORUKE NA ODGOVARAJUCU POZICIJU **** WRMSG CLR C MOV DPTR,#0200H ;DRUGA POLOVINA RAMA POCINJE NA 200H MOV A,DPL ADDC A,UPILO MOV DPL,A MOV A,DPH ADDC A,UPIHI MOV DPH,A ;DPH,DPL ADRESA U RAMU GDE UPISUJE BAJT MOV A,R7 SETB BUSY

82

CLR CE NOP JNB BUSY,$ ;UPISUJE ACC NA ADRESI DPH,DPL MOVX @DPTR,A NOP SETB CE CLR C MOV A,UPILO ;INC UPIHI,LO ADDC A,#01 MOV UPILO,A MOV A,UPIHI ADDC A,#0 MOV UPIHI,A EXWRMSG RET ;**** UPIS U MEM. ADRESU ADRHI,LO *** WRITE SETB BUSY ;busy je ulazni pin u mikrokontroler MOV A,R7 MOV DPH,ADRHI MOV DPL,ADRLO CLR CE ;SELEKTUJE DUAL PORT RAM NOP ;(CHIP ENABLE) JNB BUSY,$ ;BUSY PIN IDT7130 MOVX @DPTR,A NOP SETB CE EXWRITE RET ;**** CITANJE SA MEM. ADRESE ADRHI,LO *** READ1 MOV DPL,ADRLO MOV DPH,ADRHI ;UBACUJE ADRESU U DATA POINTER CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE RET ;**** CITANJE OD ADRESE 00 DO 0400H *** RDALL MOV ADRHI,#0 ;RESETOVANJE ADRESE ZA CITANJE MOV ADRLO,#0 RDX MOV DPH,ADRHI MOV DPL,ADRLO CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP

83

SETB CE CALL SCHAR ;SLANJE PROCITANOG BAJTA NA SER.PORT CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A ;INC ADRHI,LO MOV A,ADRLO JNZ RDX MOV A,ADRHI CJNE A,#04,RDX ;ADRESA 400H JE PREKORACENJE RAMA RET ;**** SLANJE 1 KARAKTERA ** SCHAR JB NOTSEND,$ SETB NOTSEND MOV SBUF,A ;UBACUJE BAJT U SERIJSKI BAFER RET ;************************************************ ;SERIAL INPUT INTERRUPT ROUTINE ;************************************************ RECEIVE CLR RI RETI ;******** PREDAJA ********** TRANS CLR TI CLR NOTSEND RETI END START

84

Project2

Asembler za levi mikrokontroler

;IDT7130 PC-READ/WRITE , levi MIKROKONTROLER STATUS EQU 20H TIME EQU STATUS.0 SINTE EQU STATUS.1 NOTSEND EQU STATUS.2 ;BAJT NIJE POSLAT RECEIVED EQU STATUS.3 FULL EQU STATUS.4 FIRST EQU 21H MODE EQU 22H MODE0 EQU MODE.0 ;SAMO PISE MODE1 EQU MODE.1 ;PISE,CITA MODE2 EQU MODE.2 ;CITA 1 PO 1 MODE3 EQU MODE.3 ;CITA BLOK LOB EQU 23H HIB EQU 24H PAUSE EQU 30H REC EQU 31H ;PRIMLJENI BAJT IZ SBUF-a BRECHI EQU 32H BRECLO EQU 33H ADRHI EQU 34H ADRLO EQU 35H ;hardware- in/out pins BUSY EQU P1.3 CE EQU P1.4 INT EQU P3.2 SEND1 EQU P1.1 ;PRVI uC SALJE SEND2 EQU P1.0 ;DRUGI uC SALJE RSEG CODE START JMP MAIN ORG START+TIMER0 JMP IRQ ORG START+SINT ;obrada serijskog interapta JB RI,RX JB TI,TX RX JMP RECEIVE TX JMP TRANS ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;º inicijalizacija TIMER-a,reset.RAM-a i sl. º ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ MAIN MOV IE,#00H ;zabrana svih interapta MOV SP,#70H ;definisanje steka ;(0FDH - 9600 Q=11.0592MHz) INIC: MOV TH1,#0FDH ;definisanje brzine tajmera T1

85

MOV TL1,TH1 MOV TMOD,#021H ;T1 = AUTORELOAD, T0 = 16b_TIMER MOV IP,#010H ;definisanje prioriteta MOV SCON,#050H ;dozvola serijskog prijema SETB TR1 ;STARTUJE tajmer 1 MOV TL0,#066H MOV TH0,#0FCH SETB TR0 ;******* resetovanje rama ***** MOV R0,#08 RESR MOV A,#0 MOV @R0,A INC R0 MOV A,R0 CJNE A,#070H,RESR MOV IE,#092H ;DOZVOLA INTERUPT-A MOV MODE,#0 ;** GLAVNI PROGRAM ** GP NOP MOD2 JNB MODE2,RECTST CLR RECEIVED JB SEND2,GP MOV DPH,ADRHI MOV DPL,ADRLO CALL READ CALL SCHAR CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A JNB SEND2,$ JMP GP RECTST JNB RECEIVED,$ CLR RECEIVED MOD3 JNB MODE3,MOD1 CALL RDALL MOD1 JNB MODE1,MOD0 CALL WRITE CALL READ1 CALL SCHAR JMP GP MOD0 JNB MODE0,GP CALL WRITE JMP GP ;**** UPIS U MEM. ADRESU ADRHI,LO *** WRITE JB FULL,EXWRITE

86

PISHI SETB BUSY MOV A,REC MOV DPH,ADRHI MOV DPL,ADRLO CLR CE NOP JNB BUSY,$ MOVX @DPTR,A NOP SETB CE CLR SEND1 MOV PAUSE,#02 SETB TIME CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A CJNE A,#04,EXWRITE SETB FULL EXWRITE RET ;**** CITANJE ***** READ CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE RET ;**** CITANJE SA MEM. ADRESE ADRHI,LO-1 *** READ1 CLR C MOV A,ADRLO SUBB A,#01 MOV DPL,A MOV A,ADRHI SUBB A,#0 MOV DPH,A CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE EXREAD RET ;**** CITANJE OD ADRESE 00 DO 0400H *** RDALL MOV ADRHI,#0 MOV ADRLO,#0 RDX MOV DPH,ADRHI MOV DPL,ADRLO

87

CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE CALL SCHAR CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A MOV A,ADRLO JNZ RDX MOV A,ADRHI CJNE A,#04,RDX CLR RECEIVED RET ;**** SLANJE 1 KARAKTERA ** SCHAR JB NOTSEND,$ SETB NOTSEND MOV SBUF,A RET ;************************************************ ;SERIAL INPUT INTERRUPT ROUTINE ;************************************************ RECEIVE PUSH ACC PUSH PSW ;SAVE ACC AND CURRENT BANK SELECT PUSH DPH PUSH DPL MOV REC,SBUF ;GET SERIAL INTERUPT BYTE MOV A,REC CJNE A,#0244,KLASIC ;'ô' MOV BRECHI,#0 MOV BRECLO,#0 MOV ADRHI,#0 MOV ADRLO,#0 CLR FULL KLASIC CLR C MOV A,BRECLO ADDC A,#01 MOV BRECLO,A MOV A,BRECHI ADDC A,#0 MOV BRECHI,A JNZ GIGY MOV A,BRECLO CJNE A,#01,VIMOD

88

JMP PPI VIMOD CJNE A,#02,MABY2 CALL MODESEL ;LEVI uC NOP JMP PPI MABY2 CJNE A,#03,GIGY ; CALL MODESEL ;DESNI uC NOP JMP PPI GIGY SETB RECEIVED PPI CLR RI POP DPL POP DPH POP PSW POP ACC RETI ;***** SELEKCIJA MODA ****** MODESEL MOV MODE,#0 MOV A,REC CALL ASCBCD VM0 CJNE A,#0,VM1 MOV MODE,#01 JMP EXMOD VM1 CJNE A,#01,VM2 MOV MODE,#02 JMP EXMOD VM2 CJNE A,#02,VM3 MOV MODE,#04 JMP EXMOD VM3 CJNE A,#03,EXMOD MOV MODE,#08 EXMOD RET ;0123456789 ;------------------------------- ; PREVOD ASCII-BCD ;------------------------------- ASCBCD CLR C SUBB A,#048 ; U A JE BCD BROJ RET ;******** PREDAJA ********** TRANS CLR TI CLR NOTSEND RETI ;****** INTERRUPT TIMER-a 0 NA ~200uS ************* IRQ MOV TL0,#037H MOV TH0,#0FFH PUSH ACC

89

PUSH PSW DALIT JNB TIME,IZIRQ DEC PAUSE MOV A,PAUSE JNZ IZIRQ CLR TIME SETB SEND1 IZIRQ POP PSW POP ACC RETI END START

90

Asembler za desni mikrokontroler

;IDT7130 PC-READ/WRITE ,DESNI MIKROKONTROLER STATUS EQU 20H TIME EQU STATUS.0 SINTE EQU STATUS.1 NOTSEND EQU STATUS.2 ;BAJT NIJE POSLAT RECEIVED EQU STATUS.3 FULL EQU STATUS.4 FIRST EQU 21H MODE EQU 22H MODE0 EQU MODE.0 ;SAMO PISE MODE1 EQU MODE.1 ;PISE,CITA MODE2 EQU MODE.2 ;CITA 1 PO 1 MODE3 EQU MODE.3 ;CITA BLOK LOB EQU 23H HIB EQU 24H PAUSE EQU 30H REC EQU 31H ;PRIMLJENI BAJT IZ SBUF-a BRECHI EQU 32H BRECLO EQU 33H ADRHI EQU 34H ADRLO EQU 35H ;hardware- in/out pins BUSY EQU P1.3 CE EQU P1.4 INT EQU P3.2 SEND1 EQU P1.1 ;PRVI uC SALJE SEND2 EQU P1.0 ;DRUGI uC SALJE RSEG CODE START JMP MAIN ORG START+TIMER0 JMP IRQ ORG START+SINT ;obrada serijskog interapta JB RI,RX JB TI,TX RX JMP RECEIVE TX JMP TRANS ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;º inicijalizacija TIMER-a,reset.RAM-a i sl. º ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ MAIN MOV IE,#00H ;zabrana svih interapta MOV SP,#70H ;definisanje steka ;(0FDH - 9600 Q=11.0592MHz) INIC: MOV TH1,#0FDH ;definisanje brzine tajmera T1 MOV TL1,TH1 MOV TMOD,#021H ;T1 = AUTORELOAD, T0 = 16b_TIMER

91

MOV IP,#010H ;definisanje prioriteta MOV SCON,#050H ;dozvola serijskog prijema SETB TR1 ;STARTUJE tajmer 1 MOV TL0,#066H MOV TH0,#0FCH SETB TR0 ;******* resetovanje rama ***** MOV R0,#08 RESR MOV A,#0 MOV @R0,A INC R0 MOV A,R0 CJNE A,#070H,RESR MOV IE,#092H ;DOZVOLA INTERUPT-A MOV MODE,#0 ;** GLAVNI PROGRAM ** GP NOP MOD2 JNB MODE2,RECTST CLR RECEIVED JB SEND2,GP MOV DPH,ADRHI MOV DPL,ADRLO CALL READ CALL SCHAR CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A JNB SEND2,$ JMP GP RECTST JNB RECEIVED,$ CLR RECEIVED MOD3 JNB MODE3,MOD1 CALL RDALL MOD1 JNB MODE1,MOD0 CALL WRITE CALL READ1 CALL SCHAR JMP GP MOD0 JNB MODE0,GP CALL WRITE JMP GP ;**** UPIS U MEM. ADRESU ADRHI,LO *** WRITE JB FULL,EXWRITE PISHI SETB BUSY MOV A,REC

92

MOV DPH,ADRHI MOV DPL,ADRLO CLR CE NOP JNB BUSY,$ MOVX @DPTR,A NOP SETB CE CLR SEND1 MOV PAUSE,#02 SETB TIME CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A CJNE A,#04,EXWRITE SETB FULL EXWRITE RET ;**** CITANJE ***** READ CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE RET ;**** CITANJE SA MEM. ADRESE ADRHI,LO-1 *** READ1 CLR C MOV A,ADRLO SUBB A,#01 MOV DPL,A MOV A,ADRHI SUBB A,#0 MOV DPH,A CLR CE NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE EXREAD RET ;**** CITANJE OD ADRESE 00 DO 0400H *** RDALL MOV ADRHI,#0 MOV ADRLO,#0 RDX MOV DPH,ADRHI MOV DPL,ADRLO CLR CE

93

NOP JNB BUSY,$ NOP MOVX A,@DPTR NOP SETB CE CALL SCHAR CLR C MOV A,ADRLO ADDC A,#01 MOV ADRLO,A MOV A,ADRHI ADDC A,#0 MOV ADRHI,A MOV A,ADRLO JNZ RDX MOV A,ADRHI CJNE A,#04,RDX CLR RECEIVED RET ;**** SLANJE 1 KARAKTERA ** SCHAR JB NOTSEND,$ SETB NOTSEND MOV SBUF,A RET ;************************************************ ;SERIAL INPUT INTERRUPT ROUTINE ;************************************************ RECEIVE PUSH ACC PUSH PSW ;SAVE ACC AND CURRENT BANK SELECT PUSH DPH PUSH DPL MOV REC,SBUF ;GET SERIAL INTERUPT BYTE MOV A,REC CJNE A,#0244,KLASIC ;'ô' MOV BRECHI,#0 MOV BRECLO,#0 MOV ADRHI,#0 MOV ADRLO,#0 CLR FULL KLASIC CLR C MOV A,BRECLO ADDC A,#01 MOV BRECLO,A MOV A,BRECHI ADDC A,#0 MOV BRECHI,A JNZ GIGY MOV A,BRECLO CJNE A,#01,VIMOD JMP PPI

94

VIMOD CJNE A,#02,MABY2 ; CALL MODESEL ;LEVI uC NOP JMP PPI MABY2 CJNE A,#03,GIGY CALL MODESEL ;DESNI uC NOP JMP PPI GIGY SETB RECEIVED PPI CLR RI POP DPL POP DPH POP PSW POP ACC RETI ;***** SELEKCIJA MODA ****** MODESEL MOV MODE,#0 MOV A,REC CALL ASCBCD VM0 CJNE A,#0,VM1 MOV MODE,#01 JMP EXMOD VM1 CJNE A,#01,VM2 MOV MODE,#02 JMP EXMOD VM2 CJNE A,#02,VM3 MOV MODE,#04 JMP EXMOD VM3 CJNE A,#03,EXMOD MOV MODE,#08 EXMOD RET ;0123456789 ;------------------------------- ; PREVOD ASCII-BCD ;------------------------------- ASCBCD CLR C SUBB A,#048 ; U A JE BCD BROJ RET ;******** PREDAJA ********** TRANS CLR TI CLR NOTSEND RETI ;****** INTERRUPT TIMER-a 0 NA ~200uS ************* IRQ MOV TL0,#037H MOV TH0,#0FFH PUSH ACC PUSH PSW

95

DALIT JNB TIME,IZIRQ DEC PAUSE MOV A,PAUSE JNZ IZIRQ CLR TIME SETB SEND1 IZIRQ POP PSW POP ACC RETI END START

96

Softver na PC-u

Project 1

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, TabNotBk, StdCtrls, CPort, Grids, ExtCtrls; type TForm1 = class(TForm) TabbedNotebook1: TTabbedNotebook; poruka1: TRichEdit; Button1: TButton; Button2: TButton; ComPort1: TComPort; Timer1: TTimer; StringGrid1: TStringGrid; Button3: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Button10: TButton; Button12: TButton; StringGrid2: TStringGrid; Button13: TButton; Button14: TButton; Panel1: TPanel; Timer2: TTimer; RichEdit1: TRichEdit; Button11: TButton; Panel2: TPanel; Button15: TButton; Edit9: TEdit; Label1: TLabel; procedure TabbedNotebook1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ComPort1RxChar(Sender: TObject; Count: Integer); procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); procedure Button3Click(Sender: TObject);

97

procedure Button11Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button12Click(Sender: TObject); procedure Button13Click(Sender: TObject); procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Edit2KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Edit3KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Edit4KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Edit5KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Edit6KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Edit7KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Edit8KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button14Click(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Button15Click(Sender: TObject); procedure poruka1Change(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; mod1,soh,brojporuke,stx,etx,eot:byte; brojacpunjenja,brojacdolaska,brojporuka,automatic:integer; dolazak: array[0..1023] of byte; heder,zadnjaporuka,auto:boolean; implementation var niz:array[0..511] of byte; {$R *.dfm} procedure ispraznipromenljive(); var i:integer; begin brojacpunjenja := 0; brojacdolaska := 0; i := 0; while i <= 511 do begin dolazak[i] := 0; inc(i); end;

98

i := 0; while i <= 511 do begin niz[i] := 0; inc(i); end; end; procedure dodeliascii(text:string;pozicija:integer); var izbor:string; i,duzina:integer; begin duzina := length(Text); for i := 0 to duzina-1 do begin izbor := copy(text,i+1,1); if izbor = 'A' then niz[i+pozicija] := ord('A') else if izbor = 'a'then niz[i+pozicija] := ord('a') else if izbor = 'B'then niz[i+pozicija] := ord('B') else if izbor = 'b'then niz[i+pozicija] := ord('b') else if izbor = 'C'then niz[i+pozicija] := ord('C') else if izbor = 'c'then niz[i+pozicija] := ord('c') else if izbor = 'D'then niz[i+pozicija] := ord('D') else if izbor = 'd'then niz[i+pozicija] := ord('d') else if izbor = 'E'then niz[i+pozicija] := ord('E') else if izbor = 'e'then niz[i+pozicija] := ord('e') else if izbor = 'F'then niz[i+pozicija] := ord('F') else if izbor = 'f'then niz[i+pozicija] := ord('f') else if izbor = 'G'then niz[i+pozicija] := ord('G') else if izbor = 'g'then niz[i+pozicija] := ord('g') else if izbor = 'H'then niz[i+pozicija] := ord('H') else if izbor = 'h'then niz[i+pozicija] := ord('h') else if izbor = 'I'then niz[i+pozicija] := ord('I') else if izbor = 'i'then niz[i+pozicija] := ord('i') else if izbor = 'J'then niz[i+pozicija] := ord('J') else if izbor = 'j'then niz[i+pozicija] := ord('j') else if izbor = 'K'then niz[i+pozicija] := ord('K') else if izbor = 'k'then niz[i+pozicija] := ord('k') else if izbor = 'L'then niz[i+pozicija] := ord('L') else if izbor = 'l'then niz[i+pozicija] := ord('l') else if izbor = 'M'then niz[i+pozicija] := ord('M') else if izbor = 'm'then niz[i+pozicija] := ord('m') else if izbor = 'N'then niz[i+pozicija] := ord('N') else if izbor = 'n'then niz[i+pozicija] := ord('n') else if izbor = 'O'then niz[i+pozicija] := ord('O') else if izbor = 'o'then niz[i+pozicija] := ord('o') else if izbor = 'P'then niz[i+pozicija] := ord('P') else if izbor = 'p'then niz[i+pozicija] := ord('p') else if izbor = 'Q'then niz[i+pozicija] := ord('Q') else if izbor = 'q'then niz[i+pozicija] := ord('q') else if izbor = 'R'then niz[i+pozicija] := ord('R') else if izbor = 'r'then niz[i+pozicija] := ord('r') else if izbor = 'S'then niz[i+pozicija] := ord('S') else if izbor = 's'then niz[i+pozicija] := ord('s') else if izbor = 'T'then niz[i+pozicija] := ord('T') else if izbor = 't'then niz[i+pozicija] := ord('t') else if izbor = 'U'then niz[i+pozicija] := ord('U') else if izbor = 'u'then niz[i+pozicija] := ord('u') else if izbor = 'V'then niz[i+pozicija] := ord('V') else if izbor = 'v'then niz[i+pozicija] := ord('v')

99

else if izbor = 'W'then niz[i+pozicija] := ord('W') else if izbor = 'w'then niz[i+pozicija] := ord('w') else if izbor = 'X'then niz[i+pozicija] := ord('X') else if izbor = 'x'then niz[i+pozicija] := ord('x') else if izbor = 'Y'then niz[i+pozicija] := ord('Y') else if izbor = 'y'then niz[i+pozicija] := ord('y') else if izbor = 'Z'then niz[i+pozicija] := ord('Z') else if izbor = 'z'then niz[i+pozicija] := ord('z') else if izbor = '1'then niz[i+pozicija] := ord('1') else if izbor = '2'then niz[i+pozicija] := ord('2') else if izbor = '3'then niz[i+pozicija] := ord('3') else if izbor = '4'then niz[i+pozicija] := ord('4') else if izbor = '5'then niz[i+pozicija] := ord('5') else if izbor = '6'then niz[i+pozicija] := ord('6') else if izbor = '7'then niz[i+pozicija] := ord('7') else if izbor = '8'then niz[i+pozicija] := ord('8') else if izbor = '9'then niz[i+pozicija] := ord('9') else if izbor = '0'then niz[i+pozicija] := ord('0') else if izbor = ' 'then niz[i+pozicija] := ord(' ') else if izbor = '.'then niz[i+pozicija] := ord('.') else if izbor = ','then niz[i+pozicija] := ord(',') else if izbor = '?'then niz[i+pozicija] := ord('?') else if izbor = ';'then niz[i+pozicija] := ord(';') else if izbor = ':'then niz[i+pozicija] := ord(':') else if izbor = '<'then niz[i+pozicija] := ord('<') else if izbor = '>'then niz[i+pozicija] := ord('>') else if izbor = '/'then niz[i+pozicija] := ord('/') else if izbor = '('then niz[i+pozicija] := ord('(') else if izbor = ')'then niz[i+pozicija] := ord(')') else if izbor = '`'then niz[i+pozicija] := ord('`') else if izbor = '~'then niz[i+pozicija] := ord('~') else if izbor = '!'then niz[i+pozicija] := ord('!') else if izbor = '$'then niz[i+pozicija] := ord('$') else if izbor = '@'then niz[i+pozicija] := ord('@') else if izbor = '#'then niz[i+pozicija] := ord('#') else if izbor = '^'then niz[i+pozicija] := ord('^') else if izbor = '&'then niz[i+pozicija] := ord('&') else if izbor = '*'then niz[i+pozicija] := ord('*') else if izbor = '-'then niz[i+pozicija] := ord('-') else if izbor = '_'then niz[i+pozicija] := ord('_') else if izbor = '='then niz[i+pozicija] := ord('=') else if izbor = '+'then niz[i+pozicija] := ord('+') else if izbor = '\'then niz[i+pozicija] := ord('\') else if izbor = '|'then niz[i+pozicija] := ord('|') else if izbor = '{'then niz[i+pozicija] := ord('{') else if izbor = '}'then niz[i+pozicija] := ord('}') else if izbor = '['then niz[i+pozicija] := ord('[') else if izbor = ']'then niz[i+pozicija] := ord(']') else if izbor = '%'then niz[i+pozicija] := ord('%'); end; end; procedure zaglavlje(); begin niz[0] := 1; niz[1] := mod1; niz[2] := 0; niz[3] := 2; //niz[510] := 3; //niz[511] := 4;

100

end; procedure TForm1.TabbedNotebook1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean); begin if NewTab = 0 then mod1 := 0 else if NewTab = 1 then mod1 := 1; ispraznipromenljive; zaglavlje; heder := false; end; procedure TForm1.Button1Click(Sender: TObject); var i,nula:integer; begin poruka1.Clear; //ispraznigrid; ispraznipromenljive; poruka1.SetFocus; button12.Click; end; {procedure pucajnaport(text:string); var podatak:integer; begin podatak := 1; form1.ComPort1.Write(podatak,1); podatak := mod1; form1.ComPort1.Write(podatak,1); podatak := 0; form1.ComPort1.Write(podatak,1); podatak := 2; form1.ComPort1.Write(podatak,1); form1.ComPort1.WriteStr(text); podatak := 3; form1.ComPort1.Write(podatak,1); podatak := 4; form1.ComPort1.Write(podatak,1); end;} procedure TForm1.Button2Click(Sender: TObject); var poruka:string; br_linija,i,kod,brojac,duzina:integer; begin brojacdolaska := 0; poruka1.Refresh; zaglavlje; br_linija := poruka1.Lines.Count; i := 0; //0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz //SLAGANJE PORUKE while i < br_linija do begin poruka := poruka + poruka1.Lines[i]; inc(i); end; duzina := length(poruka); dodeliascii(poruka,4); niz[4+duzina] := 3; niz[5+duzina] := 4;

101

i := 0; while i <= 511 do begin comport1.Write(niz[i],1); inc(i); end; end; procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); var stiglo:string; prijem:array[0..1023] of byte; j:integer; begin comport1.Read(prijem,count); for j := 0 to count-1 do begin dolazak[brojacdolaska] := prijem[j]; inc(brojacdolaska); end; timer1.Enabled := true; comport1.ClearBuffer(true,true); end; procedure oivicistringgridove(); //upisuje brojeve po ivici stringgridova var i:integer; begin for i := 0 to 16 do begin form1.StringGrid1.Cells[i+1,0] := inttohex(i,2); form1.StringGrid2.Cells[i+1,0] := inttohex(i,2); end; for i := 0 to 32 do begin form1.StringGrid1.Cells[0,i+1] := inttohex(i,2); form1.StringGrid2.Cells[0,i+1] := inttohex(i+32,2); end; end; procedure TForm1.FormActivate(Sender: TObject); var i:integer; begin oivicistringgridove; comport1.Open; tabbednotebook1.PageIndex := 0; poruka1.SetFocus; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin comport1.Close; end; procedure vratiporuku(); var kol,red,i,j,k:integer; rec,karakter:string; bafer:array[0..511] of byte; begin j := 0; form1.RichEdit1.Clear;

102

for i := 512 to 1023 do begin if dolazak[i] = 0 then else begin bafer[j] := dolazak[i]; inc(j); end; end; for k := 0 to j-1 do rec := rec + chr(bafer[k]); form1.RichEdit1.Lines.Add(rec); end; procedure TForm1.Timer1Timer(Sender: TObject); var kol,red,k:integer; begin timer1.Enabled := false; timer2.Enabled := true; panel1.Color := clred; kol := 0; red := 0; while red <= 32 do begin while kol <= 16 do begin stringgrid1.Cells[kol+1,red+1] := (inttohex(dolazak[red*16+kol],2)); inc(kol); end; kol := 0; inc(red); end; kol := 0; red := 0; while red <= 32 do begin while kol <= 16 do begin stringgrid2.Cells[kol+1,red+1] := (inttohex(dolazak[red*16+kol+512],2)); inc(kol); end; kol := 0; inc(red); end; poruka1.Color := clwhite; //stringgrid1.Color := clwhite; //stringgrid2.Color := clwhite; brojacdolaska := 0; if stringgrid1.Cells[2,1] = 'FF' then vratiporuku; for k := 0 to 1023 do dolazak[k] := 0; end; { AAAAAAAAAAAA BBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDD EEEEEEEEEEEEEEEE FFFFFFFFFFFFFFFF GGGGGGGGGGGGGGGG HHHHHHHHHHHHHHHH IIIIIIIIIIIIIIII

103

JJJJJJJJJJJJJJJJ KKKKKKKKKKKKKKKK LLLLLLLLLLLLLLLL MMMMMMMMMMMMMMMM NNNNNNNNNNNNNNNN OOOOOOOOOOOOOOOO PPPPPPPPPPPPPPPP RRRRRRRRRRRRRRRR SSSSSSSSSSSSSSSS TTTTTTTTTTTTTTTT UUUUUUUUUUUUUUUU VVVVVVVVVVVVVVVV ZZZZZZZZZZZZZZZZ aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbb cccccccccccccccc dddddddddddddddd eeeeeeeeeeeeeeee ffffffffffffffff gggggggggggggggg hhhhhhhhhhhhhhhh iiiiiiiiiiiiiiii kkkkkkkkkkkkkkkk llllllllllllllll mmmmmmmmmmmmmmmm } function zadnjaporuka1():boolean; begin zadnjaporuka := false; if form1.Edit2.Visible then begin if form1.Edit3.Visible then begin if form1.Edit4.Visible then begin if form1.Edit5.Visible then begin if form1.Edit6.Visible then begin if form1.Edit7.Visible then begin if form1.Edit8.Visible then begin if (form1.Edit1.Color = clyellow) and (form1.Edit2.Color = clyellow) and (form1.Edit3.Color = clyellow) and (form1.Edit4.Color = clyellow) and (form1.Edit5.Color = clyellow) and (form1.Edit6.Color = clyellow) and (form1.Edit7.Color = clyellow) and (form1.Edit8.Color = clyellow) then zadnjaporuka := true; end else begin if (form1.Edit1.Color = clyellow) and (form1.Edit2.Color = clyellow) and (form1.Edit3.Color = clyellow) and (form1.Edit4.Color = clyellow) and

104

(form1.Edit5.Color = clyellow) and (form1.Edit6.Color = clyellow) and (form1.Edit7.Color = clyellow) then zadnjaporuka := true; end; end else begin if (form1.Edit1.Color = clyellow) and (form1.Edit2.Color = clyellow) and (form1.Edit3.Color = clyellow) and (form1.Edit4.Color = clyellow) and (form1.Edit5.Color = clyellow) and (form1.Edit6.Color = clyellow) then zadnjaporuka := true; end; end else begin if (form1.Edit1.Color = clyellow) and (form1.Edit2.Color = clyellow) and (form1.Edit3.Color = clyellow) and (form1.Edit4.Color = clyellow) and (form1.Edit5.Color = clyellow) then zadnjaporuka := true; end; end else begin if (form1.Edit1.Color = clyellow) and (form1.Edit2.Color = clyellow) and (form1.Edit3.Color = clyellow) and (form1.Edit4.Color = clyellow) then zadnjaporuka := true; end; end else begin if (form1.Edit1.Color = clyellow) and (form1.Edit2.Color = clyellow) and (form1.Edit3.Color = clyellow) then zadnjaporuka := true; end; end else begin if (form1.Edit2.Color = clyellow) and (form1.Edit1.Color = clyellow) then zadnjaporuka := true; end; end else begin if form1.Edit1.Color = clyellow then zadnjaporuka := true; end; end; procedure enabledugmici(); begin form1.Button3.Enabled := true; form1.Button4.Enabled := true; form1.Button5.Enabled := true; form1.Button6.Enabled := true; form1.Button7.Enabled := true;

105

form1.Button8.Enabled := true; form1.Button9.Enabled := true; form1.Button10.Enabled := true; end; procedure disabledugmici(); begin form1.Button3.Enabled := false; form1.Button4.Enabled := false; form1.Button5.Enabled := false; form1.Button6.Enabled := false; form1.Button7.Enabled := false; form1.Button8.Enabled := false; form1.Button9.Enabled := false; form1.Button10.Enabled := false; end; procedure TForm1.Button3Click(Sender: TObject); var i,k,brojporuke,duzina:integer; begin disabledugmici; ispraznipromenljive; brojporuke := 0; brojacpunjenja := 0; niz[brojacpunjenja] := soh; inc(brojacpunjenja); niz[brojacpunjenja] := mod1; inc(brojacpunjenja); niz[brojacpunjenja] := brojporuke; inc(brojacpunjenja); niz[brojacpunjenja] := stx; inc(brojacpunjenja); duzina := length(edit1.Text); dodeliascii(edit1.Text,brojacpunjenja); brojacpunjenja := brojacpunjenja+duzina; niz[brojacpunjenja] := etx; inc(brojacpunjenja); dec(brojporuka); edit1.Color := clyellow; zadnjaporuka1; if zadnjaporuka then begin niz[brojacpunjenja] := eot; inc(brojacpunjenja); zadnjaporuka := false; end; k := 0; while k <= 511 do begin comport1.Write(niz[k],1); inc(k); end; end; procedure TForm1.Button11Click(Sender: TObject); var k:integer; begin halt; end;

106

procedure TForm1.Button4Click(Sender: TObject); var i,k,brojporuke,duzina:integer; begin disabledugmici; ispraznipromenljive; brojporuke := 1; brojacpunjenja := 0; niz[brojacpunjenja] := soh; inc(brojacpunjenja); niz[brojacpunjenja] := mod1; inc(brojacpunjenja); niz[brojacpunjenja] := brojporuke; inc(brojacpunjenja); niz[brojacpunjenja] := stx; inc(brojacpunjenja); duzina := length(edit2.Text); dodeliascii(edit2.Text,brojacpunjenja); brojacpunjenja := brojacpunjenja+duzina; niz[brojacpunjenja] := etx; inc(brojacpunjenja); edit2.Color := clyellow; zadnjaporuka1; if zadnjaporuka then begin niz[brojacpunjenja] := eot; inc(brojacpunjenja); zadnjaporuka := false; end; k := 0; while k <= 511 do begin comport1.Write(niz[k],1); inc(k); end; end; procedure TForm1.Button12Click(Sender: TObject); var k,nula:integer; begin richedit1.Clear; brojacdolaska := 0; niz[0] := 1; niz[1] := 2; for k := 0 to 1 do comport1.Write(niz[k],1); end; procedure TForm1.Button13Click(Sender: TObject); begin richedit1.Clear; button14.Click; edit1.Text := ''; edit2.Text := ''; edit2.Visible := false; button4.Visible := false; edit3.Text := ''; edit3.Visible := false; button5.Visible := false; edit4.Text := ''; edit4.Visible := false;

107

button6.Visible := false; edit5.Text := ''; edit5.Visible := false; button7.Visible := false; edit6.Text := ''; edit6.Visible := false; button8.Visible := false; edit7.Text := ''; edit7.Visible := false; button9.Visible := false; edit8.Text := ''; edit8.Visible := false; button10.Visible := false; edit1.SetFocus; brojporuka := 0; end; procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin // if key = 13 then if Length(edit1.Text)=16 then begin edit2.Visible := true; edit2.SetFocus; button4.Visible := true; inc(brojporuka); end; if not button3.Visible then button3.Visible := true; end; procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin // if key = 13 then if Length(edit2.Text)=16 then begin edit3.Visible := true; edit3.SetFocus; button5.Visible := true; inc(brojporuka); end; end; procedure TForm1.Edit3KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin // if key = 13 then if Length(edit3.Text)=16 then begin edit4.Visible := true; edit4.SetFocus; button6.Visible := true; inc(brojporuka); end; end; procedure TForm1.Edit4KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin

108

// if key = 13 then if Length(edit4.Text)=16 then begin edit5.Visible := true; edit5.SetFocus; button7.Visible := true; inc(brojporuka); end; end; procedure TForm1.Edit5KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin // if key = 13 then if Length(edit5.Text)=16 then begin edit6.Visible := true; edit6.SetFocus; button8.Visible := true; inc(brojporuka); end; end; procedure TForm1.Edit6KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin // if key = 13 then if Length(edit6.Text)=16 then begin edit7.Visible := true; edit7.SetFocus; button9.Visible := true; inc(brojporuka); end; end; procedure TForm1.Edit7KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin // if key = 13 then if Length(edit7.Text)=16 then begin edit8.Visible := true; edit8.SetFocus; button10.Visible := true; inc(brojporuka); end; end; procedure TForm1.Edit8KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = 13 then begin //button11.Visible := true; inc(brojporuka); end; end;

109

procedure TForm1.Button5Click(Sender: TObject); var i,k,brojporuke,duzina:integer; begin disabledugmici; ispraznipromenljive; brojporuke := 2; brojacpunjenja := 0; niz[brojacpunjenja] := soh; inc(brojacpunjenja); niz[brojacpunjenja] := mod1; inc(brojacpunjenja); niz[brojacpunjenja] := brojporuke; inc(brojacpunjenja); niz[brojacpunjenja] := stx; inc(brojacpunjenja); duzina := length(edit3.Text); dodeliascii(edit3.Text,brojacpunjenja); brojacpunjenja := brojacpunjenja+duzina; niz[brojacpunjenja] := etx; inc(brojacpunjenja); edit3.Color := clyellow; zadnjaporuka1; if zadnjaporuka then begin niz[brojacpunjenja] := eot; inc(brojacpunjenja); zadnjaporuka := false; end; k := 0; while k <= 511 do begin comport1.Write(niz[k],1); inc(k); end; end; procedure TForm1.Button6Click(Sender: TObject); var i,k,brojporuke,duzina:integer; begin disabledugmici; ispraznipromenljive; brojporuke := 3; brojacpunjenja := 0; niz[brojacpunjenja] := soh; inc(brojacpunjenja); niz[brojacpunjenja] := mod1; inc(brojacpunjenja); niz[brojacpunjenja] := brojporuke; inc(brojacpunjenja); niz[brojacpunjenja] := stx; inc(brojacpunjenja); duzina := length(edit4.Text); dodeliascii(edit4.Text,brojacpunjenja); brojacpunjenja := brojacpunjenja+duzina; niz[brojacpunjenja] := etx; inc(brojacpunjenja); edit4.Color := clyellow; zadnjaporuka1; if zadnjaporuka then begin

110

niz[brojacpunjenja] := eot; inc(brojacpunjenja); zadnjaporuka := false; end; k := 0; while k <= 511 do begin comport1.Write(niz[k],1); inc(k); end; end; procedure TForm1.Button7Click(Sender: TObject); var i,k,brojporuke,duzina:integer; begin disabledugmici; ispraznipromenljive; brojporuke := 4; brojacpunjenja := 0; niz[brojacpunjenja] := soh; inc(brojacpunjenja); niz[brojacpunjenja] := mod1; inc(brojacpunjenja); niz[brojacpunjenja] := brojporuke; inc(brojacpunjenja); niz[brojacpunjenja] := stx; inc(brojacpunjenja); duzina := length(edit5.Text); dodeliascii(edit5.Text,brojacpunjenja); brojacpunjenja := brojacpunjenja+duzina; niz[brojacpunjenja] := etx; inc(brojacpunjenja); edit5.Color := clyellow; zadnjaporuka1; if zadnjaporuka then begin niz[brojacpunjenja] := eot; inc(brojacpunjenja); zadnjaporuka := false; end; k := 0; while k <= 511 do begin comport1.Write(niz[k],1); inc(k); end; end; procedure TForm1.Button8Click(Sender: TObject); var i,k,brojporuke,duzina:integer; begin disabledugmici; ispraznipromenljive; brojporuke := 5; brojacpunjenja := 0; niz[brojacpunjenja] := soh; inc(brojacpunjenja); niz[brojacpunjenja] := mod1; inc(brojacpunjenja); niz[brojacpunjenja] := brojporuke;

111

inc(brojacpunjenja); niz[brojacpunjenja] := stx; inc(brojacpunjenja); duzina := length(edit6.Text); dodeliascii(edit6.Text,brojacpunjenja); brojacpunjenja := brojacpunjenja+duzina; niz[brojacpunjenja] := etx; inc(brojacpunjenja); edit6.Color := clyellow; zadnjaporuka1; if zadnjaporuka then begin niz[brojacpunjenja] := eot; inc(brojacpunjenja); zadnjaporuka := false; end; k := 0; while k <= 511 do begin comport1.Write(niz[k],1); inc(k); end; end; procedure TForm1.Button9Click(Sender: TObject); var i,k,brojporuke,duzina:integer; begin disabledugmici; ispraznipromenljive; brojporuke := 6; brojacpunjenja := 0; niz[brojacpunjenja] := soh; inc(brojacpunjenja); niz[brojacpunjenja] := mod1; inc(brojacpunjenja); niz[brojacpunjenja] := brojporuke; inc(brojacpunjenja); niz[brojacpunjenja] := stx; inc(brojacpunjenja); duzina := length(edit7.Text); dodeliascii(edit7.Text,brojacpunjenja); brojacpunjenja := brojacpunjenja+duzina; niz[brojacpunjenja] := etx; inc(brojacpunjenja); edit7.Color := clyellow; zadnjaporuka1; if zadnjaporuka then begin niz[brojacpunjenja] := eot; inc(brojacpunjenja); zadnjaporuka := false; end; k := 0; while k <= 511 do begin comport1.Write(niz[k],1); inc(k); end; end;

112

procedure TForm1.Button10Click(Sender: TObject); var i,k,brojporuke,duzina:integer; begin disabledugmici; ispraznipromenljive; brojporuke := 7; brojacpunjenja := 0; niz[brojacpunjenja] := soh; inc(brojacpunjenja); niz[brojacpunjenja] := mod1; inc(brojacpunjenja); niz[brojacpunjenja] := brojporuke; inc(brojacpunjenja); niz[brojacpunjenja] := stx; inc(brojacpunjenja); duzina := length(edit8.Text); dodeliascii(edit8.Text,brojacpunjenja); brojacpunjenja := brojacpunjenja+duzina; niz[brojacpunjenja] := etx; inc(brojacpunjenja); edit8.Color := clyellow; zadnjaporuka1; if zadnjaporuka then begin niz[brojacpunjenja] := eot; inc(brojacpunjenja); zadnjaporuka := false; end; k := 0; while k <= 511 do begin comport1.Write(niz[k],1); inc(k); end; end; procedure postavibrojacporuka(); begin if form1.Edit1.Visible then brojporuka := 1; if form1.Edit2.Visible then brojporuka := 2; if form1.Edit3.Visible then brojporuka := 3; if form1.Edit4.Visible then brojporuka := 4; if form1.Edit5.Visible then brojporuka := 5; if form1.Edit6.Visible then brojporuka := 6; if form1.Edit7.Visible then brojporuka := 7; if form1.Edit8.Visible then brojporuka := 8; end; procedure TForm1.Button14Click(Sender: TObject); begin richedit1.Clear; button12.Click; edit1.Color := clwhite; edit2.Color := clwhite; edit3.Color := clwhite; edit4.Color := clwhite; edit5.Color := clwhite; edit6.Color := clwhite; edit7.Color := clwhite; edit8.Color := clwhite;

113

auto := false; //brojporuka := 0; end; procedure TForm1.Timer2Timer(Sender: TObject); begin timer2.Enabled := false; panel1.Color := clgreen; stringgrid1.Cells[16,32] := '00'; stringgrid1.Refresh; enabledugmici; if auto then begin if (button10.Visible) and ((edit8.Color = -16777211) or (edit8.Color = 16777215)) and (automatic = 7) then begin button10.Click; auto := false; end; //else if not button10.Visible then auto := false; if (button9.Visible) and ((edit7.Color = -16777211) or (edit7.Color = 16777215)) and (automatic = 6) then begin button9.Click; automatic := 7; end; //else if not button9.Visible then auto := false; if (button8.Visible) and ((edit6.Color = -16777211) or (edit6.Color = 16777215)) and (automatic = 5) then begin button8.Click; automatic := 6; end; //else if not button8.Visible then auto := false; if (button7.Visible) and ((edit5.Color = -16777211) or (edit5.Color = 16777215)) and (automatic = 4) then begin button7.Click; automatic := 5; end; //else if not button7.Visible then auto := false; if (button6.Visible) and ((edit4.Color = -16777211) or (edit4.Color = 16777215)) and (automatic = 3) then begin button6.Click; automatic := 4 end; //else if not button6.Visible then auto := false; if (button5.Visible) and ((edit3.Color = -16777211) or (edit3.Color = 16777215)) and (automatic = 2) then begin button5.Click; automatic := 3; end; //else if not button5.Visible then auto := false; if (button4.Visible) and ((edit2.Color = -16777211) or (edit2.Color = 16777215)) and (automatic = 1) then begin button4.Click; automatic := 2;

114

end; //else if not button4.Visible then auto := false; end; end; procedure TForm1.Button15Click(Sender: TObject); var k:integer; begin if (button3.Visible) and ((edit1.Color = -16777211) or (edit1.Color = 16777215)) then begin button3.Click; auto := true; automatic := 1; end; end; procedure TForm1.poruka1Change(Sender: TObject); var linijatexta,karakterauliniji,ukupnokaraktera,i:integer; begin linijatexta := poruka1.Lines.Count; ukupnokaraktera := 0; for i := 0 to linijatexta do begin karakterauliniji := length(poruka1.Lines[i]); ukupnokaraktera := ukupnokaraktera + karakterauliniji; end; edit9.Text := inttostr(ukupnokaraktera); end; initialization mod1 := 0; brojacpunjenja := 0; brojacdolaska := 0; brojporuka := 0; heder := false; zadnjaporuka := false; automatic := 1; auto := false; soh := 1; stx := 2; etx := 3; eot := 4; end.

115

unit dualport; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, CPort, ExtCtrls; type TForm1 = class(TForm) ComPort1: TComPort; exbuton: TButton; PCbafer: TRichEdit; LEVIgrupa: TGroupBox; Lmode0: TRadioButton; Lmode1: TRadioButton; Lmode2: TRadioButton; DESNIgrupa: TGroupBox; Dmode0: TRadioButton; Dmode1: TRadioButton; Dmode2: TRadioButton; Lmodex: TRadioButton; Dmodex: TRadioButton; sendBUT: TButton; readRAML: TButton; BROJchar: TLabel; Label1: TLabel; clearPCbuf: TButton; Label2: TLabel; RAMbafer: TRichEdit; Label3: TLabel; CLRRAM: TButton; PCsend: TRadioButton; PCrec: TRadioButton; Label4: TLabel; TimerRX: TTimer; RECnumb: TLabel; Label6: TLabel; readRAMD: TButton; Bevel1: TBevel; procedure exbutonClick(Sender: TObject); procedure sendBUTClick(Sender: TObject); procedure PCbaferChange(Sender: TObject); procedure clearPCbufClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ComPort1RxChar(Sender: TObject; Count: Integer); procedure CLRRAMClick(Sender: TObject); procedure readRAMLClick(Sender: TObject); procedure ComPort1TxEmpty(Sender: TObject); procedure TimerRXTimer(Sender: TObject); procedure readRAMDClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1;

116

reccount: integer; implementation {$R *.dfm} procedure TForm1.exbutonClick(Sender: TObject); begin ComPort1.Close; halt; end; procedure TForm1.sendBUTClick(Sender: TObject); var salje: string; begin reccount:=0; RAMbafer.SelectAll; Rambafer.ClearSelection; PCsend.Checked:=true; salje:=''; salje:='ô'; //244-start byte if Lmode0.Checked=true then salje:=salje+'0'; if Lmode1.Checked=true then salje:=salje+'1'; if Lmode2.Checked=true then salje:=salje+'2'; if Lmodex.Checked=true then salje:=salje+'4'; if Dmode0.Checked=true then salje:=salje+'0'; if Dmode1.Checked=true then salje:=salje+'1'; if Dmode2.Checked=true then salje:=salje+'2'; if Dmodex.Checked=true then salje:=salje+'4'; ComPort1.WriteStr(salje); ComPort1.ClearBuffer(true,true); salje:=PCbafer.Text; ComPort1.WriteStr(salje); end; procedure TForm1.PCbaferChange(Sender: TObject); var zaslanje: string; begin zaslanje:= PCbafer.Text; BROJchar.Caption:= IntToStr(Length(zaslanje)); end; procedure TForm1.clearPCbufClick(Sender: TObject); begin PCbafer.SelectAll; PCbafer.ClearSelection; end; procedure TForm1.FormCreate(Sender: TObject); begin PCbafer.SelectAll; PCbafer.ClearSelection; RAMbafer.SelectAll; RAMbafer.ClearSelection; Lmodex.Checked:=true; Dmodex.Checked:=true; ComPort1.Open; end;

117

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); var prima: string; begin reccount:=reccount+1; PCrec.Checked:=true; TimerRX.Enabled:=false; TimerRx.Interval:=15; TimerRX.Enabled:=true; ComPort1.ReadStr(prima,COUNT); RAMbafer.Text:=RAMbafer.Text + prima; end; procedure TForm1.CLRRAMClick(Sender: TObject); var brojac: integer; begin RAMbafer.SelectAll; RAMbafer.ClearSelection; brojac:=0; ComPort1.WriteStr('ô02'); ComPort1.ClearBuffer(true,true); PCsend.Checked:=true; repeat ComPort1.WriteStr(' '); Brojac:=brojac + 1; until brojac=1024; PCsend.Checked:=false; end; procedure TForm1.readRAMLClick(Sender: TObject); begin reccount:=0; RAMbafer.SelectAll; RAMbafer.ClearSelection; PCsend.Checked:=true; ComPort1.WriteStr('ô34 '); //Desni nije aktivan end; procedure TForm1.ComPort1TxEmpty(Sender: TObject); begin PCsend.Checked:=false; end; procedure TForm1.TimerRXTimer(Sender: TObject); begin PCrec.Checked:=false; TimerRX.Enabled:=false; RECnumb.Caption:=IntToStr(Length(RAMbafer.Text)); end; procedure TForm1.readRAMDClick(Sender: TObject); begin reccount:=0; RAMbafer.SelectAll; RAMbafer.ClearSelection; PCsend.Checked:=true; ComPort1.WriteStr('ô43 '); //Levi nije aktivan end; end.

118

6.4. [eme

[ema ispravlja~a

119

Blok {ema celog sistema