8.7 Microcontrollere

8.7.1 Arhitectura microcontrollerului

8.7.2 Microprocesor

8.7.3 Memorie

8.7.4 Hardware de intrare/ieșire

8.7.5 Programarea microcontrollerului și execuția programelor

8.7.6 Dezvoltarea aplicațiilor pentru microcontrollere

Un microcontroller (numit istoric „microcomputer”) este un computer digital dedicat, cu scop special și în miniatură, care este de obicei „încorporat” în sistemul de aplicație (de exemplu, sistemul mecatronic). Chiar dacă sunt mai mici ca viteză și mai costisitoare în comparație cu implementările hardware (dispozitive digitale hardware cu funcționalitate fixă), microcontrollerele au flexibilitatea și funcționalitatea mai complexă oferită de programabilitatea software.

Ca pentru orice computer digital, cerința minimă de hardware pentru un microcontroller este o unitate centrală de procesare (CPU) pentru procesarea datelor digitale, o memorie pentru stocarea datelor și circuitele de intrare/ieșire (I/O) pentru comunicarea cu alte dispozitive. Este un computer miniatură pe un singur „cip” (sau, IC) care gestionează de obicei funcții în timp-real, cu scop special, ale unei aplicații specifice și nu necesită multe dintre funcționalitățile unui computer de uz general (de exemplu, computer personal-PC desktop sau computer laptop). CPU-ul unui microcontroller este microprocesorul.

Un cip IC este pur și simplu un IC ambalat. Poate reprezenta un microprocesor, o unitate de memorie sau un alt circuit folosit într-un sistem digital sau chiar un circuit analogic. Utilizarea cipurilor de integrare la scară foarte mare (VLSI), nu numai pentru procesarea datelor (microprocesor), ci și pentru memorie (RAM, ROM, PROM etc.) și hardware de interfațare (I/O), a fost responsabilă de apariția microcontrollerului. Astăzi, microcontrollerele și microprocesoarele au devenit o parte integrantă a multor dispozitive și sisteme mecatronice cu componente precum senzori inteligenți, procesoare de semnal digital, controllere inteligente, sisteme micro-electro-mecanice (MEMS)și unități de diagnostic pe-placă.

8.7.1 Arhitectura microcontrolerului

Un microcontroller este format dintr-un microprocesor, unitate de memorie și hardware de intrare/ieșire. Aceste dispozitive interacționează prin căi de semnal electrice multilinie (conductoare) cunoscute ca magistrale. Se pot identifica trei tipuri de magistrale (bus). O magistrală de date poartă datele necesare la diverse locații în microcontroller. O magistrală de adrese poartă adresa (nume digital) unei locații de memorie sau componente hardware care trebuie accesată de microprocesor. O magistrală de control poartă comenzile emise de microprocesor care controlează funcționarea sistemului de microcontroller. În plus, va fi disponibilă o „magistrală de alimentare”, care va furniza energie pentru diverse componente din microcontroller. În figura 8.21 este prezentată o reprezentare schematică a unui microcontroller. În microcontroller pot exista mai multe unități de memorie. În special, un registru de date într-un microprocesor este o memorie într-un sens general.

FIGURA 8.21 Arhitectura tipică a unui microcontroler

8.7.1.1 Funcționarea microcontrollerului

Unitatea de procesare a unui sistem microcontroller este microprocesorul. Un microprocesor își îndeplinește funcțiile preconizate folosind instrucțiuni și date, atât furnizate prin programe cât și comenzi externe (folosind diferite mijloace de I/O). Instrucțiunile (programele) furnizate de furnizor (producător) sau dezvoltate de utilizator și stocate în memorie sunt cunoscute ca software. În special, software-ul realizat de furnizor, care este stocat într-o unitate de memorie de citire (ROM) și care nu poate fi în general modificat de utilizator, se numește firmware. De asemenea, pentru funcții specializate, unele programe cu proceduri fixe pot fi convertite permanent în hardware digital, cu avantajele asociate vitezei rapide, costului mai mic (în producția de masă) și comoditatea funcționării.

Toate informațiile (date, adrese, instrucțiuni de control, coduri de funcționare, etc.) dintr-un microcontroller sunt prezente sub formă binară, de exemplu, nivele de tensiune, impulsuri de tensiune sau stări ON/OFF ale elementelor logice digitale. Considerați operarea sistemului microcontroller prezentat în figura 8.21. De ex., să presupunem că microprocesorul dorește să citească o porțiune de date din memorie în scopul procesării numerice (adunare, înmulțire etc.). Microprocesorul cunoaște (ar trebui) adresa locației particulare din memoria microcontrollerului la care este stocată porțiunea de date. El va plasa acest cod de adresă (ca impulsuri de tensiune, de exemplu) pe magistrala de adrese și va plasa, de asemenea, semnalul de control corespunzător pentru „Citire din memorie” pe magistrala de control. Ca răspuns, memoria va plasa porțiunea de date pe magistrala de date, de la care microprocesorul va citi datele într-unul din registrele sale. În continuare, considerați stocarea în memorie a porțiunii de date procesate de microprocesor. În primul rând, microprocesorul va plasa porțiunea de date (probabil situată curent în acumulatorul sau registrul său de date) pe magistrala de date și va plasa pe magistrala de adrese codul de adresă al locației în memoria la care trebuie să fie stocată porțiunea de date. În cele din urmă, microprocesorul va plasa semnalul de control „Scriere în memorie” pe magistrala de control. Aceasta va stoca porțiunea de date la locația corectă a adresei în memoria microcontrollerului. Acest proces nu va șterge automat porțiunea de date generată în interiorul microprocesorului (care este prezentă în registrul de date). Introducerea de date de la alte dispozitive (periferice) și ieșirea de date către alte dispozitive pot fi gestionate în același mod.

Acum considerați sarcina procesării datelor într-un microcontroller (de un microprocesor). Un program de computer (software) este stocat în memoria microcontrollerului, pentru a efectua sarcina de procesare. Etapa particulară a programului (adică instrucțiunea) care se execută este selectată în funcție de valoarea din contorul programului. Această valoare este adresa instrucțiunii. Presupunem că sarcina, conform programului computerului, este să adunați datele stocate în locația adresei de memorie B la datele de la adresa locației A și să stocați rezultatul la locația adresei C. Adresa instrucțiunii (indicată conform contorului de program) va identifica o instrucțiune din program care va „instrui” microprocesorul să citească datele din locația de memorie A a microcontrollerului în acumulatorul microprocesorului. Prin urmare, această locație a adresei de instrucțiuni (în memoria unde este memorat programul) va conține codul de operare pentru „Citire din memorie” și adresa locației de memorie A. Similar, a doua locație a adresei de instrucțiuni va conține codul de operare pentru „Adunare” și adresa locației de memorie B. Aceasta va duce la adunarea datelor din locația B la ceea ce se află deja în acumulatorul microprocesorului. Rezultatul va rămâne în acumulator. A treia locație a adresei de instrucțiuni va conține codul de operare pentru „Stocare în memorie” și adresa locației de memorie C. Aceasta va face ca datele din acumulatorul microprocesorului să fie plasate la locația C a memoriei microcontrollerului.

8.7.2 Microprocesor

