Balkanski špijun

Voja Antonić
Ovog meseca bavićemo se jednostavnim sistemom za akviziciju podataka, koji će pokazati da donedavno skupi, glomazni i komplikovabili uređaji mogu, uz minimalna ulaganja, da se realizuju pomoću modernih mikrokontrolera.


Pojavom mikrokontrolera, digitalni sistemi za akviziciju podataka su postali neuporedivo manji i jednostavniji. Sada se isplati ugrađivati ih i tamo gde su donedavo radili mehanički registratori: u meteorološke stanice, medicinske instrumente, motorna vozila, tehničku mernu opremu... Niska cena i veliki kapacitet memorijskih čipova nam dozvoljava da sagradimo uređaj za akviziciju podataka koji celu datoteku drži u statičkom RAM-u; biće to, dakle, solid state projekat, bez pokretnih mahaničkih delova.


Projektni zadatak

Projektni zadatak nije teško opisati: treba nam uređaj koji će periodično očitavati stanje na jednom ili više ulaza i te podatke upisivati u svoju memoriju. Posle završenog procesa upisa, uređaj se donosi do kompjutera, priključuje se na (najbolje serijski) port i sve je dalje stvar softvera - iscrtavaće se grafikoni, štampati tablice ili vršiti statistička obrada.
Potreban nam je, dakle, serijski izlaz prilagođen RS232C standardu, RAM (najbolje statički) u koji će se upisivati podaci, mikrokontroler koji će upravljati radom uređaja i ulazni sklop koji će konvertovati podatke u digitalni oblik u kome će mikrokontroler moći da ga očita.
Taj ulazni sklop je najkritičniji deo uređaja - u većini slučajeva tražiće se konverzija analogne veličine u digitalnu, ali ni to ne bi trebalo da bude problem jer se danas na tržištu nalazi veliki broj mikrokontrolera sa ugrađenim analogno-digitalnim konvertorom. Treba samo da odaberemo tip koji će zadovoljiti zahteve rezolucije i brzine konverzije i da pažljivo odvojimo analogni od digitalnog dela uređaja, kako ne bismo smetnjama koje unosi digitalni signal degradirali tačnost izmerene analogne veličine.
Ipak, projekat koji ovde objavljujemo neće imati analogno-digitalni konvertor - biće veoma jednostavan, ali to ne znači da za njega nećete naći primenu. U samo četiri čipa ćemo realizovati uređaj koji meri i memoriše brzinu kretanja motornog vozila. Slični (ali mehanički) uređaji postoje već nekoliko decenija i rade sa pisaljkom koja grafikon brzine iscrtava na kružnom papiru - ovakve registratore, po sili zakona, imaju teretna vozila koja se kreću po drumovima Evrope. Da ne bismo ulazili u pravna pitanja koja se tiču procedure atestiranja ovakvih uređaja, zadovoljićemo se sklopom za privatnu upotrebu i za svoje zadovoljstvo... uzgred dolazi i uvid u način vožnje nekoga kome smo poverili svoj automobil. Eto ideje za privatne preduzimače koji imaju svoj vozni park sa angažovanim vozačima, ili za roditelje kojima zebe srce svaki put kad svome detetu, koje je tek zakoračilo u punoletstvo, povere automobil uz neizbežni zahtev "samo nemoj brzo da voziš"... i pritom dobro znaju da taj zahtev neće biti ispunjen.
Nije naše da dajemo savete koji se tiču osnovnog etičkog i pedagoškog pitanja - da li je manje zlo da detetu ukažemo nepoverenje i špijuniramo ga u svakom trenutku, ili da ga ponekad ostavimo bez ikakvog nadzora i da se molimo da nam se vrati živo i zdravo. Ostavljajući da svako o ovome odluči sam, vraćamo se našem projektu.


Šta sve mogu četiri čipa

