PC Press
O nama
O nama
Pretplata
O nama
Postanite saradnik PC-ja
Kontakt sa redakcijom
PC Press
Novi broj
Novi broj   
Pretrazivanje
Arhiva
Arhiva   
PC Online
PC Plus   
Specijalna izdanja
Projekat Projekat
PC #23 : April 1997 TehnoGuru

 Naslovna  Sadržaj 
Voja Antonić  

Miki Maus i programiranje

Na primeru jednog meteorološkog uređaja, Voja Antonić demonstrira različite konstruktorske pristupe u projektovanju hardvera.

Kad se nađe pred projektnim zadatkom, iskusni stručnjak će odmah imati ideju kako će koji problem rešiti i kakav će biti globalni koncept uređaja. Za ovo može da zahvali iskustvu, ali "biblioteka rešenja" koju čuva u glavi često će ga sprečiti da upotrebi kreativnost tamo gde za nju ima mesta. Zbog toga, analizirajući mikroprocesorske uređaje svetskih proizvođača, nalazimo malo rešenja u kojima ima lepote, duha i invencije - ona obiluju konstruktorskim stereotipima, koji su neoptimizovani, skupi i glomazni.

Mada neki konstruktori, školovani na klasičnim kanonima digitalne tehnike, ovakva rešenja s potcenjivanjem nazivaju "Miki Maus logikom", to ne bi trebalo da nas spreči da pustimo mašti na volju i da projektovanje tretiramo kao kreativni proces...

U službi meteorologije

Ovoga puta ćemo se baviti jednim meteorološkim instrumentom, koji meri brzinu i pravac vetra. Mada se radi o konkretnom uređaju (slika 1) koji je sagrađen i već dugo je u funkciji, nećemo se upuštati u detaljan opis projekta. Umesto toga, zadržaćemo se na nekim interesantnim detaljima, pošto preostali deo projekta nosi standardna rešenja, koja je dovoljno samo pomenuti.

Uređaj se sastoji od dve fizičke celine: senzor se nalazi na krovu zgrade, a pokazivač u prostoriji. Povezani su kablom kroz koji se senzor napaja i šalje podatke do pokazivača. Meri se brzina vetra uz pomoć standardnog trokrakog rotora sa poluloptastim "hvatačima vetra" i pravac vetra pomoću vetruške sa jednim krilcem, kao kod starinskih "petlova" na dimnjacima. Izmerena brzina se prikazuje na numeričkom displeju, a pravac na kružnom nizu od 36 svetlećih dioda, od kojih je uvek samo jedna upaljena, dakle rezolucija je 10 lučnih stepeni.

Za praćenje brzine obrtanja rotora upotrebljen je magnetni (hall effect) senzor, koji se pobuđuje permanentnim magnetom fiksiranim na rotoru. Situacija sa merenjem pravca vetra je nešto složenija: postoji šest optičkih refleksionih senzora koji registruju ugaoni položaj vetruške, pomoću specijalne "šare" iscrtane na disku. Svi ovi podaci se kroz kabl šalju do pokazivača (dakako, mikroprocesorskog) koji se nalazi u prostotriji.

U kolonu po jedan

Obzirom da je kabl koji spaja ove dve jedinice dug (često preko deset metara) i da je, zbog rizične montaže i atmosferskih uticaja, prilično "povrediv" deo uređaja, prvi zahtev je da se svede na što manji broj vodova, ne samo da bi bio jeftiniji i lakši, nego i da bi se pojednostavila montaža senzora na krovu. Priznajte da je teško priključiti 9-žilni kabl (7 signala, masa i napajanje, kako je trebalo da bude u prvoj verziji) na ploču senzora smeštenu u kućište jedva nešto veće od loptice za ping-pong, i da to još bude robusno i dobro zaštićeno od vlage.

Treba, dakle, paralelnu komunikaciju zameniti serijskom, jer kad bitove poređamo "u kolonu po jedan", umesto devetožilnog biće nam dovoljan i trožilni kabl. Sad počinju da se rađaju problemi: kako osmisliti sklop koji vrši paralelno-serijsku konverziju 7-bitnog podatka? Najlakše bi bilo za ovo zadužiti jedan mali i ekonomičan mikrokontroler (recimo, PIC 16C54), ali uslovi rada sklopa to ne dozvoljavaju: temperatura na krovu zgrade može da se kreće u granicama koje su šire od radnog opsega standardnog mikrokontrolera, koji je samo od 0 do 70 °C. Kola sa proširenim radnim opsegom su skupa i teško ih je pronaći na tržištu, ali nešto ipak treba uraditi, samo šta? Mogao bi se dograditi grejač (da ne kažemo žičani otpornik) i termički senzor za regulaciju temperature zimi, ali šta uraditi leti, kad se kućište senzora usija na suncu?