După cum s-a văzut anterior, creierul unui microcontroller este unitatea de microprocesor. Procesează date (numerice și logice) conform instrucțiunilor (programul computerului) furnizate microcontrollerului. Să discutăm pe scurt numai arhitectura porțiunii de microprocesor. Memoria și hardware-ul de intrare/ieșire ale unui microcontroler vor fi discutate ulterior.

În figura 8.22 este prezentată o structură simplificată a unei unități de microprocesor. Am menționat deja câteva componente incluse în această reprezentare schematică. Rețineți interacțiunea dintre diversele componente prezentate în figură. O scurtă descriere a funcției fiecărei componente este dată în continuare.

FIGURA 8.22 Reprezentarea schematică a unui microprocesor

8.7.2.1 Unitatea logică aritmetică

Unitatea logică aritmetică (ALU) a unui microprocesor poate efectua operații aritmetice, cum ar fi adunarea, scăderea, înmulțirea și împărțirea și operații logice precum AND, OR, NOT, NAND și NOR. În funcție de numărul de operații primitive disponibile cu micro-procesorul particular, unele sau toate aceste operațiuni pot fi efectuate de ALU ca răspuns la codurile de operare corespunzătoare. De exemplu, dacă înmulțirea nu este o operație primitivă pentru un anumit microprocesor, aceasta poate fi realizată prin diferite moduri, cum ar fi adunarea repetată, sau adunarea și deplasarea. Similar, scăderea poate fi efectuată prin utilizarea adunării (de exemplu, prin metoda complementului lui doi).

De obicei, datele (adică, operanzii) care urmează să fie procesate de către ALU sunt citite (de exemplu, din memorie) în acumulator și în registrul de date (a se vedea figura 8.22). Codul de operare corespunzător operației care urmează să fie efectuată de ALU este plasat în registrul de instrucțiuni.

Codul de operare este disponibil din programul computerului, care este stocat în memoria microcontrollerului. Acest „opcode” se află în pasul (instrucțiunea) de program, care este adresat în funcție de conținutul contorului de program. Decodorul de operație decodează codul de operare. În continuare, un semnal de control este furnizat către secvențierul ALU pentru a efectua o anumită operație. Odată efectuată operația, rezultatul este stocat în acumulator și poate fi ulterior stocat în memoria microcontrollerului sau trimis la un dispozitiv de ieșire prin magistrala de date.

8.7.2.2 Contorul programului

În timpul execuției, programul computerului este stocat în memoria microcontrollerului. Fiecare instrucțiune (sau pas de program) este stocată într-o locație de memorie specifică, cu o adresă asociată. Contorul de program este o zonă de stocare din microprocesor care conține adresa instrucțiunii (pasul programului) care urmează să fie executat în continuare. Când această adresă este plasată pe magistrala de adrese de către microprocesor, memoria microcontrolerului va răspunde plasând datele (pasul de program) conținut în acea locație de memorie pe magistrala de date. Adresa din contorul de program va avansa (incrementa) secvențial astfel încât să execute programul într-o manieră secvențială, cu excepția cazului în care sunt întâlnite instrucțiuni precum saltul (jump) sau branch (ramificația). În cazul unei instrucțiuni branch, conținutul contorului de program va fi schimbat pentru a reflecta pasul de program la care execuția a fost deconectată.

8.7.2.3 Registrul de adrese

Adresa unei locații de memorie a microcontrollerului sau dispozitivului periferic care trebuie accesat de microprocesor este conținută într-un registru temporar cunoscut ca registru de adrese. Când această adresă este plasată pe magistrala de adrese, datele din locația de memorie corespunzătoare vor fi plasate pe magistrala de date, sau unitatea hardware adresată va fi „activată”, poate prin plasarea unor date pe magistrala de date.

8.7.2.4 Acumulatorul și Registrul de date

Este vorba despre registrele din microprocesor care pot reține temporar datele care urmează să fie procesate de ALU a sa. De obicei, atunci când este adresat un pas de program, datele care urmează să fie procesate în instrucțiunea respectivă sunt plasate în aceste registre. Mai mult, rezultatele produse de ALU sunt stocate temporar în aceste registre pentru a fi plasate pe magistrala de date, de exemplu, pentru stocarea ulterioară în memoria microcontrolerului.

8.7.2.5 Registrul de instrucțiuni

Instrucțiuni, cum ar fi un cod de operare conținut într-un pas de program (stocat în memorie și accesat de microprocesor) sunt stocate temporar într-un registru de instrucțiuni, în așteptarea decodării.

8.7.2.6 Decodor de operație

Decodorul de operație interpretează un cod de operație stocat în registrul de instrucțiuni al microprocesorului. Informațiile decodate sunt apoi transmise unui secvențiator pentru a fi trimise către ALU. În acest mod, ALU află ce operație trebuie efectuată pe datele (adică, operanzi) care sunt stocate în registrele de date.

8.7.2.7 Sequencer

De obicei nu este posibil ca ALU să proceseze datele imediat după ce decodorul de operație interpretează opcode-ul. Secvențiatorul controlează secvența în care ALU își desfășoară operațiile. Secvențiatorul poate primi semnale de control de la dispozitivele periferice sau un semnal „Pregătit pentru acțiune” de la ALU.

8.7.3 Memorie

Un microprocesor trebuie să aibă acces la datele pe care le prelucrează și la instrucțiunile (programul computer) care îl informează despre modul în care ar trebui procesate datele. Programele de computer (software) și datele sunt stocate în memoria microcontroller pentru acces în timpul procesării. Memoria este diferită de suporturile de stocare în masă, cum ar fi discurile, care sunt dispozitive off-line ale unui computer digital. În timpul funcționării, microcontrolerul poate transfera date (și programe) stocate într-un mediu de stocare extern în memoria sa și poate transfera date procesate, stocate curent în memorie, înapoi în mediul de stocare, prin interfața I/O. Este conținutul memoriei care poate fi accesat direct de microprocesor.

8.7.3.1 RAM, ROM, PROM, EPROM și EEPROM

Memoria unui microcontroler poate fi integrată cu acesta sau disponibilă ca cipuri de memorie separate. Există multe categorii de memorie ale unui microcontroller (sau al oricărui computer digital). Memoria de citire și scriere (denumită popular memorie de acces aleatoriu) este notată cu RAM. Utilizatorul poate citi conținutul unei memorii RAM și, de asemenea, poate scrie (stoca) informații (date, programe) într-o memorie RAM. Prin urmare, software-ul generat de utilizator este de obicei stocat într-un cip RAM al unui computer.

Memoria numai de citire este notată cu ROM. Utilizatorul poate citi conținutul unui ROM, dar nu poate modifica acesta; utilizatorul nu poate scrie într-o ROM. Nu își pierde conținutul atunci când este scoasă alimentarea. De obicei, software permanent furnizat de producător (adică firmware) este stocat într-un ROM.

Uneori, utilizatorul (nu producătorul) poate dori să stocheze informații permanent în memorie. În acest scop este utilizată o memorie programabilă numai de citire sau PROM. Cu un dispozitiv de scriere special, utilizatorul este capabil să scrie într-o PROM goală odată, dar conținutul stocat nu poate fi modificat ulterior.