Izbor je pao na Microchip-ov mikrokontroler tipa PIC 16C54 ili 16C84 - opredelite se sami. Mada ova dva tipa imaju potpuno jednak broj i raspored pinova, prilično su različiti: po širini reči programske memorije, po kapacitetu internog ROM-a i RAM-a i, što je najvažnije, po načinu programiranja. Programska memorija mikrokontrolera 16C84 je u EEPROM-u, što značajno olakšava upis programa - ako nemate specijalni programator za 16C54, preporučujemo 16C84 i programator koji je kao samogradnja objavljen u "PC #26" (jul 1997).
Tip RAM-a treba odabrati prema zahtevanom kapacitetu. Na šemi je nacrtan 431000, čiji je kapacitet 128 K*8, ali ako su dopuštene skromnije performanse uređaja, možemo da koristimo i 62256 (32 K*8) ili 6264 (8 K*8). Lako ćemo se opredeliti ako izračunamo šta nam je zaista potrebno: recimo da hoćemo da upisujemo brzinu vozila sa rezolucijom od 1 km/h, pa pošto smo sigurni da taj podatak neće premašiti broj 255, dovoljan će nam biti jedan bajt po uzorku. Usvojićemo, takođe, zahtev da na svakih pet sekundi (12 puta u minutu) po jednom upisujemo stanje registra koji meri brzinu i da zahtevamo da autonomija rada iznosi sedam dana. Tada će nam biti potrebno 7 dana * 24 časa * 60 minuta * 12 uzoraka = 120,960 bajtova. Pošto 431000 ima kapacitet 131,072 bajta, vidimo da smo se "tesno" provukli sa tim tipom, ali ako primenumo prostu kompresiju, možemo višestruko da popravimo odnos između ugrađenog kapaciteta i postignute autonomije rada. Ova kompresija u najprostijem obliku podrazumeva da se u toku mirovanja vozila u RAM ne upisuju hiljade nula, već samo dvobajtni podatak o broju 5-sekundnih ciklusa mirovanja vozila kome, naravno, prethodi specifičan heder - najbolje bajt 255.
Mikrokontroleri PIC 16C54 i 16C84 su pakovani u 18-pinsko kućište, tako da imaju samo po 12 univerzalnih ulaza/izlaza i još po jedan RTCC (Real Time Clock/Counter) ulaz. Ako želimo da projekat bude jednostavan i pregledan, ne treba olako povećavati broj portova dodavanjem spoljnih periferija; bolje je pre toga pokušati da se svi zahtevi "spakuju" na raspoloživi ulazno-izlazni prostor.


Raspored portova

RAM adrese sa najveći "potrošač" portova: na tipu 431000 ima ih čak 17, pe će najbolje biti da ih ne pobuđujemo direktno sa portova, već da u igru uvedemo binarne brojače, čiji će izlazi prozivati adrese RAM-a. Ionako nam ni pri upisu ni pri čitanju neće trebati pristup sadržaju preko reda, nego samo od adrese 0 pa redom do kraja; tako će nam za upravljanje adresnim registrom biti potreban samo signal za reset brojača i za uvećanje registra. Što se samih brojača tiče, izbor je pao na CMOS binarne brojače CD4040, koji imaju 11 izlaza. Pošto nam za generisanje adresa treba ukupno 17 izlaza, dovoljno će nam biti dva ovakva brojača.
Komunikacija sa RAM-om zahteva dvosmernu osmobitnu magistralu i još dva izlazna porta, za signale upisa (-WR) i čitanja (-RD). Posle ispunjavanja ovih zahteva, bilans je poražavajući: ostala su nam samo dva ulazno/izlazna porta i brojački (RTCC) ulaz. Jedan port moramo da rezervišemo za serijski izlaz, a drygu kao detekciju da li je serijski kabl priključen, dakle da li se zahteva akvizicija podataka ili prepis preko serijskog porta u računar. Ostaje nam samo RTCC ulaz; on je prirodno predodređen da broji impulse sa davača brzine, pa ćemo ga za to upotrebiti.
Upotrebili smo sve portove, a ostala su dva zahteva: impuls za uvećanje stanja i za reset adresnog brojača. Prvi možemo da rešimo na elegantan način: port koji pobuđuje izlazne bafere RAM-a (-OE, Output Enable) može da se koristi i za uvećanje brojača: prilikom prepisa sadržaja RAM-a na serijski port, ionako nam treba uvećanje brojača posle svakog čitanja RAM-a, a pri akviziciji merenju brzine i upisu u RAM možemo da posle svakog aktiviranja -WR impulsa, uradimo i jedno "transparentno" čitanje RAM-a, mada nam ovaj podatak zapravo ne treba; potreban nam je samo impuls čitanja, da bismo uvećali brojač.
Ipak, pogledajmo šta se događa pri čitanju RAM-a: na -RD ulazu nam treba negativan impuls, a stanje brojača se menja pri opadajućoj ivici, dakle na početku negativnog impulsa. Ovo je problem, pošto su sva CMOS kola serije CD4000 veoma spora, a CD 4020 je asinhroni brojač, pa će odziv poslednjeg izlaza značajno kasniti za impulsom na brojačkom ulazu. Dodajmo tome i vreme odziva RAM-a, pa ćemo videti da će nam posle spuštanja porta RA3 na nizak nivo trebati neko vreme do ispravnog odziva RAM-a. Nekoliko NOP-ova u programu, posle spuštanja RA3 na nizak nivo, a pre čitanja porta RB će rešiti ovaj problem.
Poslednji na listi zahteva je reset adresnog brojača, koji mora da se izvede pri svakom startovanju uređaja i pre prepisivanja sadržaja RAM-a u kompjuter preko serijskog porta. Slobodnih portova više nemamo, ali nam za reset nisu ni potrebni - dovoljno je da signal sa tastera za startovanje uređaja iskoristimo za resetovanje mikrokontrolera i brojača istovremeno. Mala nezgoda se pojavljuje kada se, kao u ovom slučaju, suočimo sa različitim polaritetima signala za reset (PIC 16C54/84 se resetuje niskim, a CD4020 visokim logičkim nivoom), pa mora da se ugradi nekakav invertor. Opredelili smo se za diskretni invertor sa jednim tranzistorom, jer će on zauzeti manje nesta nego kad bismo dodavali još jedno 14-pinsko integrisano kolo.
Vremensko kolo za automatsko generisanje -MCLR (reset) signala za 16C54/84 je izostavljeno - predstavljalo bi nepotrebnu investiciju, ne zato što svi mikrokontroleri serije PIC imaju interno kolo za reset (jer ono ne radi baš najbolje kod neposrednog baterijskog napajanja, zato što je porast napona u trenutku priključenja baterije obično brži nego što je Microchip propisao za normalan rad ovog internog kola), već zato što pre svakog rada ionako treba pritisnuti startni taster, čime se realizuje reset signal.