Srećom, pregled karakteristika svih logičkih familija nam je pokazao jedan ohrabrujući podatak: CMOS serija CD4000 u najgorem slučaju ima temperaturni radni opseg od -40 do +85 °C, što bi moglo da bude dovoljno. Kola iz ove serije se lako nalaze na tržištu, potrošnja struje je izuzetno niska, kao i cena, a mala brzina rada je u ovom slučaju više prednost nego nedostatak, jer osigurava dobru imunost na spoljne smetnje, naročito ako u komšiluku imate nekog radioamatera koji je montirao antenu na dva metra od vašeg senzora.

Manje-više je poznato kako izgledaju diskretna rešenja za serijske davače, ali dobra optimizacija će nam pokazati da je moguće ostvariti sklop sa samo dva kola: brojač CD4060, koji sadrži i ulazne invertore pogodne za kvarcni ili RC oscilator i 8-ulazni selektor CD4512. Pogled na šemu na slici 2 će nam razjasniti princip rada: brojač CD4060 osigurava sekvencijalno prozivanje jednog po jednog ulaza na selektoru CD4512, i njegovo prosleđivanje do izlaznog tranzistora. Prvi ulaz je uvek na logičkoj jedinici, i to je start bit, sledi 7 data bitova, a stop signal je, silom prilika, produžen i traje kao 8 bitova. Za ovo je nadležan INH (inhibit) ulaz selektora, koji, kad je logički visok, forsira izlaz na nizak nivo, bez obzira na stanja na data ulazima. Ovo produžavanje stop signala je ne samo poželjno, nego i neophodno, jer uvek osigurava ispravno prepoznavanje start bita od strane prijemnog kola (koje se nalazi na drugom kraju kabla). Kod ovakvih sklopova, gde se vrši permanentna predaja niza bajtova bez pauze, sa standardno kratkim stop bitom, postojala bi opasnost da prijemnik neki data bit, koji je slučajno stalno visok, pogrešno detektuje kao start i da nadalje celu sekvencu prima neispravno.

Ovakav sklop omogućava permanentno slanje 7-bitnog podatka po svim standardima za serijski asinhroni prenos. Srećna okolnost je da nam je u ovom slučaju bio potreban prenos sedam bitova (šest za poziciju senzora za smer vetra i jedan za brzinu), jer da je bio potreban samo još jedan bit, to bi zahtevalo još jedno integrisano kolo.

Na prijemnoj strani je dovoljno postaviti jedan pull-up otpornik i signal voditi direktno na serijski ulaz mikrokontrolera (P3.0 ako je u pitanju 8031), ali nikako ne treba zaboraviti zaštitu od prenapona i impulsnih smetnji (ovo nije nacrtano na šemi). Još bolje rešenje je da se signal na prijemnoj strani prosledi optokaplerom (što bi ograničilo brzinu prenosa), a da se senzor napaja iz zasebnog, galvanski odvojenog ispravljača. Ovo bi bila dovoljna zaštita od manjih elektrostatičkih naboja, ali pravu sigurnost od većih električnih pražnjenja bi nam dala samo optička komunikacija kroz svetlovodna vlakna, jer se ionako radi o opto-senzorima; u tom slučaju bi ceo sklop senzora bio realizovan bez ijedne žice!

U principu je moguće ovakav signal dovesti na serijski ulaz standardnog PC-ja, naravno preko kola koje je u prošlom broju časopisa opisano pod naslovom "Jedna mala podvala". Ako treba invertovati signal (a ovde to jeste slučaj), ulaz 0 selektora CD4512 treba spojiti na masu, a ulaze INH i DIS (3-state disable) međusobno zameniti i na izlaz selektora postaviti jedan pull-up otpornik prema pozitvnom polu napajanja (na šemi nacrtan isprekidanim linijama). Ovako ćemo na kolektoru tranzistora dobiti visok start i niske stop bitove, a smisao data bitova ćemo, ako je potrebno, lako invertovati softverski, na prijemnoj strani.

Kolo CD4060 je binarni brojač koji ima izvedene izlaze Q4 do Q10, pa je Q11 preskočen (iz nekog nejasnog razloga nije izveden na nožicu kola), pa slede izlazi Q12, Q13 i Q14. Pošto nam trebaju četiri susedna izlaza, možemo da koristimo izlaze Q7-Q10, ali zbog nesrećnog preskakanja Q11 nikako nije moguće koristiti izlaze Q12-Q14. Na šemi je data rezonantna učestanost kvarc-kristala za brzinu 4800 bauda. Naravno da je ovu učestanost moguće izbrati po potrebi, pa čak i zameniti kvarcni oscilator RC oscilatorom, ali u tom slučaju prijemni sklop mora da bude "inteligentan" i da ima mogućnost automatskog prilagođavanja brzine prijema, jer RC oscilatori imaju relativno nisku stabilnost učestanosti.