Cineva poate dori să aibă memorii permanente care pot fi modificate și (ocazional), în circumstanțe speciale. În acest caz este utilă memoria programabilă de citire care nu mai poate fi ștearsă (EPROM). Conținutul unui EPROM poate fi șters cu ajutorul unui echipament specializat (de exemplu, prin aplicarea luminii ultraviolete timp de 30 min). Apoi, informații noi pot fi stocate din nou pe EPROM (permanent, până la ștergere cu ajutorul echipamentului special).

PROM șters electric este notat cu EEPROM. Acesta este notat și EAPROM (PROM modificat electric). Această memorie poate fi utilizată permanent ca ROM, dar poate fi modificată ocazional folosind curenți electrici (mai degrabă decât lumina ultravioletă) de tensiune destul de ridicată, produsă de circuite speciale. Printre avantajele EEPROM se numără faptul că este posibilă modificarea controlată cu atenție a conținutului de memorie (să zicem, ștergerea unei porțiuni selectate din conținut) și că cipul de memorie nu trebuie eliminat de pe placa PC pentru modificare. Dezavantajele includ încetinirea procesului de modificare și complexitatea circuitelor electrice care ar fi necesare în acest proces.

8.7.3.2 Biți, octeți și cuvinte

Informațiile dintr-un microcontroller sunt stocate, procesate și transferate sub formă de biți sau cifre binare. Stocarea datelor în memoria computerului poate fi realizată folosind o grilă de elemente bistabile. Un cip de memorie care poate stoca 1024 biți (210 biți) este un cip de memorie de 1 kb. Rețineți că cipurile RAM de sute de megabiți (Mb) în capacitate (Notă: 1 Mb = 1024 kb) sunt disponibile în mod obișnuit, iar costul este și el în scădere. Aceasta este un domeniu în creștere rapidă.

Un microcontroller de bază gestionează informațiile grupate în 8 biți simultan. Un astfel de grup de 8 biți este denumit octet (byte). În terminologia computerului, o colecție de 1024 octeți este un kilobyte sau pur și simplu 1K. De asemenea, 1 megabyte (sau 1Mb) este egal cu 1024 K.

Numărul de biți care poate fi manipulat de un computer într-o singură operație se numește dimensiunea cuvântului computerului. Un cuvânt de date este stocat în fiecare registru al unui microprocesor și poate fi procesat de către ALU într-o singură operație. Aceasta este de obicei dimensiunea datelor care pot fi plasate pe magistrala de date a microcontrolerului. Astăzi, microcontrollerele pe 16 biți sunt comune, în timp ce sunt disponibile și microcontrollerele pe 32 biți (adică cuvântul de date = 32 biți).

8.7.3.3 Memorie volatilă

Dacă conținutul unei memorii este șters automat atunci când sursa de alimentare a computerului este oprită, se spune că memoria este volatilă. Multe tipuri de cipuri RAM au memorii volatile. Cipurile ROM ar trebui să își mențină conținutul și în condiții de alimentare oprită. Prin urmare, ar trebui să aibă memorii nevolatile.

8.7.3.4 Forma fizică a memoriei

Orice element bistabil poate stoca un pic de date. Rezultă că o varietate de dispozitive fizice pot servi ca memorie de computer. Densitatea stocării datelor (care guvernează datele fizice) dintr-un cip de memorie depinde de tipul particular de memorie semiconductoare.

FIGURA 8.23 Elementul de memorie CMOS (MOSFET complementar simetric)

Un tip de cip de memorie folosește elemente de tranzistor cu efect de câmp (MOSFET) (a se vedea figura 8.23) pentru a stoca biți de date. Nivelul de sarcină electrică dintre terminalul porții și terminalul de canal este utilizat pentru a reprezenta un bit. Un nivel de sarcină peste o valoare de prag va reprezenta 1 și un nivel de sarcină sub valoarea de prag va reprezenta 0. Prin urmare, un bit 1 poate fi stocat prin energizarea porții MOSFET la locația corectă de memorie. Întrucât această sarcină scade treptat, ea trebuie reîmprospătată periodic (să zicem, la o frecvență de 1 kHz) pentru a-și menține valoarea. Prin urmare, acest tip de RAM se numește RAM dinamică (sau, DRAM) și este implementat folosind circuite dinamice. Rețineți că acest tip de memorie este volatil și nu poate fi utilizat ca ROM.

O memorie statică, spre deosebire de memoria dinamică, nu trebuie reîmprospătată periodic. O memorie RAM statică obișnuită folosește elemente flip-flop. Așa cum s-a discutat anterior, un element flip-flop constă din porți logice formate din elemente semiconductoare și își va menține starea de ieșire chiar și după ce intrările sunt eliminate. O RAM statică de acest tip tinde să fie mai scumpă decât o RAM dinamică, deoarece este implicat un circuit mai complex. Un avantaj este, însă, că o memorie RAM statică nu necesită circuite pentru reîmprospătarea continuă a intrărilor.

O memorie semiconductoare care este utilizată în mod obișnuit ca EPROM folosește elemente MOSFET pentru stocarea permanentă a sarcinilor electrice. Fiecare MOSFET are o poartă suplimentară (flotantă) care este izolată (folosind un strat de dioxid de siliciu) de restul tranzistorului. Când o tensiune înaltă (de exemplu, 25 V) este aplicată între terminalul porții (gate) obișnuite și terminalul de drenă (drain), poarta flotantă va fi încărcată, dar această încărcare va fi captată de izolație atunci când tensiunea este îndepărtată. Prin urmare, un bit 1 va fi păstrat permanent la locația de memorie. Cipul poate fi șters expunându-l la lumina ultravioletă timp de aprox. o jumătate de oră. Acest proces face ca izolarea cu dioxid de siliciu a porții flotante să conducă temporar, descărcând astfel poarta. Datele noi pot fi stocate din nou în cip prin încărcarea porților flotante ca înainte.

8.7.3.5 Acces la memorie

Fiecare locație de memorie are o adresă unică pentru a putea fi accesată de microprocesor. Adresa unei locații de memorie nu este cu siguranță aceeași cu a informațiilor (datele) stocate în acea locație. De obicei, fiecare locație de memorie poate stoca un cuvânt de date. Fiecare locație de memorie poate fi conectată la magistrala de date printr-un buffer de date folosind un semnal de control. Locația de memorie specifică ce trebuie conectată la magistrala de date este aleasă în funcție de adresa de pe magistrala de adrese. Această adresă este decodată și locația de memorie corespunzătoare este activată. În funcție de semnalul de control, conținuturile care sunt stocate temporar în buffer sunt apoi stocate la locația de memorie sau invers. În figura 8.24 este prezentată o reprezentare schematică a acestei scheme de acces la memorie (citire/scriere). Rețineți că bufferul are trei stări (citire, scriere și nicio acțiune).

FIGURA 8.24 Schemă de acces la memorie

Schema de acces poate fi extinsă în cazul în care trebuie accesate mai multe cipuri de memorie. În acest caz, mai întâi, este activat controlul „selectare cip” și informațiile de pe magistrala de adrese sunt folosite pentru a alege cipul de memorie corect. În continuare, controlul de scriere sau controlul de citire este activat ca în cazul unui singur chip pentru a efectua operația corespunzătoare.

