Microcontrolere PIC on-line GRATIS!

 
 
 
   
Pagina anterioară Conţinut Pagina următoare

 

CAPITOLUL 1

Introducere în Microcontrolere

Introducere
Istorie
Microcontrolere contra microprocesoare

1.1 Unitatea de memorie
1.2 Unitatea de procesare
1.3 Bus-ul
1.4 Unitatea intrare-ieşire
1.5 Comunicaţie serială
1.6 Unitatea de timer
1.7 Watchdog-ul
1.8 Convertorul Analog-Digital
1.9 Programul


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ţă.

Istorie

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 Zilog anunţă Z80. În timpul creării acestui microprocesor, Faggin ia o decizie crucială. Ştiind că un mare număr de programe fuseseră dezvoltate pentru 8080, Faggin îşi dă seama că mulţi vor rămâne fideli acelui microprocesor din cauza marii cheltuieli care ar rezulta în urma refacerii tuturor programelor. Astfel el decide că un nou microprocesor trebuie să fie compatibil cu 8080, sau că trebuie să fie capabil să execute toate programele care deja fusese scrise pentru 8080. În afară acestor caracteristici, multe altele noi au fost adăugate, aşa că Z80 a fost un microprocesor foarte puternic la vremea lui. Putea adresa direct 64Kb de memorie, avea 176 instrucţiuni, un număr mare de registre, o opţiune incorporată pentru reîmprospătarea memoriei RAM dinamice, o singură sursă, viteză de lucru mult mai mare etc. Z80 a fost un succes mare şi toată lumea a făcut conversia de 8080 la Z80. Se poate spune că Z80 comercial, a fost fără nici o îndoială, cel mai de succes micropocesor de 8 biţi a acelui timp. În afară de Zilog, alţi noi producători apar de asemenea ca: Mostek, NEC, SHARP şi SGS. Z80 a fost inima a multor calculatoare ca: Spectrum, Partner, TRS703, Z-3.

Î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.

1.1 Unitatea de memorie

Memoria este o parte a microcontrolerului a cărei funcţie este de a înmagazina date.
Cel mai uşor mod de a explica este de a-l descrie ca un dulap mare cu multe sertare. Dacă presupunem că am marcat sertarele într-un asemenea fel încât să nu fie confundate, oricare din conţinutul lor va fi atunci uşor accesibil. Este suficient să se ştie desemnarea sertarului şi astfel conţinutul lui ne va fi cunoscut în mod sigur.

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.

1.3 Bus-ul

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ă.

1.4 Unitatea intrare-ieşire

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.

1.5 Comunicaţia serială

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.

1.6 Unitatea timer

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.

1.7 Watchdog-ul

Î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).

1.9 Programul

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
REGISTER1=MEMORY LOCATION_A
REGISTER2=MEMORY LOCATION_B
PORTA=REGISTER1 + REGISTER2

END

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.

Programarea poate fi făcută în câteva limbaje ca Assembler, C şi Basic care sunt cele mai folosite limbaje. Assembler aparţine limbajelor de nivel scăzut ce sunt programate lent, dar folosesc cel mai mic spaţiu în memorie şi dă cele mai bune rezultate când se are în vedere viteza de execuţie a programului. Pentru că este cel mai folosit limbaj în programarea microcontrolerelor va fi discutat într-un capitol ulterior. Programele în limbajul C sunt mai uşor de scris, mai uşor de înţeles, dar sunt mai lente în executare decât programele în Assembler. Basic este cel mai uşor de învăţat, şi instrucţiunile sale sunt cele mai aproape de modul de gândire a omului, dar ca şi limbajul de programare C este de asemenea mai lent decât Assembler-ul. În orice caz, înainte de a vă hotărî în privinţa unuia din aceste limbaje trebuie să studiaţi cu atenţie cerinţele privind viteza de execuţie, mărimea memoriei şi timpul disponibil pentru asamblarea sa.

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.

 

Pagina anterioară Conţinut Pagina următoare
 

© Copyright 2003. mikroElektronika. All Rights Reserved. For any comments contact webmaster.