Kolo sa šeme je, zajedno sa svim senzorima, zahvaljujući upotrebi SMD komponenata, realizovano na kružnoj štampanoj pločici prečnika 30 mm. Tako je ispunjen uslov da se dobije senzor malih dimenzija.

Dobitna kombinacija

Senzor za pravac vetra je zapravo apsolutni ugaoni optički enkoder sa Grejovim kodom. Da se malo jasnije izrazimo, očitavanje ugaone pozicije osovine se obavlja refleksionim optičkim senzorima, koji detektuju svetle i tamne površine na obrtnom disku. Ono "apsolutni" znači da u svakom trenutku može da očita apsolutnu ugaonu poziciju, za razliku od inkrementalnog, koji može da čita samo priraštaj ugla.

Zahtevana rezolucija je 36 pozicija po celom krugu (svaka po 10 ugaonih stepeni). Jasno je da nam za predstavljanje ugla treba 6 bitova. Ako bismo koristili standardni binarni kod, postojala bi opasnost da se na prelaznim tačkama, kad više bitova istovremeno menja stanje, dogodi fatalna greška zbog mikronske nepreciznosti u izradi i očitavanju, jer su neki bitovi već promenili stanje, a drugi nisu. Ovaj problem se u praksi rešava primenom Grejovog koda, kod koga se na prelezu između dve susedne pozicije uvek menja samo po jedan bit.

Grejov kod ima i jedan nedostatak: koliko imamo bitova (ili senzora), toliko nam treba optičkih zapisa, dakle kôd bi morao da bude zapisan na valjkastoj površini cilindra (što bi zahtevalo velike dimenzije) ili na disku sa šest različitih prstenastih zapisa, sa različitim poluprečnicima, što bi takođe zahtevalo veliki senzor.

Ovo je bilo lep izazov: malo matemetičke kombinatorike je dovelo do jednog srećno uklopljenog (i potpuno nestandardnog) koda koji ima samo jedan zapis (dakle, svi senzori se nalaze na jednakom rastojanju od obrtne ose), a zadovoljen je i najvažniji uslov da se pri svakoj promeni ugla menja samo po jedan bit. Postoji i ekstra pogodnost - ugao između svaka dva susedna senzora je 60°, dakle senzori su poređani u pravilnoj lepezi oko osovine, što olakšava preciznu montažu refleksionih optičkih senzora na minijaturnu štampanu ploču. Disk kodiran na ovaj način je prikazan na slici 3: senzori su označeni parovima strelica. Zadatak softvera u pokaznoj jedinici uređaja je da pomoću tablice izvrši konverziju očitanog koda u ugao i da upali jednu od 36 svetlećih dioda na kružnom nizu.

Mozgalica za matematičare

U ovom projektu je postojao još jedan izazov koji pravog konstruktora ne ostavlja ravnodušnim. Zahtev naručioca je bio da se, na posebnu komandu, prikaže i srednja vrednost očitane brzine i pravca vetra za određeno vreme. Za računanje srednje vrednosti brzine nema nikakvih teškoća, jer je to samo aritmetička sredina određenog broja memorisanih vrednosti, ali varate se ako mislite da je usrednjavanje ugla tako jednostavno. I danas se u krugovima zaljubljenika u mikrokontrolere priča o jednom od "jačih" bagova koji je, nepažnjom programera, nekim čudom zaobišao sve testove i ušao u stariji tip istog ovakvog uređaja.

O čemu se radi? Ako očitani ugao, recimo, varira od 39° do 41°, biće ispravno izračunata srednja vrednost od 40°, što je u redu, ali ako varira između 359° i 1°, onda će biti izračunata srednja vrednost od 180° (pa to je sredina, zar ne?). Nesrećnim sticajem okolnosti, dobijena je upravo vrednost koja je najdalje od ispravne!

Problem je, koliko smešan, toliko i neugodan. Rešenja svakako ima više, a vešt matematičar bi pronašao i bolji način, ali opredelio sam sa za algoritam koji pomalo zloupotrebljava trigonometriju. Za svaku memorisanu vrednost ugla se izračunava sinus i kosinus (iz tablice, jer je rezolucija relativno mala), zatim se na klasičan način računaju srednje vrednosti za obe ove veličine, a onda se iz te dve srednje vrednosti jednom operacijom deljenja dobija tangens. Iz druge tablice se tangens konvertuje u ugao (to je znatno brže nego "pošteno" računati arc tg), i to je srednja vrednost ugla. Problem deljenja sa nulom je rešen posebnim testom u programu koji nije vodio na poruku greške, nego na fiksnu vrednost ugla od 90° ili 270°, zavisno od predznaka izračunate srednje vrednosti sinusa.

Nisam uspeo da matematički dokažem tačnost ovog algoritma, ali niko od naručilaca nije zapazio ništa neobično. A to je najvažnije, zar ne?