Considerare cip-ul RAM static prezentat în figura 8.25. Este vorba de o memorie RAM semiconductoare (CMOS) de 32K × 8. Mai exact, are 32K locații de memorie, fiecare deținând 8 biți de memorie. Deoarece 32K = 32 × 210 = 215, avem nevoie de o adresă de 15 biți pentru a identifica toate 32K de locații ale memoriei. Acești biți de adrese sunt notați cu A0 – A14 în figura 8.25. Atunci când o anumită locație de memorie (8 biți) este adresată folosind combinația corespunzătoare de adrese de 15 biți, conținutul memoriei (8 biți) poate fi accesat de cei opt pini de I/O notați de la I/O1 la I/O8. În particular, când este activat pinul WE (folosind 0-logic; din cauza „low-activ”), cei opt pini de I/O pot fi folosiți pentru a trimite 8 biți de date pentru a fi stocate la locația de memorie adresată. Rețineți că „bara de deasupra” lui WE¯ indică „low-activ”. Când terminalul OE este activat (folosind 0-logic, deoarece „low-activ”), conținutul (8 biți) din locația de memorie adresată poate fi citit din cele opt terminale I/O. Chipul de memorie particular este selectat de procesor prin trimiterea unui semnal logic low la terminalul CS (chip select), care este terminalul „selectare cip” (low-activ).

Exemplul 8.10

Considerați un cip RAM care are 256 locații de memorie. Discutați diferite moduri în care această memorie poate fi structurată și accesată folosind adresa. Care este dimensiunea minimă de cuvânt a adresei de memorie care este necesară?

Soluţie

Un mod posibil de a aranja cele 256 de locații de memorie este ca un singur rând având 256 locații. În acest caz, ar fi nevoie de o adresă de 8 biți (Notă: 28 = 256). Toți cei 8 biți ai cuvântului de adresă sunt utilizați simultan pentru a defini cele 256 de locații de-a lungul rândului. Alternativ, memoria ar putea fi aranjată ca o matrice de două rânduri, fiecare rând având 128 de locații. În acest caz, un bit de adresă este utilizat pentru a indica numărul de rând. De exemplu, valoarea 0 a acestui bit ar putea reprezenta primul rând și, apoi, valoarea 1 ar reprezenta al doilea rând. Acum, sunt necesari 7 biți pentru a indica locația memoriei de-a lungul rândului ales (Notă: 27= 128). Din nou, este necesar un cuvânt de 8 biți ca adresă de memorie. Însă, o altă posibilitate este o matrice de memorie care are 4 rânduri și 64 de locații pe fiecare rând. În acest caz, 2 biți sunt necesari pentru a reprezenta numărul de rând, iar 6 biți (26 = 64) sunt necesari pentru a defini locația de-a lungul fiecărui rând. Din nou, avem nevoie de un cuvânt de 8 biți. În continuare, considerăm o matrice de 8 rânduri, fiecare rând având 32 de locații de memorie. În acest caz, trebuie alocați 3 biți ai cuvântului de adresă pentru definirea numărului de rând și 5 biți (25 = 32) pentru a defini locația de-a lungul fiecărui rând. Încă o dată, ar fi nevoie de o adresă de 8 biți. Aceste patru aranjamente de memorie sunt structurile optime și, în fiecare caz, este necesară o adresă de 8 biți. Alte structuri nu sunt optime. De exemplu, se ia în considerare o structură care are 3 rânduri. În acest caz, 86 de locații de memorie sunt necesare pe fiecare rând. Deoarece sunt necesari 2 biți pentru a defini numărul rândului și 7 biți pentru a defini locația de memorie pe fiecare rând, avem nevoie de o adresă de 9 biți pentru această structură.

FIGURA 8.25 Un cip 32K × 8 RAM

8.7.3.6 Proiectarea cardului de memorie

Mai multe cipuri de memorie pot fi plasate într-un singur card de memorie pentru a forma o memorie de capacitate mai mare, după cum este necesar. Considerați un cip de memorie mK × p. Acesta are mK locații de memorie, fiecare locație putând conține p biți de date. Să presupunem că m = 2r. Deoarece, 1K = 210, se remarcă faptul că există 210+r locații de memorie și, ca urmare, sunt necesari 10+r biți pentru a adresa aceste locații.

Atunci când mai multe cipuri de memorie sunt plasate într-un card de memorie, este necesară o adresă pentru a selecta un anumit cip și este necesară o adresă suplimentară pentru o locație de memorie din acel cip. Un decodor poate fi utilizat pentru a converti adresa de selectare a cipului în logica necesară CS¯ a cipului selectat. I/O va corespunde apoi locației de memorie adresată a cipului selectat.

Exemplul 8.11

Să presupunem că sunt disponibile un număr necesar de cipuri 2K × 8 EPROM și cipuri 2K × 8 RAM. Construiți un card de memorie care conține 4K × 8 EPROM și 4K × 8 RAM.

Soluţie

Trebuie să folosim două cipuri 2K × 8 EPROM și două cipuri 2K × 8 RAM pentru a răspunde cerinței. Rețineți că este necesară o adresă de 2 biți pentru a selecta unul dintre aceste patru cipuri. Sunt necesari încă 11 biți pentru a selecta locația de memorie în cipul selectat. Să notăm acești 13 biți cu A0, A1,…, A12. Biții A11 și A12 sunt folosiți pentru a selecta un cip, iar biții A0, A1,…, A10 sunt folosiți pentru a adresa o locație de memorie a cipului selectat. Acest aranjament este prezentat în figura 8.26.

FIGURA 8.26 Un card de memorie care conține două cipuri EPROM și două cipuri RAM

Valorile A11 și A12 trebuie să fie alese astfel încât atunci când este adresat un anumit cip, CS¯-ul său este setat la 0 în timp ce CS¯-ul celorlalte cipuri sunt toate setate la 1. Acesta este cazul logicii „low-active”, după cum am discutat anterior în capitol. În acest scop poate fi utilizat un decodor 2 la 4, așa cum este indicat în tabelul 8.10. O realizare a porții logice a acestui decodor este prezentată în Figura 8.27.

Tabelul 8.10 Logica de selectare a cipurilor

FIGURA 8.27 Un decodor 2 la 4 pentru selectarea cipurilor

8.7.4 Hardware de intrare/ieșire

Revenind la aranjamentul microcontrollerului prezentat în figura 8.21, rețineți că până acum am discutat despre microprocesor și memorie în unele detalii. În această secțiune, vom examina considerațiile de intrare/ieșire ale unui microcontroller.

Pinii de intrare/ieșire formează legătura dintre un microcontroler și un dispozitiv periferic precum un afișaj, o tastatură sau un sistem care este monitorizat sau controlat (de exemplu, un dispozitiv mecatronic, cum ar fi un motor). Însă, deseori nu este posibil să conectați direct un dispozitiv periferic la microcontroller din motive precum:

1. Dacă dispozitivele sunt conectate direct la un microcontroller, acesta nu va ști de la care dispozitive sau locație de memorie vin datele (pe durata intrării) și nu va putea „selecta” un dispozitiv la care să furnizeze date sau să opereze dispozitivul. (pe durata ieșirii).

2. Datele pot fi primite simultan de la mai multe dispozitive. Dacă un dispozitiv nu așteaptă până când microcontrolerul este gata să accepte date de la dispozitivul respectiv, sistemul nu poate funcționa corect. În monitorizarea și controlul unui sistem mecatronic, deseori, multe variabile de răspuns ale sistemului ar trebui să fie citite și mai mult de un semnal de control poate fi generat. Cele două elemente menționate la articolul 1 de mai sus sunt aplicabile și aici.

