![]() |
Microcontrolere PIC on-line GRATIS! |
![]() |
|||||
|
|||||||
|
CAPITOLUL 1 Introducere în Microcontrolere Introducere Circumstanţele în care ne găsim astăzi în domeniul microcontrolerelor şi-au avut începuturile în dezvoltarea tehnologiei circuitelor integrate. Această dezvoltare a făcut posibilă înmagazinarea a sute de mii de tranzistoare într-un singur cip. Aceasta a fost o premiză pentru producţia de microprocesoare, şi primele calculatoare au fost făcute prin adăugarea perifericelor ca memorie, linii intrare-ieşire, timer-i şi altele. Următoarea creştere a volumului capsulei a dus la crearea circuitelor integrate. Aceste circuite integrate conţin atât procesorul cât şi perifericele. Aşa s-a întâmplat cum primul cip conţinând un microcalculator, sau ce va deveni cunoscut mai târziu ca microcontroler a luat fiinţă. Este anul 1969, şi o echipă de ingineri japonezi de la compania BUSICOM sosesc în Statele Unite cu cererea ca unele circuite integrate pentru calculatoare să fie făcute folosind proiectele lor. Propunerea a fost făcută către INTEL, iar Marcian Hoff a fost desemnat responsabil cu acest proiect. Pentru că el era cel ce avea experienţă în lucrul cu un calculator (PC) PDP8, i-a venit să sugereze o soluţie diferită fundamental în locul construcţiei propuse. Această soluţie presupunea că funcţionarea circuitului integrat este determinată de un program memorat în el. Aceasta a însemnat că configuraţia ar fi fost mult mai simplă, dar aceasta ar fi cerut mult mai multă memorie decât ar fi cerut proiectul propus de inginerii japonezi. După un timp, cu toate că inginerii japonezi au încercat să caute o soluţie mai simplă, ideea lui Marcian a câştigat, şi a luat naştere primul microprocesor. În transformarea unei idei într-un produs finit, Frederico Faggin a fost de un ajutor major pentru INTEL. El s-a transferat la INTEL, şi doar în 9 luni a reuşit să scoată un produs din prima sa concepţie. INTEL a obţinut drepturile de a vinde acest bloc integral în 1971. În primul rând ei au cumpărat licenţa de la compania BUSICOM care nu au avut idee ce comoară avuseseră. În timpul acelui an a apărut pe piaţă un microprocesor numit 4004. Acela a fost primul microprocesor de 4 biţi cu viteză 6000 operaţii pe secundă. Nu mult după aceea, compania americană CTC a cerut de la INTEL şi de la Texas Instruments să facă un microprocesor pe 8 biţi pentru folosinţă în terminale. Cu toate că CTC a renunţat la această idee până la sfârşit, INTEL şi Texas Instruments au continuat să lucreze la microprocesor şi în aprilie 1972 a apărut pe piaţă primul microprocesor de 8 biţi sub numele de 8008. Putea să adreseze 16Kb de memorie şi avea 45 de instrucţiuni şi viteza de 300.000 de operaţii pe secundă. Acel microprocesor a fost predecesorul tuturor microprocesoarelor de astăzi. INTEL au continuat dezvoltările lor până în aprilie 1974 şi au lansat pe piaţă microprocesorul de 8 biţi sub numele de 8080 ce putea adresa 64Kb de memorie şi avea 75 de instrucţiuni, iar preţul începuse de la 360$. Într-o altă companie americană Motorola, şi-au dat seama repede ce se întâmpla, aşa că au lansat pe piaţă un microprocesor de 8 biţi 6800. Constructor şef era Chuck Peddle şi pe lângă microprocesorul propriu-zis, Motorola a fost prima companie care să facă alte periferice ca 6820 şi 6850. La acel timp multe companii au recunoscut marea importanţă a microprocesoarelor şi au început propriile lor dezvoltări. Chuck Peddle părăseşte Motorola pentru a se muta la MOS Technology şi continuă să lucreze intensiv la dezvoltarea microprocesoarelor. La expoziţia WESCON din Statele Unite din 1975 a avut loc un eveniment critic în istoria microprocesoarelor. MOS Technology a anunţat că produce microprocesoarele 6501 şi 6502 la 25$ bucata pe care cumpărătorii le puteau cumpăra imediat. Aceasta a fost atât de senzaţional încât au crezut că este un fel de înşelăciune, gândind că competitorii vindeau 8080 şi 6800 la 179$. Ca un răspuns la competitorii lor atât INTEL cât şi Motorola au scăzut preţurile lor în prima zi a expoziţiei până la 69.95$ pe microprocesor. Motorola intentează repede proces contra lui MOS Technology şi contra lui Chuck Peddle pentru copierea protejatului 6800. MOS Technology încetează de a mai produce 6501 dar continuă să producă 6502. 6502 este un microcontroler pe 8 biţi cu 56 de instrucţiuni şi o capabilitate de adresare directă de 64Kb de memorie. Datorită costului scăzut, 6502 devine foarte popular, aşa că este instalat în calculatoare ca :KIM-1, Apple I, Apple II, Atari, Comodore, Acorn, Oric, Galeb, Orao, Ultra şi multe altele. Curând apar câţiva producători de 6502 (Rockwell, Sznertek, GTE, NCR, Ricoh şi Comodore preiau MOS Technology) ce era în momentul prosperităţii sale vândut la o rată de 15 milioane de microprocesoare pe an!
Alţii totuşi nu au cedat. Federico Faggin părăseşte INTEL, şi îşi porneşte
propria sa companie Zilog Inc. În 1976, INTEL iese pe piaţă cu o versiune îmbunătăţită de microprocesor pe 8 biţi numit 8085. Totuşi, Z80 era cu mult mai bun încât INTEL curând a pierdut bătălia. Chiar dacă au apărut pe piaţă încă câteva microprocesoare (6809, 2650, SC/MP etc.), totul fusese de fapt deja hotărât. Nu mai erau de făcut îmbunătăţiri importante ca să-i facă pe producători să se convertească spre ceva nou, aşa că 6502 şi Z80 împreună cu 6800 au rămas ca cei mai reprezentativi ai microprocesoarelor de 8 biţi ai acelui timp. Microcontrolere contra Microprocesoare Microcontrolerul diferă de un microprocesor în multe feluri. În primul rând şi cel mai important este funcţionalitatea sa. Pentru a fi folosit, unui microprocesor trebuie să i se adauge alte componente ca memorie, sau componente pentru primirea şi trimiterea de date. Pe scurt, aceasta înseamnă că microprocesorul este inima calculatorului. Pe de altă parte, microcontrolerul este proiectat să fie toate acestea într-unul singur. Nu sunt necesare alte componente externe pentru aplicarea sa pentru că toate perifericele necesare sunt deja incluse în el. Astfel, economisim timpul şi spaţiul necesare pentru construirea de aparate.Memoria
este o parte a microcontrolerului a cărei funcţie este de a înmagazina
date. Componentele de memorie sunt exact aşa. Pentru o anumită intrare obţinem conţinutul unei anumite locaţii de memorie adresate şi aceasta este totul. Două noi concepte ne sunt aduse: adresarea şi locaţia de memorie. Memoria constă din toate locaţiile de memorie, şi adresarea nu este altceva decât selectarea uneia din ele. Aceasta înseamnă că noi trebuie să selectăm locaţia de memorie la un capăt, şi la celălalt capăt trebuie să aşteptăm conţinutul acelei locaţii. În afară de citirea dintr-o locaţie de memorie, memoria trebuie de asemenea să permită scrierea în ea. Aceasta se face prin asigurarea unei linii adiţionale numită linie de control. Vom desemna această linie ca R/W (citeşte /scrie). Linia de control este folosită în următorul fel: dacă r/w=1, se face citirea, şi dacă opusul este adevărat atunci se face scrierea în locaţia de memorie. Memoria este primul element, dar avem nevoie şi de altele pentru ca microcontrolerul nostru să funcţioneze. 1.2 Unitatea de procesare centrală Să adăugăm alte 3 locaţii de memorie pentru un bloc specific ce va avea o capabilitate incorporată de înmulţire, împărţire, scădere şi să-i mutăm conţinutul dintr-o locaţie de memorie în alta. Partea pe care tocmai am adăugat-o este numită "unitatea de procesare centrală" (CPU). Locaţiile ei de memorie sunt numite regiştri. Regiştrii sunt deci locaţii de memorie al căror rol este de a ajuta prin executarea a variate operaţii matematice sau a altor operaţii cu date oriunde se vor fi găsit datele. Să privim la situaţia curentă. Avem două entităţi independente (memoria şi CPU) ce sunt interconectate, şi astfel orice schimb de informaţii este ascuns, ca şi funcţionalitatea sa. Dacă, de exemplu, dorim să adăugăm conţinutul a două locaţii de memorie şi întoarcem rezultatul înapoi în memorie, vom avea nevoie de o conexiune între memorie şi CPU. Mai simplu formulat, trebuie să avem o anumită "cale" prin care datele circulă de la un bloc la altul. Calea este numită "bus"- magistrală. Fizic, el reprezintă un grup de 8, 16, sau mai multe fire. Sunt două tipuri de bus-uri: bus de adresă şi bus de date. Primul constă din atâtea linii cât este cantitatea de memorie ce dorim să o adresăm, iar celălalt este atât de lat cât sunt datele, în cazul nostru 8 biţi sau linia de conectare. Primul serveşte la transmiterea adreselor de la CPU la memorie, iar cel de al doilea la conectarea tuturor blocurilor din interiorul microcontrolerului. În ceea ce priveşte funcţionalitatea, situaţia s-a îmbunătăţit, dar o nouă problemă a apărut de asemenea: avem o unitate ce este capabilă să lucreze singură, dar ce nu are nici un contact cu lumea de afară, sau cu noi! Pentru a înlătura această deficienţă, să adăugăm un bloc ce conţine câteva locaţii de memorie al căror singur capăt este conectat la bus-ul de date, iar celălalt are conexiune cu liniile de ieşire la microcontroler ce pot fi văzute cu ochiul liber ca pini la componenta electronică. Aceste locaţii ce tocmai le-am adăugat sunt numite "porturi". Sunt diferite tipuri de porturi: intrare, ieşire sau porturi pe două-căi. Când se lucrează cu porturi, mai întâi de toate este necesar să se aleagă cu ce port urmează să se lucreze, şi apoi să se trimită date la, sau să se ia date de la port. Când se lucrează cu el portul se comportă ca o locaţie de memorie. Ceva este pur şi simplu scris în sau citit din el, şi este posibil de a remarca uşor aceasta la pinii microcontrolerului. Cu aceasta am adăugat la unitatea deja existentă posibilitatea comunicării cu lumea de afară. Totuşi, acest mod de comunicare are neajunsurile lui. Unul din neajunsurile de bază este numărul de linii ce trebuie să fie folosite pentru a transfera datele. Ce s-ar întâmpla dacă acestea ar trebui transferate la distanţă de câţiva kilometri? Numărul de linii înmulţit cu numărul de kilometri nu promite costuri eficiente pentru proiect. Nu ne rămâne decât să reducem numărul de linii într-un aşa fel încât să nu scădem funcţionalitatea. Să presupunem că lucrăm doar cu 3 linii, şi că o linie este folosită pentru trimiterea de date, alta pentru recepţie şi a treia este folosită ca o linie de referinţă atât pentru partea de intrare cât şi pentru partea de ieşire. Pentru ca aceasta să funcţioneze, trebuie să stabilim regulile de schimb ale datelor. Aceste reguli sunt numite protocol. Protocolul este de aceea definit în avans ca să nu fie nici o neînţelegere între părţile ce comunică una cu alta. De exemplu, dacă un om vorbeşte în franceză, şi altul vorbeşte în engleză, este puţin probabil că ei se vor înţelege repede şi eficient unul cu altul. Să presupunem că avem următorul protocol. Unitatea logică "1" este setată pe linia de transmisie până ce începe transferul. Odată ce începe transferul, coborâm linia de transmisie la "0" logic pentru o perioadă de timp (pe care o vom desemna ca T), aşa că partea receptoare va şti că sunt date de primit, aşa că va activa mecanismul ei de recepţie. Să ne întoarcem acum la partea de transmisie şi să începem să punem zero-uri şi unu-uri pe linia de transmisie în ordinea de la un bit a celei mai de jos valori la un bit a celei mai de sus valori. Să lăsăm ca fiecare bit să rămână pe linie pentru o perioadă de timp egală cu T, şi la sfârşit, sau după al 8-lea bit, să aducem unitatea logică "1" înapoi pe linie ce va marca sfârşitul transmisiei unei date. Protocolul ce tocmai l-am descris este numit în literatura profesională NRZ (Non-Return to Zero). Unitatea serială folosită pentru a trimite date, dar numai prin trei linii Pentru că avem linii separate de recepţie şi de transmitere, este posibil să recepţionăm şi să transmitem date (informaţii) în acelaşi timp. Blocul aşa numit full-duplex mode ce permite acest mod de comunicare este numit blocul de comunicare serială. Spre deosebire de transmisia paralelă, datele sunt mutate aici bit cu bit, sau într-o serie de biţi, de unde vine şi numele de comunicaţie serială. După recepţia de date trebuie să le citim din locaţia de transmisie şi să le înmagazinăm în memorie în mod opus transmiterii unde procesul este invers. Datele circulă din memorie prin bus către locaţia de trimitere, şi de acolo către unitatea de recepţie conform protocolului. Acum că avem comunicaţia serială, putem recepţiona, trimite şi procesa date. Totuşi, pentru noi ca să putem să îl folosim în industrie mai avem nevoie de câteva blocuri. Unul din acestea este blocul timer care este important pentru noi pentru că ne dă informaţia de timp, durată, protocol etc. Unitatea de bază a timer-ului este un contor liber (free-run) care este de fapt un registru a cărui valoare numerică creşte cu unu la intervale egale, aşa încât luându-i valoarea după intervalele T1 şi T2 şi pe baza diferenţei lor să putem determina cât timp a trecut. Acesta este o parte foarte importantă a microcontrolerului al cărui control cere cea mai mare parte a timpului nostru. Încă un lucru ce necesită atenţia noastră este funcţionarea fără defecte a microcontrolerului în timpul funcţionării. Să presupunem că urmare a unei anumite interferenţe (ce adesea se întâmplă în industrie) microcontrolerul nostru se opreşte din executarea programului, sau şi mai rău, începe să funcţioneze incorect. Bineînţeles, când aceasta se întâmplă cu un calculator, îl resetăm pur şi simplu şi va continua să lucreze. Totuşi, nu există buton de resetare pe care să-l apăsăm în cazul microcontrolerului care să rezolve astfel problema noastră. Pentru a depăşi acest obstacol, avem nevoie de a introduce încă un bloc numit watchdog-câinele de pază. Acest bloc este de fapt un alt contor liber (free-run) unde programul nostru trebuie să scrie un zero ori de câte ori se execută corect. În caz că programul se "înţepeneşte", nu se va mai scrie zero, iar contorul se va reseta singur la atingerea valorii sale maxime. Aceasta va duce la rularea programului din nou, şi corect de această dată pe toată durata. Acesta este un element important al fiecărui program ce trebuie să fie fiabil fără supravegherea omului. 1.8 Convertorul Analog-Digital Pentru că semnalele de la periferice sunt substanţial diferite de cele pe care le poate înţelege microcontrolerul (zero şi unu), ele trebuie convertite într-un mod care să fie înţeles de microcontroler. Această sarcină este îndeplinită de un bloc pentru conversia analog-digitală sau de un convertor AD. Acest bloc este responsabil pentru convertirea unei informaţii despre o anumită valoare analogică într-un număr binar şi pentru a o urmări pe tot parcursul la un bloc CPU aşa ca blocul CPU să o poată procesa. Astfel microcontrolerul este acum terminat, şi tot ce mai rămâne de făcut este de a-l pune într-o componentă electronică unde va accesa blocurile interioare prin pinii exteriori. Imaginea de mai jos arată cum arată un microcontroler în interior.
Configuraţia fizică a interiorului unui microcontroler Liniile subţiri ce merg din interior către părţile laterale ale microcontrolerului reprezintă fire conectând blocurile interioare cu pinii capsulei microcontrolerului. Schema următoare reprezintă secţiunea centrală a microcontrolerului.
Pentru o aplicaţie reală, un microcontroler singur nu este de ajuns. În afară de microcontroler, avem nevoie de un program pe care să-l execute, şi alte câteva elemente ce constituie o interfaţă logică către elementele de stabilizare (ce se va discuta în capitolele următoare). Scrierea programului este un domeniu special de lucru al microcontolerului şi este denumit "programare". Să încercăm să scriem un mic program ce îl vom crea singuri şi pe care oricine va fi în stare să-l înţeleagă.
START
Programul
adună conţinutul a două locaţii de memorie, şi vede suma lor la portul A.
Prima linie a programului este pentru mutarea conţinutul locaţiei de
memorie "A" într-unul din regiştri unităţii de procesare centrale. Pentru
că avem nevoie şi de celelalte date de asemenea, le vom muta de asemenea
în celălalt registru al unităţii de procesare centrale. Următoarea
instrucţiune instruieşte unitatea de procesare centrală să adune
conţinutul celor doi regiştri să trimită rezultatul obţinut la portul A,
încât suma acestei adunări să fie vizibilă pentru toată lumea de afară.
Pentru o problemă mai complexă, programul care să lucreze la rezolvarea ei
va fi mai mare. După ce este scris programul, trebuie să instalăm microcontrolerul într-un aparat şi să-l lăsăm să lucreze. Pentru a face aceasta trebuie să adăugăm câteva componente externe necesare pentru funcţionarea sa. Mai întâi trebuie să dăm viaţă microcontrolerului prin conectarea sa la o sursă (tensiune necesară pentru operarea tuturor instrumentelor electronice) şi oscilatorului al cărui rol este similar inimii din corpul uman. Bazat pe ceasul său microcontrolerul execută instrucţiunile programului. Îndată ce este alimentat microcontrolerul va executa un scurt control asupra sa, se va uita la începutul programului şi va începe să-l execute. Cum va lucra aparatul depinde de mulţi parametri, cel mai important fiind priceperea dezvoltatorului de hardware, şi de experienţa programatorului în obţinerea maximului din aparat cu programul său.
|
|
© Copyright 2003. mikroElektronika. All Rights Reserved. For any comments contact webmaster. |