Napajanje nije kritično

Napajanje je posebna priča - ako po priloženoj šemi sudimo, izgleda kao da smo namerno izbegli ovu temu. Ipak nije tako, jer su sve komponente koje su ovde primenjene tako malo zahtevne što se tiče napajanja da ne moramo čak ni da postavimo glavni OFF-ON prekidač, a ni stabilizator napona. Potrošnja mikrokontrolera PIC 16C54 je, za tip sa LP sufiksom (koji preporučujemo) svega 32 mikroampera, pri taktu oscilatora od 32 kHz. ®ak i ovako niska učestanost takta je sasvim dovoljna za ovu primenu, jer su zahtevi za procesorskom snagom minimalni. PIC 16C84 LP ima nešto višu potrošnju: 60 mikroampera pri istom taktu, ali i to je sasvim zanemarljivo.
Brojači CD4020 imaju još nižu potrošnju, a pošto RAM radi skoro u statičkom režimu, ni njegova potrošnja struje nije značajna. Zvuči apsurdno, ali najznačajniji potrošači su postali pull-up otpornici, naročito onaj od 10 K na ulazu sa senzora za brzinu, jer njegovu vrednost ne smemo preterano da povećevamo, kako ne bismo povećali osetljivost ovog ulaza na smetnje.
Što se napajanja uređaja strujom tiče, savet je da se koriste četiri nikl-kadmijumske baterije koje, kad se spoje redno, daju napon od 4.8 V, a pošto su zahtevi za strujom napajanja veoma skromni, dobro će doći i minijaturni NiCd članovi za bežične telefonske aparate. Baterije su malih dimenzija i leme se direktno na štampanu ploču, pa tako možemo da napravimo veoma kompaktan uređaj.
Punjenje baterija može da se realizuje pomoću spoljnog ispravljača, ali možemo da pribegnemo i elegantnijem rešenju: punite ih direktno iz RS232 porta računara, nekim od izlaza koji ima stalni nivo od +12 V. Ako ga povežemo diretno na + pol baterije, aktiviraće se strujno ograničenje na RS232 drajveru računara, pa će struja punjenja biti ograničena na oko 10 mA. U ovom slučaju nikakav redni otpornik nije potreban (mada ne bi ni smetao), ali je dobro staviti svetleću diodu tako da struja punjenja prolazi kroz nju, kako bismo imali indikator punjenja baterije. Sve ovo nije nacrtano na šemi, jer spada u deo koji svako može da osmisli i realizuje prema svojoj želji.
Senzor za brzinu može da bude neki od standardnih senzora za elektronske taksimetre. Oni se obično mehanički vezuju za sajlu brzinometra i daju po jedan impuls pri svakom obrtaju čelične žice u sajli. Ovakav senzor može da se napravi i u samogradnji, naravno ako imate dovoljno iskustva, alata i materijala za ovakve zahvate.




PC home - osnovna strana Novi broj|Arhiva|Pretrazivanje svih brojeva|O nama
Pretplatite se na PC|Postanite saradnik casopisa PC|Pitanja i komentari u vezi casopisa