3. Datele de la dispozitivul extern pot fi semnale analogice, care trebuie transformate într-o formă digitală corespunzătoare înainte de a intra în microcontroler.

4. Viteza de procesare a datelor microcontrolerului va fi diferită (adesea mai rapidă) decât viteza cu care datele sunt gestionate (generate, afișate, utilizate pentru a acționa un dispozitiv etc.) de un dispozitiv extern. Deci, sincronizarea (sau proporționarea) ratelor de date ar fi necesară, în special în monitorizarea și controlul în timp real.

5. Unele calcule (de exemplu, transformata Fourier rapidă) necesită blocuri de date, nu doar un eșantion de date. Prin urmare, ar fi necesar un mijloc de buffer-are a datelor. Mai mult, un dispozitiv extern poate genera date într-o manieră serială de biți, ca o secvență de impulsuri, în timp ce un microprocesor prelucrează cuvinte (de exemplu, 16 biți sau 32 biți) de date și memoria microcontrolerului stochează și ea cuvinte de date. Este necesar un mijloc pentru această conversie serial-paralelă.

6. Nivelele de tensiune și curenții semnalelor gestionate de dispozitivele externe sunt adesea diferite de cele compatibile cu un microcontroller (TTL, CMOS etc.). Mai mult, impedanța unui dispozitiv periferic trebuie să fie adaptată cu cea a microcontrollerului (vezi Capitolul 4). În caz contrar, va rezulta denaturarea semnalului datorată încărcării.

Cerințele de intrare/ieșire vor depinde de mulți factori, inclusiv caracteristicile dispozitivului extern care este conectat la microcontroller (de exemplu, date analogice sau digitale, rata datelor, nivelul/puterea semnalului, date seriale sau paralele), natura aplicației (de exemplu, controlul automat, monitorizarea procesului în timp real, achiziția și înregistrarea datelor pentru procesarea off-line) și numărul de canale de semnal de intrare și ieșire.

8.7.4.1 Schema de pini (Pin-Out) ai Microcontrollerului

Un cip de microcontroler are mulți pini (de exemplu, DIP de 40 de pini). Mulți dintre acești pini sunt grupați în „porturi”, care servesc funcții de intrare/ieșire (interfață). Restul servesc în alte scopuri diverse (de exemplu, tensiune, tact). Pinii sunt desemnați pentru diverse funcții (de exemplu, intrare sau ieșire; conversie analogic-digitală; captare/comparație/modulare lățime puls - CCP). Funcționarea portului unui microcontroler este controlată de microprocesor prin registrele sale.

8.7.4.1.1 Pinii de intrare

În funcție de natura dispozitivului și de compatibilitate (tensiune, putere, impedanță etc.), un dispozitiv poate fi conectat direct la pinii microcontrolerului. Acesta poate fi cazul dispozitivelor TTL sau CMOS. Uneori, pot fi conectate elemente discrete externe cu dispozitivul (de exemplu, un rezistor pull-up pentru dispozitiv TTL open-collector sau un dispozitiv CMOS open-drain).

8.7.4.1.2 Pinii de ieșire

Doar dispozitive compatibile (de exemplu, dispozitive TTL sau CMOS) pot fi conectate direct la pinii de ieșire ai unui microcontroller. În unele cazuri, elemente discrete externe pot fi obligate să fie conectate la dispozitiv (de exemplu, un rezistor pull-up pentru dispozitiv TTL open-collector sau un dispozitiv CMOS open-drain). Este posibil să fie nevoie de hardware suplimentar (de exemplu, buffer, sursă de alimentare externă, convertor digital-analogic extern - DAC) pentru a acționa mai multe dispozitive prin același pin de ieșire (adică fan-out).

Procesul de intrare/ieșire al unui microcontroller poate avea loc în mai multe moduri. Trei moduri principale sunt următoarele:

1. Intrare/ieșire programată

2. Intrare/ieșire de întrerupere

3. Acces direct la memorie (DMA)

Cele trei metode sunt ilustrate în figura 8.28 și sunt descrise în continuare.

8.7.4.2 I/O programate

În acest caz, transferul de date are loc sub controlul unui program care rulează în microcontroller. Acest lucru este ilustrat în figura 8.28a. În primul rând, programul selectează dispozitivul adecvat pentru a fi accesat și microprocesorul trimite un semnal de control pentru a activa hardware-ul (pinul) de interfață corespunzător și, poate, pentru a informa dacă este o operație de intrare date (adică, citire) sau o operație de ieșire date (adică, scrie). Într-o operație de intrare, datele sunt transferate de la dispozitivul extern în registrul de date (sau acumulatorul) microprocesorului, care pot fi în cele din urmă stocate în memoria microcontrolerului. Într-o operație de ieșire, datele sunt transferate din registrul de date al microprocesorului către dispozitivul extern.

FIGURA 8.28 Trei metode de transfer de date intrare/ieșire:
(a) I/O programat; (b) I/O întrerupte ; (c) DMA

Deoarece ar putea exista multe dispozitive sau canale de date interfațate cu un microcontroller, ar trebui să existe o modalitate de a alege dispozitivul sau canalul adecvat pentru transferul de date. O metodă obișnuită folosită pentru aceasta, în I/O programate, este cunoscută sub denumirea de I/O mapată de memorie. Această metodă este ilustrată în figura 8.29. În acest caz, fiecare canal de date (sau dispozitiv extern) este tratat de microprocesor ca o locație de memorie și i se atribuie o adresă. În mod clar, această adresă trebuie să fie unică și nu o adresă folosită deja pentru o locație de memorie. Pentru a selecta un canal de date, microprocesorul plasează adresa corespunzătoare pe magistrala de adrese. Decodorul de adrese interpretează adresa și activează linia I/O adecvată (pin). De asemenea, microprocesorul trimite un semnal de control pentru a instrui dacă este o operație de intrare sau o operație de ieșire. În cazul unei operații de ieșire, microprocesorul plasează datele pe magistrala de date. Apoi dispozitivul extern preia aceste date. Într-o operație de intrare, hardware-ul interfeței plasează datele pe magistrala de date, iar microprocesorul preia aceste date. Microprocesorul ar trebui să aibă o modalitate de a afla dacă un dispozitiv extern este gata să accepte date de la microcontroller sau dacă un dispozitiv are date gata să fie citite în microcontroller. O metodă de a face acest lucru este prin sondaj. În această metodă, microprocesorul (atunci când nu este angajat într-o activitate importantă de procesare) va scana periodic canalele I/O (pini) pentru a vedea dacă un anumit canal (sau dispozitiv) este gata pentru o activitate de intrare/ieșire. Această disponibilitate poate fi indicată printr-un registru de stare pe un singur bit (de exemplu, bit 1 care indică „gata” și bit 0 care indică „nu este gata”). Unele scheme de atribuire a priorităților ar fi necesare pentru a selecta un canal atunci când mai multe canale sunt gata. Sondarea este o tehnică lentă și oarecum risipitoare de selecție a dispozitivului. Ea trebuie să scaneze toate canalele din fiecare ciclu de sondare și folosește microprocesorul chiar și atunci când canalele de intrare/ieșire nu sunt gata. O metodă de selectare a unui dispozitiv I/O, care nu prezintă aceste dezavantaje, este utilizarea întreruperilor, așa cum este descris în continuare.

FIGURA 8.29 I/O mapată de memorie

8.7.4.3 I/O de întrerupere

Această metodă de transfer a datelor de intrare/ieșire este ilustrată în figura 8.28b. În această metodă, un dispozitiv extern, atunci când este gata pentru o activitate de intrare/ieșire, trimite un semnal de cerere de întrerupere la microcontroler. Microprocesorul își suspendă activitatea curentă (după finalizarea execuției instrucțiunii pe care o execută în prezent) și execută activitatea I/O și apoi revine la activitatea inițială (întreruptă). Ca și în cazul sondajului, este necesară o anumită metodă de atribuire a priorităților pentru a face față situațiilor în care există mai multe cereri de întrerupere simultan. De exemplu, microcontrolerul poate avea mai mult de o linie de cerere de întrerupere care este ocupată în funcție de o anumită prioritate (de exemplu, pe baza primul-venit-primul servit). Microprocesorul asigură întreruperea solicită una câte una, în funcție de acea prioritate. Etapele de bază ale deservirii unei solicitări de întrerupere sunt următoarele: (1) microprocesorul finalizează execuția instrucțiunii curente; (2) salvează conținutul registrelor sale în memoria microcontrollerului; (3) transmite un semnal de confirmare a întreruperii prin intermediul unei linii de control către dispozitivul extern - aceasta inițiază procesul de transfer de date; (4) microprocesorul trimite un semnal complet de serviciu, care va dezactiva linia I/O particulară și va relua activitatea întreruptă.

8.7.4.4 Metoda de acces direct la memorie

Această metodă de transfer a datelor de intrare/ieșire este ilustrată în figura 8.28c. Spre deosebire de cele două metode anterioare, această metodă are nevoie de foarte puțină activitate de microprocesor și este potrivită pentru transferul rapid de date în vrac. În această metodă, transferul de date I/O are loc direct între memoria microcontrolerului și dispozitivul extern printr-o magistrală de date, sub controlul unui controller DMA. Controllerul DMA suspendă temporar operația curentă a microprocesorului, generează semnalele de control necesare pentru a efectua operațiunea de transfer de date și reactivează microprocesorul la finalizarea transferului de date. Aceasta este cunoscută sub numele de cycle stealing (furtul de ciclu), deoarece controllerul DMA fură un ciclu de funcționare al microprocesorului.

8.7.4.5 Operație de Handshaking

În timpul introducerii datelor, este de dorit ca microcontrollerul să fie notificat atunci când dispozitivul extern a plasat date în bufferul portului său de I/O. Similar, microcontrollerul ar trebui să notifice dispozitivului extern atunci când microcontrollerul a citit datele din bufetul portului de I/O. Acest tip de semnalizare în două sensuri este cunoscut ca handshaking. De exemplu, un nivel de tensiune ar putea fi setat high atunci când bufferul este plin și ulterior setat low atunci când microcontrollerul citește bufferul. Acest tip de semnal handshaking pentru introducerea datelor este prezentat în figura 8.30a. Handshaking similar va avea loc și la ieșirea datelor. De exemplu, semnalul handshaking de ieșire este setat high la momentul când microprocesorul a stocat datele procesate în bufferul de ieșire. Acest semnal va fi setat low atunci când dispozitivul extern primește conținutul bufferului. Semnalul handshaking asociat arătat în figura 8.30b.

Funcția handshaking se poate realiza și folosind un registru de stare. Un registru de stare constă dintr-un octet sau un cuvânt de date. O locație de un bit a registrului este atribuită fiecărui port I/O. Atunci, valoarea bitului poate fi utilizată în operația handshaking. De exemplu, în timpul introducerii de date la port n de I/O, bitul din a n-a poziție a registrului de stare este setat la 1 atunci când bufferul de date este plin. Valoarea bitului la acea locație este setată din nou la 0 atunci când microprocesorul a finalizat citirea conținutului portului respectiv.

8.7.4.6 Ceas, contor și cronometru

Ceasurile sau semnalele de sincronizare sunt cruciale pentru funcționarea unui microcontroller. Semnalul de tact (ceas) este de obicei o secvență de impuls la o frecvență constantă cunoscută, generată, de exemplu, de un oscilator cu cristal de cuarț. Multe semnale de tact sunt utilizate într-un microcontroller. În particular, ceasul microprocesorului este un semnal de puls cu frecvență ridicată (de exemplu, sute de MHz), care este utilizat pentru a coordona și a sincroniza diverse activități ale microprocesorului. În plus, semnalele de tact sunt utilizate pentru a contoriza sau a număra evenimente, pentru a sincroniza transferul de date de intrare/ieșire, precum și pentru generarea de semnale de control și întreruperi în funcționarea circuitelor sample-and-hold (eșantionare-memorare), ADC, DAC, multiplexoare și alt hardware de interfață. De exemplu, conversia analogic-digitală poate fi controlată (sau sincronizată cu alte activități) prin declanșarea ADC folosind un semnal de tact. Frecvența unui semnal de declanșare ADC poate fi în gama MHz. Frecvențele de tact variabile pot fi obținute folosind cronometre programabile. Momentul operațiilor de intrare/ieșire este deosebit de crucial în aplicațiile de microcontroler în timp-real, cum ar fi controlul digital și monitorizarea online a sistemelor mecatronice.

FIGURA 8.30 Un semnal handshaking:
(a) pentru introducerea datelor și (b) pentru ieșirea datelor

8.7.5 Programarea microcontrolerrului și execuția programului

Aplicația cu microcontroller este o implementare software. Un microcontroller nu poate efectua o sarcină decât dacă este instruit complet și corect despre cum să efectueze această sarcină. Cu alte cuvinte, sarcina trebuie să fie „programată”. Programul computerului (software) conține instrucțiunile necesare pentru a efectua sarcina pas-cu-pas. Un microcontroller este programat folosind setul său de instrucțiuni. Este un set de comenzi sau coduri de operare, scrise ca mnemonice. Fiecare etapă de operare a unui microcontroller necesită un „cod de operare” împreună cu, când este necesar, date (sau operanzi) pe care se efectuează operațiunea. Diferite mărci și modele de microcontrollere vor avea seturi de instrucțiuni diferite.

8.7.5.1 Set de instrucțiuni, coduri de operare și mnemonice

În cadrul unui microcontroller, instrucțiunile de manipulare a datelor și de efectuare a diferitelor operații trebuie să fie date sub forma binară. Codul utilizat pentru a reprezenta o operație sau instrucțiune a computerului este cunoscut sub numele de cod de operare sau pur și simplu opcode. Lista acestor opcode-uri este setul de instrucțiuni al microcontrolerului. Pe plan intern, opcode-ul este utilizat sub forma binară. Aceasta corespunde codului mașinii sau limbajului mașină al microcontrollerului. Extern, însă, este incomod să folosiți reprezentarea binară pentru fiecare cod. Prin urmare, în programarea într-un limbaj de nivel-scăzut, cum ar fi limbajul de asamblare, o abreviere semnificativă este utilizată pentru a reprezenta fiecare cod de operare. Aceste abrevieri sunt cunoscute sub numele de mnemonice. De exemplu, codul de operare pentru împărțirea unui număr la altul ar putea fi 0011011 în cod mașină, iar mnemonicul acestui cod de operație ar putea fi DIV. Etapa (sau instrucțiunea) programului asociat ar trebui să conțină două adrese, adresa codului de operare și adresa locației datelor în memoria microcontrolerului. Codurile de operare sunt de obicei stocate permanent în ROM, iar datele sunt de obicei stocate în RAM.

8.7.5.2 Programare și limbaje

Un microprocesor execută programele stocate în memoria microcontrolerului. Aceste programe sunt prezente sub forma limbajului mașinii (în cod binar) al microcontrolerului. Dar, este destul de dificil să scrii un program în cod mașină. Prin urmare, de-a lungul anilor au fost dezvoltate multe limbaje pentru computer care sunt mai convenabile pentru programare de către oameni. Unele dintre aceste limbaje sunt la nivel-scăzut, în sensul că sunt strâns legate de un anumit limbaj de mașină și sunt de obicei specifice mașinii și, prin urmare, nu sunt schimbabile cu diferite tipuri de microcontrollere (adică nu sunt portabile). Unele alte tipuri de limbaje sunt de nivel înalt și generice. De obicei, un program este mai întâi scris într-un limbaj de nivel înalt pe computer și depanat și „compilat” corect înainte de descărcarea în microcontrollere.

Notă: este mult mai ușor să scrii un program într-un limbaj de nivel-înalt. Depanarea (eliminarea erorilor) este și ea mai ușoară. Dar, întrucât un program de nivel-înalt nu este specific mașinii, nici personalizat, acesta poate fi ineficient, iar viteza de execuție este mai mică decât cu un program scris într-un limbaj de nivel-scăzut, dependent de mașină. Un program de nivel-înalt poate fi utilizat pentru a programa orice microcontroller, cu condiția să fie disponibil un compilator adecvat, care este un program care poate converti programul de nivel-înalt în limbajul mașină al microcontrolerului.

8.7.5.2.1 Programarea limbajului de asamblare

Un program în limbaj de asamblare are o corespondență unu-la-unu cu programul său de limbaj mașină. Mai exact, fiecare etapă (sau linie) a unui program în limbaj mașină va consta din trei elemente după cum urmează:

Adresa de instrucțiuni Cod de operare Adresa de date

Principala diferență este că limbajul mașină folosește reprezentarea binară pentru fiecare subiect, iar limbajul de asamblare folosește o mnemonică pentru codul de operare și un nume de variabilă pentru a numi adresa de date. Adresele de instrucțiuni nu sunt necesare într-un program de asamblare, deoarece sunt generate automat în timpul procesului de asamblare. Un program cunoscut sub numele de assembler este utilizat pentru a converti un program din limbaj de asamblare în limbaj mașină. Acesta va interpreta corect mnemonica pentru opcode și, de asemenea, va atribui adrese de memorie pentru numele variabilei de date. Erorile din programul în limbaj de asamblare sunt, de asemenea, verificate și indicate în timpul procesului de asamblare. Doar un program de asamblare fără erori va genera un modul obiect care va fi stocat în memorie. Limbajul de asamblare depinde de mașină și, prin urmare, va varia de la un microcontroller la altul. Pentru a programa un microcontroller în limbaj de asamblare, setul de instrucțiuni al microprocesorului trebuie cunoscut. Mnemonica pentru opcode-uri este dată în setul de instrucțiuni.

8.7.5.2.2 Limbaje de nivel înalt

Datorită corespondenței unu-la-unu între limbajul mașină și limbajul de asamblare, este complex și obositor să se programeze în limbaj de asamblare. Mai mult, un program în limbaj de asamblare nu poate fi transferat (portat) cu ușurință de la un microcontroller la altul. Prin urmare, programele de computer sunt scrise frecvent într-un limbaj de nivel-înalt.

Limbajele de nivel-înalt utilizează, de asemenea, mnemonice pentru operații și nume de variabile pentru adrese de date. Dar, în general, multe operații sunt combinate într-o singură declarație de program și, prin urmare, nu există o corespondență unu-la-unu între un limbaj de nivel-înalt și programul său în cod-mașină. Un program cunoscut sub numele de compilator este utilizat pentru a converti un program în limbaj de nivel-înalt (programul sursă) într-un program cod-mașină (codul obiect).

Limbajele populare de nivel-înalt includ C, FORTRAN, PASCAL și BASIC. Un inginer de mecatronică ar trebui să poată programa utilizând cel puțin unul dintre aceste limbaje. Spre deosebire de primele trei limbaje, BASIC (Beginner’s All-purpose Symbolic Instruction Coding) utilizează un compilator-interpretor. În acest caz, întregul program sursă nu este compilat într-o singură etapă. În schimb, fiecare linie (instrucțiune) de bază este compilată și executată înainte de a trece la următoarea declarație. Acest proces este evident mai lent decât compilarea obișnuită, dar este mai convenabil și mai avantajos în calculele online.

8.7.5.3 Executarea programelor

Să presupunem că un program de calculator este scris folosind un limbaj de nivel-înalt pe un PC, depanat și convertit în limbaj mașină de către software-ul asamblator sau compilator. Acest program în cod-mașină (sub forma binară) este mai întâi „încărcat” în memoria (RAM sau ROM) a microcontrollerului. Notă: Un program în limbaj-mașină poate fi, de asemenea, stocat într-un mediu periferic, cum ar fi hard disk-ul și încărcat în memorie numai atunci când programul este executat. Acest lucru economisește spațiul valoros de memorie. Fiecare pas de program are o adresă asociată cu el. Această adresă oferă locația memoriei în care este stocat acel pas de program. În continuare, microprocesorul microcontrollerului trebuie să urmeze instrucțiunile date în fiecare dintre acești pași ai programului.

Execuția programului începe printr-o anumită comandă (să zicem, printr-un semnal extern de la tastatură sau declanșator dintr-o variabilă de răspuns a unui sistem mecatronic). În primul rând, adresa primului pas de program este citită în contorul de program al microprocesorului. Această adresă este apoi plasată pe magistrala de adrese. Conținutul acelei locații de adresă în memorie este returnat la microprocesor prin magistrala de date. Rețineți că în conținut este atât adresa unui cod de operare, cât și adresa datelor pe care ar opera opcode-ul. Microprocesorul plasează mai întâi adresa opcode-ului pe magistrala de adrese. De obicei, aceasta ar fi o adresă a unei locații ROM. Ca răspuns, conținutul locației ROM (cod de operare) este returnat microprocesorului prin magistrala de date. Aceasta este stocată automat în registrul de instrucțiuni al microprocesorului. În continuare, microprocesorul plasează pe magistrala de adrese adresa datelor (operand). De obicei, aceasta ar fi o adresă a unei locații RAM. Ca răspuns, conținutul locației RAM (date) este returnat microprocesorului prin magistrala de date. Aceste date vor fi stocate în acumulator (un registru de date) în cadrul microprocesorului. Datele sunt „preluate” în acest mod de microprocesor. Ulterior, codul de operare stocat în registrul de instrucțiuni este decodat de decodorul de operație și prezentat secvențiatorului (a se vedea figura 8.22), care la rândul său secvențiază operația corespunzătoare. Operația efectivă are loc prin intermediul hardware-ului de procesare al lui ALU al microprocesorului. Odată ce acest pas de program este executat, contorul de program este avansat cu unu. Acest număr nou în contorul de program corespunde adresei următorului pas al programului. În consecință, microprocesorul va executa următorul pas al programului ca înainte. Pe toată durata operațiunii, semnalele de control vor fi trimise prin magistrala de control pentru a semnaliza diverse activități și stări ale microcontrollerului.

8.7.5.3.1 Ramificarea

Un microprocesor execută pașii programului unul câte unul în ordinea în care sunt scrise (adică secvențial), cu excepția cazului în care sunt instruiți de prezentul pas de program pentru a se ramifica (sau a sări) la un alt pas decât cel următor. În mod normal, contorul de program este incrementat cu 1 după executarea fiecărui pas de program, după cum am menționat anterior. Dacă se întâlnește o declarație de ramificare, conținutul contorului de program trebuie modificat pentru a da adresa pasului de program care va fi executat în continuare. Prin urmare, o declarație de ramificare ar trebui să conțină această adresă. Când se întâlnește o instrucțiune de ramificare în program, microprocesorul stochează mai întâi conținutul actual al contorului de program într-o locație de memorie (cunoscută sub numele de stivă), și apoi încarcă în contorul de program adresa pasului programului la care execuția ar urma să fie ramificată. Odată ce pașii programului ce urmează instrucțiunea de ramificație sunt executați, programul va întâlni o declarație de „returnare”. La întâlnirea acestei declarații, microprocesorul va încărca adresa stocată în stivă înapoi în contorul de program și va continua operația ca de obicei.

8.7.5.4 Prelucrare în timp real

Cerințele de calcul, în special cele referitoare la viteză și eficiență, sunt de obicei mai severe pentru procesarea în timp-real. În aplicațiile mecatronice, semnalele de control trebuie să fie generate în timp real. Cu alte cuvinte, ciclurile de procesare a datelor trebuie sincronizate cu un ceas în timp-real. Eficiența procesării este o considerație majoră în calculul în timp-real. De exemplu, în controlul digital, viteza de procesare trebuie să crească proporțional cu rata de eșantionare a datelor măsurate. Teorema lui Shannon de eșantionare indică faptul că viteza de eșantionare ar trebui să fie de cel puțin două ori (și de preferat de 5 sau 10 ori) componenta de frecvență maximă de interes în semnalul măsurat.

Prioritățile microcontrollerului trebuie alocate pentru diferite sarcini, cerințe și nevoi. De exemplu, metodele de gestionare a întreruperilor ar trebui definite în mod clar pentru canalele I/O. Alocarea resurselor include alocarea memoriei și acest lucru este destul de crucial în sistemele de timp-real.

O altă considerație care este de cea mai mare importanță în calculul în timp-real este problema dacă ar trebui utilizate dispozitive acționate software sau dispozitive logice hardware. De exemplu, în controlul digital direct, semnalele de control trebuie să fie calculate într-un ciclu de control. Această perioadă de timp este limitată de factori precum perioada de eșantionare ADC pentru senzori analogici, perioada de impuls pentru encodere și perioada de pas (timp pentru un pas la viteză maximă) pentru motoarele pas cu pas. Abordarea bazată pe software are avantaje precum flexibilitatea și capacitatea de a implementa strategii de control destul de complexe. Abordarea bazată pe hardware (un controller hardware) prezintă avantaje precum viteza de operare rapidă, simplitatea și costul redus (în producția de masă). În funcție de sarcina la îndemână, se poate ajunge la un compromis: un sistem hibrid format din dispozitive bazate pe software (microcontrollere) și dispozitive logice hardware (implementări hardware). De exemplu, sarcini simple, cum ar fi sincronizarea, numărarea și secvențierea, pot fi puse în aplicare de circuite logice hardware, iar algoritmii de control pot fi programați într-un microcontroller.

8.7.6 Dezvoltarea aplicațiilor pentru microcontrolere

Microcontrolerele și instrumentele de dezvoltare/aplicare ale acestora sunt disponibile de la mai mulți furnizori. Microcontrollerele populare includ familiile ARM și Cortex de la dispozitive analogice; familia 8x de la Intel; familia PIC de la Microchip technology; familia HC de la Motorola (Freescale); și familia MSP de la Texas Instruments. Un kit de dezvoltare pentru un microcontroller include următoarele: cip Microcontroller; placa de dezvoltare (breadboard); PC (pentru programare, depanare etc.); sursa de alimentare (DC); cabluri de conectare; software (compilator, debugger, simulator/emulator etc.); manuale de referință (copie în format soft sau pe suport); hardware divers (cipuri IC cum ar fi trigger-Schmitt, drivere, memorie suplimentară etc; elemente discrete, cum ar fi rezistoare etc.). Reprezentarea schematică a unei plăci de dezvoltare cu componentele sale este prezentată în Figura 8.31. Sistemul sau dispozitivul care va fi operat de microcontroler (de exemplu, un dispozitiv mecatronic, cum ar fi un motor) este, de asemenea, indicat în figură.

Înainte de a achiziționa microcontrollere și instrumente de dezvoltare, trebuie să examinați cu atenție aplicația (de exemplu, operarea /monitorizarea/controlul unui dispozitiv mecatronic) și să înțelegeți cerințele sale. Este de dorit să urmați o procedură sistematică în dezvoltarea unei aplicații cu microcontroller. Următoarele etape principale sunt sugerate:

FIGURA 8.31 Placă de proiect pentru microcontroller

1. Studiați sistemul/dispozitivul de aplicație în raort cu funcțiile sale, ieșirile (monitorizate în mod normal cu senzori), intrările (în mod normal activate de un controler sau comenzi externe) și specificațiile de performanță.

2. Descrieți în cuvinte funcțiile microcontrollerului din aplicația particulară. Aceasta va forma pseudo-programul și poate include reprezentări grafice, cum ar fi diagrame de flux și diagrame bloc.

3. Selectați un microcontroller comercial prin potrivirea capabilităților sale (număr de linii I/O, memorie, dimensiunea cuvântului, viteză, tipuri de capabilități de I/O, cum ar fi PWM, UART, etc.) cu specificațiile proiectului, cost, dimensiune, etc.

4. Achiziționați instrumentele de dezvoltare necesare pentru microcontroller (software pentru programare, depanare, emulare, etc; placă de testare; cabluri; PC; alimentare; manuale de referință etc.).

5. Proiectați și realizați circuitul hardware pentru placa de testare (inclusiv cerințele de I/O, cipuri IC suplimentare, cum ar fi trigger-Schmitt și memorie suplimentară, și elemente discrete, cum ar fi rezistoare pull-up, etc.). Achiziționați hardware suplimentar.

6. Completați placa de proiect, incluzând sistemul/dispozitivul (mecatronic) care urmează să funcționeze și testați hardware-ul.

7. Programează aplicația pe PC folosind un limbaj adecvat de nivel-înalt (de exemplu, C), depanați, compilați, depanați din nou (emulați aplicația dacă este necesar) și descarcați codul în microcontroller.

8. Testați funcționarea aplicației generale. Dacă este necesar, reglați-fin unele dintre etapele anterioare.