Documente Academic
Documente Profesional
Documente Cultură
După cum se observă, este necesară prezenţa interfeţelor analogice pentru interacţiunea
cu mediul.
Vom prezenta în continuare câteva exemple pe baza cărora putem pune în evidenţă
principalele caracteristici ale sistemelor incorporate (fig. 1.2).
- agenda electronică PDA (Personal Digital Assitant)
- Videocamera digitală
- Telefon celular
- Televizor celular sau chiar analogic
Fig. 1.4. Mars Rover Fig. 1.5. GPS Fig. 1.6. ERS 100 ROBOTIC DOG
- Programele trebuie să fie corecte din punct de vedere logic şi temporal. Dacă
corectitudinea logică este caracteristică tuturor programelor, corectitudinea temporală
este impusă de cerinţele de aplicaţie de timp real.
- Trebuie să asigure concurenţa fizică implicită deoarece un sistem incorporat poate
lucra multiuser şi multiproces.
- Siguranţa în funcţionare şi toleranţa la defect sunt obligatorii, soft-ul fiind cel care
trebuie să asigure aceste proprietăţi.
- Soft-ul de aplicaţie este specific şi are un scop unic.
- Funcţionarea multitasking şi concurentă este determinată de faptul că un sistem
incorporat trebuie să poată lucra cu mai multe intrări şi ieşiri şi cu evenimente
multiple în mod independent – multe sisteme incorporate sunt obligate să lucreze
multitasking. Separarea task-urilor simplifică programarea, dar cere comutarea într-
un anumit fel, înainte şi înapoi printre diferite task-uri (programare multitasking).
Concurenţa reprezintă aparenta execuţie simultană a mai multor task-uri
În proiectarea unui sistem incorporat trebuie urmărită rezolvarea unor probleme specifice
precum:
- Cât de mult hardware este necesar – care este lungimea cuvântului pentru CPU,
dimensiunea memoriei, etc.
- Care va fi dimensiunea intervalului de timp care să asigure finalizarea operaţiilor
(intervalul de timp pentru finalizarea operaţiilor în real-time) – un hard mai rapid sau
un soft mai inteligent – un hard mai rapid înseamnă costuri de producţie mai mari în
timp ce soft-ul mai inteligent presupune cheltuieli de dezvoltare mai mari. Trebuie
găsit un compromis care să asigure performanţe maxime cu costuri minime.
- Cum să se minimizeze consumul de energie – oprirea elementelor care nu sunt
necesare, reducerea accesării memoriei
Concluzii
Sistemele incorporate se regăsesc peste tot în jurul nostru – multe dintre aceste includ un
hardware şi un software complex
Dezvoltarea unui sistem incorporat presupune rezolvarea unui mare număr de provocări
S-au dezvoltat metodologii de proiectare care să ajute la gestionarea procesului de
dezvoltare
CURS 2
PRINCIPALE AVANTAJE
ALE METODOLOGIEI DE PROIECTARE
ofera posibilitatea păstrarii unei istorii / înregistrari a rezultatelor etapelor proiectarii
- utila pentru documentare, testare functionala, depanare
permite dezvoltarea sau folosirea unor unelte de proiectare asistata de calculator
- desfasurarea în paralel a proiectarii pentru diferite componente functionale
simplifica comunicarea dintre membrii unei echipe de proiectare.
ELEMENTE SPECIFICE
PROIECTARII EmS
• Re-utilizarea unor componente deja proiectate în alte proiecte
• Strânsa interactiune dintre hardware si software
– Programatorii trebuie sa înteleaga partea hardware iar proiectantii de hardware trebuie
sa înteleaga partea software
• Utilizarea de blocuri functionale +fiecare proiectant este responsabil atât de hardware cât si de
software pentru o functiune, sau pentru un set de functiuni
ETAPE PROIECTARE
• Deciziile luate la un anumit pas al proiectarii sunt bazate pe estimarea a ce se va întâmpla mai
târziu
– Daca estimarile sunt inadecvate, trebuie sa ne întoarcem si sa îndreptam deciziile
noastre initiale, tinând cont de noile evenimente
• La fiecare etapa a proiectarii se adauga detalii:
-analiza proiectului la fiecare pas pentru a determina cum se îndeplinesc specificatiile
-rafinarea proiectului pentru a adauga elemente de detaliu
-verificarea proiectul pentru a fi siguri ca îndeplineste toate obiectivele sistemului
PRINCIPALELE ETAPE ÎN
PROCESUL DE PROIECTARE AL EmS
•Implementare module
•Verificare si punere la punct
•Implementarea si integrarea sistemului
REZUMAT CERINTE
Faza Rezultate
Definirea problemei de proiectare si elaborare cerinte
Cercetare, analiza piata →Definirea corecta a problemei
Consultare utilizator. Culegere de →Propunere cerinte
informatii →Document (formular) de cerinte
generale de la clienti (utilizatori sau → Crearea unui plan de testare
beneficiari)
Cerinte functionale si nefunctionale
Cercetare
ELABORAREA SPECIFICATIILOR
• Specificatiile reprezinta o descriere functionala detaliata ce respecta cerintele. Nu indica modul
de implementare.
– Specificatiile usureaza întelegerea cerintelor
– Specificatiile permit urmarirea îndeplinirii cerintelor pe parcursul activitatilor de
proiectare
• Usureaza munca de proiectare
• Înlatura eventualele greseli, repetari sau omisiuni ale unor functii→reluari ale proiectarii
• Specificatiile sunt deosebit de importante pentru proiecte complexe, ce implica un colectiv de
cercetare →sarcinile de proiectare pentru fiecare persoana din grup.
• Presupun o analiza (interna) a conceptiilor de proiectare enuntate pentru a verifica daca
specificatiile cerute sunt posibil de implementat
– re-utilizarea unor parti din alte proiecte anterioare permite asigurarea succesului noului
proiect (functional si ca timp de terminare)
• Specificatiile pot fi privite ca un contract între beneficiar si proiectant
• Documentele cu cerinte si specificatii pot fi folosite pentru crearea unui plan de testare
– Documentul initial de cerinte defineste ce este nevoie este necesar a fi testata.
• Testarea este facuta, de obicei la proiectele mari, de un inginer de testare independent de
colectivul de proiectare, care elaboreaza un plan de testare pe baza cerintelor.
• Separarea analizei cerintelor si specificatiilor este necesara adesea:
– diferente mari între modul cum beneficiarii pot descrie sistemul si ceea ce au nevoie
specialistii pentru a proiecta sistemul.
– beneficiarii pot avea asteptari nerealiste cu privire la ceea ce se poate face cu bugetul
alocat de ei.
COMPLEXITATEA SPECIFICATIILOR
• Complexitatea si formalismul specificatiilor depind de tipul companiei proiectante si de
dimensiunea produsului final.
• Se poate realizeaza o modelare a specificatiilor în scopul proiectarii arhitecturii si ulterior a
proiectarii componentelor.
– Modelele sunt reprezentari conceptuale ale functionalitatii sistemului. Modelul este
constituit din obiecte functionale si reguli pentru compunerea acestor obiecte.
• Descrierea grafica a specificatiilor
– fie într-un limbaj de modelare,
– sau prin definirea si desenarea unor diagrame de analiza conceptuala a sistemului care
cuprind:
• componentele cheie ale sistemului,
• functiile de baza ale fiecarei componente,
• interactiunea – caile de comunicare între aceste componente si
• lista serviciilor oferite utilizatorului sistemului
PROIECTARE ARHITECTURALĂ
• Arhitectura este o reprezentare abstractă a implementării sistemului şi indică structura
sistemului în termenii componentelor mari şi interconexiunile dintre acestea
• La nivel arhitectural, componentele hardware şi software sunt reprezentate ca o compoziţie de
elemente ce interacţionează
– Detalii de implementare (HW & SW) sunt abstractizate, conţinând doar informaţia de
comportament şi de inter-relaţie între componente
• O arhitectura embedded include elemente interne ale sistemului, elemente externe ce
interacţionează cu sistemul, proprietăţile fiecărui element individual şi relaţiile de interacţiune
între elemente
• În aceasta etapa se face partiţionarea implementării funcţiilor între hardware şi software
IMPORTANTA ARHITECTURII
• Indică cum se vor implementa funcţiile sistemului, descrise în specificaţii.
• Arhitectura este documentul care:
– Defineşte infrastructura proiectului
– Evidenţiază opţiunile şi constrângerile de proiectare
– Comunică rapid şi corect, prin planul arhitectural, modul în care se va face
proiectarea / implementarea. (Comunicare către alte persoane cu / fără pregătire
tehnică)
– Este fundamentul activităţii de planificare a sarcinilor de proiectare
– Permite analiza şi testarea calităţii unui dispozitiv
– Permite definirea unor modalităţi de reducere a costurilor de proiectare construcţie
– Permite estimarea corectă a riscurilor implicate de varianta de implementare a
diverselor elemente
– Permite reutilizarea cunoaşteriiscăderea în viitor a costurilor
Proiectarea arhitecturala include:
Definirea componentelor sistemului. Este o estimare ce tine de experienţa şi de cunoaşterea
caracteristicilor componentelor hardware şi software propuse.
Specificaţii hardware / software (exista opţiunea între a cumpăra şi a construi prin forte
proprii)
În cazul UML: modelare grafica a obiectelor componente. Obiectele corespund
pieselor reale HW si SW ale proiectului.
Alegerea procesorului
Alegerea limbajului de programare
Evaluarea sistemului
Proiectare hardware şi firmware
Integrare si testare funcţională
DE ŢINUT CONT
• Este important de ţinut minte că hardware reprezintă un cost recurent (repetat), ce se repeta
pentru fiecare sistem vândut.
• Software reprezintă un cost ne-recurent. Trebuie dezvoltat o singură dată, dar nu apare ca şi
cost pe unitatea de produs, decât dacă este o taxa de licenţă de plătit.
• Alegerea variantei de implementare hardware:
– Cu microprocesoare, microcontrollere discrete şi cablaj imprimat – în aceeaşi
carcasă, System in Package
– Sistem distribuit
– Un-sistem-pe-un-chip (System-on-chip = SOC). Proiecte SOC pe baza de nuclee
IP
– ASIC, bazat tot pe nuclee IP dar pentru aplicaţii specifice si în număr extrem de mare.
Sunt tot SoC, full custom design.
ALEGEREA PROCESORULUI
• Numărul de pini de IO necesari - Pini grupaţi în porturi de IO, restricţii, capabilităţi curenţi
mari
• Interfeţe necesare
• Cerinţe memorie RAM
– numărul de variabile plus suma tuturor bufferelor interne, structuri FIFO, şi
dimensiunea stivei
– intern / extern, restricţii de utilizare, SFR, moduri de adresare
– eficienta compiler.
• Cerinţe memorie ROM
– suma codului de program plus toate tabelele necesare a fi incluse într-o memorie
nevolatilă
– regula bazata pe experienţă: ocupare în proporţie de maxim 80%
– Testare compilator ales porţiuni de cod pentru a determina dimensiunea
acestuia după compilare / asamblare
– dimensiunea codului depinde limbajul de programare ales pentru dezvoltare
– dacă se folosesc operaţii în virgulă mobilă, iar procesorul nu are inclus un
coprocesor matematiccod mare.
• Număr de întreruperi cerut
• Consideraţii real-time
• Mediul de dezvoltare. Funcţiuni principale ale unui mediu integrat de dezvoltare (IDE -
Integrated Development Environment), ce rulează pe un calculator desktop (de exemplu un
PC).:
– dezvoltarea programelor utilizator (de obicei în limbaj C şi / sau asamblare) într-o
fereastra de editare.
– compilator si editor de legături
– depanarea şi punerea la punct a programelor prin debugger
– asamblor pentru rutinele scrise în asamblare
– simulator pentru rularea programelor (inclusiv pas cu pas prin debugger) şi
urmărirea conţinutului registrelor interne, a memoriei, a porturilor de IO, a
circuitelor timer / counter, etc.
– transferul codului (program executabil) către memoria locala (flash, EEPROM) a
microcontrollerului
– Investiţii anterioare ale companiei (IDE), principii economice.
• Necesităţi de viteza de prelucrare.
– În cazul cel mai dezavantajos al mai multor întreruperi aflate în curs de servire
procesorul trebuie să funcţioneze respectând specificaţiile de proiectare.
– Lungimea buclelor de interogare suficient de scurtă ca să nu se piardă niciodată un
octet de la o intrare de date serială, sau de la oricare altă interfaţă.
– Frecvenţa de ceas a procesorului nu trebuie confundată cu frecvenţa oscilatorului
de ceas.
– Setul de instrucţiuni este de asemenea foarte important. În unele aplicaţii
arhitectura RISC poate fi o capcană.
• ROM-ability
– Flash
– EPROM
– OTP
– ROM.
• Costuri
• In Circuit programming
• Arhitectura memoriei
• Cerinţe de putere
• Cerinţe de mediu
– Unele aplicaţii impun ca MP să lucreze la game extreme de temperatura şi
radiaţie.
hardware şi software
• Opţiune între cumpărare sau
construire prin forte proprii.
• Partiţionare: Blocuri
funcţionale, Hw / SW
HARDWARE
SOFTWARE
IMPLEMENTAREA SISTEMULUI
• Implementarea hardware si software
• Proiectare de detaliu componente si construcţie
– Pentru software asta înseamnă proiectarea de detaliu, scriere şi depanare a
codului
– Pentru hardware înseamnă proiectarea de detaliu, realizarea proiectului prototipului si
testarea circuitelor.
• Implementare nucleu MCU
• Construcţie şi testare alte blocuri funcţionale ale arhitecturii. Daca la proiect lucrează o singura
persoana, atunci blocurile funcţionale sunt completate secvenţial. Dacă există mai mulţi
proiectanţi acestea se pot rezolva în paralel.
• Sarcinile presupuse pentru fiecare bloc funcţional includ proiectare hardware de detaliu si
construcţie, proiectare software de detaliu şi construcţie şi apoi integrarea hardware-software şi
testarea
• Pot exista interdependenţe între proiectarea hardware şi software. Partea hardware nu poate fi
testată până când o parte din software nu este gata, iar software nu poate fi testat până când
partea din proiectul hardware nu este gata
• În mod tipic se construieşte hardware şi se testează minimal mai întâi. Apoi majoritatea
efortului se concentrează pe scrierea de software şi testarea software pe hardware.
• Documentarea sistemului
VERIFICARE SI TESTARE
• Scop: verificare, testare, încorporare de informaţii de feedback pentru corectarea
neconformităţilor
• Revizii:
– Reviziile sunt demonstraţii, inspecţii ale schemelor si inspecţii ale
codului
– Revizia trebuie făcută de specialişti independenţi, familiari cu proiectul
(CERINŢE) şi tehnologiile, care să ajute la detectarea erorilor
– Se pot detecta omisiuni, erori
• Testarea produsului final este o continuare a activităţilor de testare din timpul proiectării,
acestea putând fi urmărite conform documentaţiei elaborate la proiectare arhitecturală
• Testare publică - un proiect preliminar este distribuit unor beneficiar de la care se aşteaptă
feedback (“beta testing”). Reacţia de la clienţi poate duce nu numai la detectarea unor erori,
schimbarea codului, dar şi la schimbarea unor specificaţii. Nu e recomandată întotdeauna în
domeniul EmS.
Introducere
Structura tipică a unui sistem incorporat este prezentată în figura 3.2. Aceasta poate fi
comparată cu aceea a unui computer desktop prezentată în figura 3.3. În mod normal într-un
sistem incorporat memoria primară, unitatea centrală de calcul şi multe componente periferice
incluzând convertoarele analog numeric sunt incluse într-un singur chip. Aceste chip-uri sunt
constituite ca microcontrolere. Acesta este indicat prin linia punctată în figura 3.2.
Pe de altă parte un computer desktop poate conţine toate aceste circuite într-o singură
placă PCB (Power Circuit Board) cunoscută în genere ca “placă de bază”. Deoarece aceste
computere manipulează cantităţi mari de date în comparaţie cu sistemele incorporate au fost
elaborate modalităţi de pentru stocarea şi transferul mai rapid între CPU şi memorie, CPU şi
dispozitivele I/O şi între memorie şi dispozitivele de intrare/ieşire. Stocarea este desăvârşită prin
ieftinirea memoriilor secundare precum hard disk-uri şi CDROM-uri. Procesul de transfer al
datelor este îmbunătăţit prin incorporarea metodelor de acces a memoriilor cache multinivel şi
metodelor DMA. În general pentru sistemele incorporate nu sunt necesare astfel de aranjamente.
Din cauza numărului componentelor eterogene într-un computer desktop sunt necesare surse de
tensiune cu nivele de tensiune diferite (tipic ±12V, ±%V, ±3,25V). Pe de altă parte chip-urile
pentru sistemele incorporate au nevoie de un singur nivel de tensiune (tipic +5V).
VIA 733MHz or 1 GHz low power C3 processor EBX-compliant board Acesta este
procesorul acestui SBC. VIA reprezintă compania care produce procesorul, 733MHz sau 1GHz
este frecvenţa ceasului procesorului. C3 este codul producătorului.
Socket for up to 1Giga Byte bootable DiskOnChip or 512KB SRAM or 1MB EPROM - Soclu
pentru DiskOnChip butabil mai mare de 1Gb sau 512kB Ram sau 1Mb EPROM
Această memorie este RAM static sau EPROM care conţine sistemul de operare, având acelaşi
rol ca şi Hard disk+ul pentru calculatoarele desk top
Type I and II Compact Flash (CF) cards supported - Flash compact (CF) de tip I sau II
(card)
Are rolul unui hard-disk sau floppy semiconductor. Memoria flash reprezintă memorie de tip
EEPROM (Electricaly Easable and Programmable Read Only Memory). Tip I sau II reprezintă
format+uri diferite, tipul II fiind mai compact şi mai recent.
Exemplu de specificaţii
Specifications
+5 volt only operation
Mechanical
Dimensions: 5.75" x 8.0" (146mm x 203mm)
Jumpers: 0.025" square posts
Connectors
Serial, Parallel, Keyboard: 50-pin on 0.100" grid
COM3 & 4: 20-pin on 0.100" grid
Floppy Disk Interface: 34-pin on 0.100" grid
EIDE Interface: 40-pin on 0.100" grid (Primary)
44-pin on 2mm grid (Primary)
40-pin on 0.100" grid (Secondary)
50-pin 2mm Flash connector
Parallel I/O: Two, 50-pin on 0.100" grid
CRT: 14-pin on 2-mm. grid
FP-100 Panel: Two, 50-pin on 2-mm. grid
LVDS 20-pin on 0.100" grid
Ethernet: Two RJ-45
PC/104 bus: 64-pin 0.100" socket, 40-pin 0.100" socket
PC/104-Plus 120-pin (4 x 30; 2mm) stackthrough with shrouded header
USB Four, 4-pin 0.100”
Audio Three, 3.5mm stereo phone jacks
Power: 9-pin in-line Molex
Environmental
Operating Temperature:
-40° to +85°C (733MHz)
-40° to +60°C (1GHz)
Non-condensing relative humidity: 5% to 95%
Concluzii
Rezultă din exemplul anterior că un sistem incorporate tipic constă în mare din următoarele
component montate pe o singură placă sau un singur CIP:
1. Procesor
2. Memorie
3. Module de interfaţă intrări/ieşiri
4. CAN şi CNA
5. Software ca sistem de operare
6. Software de aplicaţie
Una sau mai multe componente din cele prezentate anterior pot fi plasate pe o singură placă
sau pe un singur CIP. Într-un system incorporate tipic, microprocesorul, o mare parte a memoriei şi
principalele dispozitivele I/O sunt realizate pe un singur CIP numit microcontroller. Sistemele
incorporate lucrează pentru realizarea unor scopuri specific şi suportă în general o programare
minimală din partea utilizatorului. Interacţiunea cu utilizatorul constă dintr-o serie de comenzi care
sunt executate de RTOS prin apelarea unor subroutine. RTOS este stocat în memoria flash sau în
memoria read only. Pentru stocarea datelor temporare se vor utilize memorii care pot fi şterse. Dacă
CPU este plasat pe acelaşi CIP cu memoria, atunci o parte din memorie poate fi utilizată ca memorie
tampon. Altfel, un număr din regiştrii CPU vor fi folosiţi ca memorie tampon. CPU comunică cu
memoria prin adrese şi bus-ul de date. Durata şi controlul acestor schimburi de date sunt realizate de
unitatea de control a CPU prin intermedioul liniilor de control. Memoriile plasate pe acelaşi CIP cu
procesorul au viteze de transfer mai mari Pe de altă parte, dispozitivele I/O au diverse grade de
viteze de lucru. Aceste viteze diferite de transfer sunt manipulate în moduri diferite de către
processor. Dispozitivele cele mai lente au nevoie de circuite de interfaţare. În general nu sunt
utilizate chip-uri mai rapide decât microprocesorul.
Arhitectura unui sistem icorporat tipic esate prezentată în figura 3.8. Unitatea hardware
constă din elementele prezentate anterior conectate cu un subsistem numeric precum şi cu un
subsitem analogic. Software-ul sub forma unui RTOS este resident în memorie.
Unitatea de procesare centrală este cea mai importantă componentă a sistemelor incastrate.
Depinzând de tipul aplicaţiei procesoarele se pot clasifica în trei clase principale:
1. Microprocesoare de uz general
2. Microcontrolere
3. Procesoare digitale de semnal
Pentru mai multe aplicaţii specifice pot fi proiectate procesoare deosebite. În afară de cazul în
care cererea este mare costurile de proiectare şi producere a procesorului vor fi mari. Prin
urmare, în cele mai multe aplicaţii, proiectarea este finalizată utilizând procesoare disponibile pe
piaţă. Totuşi pot fi utilizate FPGA (Field Programmable Gate Array) pentru a implementa uşor
procese oarecare simple. Un FPGA etse un chip logic care poate fi programat. Acestea pot avea
sute de porţi care pot fi interconectate ca un EPROM (Erasable Programable Read Only
Memory). Sunt utilizate în special pentru proiectarea prototipurilor circuitelor integrate. Odată
proiectat, cipul cablat este produs pentru obţinerea vitezelor mai mari.
Un procesor de uz general este destinat să rezolve probleme într-o largă gamă de aplicaţii
precum comunicaţii, automobile şi sisteme incorporate industriale. Aceste procesoare sunt în
general ieftine pentru că sunt produse într-un număr foarte mare. Fiind ieftine, producătorul
poate investi mai mult pentru creşterea proiectării VLSI cu caracteristici arhitecturale
îmbunătăţite. Astfel, performanţe precum consumul şi dimensiunile pot fi îmbunătăţite. În cele
mai multe cazuri, pentru astfel de procesoare uneltele de proiectare sunt furnizate de producător.
De asemenea hardware+ul suport este ieftin şi uşor disponibil. Totuşi, numai o parte a
capabilităţilor procesorului pot fi necesare pentru o proiectare specifică şi prin urmare sistemele
incastrate per ansamblu nu va fi optimizat aşa cum ar fi trebuit sa fie ,in ceea ce priveşte
dimensiunea, puterea şi siguranţa în funcţionare.
Structura unui procesor de uz general este prezentată în figura 4.1.
Calea de date (data path) constă dintr-un circuit pentru transformarea şi stocarea temporară a
datelor. Conţine o unitate aritmetică şi logică (ALU) capabilă să transofrme datele în cursul
operaţiilor precum adunare, scădere, Şi logic, SAU logic, inversare, deplasare, etc. Calea de date
conţine de asemenea regiştri capabili să stocheze temporar datele generate de ALU sau obţinute
în urma operaţiilor. Bus-ul (magistrala) intern de date susţin datele şi căile de date până când
bus-ul de date extern susţine datele spre şi de la memoria de date. Dimensiunea adresei de date
indică lungimea cuvântului CPU. O adresă de date de 8 biţi corespunde unui CPU pe 8 biţi
precum 8085.
Unitatea de control este alcătuită din circuite pentru extragerea instrucţiunilor program şi
pentru a deplasa datele spre, de la şi prin calea de date în concordanţă cu instrucţiunile extrase.
Există un contor de program (PC) care păstrează adresa următoarei instrucţiuni program ce
trebuie extrase şi un registru de instrucţiuni (IR) pentru păstrarea instrucţiunii extrase. Există de
asemenea o unitate de sincronizare a registrului de stare şi controlului logic. Controlerul
generează semnale de control necesare citirii instrucţiunilor din registru de instrucţiuni (IR) şi
controlului fluxului de date pe calea de date. În general dimensiunea adresei este specificată de
unitatea de control aceasta fiind responsabilă să comunice cu memoria. Pentru fiecare
instrucţiune, controlerul realizează în mod normal mai multe multe etape precum determinarea
locaţiei din memorie a instrucţiunii, decodificarea ei, determinarea operanzilor, executarea
instrucţiunilor pe calea de date şi stocaarea instrucţiunilor. Fiecare etapă durează câţiva cicli de
ceas.
Fig. 4..1. Arhitectura unui procesor de uz general
Microcontrolere
În mod similar modului în care elemnetele unui calculator desktop sunt montate pe o singură
placă, prin montarea pe un singur chip a elementelor principale din arhitectura unui computer se
obţine un microcontroler. Din cauza restricţiilor impuse de realizarea circuitelor VLSI cele mai
multe funcţii de intrare ieşire sunt prezente într-o formă simplificată. Arhitectura tipică a unui
microcontroler este preezentată în figura 4.2.
*Casuţele dublu haşurate reprezintă elemente ale microprocesorului.
Pe lângă circuitele prezentată sistemele incorporate real time pot avea şi alte circuite specifice
incluse în acealşi chip sau pe aceeaşi placă. Acestea sunt cunoscute ca ASIC (Application
Specific Integrated Circuit). Prezentăm în continuare câteva exemple:
1. MODEM uri (unităţi de modulare, demodulare)
Sunt utilizate pentru a modula un semnal digital într-un semnal analogic de înaltă frecvenţă
(pentru comunicaţii wire less). Există mai multe metode de modulare (amplitudine, frecvenţă,
fază, etc.). Acelaşi dispozitiv este utilizat şi pentru demodulare.
2. CODEC-uri –(Unităţi de compresie decompresie)
Sunt utilizate în general pentru procesarea semnalelor digitale video sau/şi audio. Un CODEC
reduce cantitatea de date ce trebuie transmise, eliminând informaţia redundant (la transmisie) şi
reconstituind semnalul (la recepţie)
3. Filtre
Filtrele sunt utilizate pentru condiţionarea semnalelor prin eliminarea zgomotelor şi a altor
component perturbatoare. O clasă specific de filtre numite Antialiassing sunt utilizate înaintea
conversiei analog numerice pentru a preveni asiasing-ul la achiziţia semnalelor de bandă largă.
4. Controlere
Acestea sunt circuite specific pentru controlul motoarelor, şi a altor tipuri de elemente de
execuţie.
5 Memorii
Obiective
După aprofundarea lecţiei studenţii vor cunoaşte
Diferite tipuri de memorii
- Memorie procesor
- Memorie primară
- Interfaţarea memoriei
Introducere
Cele mai multe calculatoare moderne au fost proiectate conform arhitecturii de bază
numită Von-Neumann prezentată în figura 5.1.
Cele mai multe procesoare au mai mulţi regiştri asociaţi cu unitatea aritmetică şi logică
(ALU). Aceştia stochează operanzii şi rezultatele instrucţiunilor. Ratele de transfer de date sunt
foarte rapide fără să fie necesare cicluri adiţionale de ceas. Numărul regiştrilor variază de la
procesor la procesor. Cu cât sunt mai mulţi cu atât creşte viteza de execuţie a instrucţiunilor. Dar
complexitatea arhitecturii limitează cantitatea de memorie a procesorului.
În unele procesoare poate exista un bloc de memorie. Acestea pot fi tratate în acelaşi
mod ca o memorie externă. Cu toate astea este foarte rapidă.
Memorie primară
Aceasta este una care este situată în afara CPU. Poate fi situată în acelaşi CHIP cu CPU.
Aceste memorii pot fi statice sau dinamice.
Memoria cache
Aceasta este situată între procesor şi memoria primară. Se comportă ca un tampon pentru
instrucţiunile sau datele pe care procesorul le anticipează. Pot fi mai multe niveluri de memorie
cahe.
Memorie secundară
Acestea sunt tratate ca dispozitive de intrare/ieşire. Sunt cele mai ieftine dar şi cele mai
lente dispozitive de stocare conectate prin intermediul unor circuite de interfaţă intrare/ieşire.
Sunt memorii optice sau magnetice precum Hard disk, CD Rom, etc. Aceste memorii pot fi
clasificate în memorii volatile şi memorii nevolatile.
Memorie volatilă - este memoria al cărei conţinut este şters cânt circuitul de alimentare
este întrerupt. SRAM (semiconductor random acess) fac parte din această categorie.
Memorie nevolatilă – memoriile nu sunt afectate chiar dacă alimentarea este întreruptă.
Memoriile magnetice (Hard Disk), Memoriile optice (CDROM), memoriile de tip ROM (read
only memory) fac parte din acest tip de memorii.
Stocarea datelor
O memorie de m cuvinte poate stoca mxn date: m cuvinte de n biţi. Un cuvânt este
localizat la o adresă, prin urmare pentru a adresa m cuvinte sunt necesare un număr de semnale
de intrare de adrese k=log2(m) sau k linii de adrese pot acesa m=2k cuvinte.
Fig. 5.3. Regiştri interni
De exemplu: o memorie de 4096x8
- poate stoca 32768 de biţi
- 12 semnale de intrare de adresă
- 8 semnale de intrare/ieşire de date
Accesarea memoriei
Locaţia memoriei poate fi accesată prin plasarea adresei pe liniile de adrese. Liniile de
control read/write selectează operaţia (citire scriere).Unele dispozitive de memorare sunt
dispozitive multiport astfel încât pot fi accesate simultan mai multe locaţii de memorie.
Caracteristicile memoriei
Fig. 5.7.
Implementarea funcţiilor combinaţionale
Conexiunile sunt programate din fabricaţie şi sunt un set de măşti; pot fi scrise o singură
dat (la fabricare) dar stochează date pentru totdeauna. Sunt în mod uzual utilizate pentru
proiectarea formei finale a sistemelor mari.
Conexiunile pot fi programate după fabricaţie de către utilizator; acesta furnizează fişierul cu
conţinutul dorit al memoriei ROM. Înscrierea se face printr-un dispozitiv special numit
“programator” de ROM. Fiecare conexiune programabilă este arsă. Programatorul de ROM arde
fuzibilele acolo unde nu există conexiuni. Au următoarele caracteristici:
- abilităţi de scriere foarte scăzute: se pot înscrie o singură dată şi necesită un
programator
- permanenţă ridicată a informaţiei stocate: biţii nu se schimbă decît dacă se
face reconectarea la programator şi se ard noi fuzibile
- utilizare uzuală în produsul final: ieftine, greu de modificat din greaşeală
Aceasta este cunoscută ca read onlz memory reprogramabilă. Componenta programabilă este un
tranzistor MOS. Acest tranzistor are o poartă flotantă înconjurată de izolator. Sarcină negativă
Microcontrolerul PIC16F84
Introducere
CISC, RISC
Aplicaţii
Clock-ul/instrucţiune
Pipelining
Semnificaţia pinilor
Introducere
PIC16F84 aparţine unei clase de microcontrolere de 8 biţi cu arhitectură RISC. Structura
lui generală este arătată în schiţa următoare reprezentând blocurile de bază.
PORTUL A şi PORTUL B sunt conexiuni fizice între microcontroler şi lumea de afară. Portul
A are 5 pini, iar portul B are 8 pini.
Pentru că PIC16F84 este un microcontroler RISC, aceasta înseamnă că are un set redus de
instrucţiuni, mai precis 35 de instrucţiuni (de ex. microcontrolerele INTEL şi Motorola au
peste 100 de instrucţiuni). Toate aceste instrucţiuni sunt executate într-un ciclu cu excepţia
instrucţiunilor jump şi branch. Conform cu ceea ce spune constructorul, PIC16F84 ajunge la
rezultate de 2:1 în compresia cod şi 4:1 în viteză în comparaţie cu alte microcontrolere de 8
biţi din clasa sa.
Aplicaţii
PIC16F84 se potriveşte perfect în multe folosinţe, de la industriile auto şi aplicaţiile de
control casnice la instrumentele industriale, senzori la distanţă, mânere electrice de uşi şi
dispozitivele de securitate. Este de asemenea ideal pentru cardurile smart ca şi pentru
aparatele alimentate de baterie din cauza consumului lui mic.
Memoria EEPROM face mai uşoară aplicarea microcontrolerelor la aparate unde se cere
memorarea permanentă a diferitor parametri (coduri pentru transmiţătoare, viteza
motorului, frecvenţele receptorului, etc.). Costul scăzut, consumul scăzut, mânuirea uşoară
şi flexibilitatea fac PIC16F84 aplicabil chiar şi în domenii unde microcontrolerele nu au fost
prevăzute înainte (exemple: funcţii de timer, înlocuirea interfeţei în sistemele mari,
aplicaţiile coprocesor, etc.).
Programabilitatea sistemului acestui cip (împreună cu folosirea a doar doi pini în transferul
de date) face posibilă flexibilitatea produsului, după ce asamblarea şi testarea au fost
terminate. Această capabilitate poate fi folosită pentru a crea producţie pe linie de
asamblare, de a înmagazina date de calibrare disponibile doar după testarea finală, sau
poate fi folosit pentru a îmbunătăţi programele la produsele finite.
Clock-ul de la oscilator intră într-un microcontroler prin pinul OSC1 unde circuitul intern al
microcontrolerului divide clock-ul în 4 clock-uri egale Q1, Q2, Q3 şi Q4 ce nu se suprapun.
Aceste 4 clock-uri constituie un ciclu de o singură instrucţiune (numit de asemenea ciclu
maşină) în timpul căreia instrucţiunea este executată.
Executarea instrucţiunii începe prin apelarea unei instrucţiuni care este următoarea în linie.
Instrucţiunea este apelată din memoria program la fiecare Q1 şi este scrisă în registrul de
instrucţiuni la Q4. Decodarea şi executarea instrucţiunii sunt făcute între următoarele cicluri
Q1 şi Q4. În următoarea diagramă putem vedea relaţia dintre ciclul instrucţiunii şi clock-ul
oscilatorului (OSC1) ca şi aceea a clock-urilor interne Q1-Q4. Contorul de program (PC)
reţine informaţia despre adresa următoarei instrucţiuni.
Pipelining
Ciclul instrucţiune constă din ciclurile Q1, Q2, Q3 şi Q4. Ciclurile de instrucţiuni de apelare
şi executare sunt conectate într-un aşa fel încât pentru a face o apelare, este necesar un
ciclu cu o instrucţiune, şi mai este nevoie de încă unul pentru decodare şi executare. Totuşi,
datorită pipelining-ului (folosirea unei pipeline-conductă, şi este aducerea unei instrucţiuni
din memorie în timp ce se execută alta), fiecare instrucţiune este executată efectiv într-un
singur ciclu. Dacă instrucţiunea cauzează o schimbare în contorul programului, şi PC-ul nu
direcţionează spre următoarea ci spre alte adrese (poate fi cazul cu subprogramele jumps
sau calling), 2 cicluri sunt necesare pentru executarea unei instrucţiuni. Aceasta este pentru
că instrucţiunea trebuie procesată din nou, dar de data aceasta de la adresa corectă. Ciclul
începe cu clock-ul Q1, prin scrierea în registrul instruction register (IR). Decodarea şi
executarea începe cu clock-urile Q2, Q3 şi Q4.
TYC0 citeşte instrucţiunea MOVLW 55h (nu are importanţă pentru noi ce instrucţiune a fost
executată, ce explică de ce nu este un dreptunghi desenat în partea de jos).
TCYI execută instrucţiunea MOVLW 55h şi citeşte MOVWF PORTB.
TCY2 execută MOVWF PORTB şi citeşte CALL SUB_1.
TCY3 execută o apelare a subprogramului CALL SUB_1, şi citeşte instrucţiunea BSF PORTA,
BIT3. Pentru că instrucţiunea aceasta nu este aceea de care avem nevoie, sau nu este
prima instrucţiune a subprogramului SUB_1 a cărei execuţie este următoarea în ordine,
instrucţiunea trebuie citită din nou. Acesta este un bun exemplu a unei instrucţiuni având
nevoie de mai mult de un ciclu.
TCY4 ciclul instrucţiunii este total folosit pentru citirea primei instrucţiuni din subprogram la
adresa SUB_1.
TCY5 execută prima instrucţiune din subprogram SUB_1 şi citeşte următoarea.
Semnificaţia pinilor
PIC16F84 are un număr total de 18 pini. Cel mai adesea se găseşte într-o capsulă de tip
DIP18 dar se poate găsi de asemenea şi într-o capsulă SMD care este mai mică ca cea DIP.
DIP este prescurtarea de la Dual In Package. SMD este prescurtarea de la Surface Mount
Devices sugerând că găurile pentru pini unde să intre aceştia, nu sunt necesare în lipirea
acestui tip de componentă.
Pinii microcontrolerului PIC16F84 au următoarea semnificaţie:
Tipuri de oscilatoare
PIC16F84 poate lucra cu patru configuraţii diferite de oscilator. Pentru că configuraţiile cu
oscilator cu cristal şi rezistor-condensator (RC) sunt cele utilizate cel mai frecvent, doar pe
ele le vom menţiona aici. Tipul de microcontroler cu oscilator cu cristal este desemnat ca
XT, iar microcontrolerul cu perechea rezistor-condensator are desemnarea RC. Aceasta este
important pentru că trebuie să numiţi tipul de oscilator când cumpăraţi un microcontroler.
Oscilatorul XT
Oscilatorul RC
În aplicaţiile unde nu este nevoie de o mare precizie de timp, oscilatorul RC permite
economii adiţionale la cumpărare. Fecvenţa de rezonanţă a oscilatorului RC depinde de
valoarea tensiunii de alimentare, rezistorul R, condensatorul C şi temperatura de lucru.
Trebuie de menţionat că frecvenţa de rezonanţă este de asemenea influenţată de variaţiile
normale ale parametrilor de proces, de toleranţa externă a componentelor R şi C, etc.
Diagrama de mai sus arată cum este conectat oscilatorul RC la PIC16F84. La valoarea
rezistorului mai mică 2.2k, oscilatorul poate deveni instabil, sau oscilaţia se poate chiar
opri. La valori mari a lui R (ex.1M) oscilatorul devine foarte sensibil la zgomot şi umezeală.
Se recomandă ca valoarea rezistorului R să fie între 3 şi 100k. Chiar dacă oscilatorul va
lucra fără un condensator extern (C=0pF), trebuie totuşi folosit un condensator de peste
20pF pentru zgomot şi stabilitate. Indiferent de ce oscilator este folosit, pentru a obţine un
ceas la care să funcţioneze microcontrolerul, ceasul trebuie divizat la 4. Un ceas al
oscilatorului divizat cu 4 se poate obţine la pinul OSC2/CLKOUT, şi poate fi folosit pentru
testarea sau sincronizarea altor circuite logice.
Cele mai importante resurse de reset sunt a) şi b). Prima are loc de fiecare dată când este
alimentat microcontrolerul şi serveşte la aducerea toturor regiştrilor la starea iniţială a
poziţiei de start. A doua este pentru a aduce un zero logic la pinul MCLR în timpul operaţiei
normale a microcontrolerului. Este des folosită în dezvoltarea de programe.
În timpul unui reset, locaţiile de memorie RAM nu sunt resetate. Ele sunt necunoscute la
alimentare şi nu sunt schimbate la nici un reset. Spre deosebire de acestea, regiştrii SFR
sunt resetaţi la o stare iniţială a poziţiei de start. Unul din cele mai importante efecte ale
resetului este setarea contorului de program (PC) la zero (0000h), ceea ce permite
programului să înceapă executarea de la prima instrucţiune scrisă.
Impulsul pentru resetare în timpul creşterii tensiunii este generat de microcontrolerul însuşi
când detectează o creştere în tensiunea Vdd (în domeniul de la 1.2V la 1.8V). Acest impuls
durează 72 ms ceea ce este un timp suficient pentru oscilator ca să se stabilizeze. Aceste
72 ms sunt asigurate de un timer intern PWRT care are oscilatorul lui RC. Microcontrolerul
este în modul reset cât timp PWRT este activ. Totuşi, când montajul funcţionează, probleme
apar când sursa nu scade la zero ci când scade mai jos de limita ce garantează funcţionarea
corectă a microcontrolerului. Acesta este un caz real din practică, în special în mediile
industriale unde perturbaţiile şi instabilităţile sursei de alimentare sunt ceva foarte curent.
Pentru a rezolva această problemă trebuie să ne asigurăm că microcontrolerul este într-o
stare de reset de fiecare dată când tensiunea sursei scade sub limita admisă.
Registrul STATUS conţine starea aritmetică ALU (C, DC, Z), starea RESET (TO, PD) şi biţii
pentru selectarea bancului de memorie (IRP, RP1, RP0). Considerând că selecţia bancului
de memorie este controlată prin acest registru, el trebuie să fie prezent în fiecare banc.
Bancul de memorie se va discuta mai în detaliu în capitolul Organizarea memoriei. Registrul
STATUS poate fi o destinaţie pentru orice instrucţiune, cu oricare alt registru. Dacă registrul
STATUS este o destinaţie pentru instrucţiunile ce afectează biţii Z, DC or C, atunci scrierea
în aceşti trei biţi nu este posibilă.
Registrul OPTION
bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-Bit Selecţie Rată Prescaler)
Aceşti trei biţi definesc bitul de selecţie a ratei prescalerului. Ce este un prescaler şi cum
pot afecta aceşti biţi funcţionarea unui microcontroler va fi explicat în secţiunea depre
TMRO.
bit 4 T0SE (TMR0 Source Edge Select bit-Bit Selecţie a Frontului Sursei TMR0)
Dacă este permis de a se triggera TMRO prin impulsurile de la pinul RA4/T0CKI, acest bit
determină dacă aceasta va fi la frontul descrescător sau crescător al unui semnal.
1= front crescător
0= front descrescător
bit 5 TOCS (TMR0 Clock Source Select bit-Bit Selecţie Sursă Ceas TMR0)
Acest pin permite timerului liber (free-run) să incrementeze starea lui fie de la oscilatorul
intern la fiecare ¼ a ceasului oscilatorului, fie prin impulsuri externe la pinul RA4/T0CKI.
1= impulsuri externe
0= ceas intern 1/4
Registrul STATUS conţine starea aritmetică ALU (C, DC, Z), starea RESET (TO, PD) şi biţii
pentru selectarea bancului de memorie (IRP, RP1, RP0). Considerând că selecţia bancului
de memorie este controlată prin acest registru, el trebuie să fie prezent în fiecare banc.
Bancul de memorie se va discuta mai în detaliu în capitolul Organizarea memoriei. Registrul
STATUS poate fi o destinaţie pentru orice instrucţiune, cu oricare alt registru. Dacă registrul
STATUS este o destinaţie pentru instrucţiunile ce afectează biţii Z, DC or C, atunci scrierea
în aceşti trei biţi nu este posibilă.
Registrul OPTION
bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-Bit Selecţie Rată Prescaler)
Aceşti trei biţi definesc bitul de selecţie a ratei prescalerului. Ce este un prescaler şi cum
pot afecta aceşti biţi funcţionarea unui microcontroler va fi explicat în secţiunea depre
TMRO.
bit 4 T0SE (TMR0 Source Edge Select bit-Bit Selecţie a Frontului Sursei TMR0)
Dacă este permis de a se triggera TMRO prin impulsurile de la pinul RA4/T0CKI, acest bit
determină dacă aceasta va fi la frontul descrescător sau crescător al unui semnal.
1= front crescător
0= front descrescător
bit 5 TOCS (TMR0 Clock Source Select bit-Bit Selecţie Sursă Ceas TMR0)
Acest pin permite timerului liber (free-run) să incrementeze starea lui fie de la oscilatorul
intern la fiecare ¼ a ceasului oscilatorului, fie prin impulsuri externe la pinul RA4/T0CKI.
1= impulsuri externe
0= ceas intern 1/4
Toţi pinii portului pot fi definiţi ca intrare sau ieşire, conform cu nevoile unui montaj ce este
în dezvoltare. Pentru a defini un pin ca pin de intrare sau ca pin de ieşire, trebuie scrisă
combinaţia corectă de zero-uri şi unu-uri în registrul TRIS. Dacă în locul potrivit este scris
"1" logic în registrul TRIS, acel pin este pin de intrare, iar dacă este valabil contrariul, este
un pin de ieşire. Fiecare port are registrul lui TRIS. Astfel, portul A are TRISA la adresa
85h, iar portul B are TRISB la adresa 86h.
PORTB
PORTB are 8 pini legaţi la el. Registrul adecvat pentru direcţia datelor este TRISB la adresa
86h. Setarea unui bit în registrul TRISB defineşte pinul portului corespunzător ca pin de
intrare, şi resetarea unui bit în registrul TRISB, defineşte pinul portului corespunzător ca pin
de ieşire. Fiecare pin la PORTB are un rezistor slab intern pull-up (scoatere) (rezistor care
defineşte o linie la unu logic) care poate fi activat prin resetarea celui de-al şaptelea bit
RBPU în registrul OPTION. Aceşti rezistori 'pull-up' se închid automat când pinul portului
este configurat ca o ieşire. Când porneşte microcontrolerul, 'pull-up'-ii sunt dezactivaţi.
Patru pini ai portului PORTB, RB7:RB4 pot cauza o întrerupere, care se întâmplă când
starea lor se schimbă de la unu logic la zero logic şi invers. Numai pinii configuraţi ca
intrare pot cauza această întrerupere să se întâmple (dacă fiecare pin RB7:RB4 este
configurat ca o ieşire, nu va fi generată o întrerupere la schimbarea stării). Această opţiune
de întrerupere cu rezistorii 'pull-up' fac mai uşoară rezolvarea problemelor din practică, ca
de exemplu o tastatură matriceală. Dacă rândurile tastaturii sunt conectate la aceşti pini,
fiecare apăsare a unei clape va cauza o întrerupere. Microcontrolerul va determina care
clapă este apăsată în timp ce se procesează o întrerupere. Nu se recomandă să apelaţi la
portul B în timp ce se procesează întreruperea.
Exemplul de mai sus arată cum pinii 0, 1, 2, şi 3 sunt declaraţi ca intrare, şi pinii 4, 5, 6 şi
7 ca ieşire.
PORTA
PORTA are 5 pini legaţi la el. Registrul corespunzător pentru direcţia datelor este TRISA la
adresa 85h. Ca şi la portul B, setarea unui bit în registrul TRISA defineşte de asemenea
pinul portului corespunzător ca un pin de intrare, şi resetarea unui bit în registrul TRISA
defineşte pinul portului corespunzător ca pin de ieşire.
Al cincilea pin al portului A are funcţie duală. La acel pin se află de asemenea o intrare
externă pentru timer-ul TMRO. Una din aceste două opţiuni este aleasă prin setarea sau
resetarea bitului TOCS (TMR0 Clock Source Select bit-bit de Selecţie a Sursei Ceasului
TMRO). Acest pin permite timer-ului TMRO sa-şi crească starea fie de la oscilatorul intern
fie prin impulsuri externe la pinul RA4/T0CKI.
Memoria program
Memoria program a fost realizată în tehnologia FLASH ceea ce face posibil de a programa
un microcontroler de mai multe ori înainte de a fi instalat într-un montaj, şi chiar după
instalarea sa dacă se întâmplă unele schimbări în program sau parametri de proces.
Mărimea memoriei program este de 1024 locaţii cu lăţime de 14 biţi unde locaţiile zero şi
patru sunt rezervate pentru reset şi pentru vectorul întrerupere.
Memoria de date
Memoria de date constă din memoriile EEPROM şi RAM. Memoria EEPROM constă din 64 de
locaţii de opt biţi a căror conţinut nu este pierdut în timpul opririi sursei de alimentare.
EEPROM-ul nu este direct adresabil, dar este accesat indirect prin regiştrii EEADR şi
EEDATA. Pentru că memoria EEPROM este folosită curent la memorarea unor parametri
importanţi (de exemplu, o temperatură dată în regulatoarele de temperatură), există o
procedură strictă de scriere în EEPROM ce trebuie urmată pentru a preveni scrierea
accidentală. Memoria RAM pentru date ocupă un spaţiu într-o hartă a memoriei de la locaţia
0x0C la 0x4F ceea ce înseamnă 68 de locaţii. Locaţiile memoriei RAM sunt de asemenea
denumite regiştri GPR care este o abreviere General Purpose Registers-Regiştri cu Scop
General. Regiştrii GPR pot fi accesaţi indiferent de ce banc este selectat la un moment.
Regiştri SFR
Regiştri ce ocupă primele 12 locaţii în bancurile 0 şi 1 şi sunt regiştri ai funcţiei specializate
asignată cu unele blocuri ale microcontrolerului. Aceştia sunt numiţi Special Function
Registers-Regiştri ai Funcţiei Speciale.
Bancuri de Memorie
În afară de această diviziune în 'lungime' a regiştrilor SFR şi GPR, harta memoriei este de
asemenea împărţită în 'lăţime' (vezi harta precedentă) în două zone numite 'bancuri'.
Selectarea unuia din bancuri se face de biţii RPO şi RP1 în registrul STATUS-stare.
Exemplu:
bcf STATUS, RP0
Instrucţiunea BCF şterge bitul RPO (RP0=0) în registrul STATUS şi astfel setează bancul 0.
Instrucţiunea BSF setează bitul RPO (RP0=1) în registrul STATUS şi astfel setează bancul 1.
Uzual, grupurile de instrucţiuni care sunt adesea în uz, sunt conectate într-o singură unitate
ce poate fi uşor apelată într-un program, şi a cărei nume are o semnificaţie clară, aşa-
numitul Macros-macrocomandă. Cu ajutorul lor, selecţia dintre două bancuri devine mai
clară şi programul mult mai elegibil.
BANK0 macro
Bcf STATUS, RP0 ;Select memory bank 0
Endm
BANK1 macro
Bsf STATUS, RP0 ;Select memory bank 1
Endm
Locaţiile 0Ch - 4Fh sunt regiştri cu scop general (GPR) ce sunt folosiţi ca memorie RAM. Când sun
accesate locaţiile 8Ch - CFh în Bancul 1, accesăm de fapt exact aceleaşi locaţii în Bancul 0. Cu alte
cuvinte, când doriţi să accesaţi unul din regiştrii GPR, nu trebuie să vă îngrijoraţi că nu ştiţi în ce b
sunteţi!
Contorul de Program
Contorul de program (PC) este un registru de 13 biţi ce conţine adresa instrucţiunii ce se
execută. Prin incrementarea sau schimbarea sa (ex. în caz de salturi) microcontrolerul
execută instrucţiunile de program pas-cu-pas.
Stiva
PIC16F84 are o stivă de 13 biţi cu 8 nivele, sau cu alte cuvinte, un grup de 8 locaţii de
memorie de 13 biţi lăţime cu funcţii speciale. Rolul său de bază este de a păstra valoarea
contorului de program după un salt din programul principal la o adresă a unui subprogram.
Pentru ca un program să ştie cum să se întoarcă la punctul de unde a pornit, trebuie să
înapoieze valoarea contorului programului din stivă. Când se mută dintr-un program într-un
subprogram, contorul programului este împins în stivă (un exemplu de acesta este
instrucţiunea CALL). Când se execută instrucţiuni ca RETURN, RETLW sau RETFIE ce au fost
executate la sfârşitul unui subprogram, contorul programului a fost luat dintr-o stivă, aşa ca
programul să poată continua de unde a fost oprit înainte de a fi întrerupt. Aceste operaţii de
plasare într-o şi luare dintr-o stivă de contor de program sunt numite PUSH şi POP, şi sunt
numite conform cu instrucţiunile similare ale unor microcontrolere mai mari.
Programarea În Sistem
Pentru a programa o memorie de program, microcontrolerul trebuie să fie setat pentru un
mod de lucru special prin aducerea pinului MCLR la 13.5V, iar sursa de tensiune Vdd trebuie
să fie stabilizată între 4.5V şi 5.5V. Memoria program poate fi programată serial folosind doi
pini 'data/clock' ce trebuie să fie mai întâi separaţi de liniile montajului, aşa ca să nu apară
erori în timpul programării.
Moduri de adresare
Locaţiile de memorie RAM pot fi accesate direct sau indirect.
Adresarea Directă
Adresarea Directă se face printr-o adresă de 9 biţi. Această adresă este obţinută prin
conectarea celui de-al şaptelea bit al adresei directe a unei instrucţiuni cu doi biţi (RP1,
RP0) din registrul STATUS după cum se arată în figura următoarea. Orice acces la regiştrii
SFR poate fi un exemplu de adresare directă.
Adresarea Directă
Adresarea Indirectă
Adresarea indirectă spre deosebire de cea directă nu ia o adresă dintr-o instrucţiune ci o
creează cu ajutorul bitului IRP a regiştrilor STATUS şi FSR. Locaţia adresată este accesată
prin registrul INDF care de fapt ţine o adresă indicată de un FSR. Cu alte cuvinte, orice
instrucţiune care foloseşte INDF ca registrul al ei, în realitate accesează datele indicate de
un registru FSR. Să spunem, de exemplu, că un registru cu scop general (GPR) la adresa
0Fh conţine o valoarea 20. Prin scrierea unei valori 0Fh în registrul FSR vom obţine un
registru indicator la adresa 0Fh, iar prin citirea din registrul INDF, vom obţine valoarea 20,
ceea ce înseamnă că am citit din primul registru valoarea lui fără accesarea lui directă (dar
prin FSR şi INDF). Se pare că acest tip de adresare nu are nici un avantaj faţă de adresarea
directă, dar există unele nevoi în timpul programării ce se pot rezolva mai simplu doar prin
adresarea indirectă.
Un asemenea exemplu poate trimite un set de date prin comunicaţia serială, lucrând cu
bufere şi indicatoare (ce vor fi discutate în continuare într-un capitol cu exemple), sau să
şteargă o parte a memoriei RAM (16 locaţii) ca în următorul exemplu.
Citind datele din registrul INDF când conţinutul registrului FSR este egal cu zero, întoarce
valoarea zero, şi scrie în el rezultatul în operaţia NOP (no operation- nu operează).
2.6 Întreruperi
Întreruperile sunt un mecanism a unui microcontroler ce îi permit să răspundă la unele
evenimente la momentul când se întâmplă, indiferent de ce face atunci microcontrolerul.
Aceasta este o parte foarte importantă, pentru că permite conexiunea microcontrolerului cu
lumea de afară. În general, fiecare întrerupere schimbă debitul programului, îl întrerupe şi
după executarea unui subprogram (rutine de întrerupere), continuă din acelaşi punct.
Registru INTCON
bit 0 RBIF (RB Port Change Interrupt Flag bit-bit Steguleţ de Întrerupere a Schimbării
Portului RB) Bit ce informează despre schimbările de la pinii 4, 5, 6 şi 7 ai portului B.
1=cel puţin un pin şi-a schimbat starea
0=nu s-a întâmplat nici o schimbare la vreun pin
bit 1 INTF (INT External Interrupt Flag bit-bit Steguleţ de Întrerupere Externă INT) A avut
loc o întrerupere externă.
1=a avut loc o întrerupere
0=nu a avut loc o întrerupere
Dacă s-a detectat un front crescător sau descrescător la pinul RB0/INT, (ce este definit cu
bitul INTEDG în registrul OPTION), bitul INTF este setat. Bitul trebuie să fie şters în
subprogramul întrerupere pentru a detecta următoarea întrerupere.
bit 2 T0IF (TMR0 Overflow Interrupt Flag bit-bit Steguleţ Depăşire Întrerupere TMRO)
Depăşirea contorului TMRO.
1=contorul şi-a schimbat starea de la FFh la 00h.
0=depăşirea nu a avut loc
Bitul trebuie să fie şters în program pentru ca o întrerupere să fie detectată.
bit 3 RBIE (RB port change Interrupt Enable bit-bit Permite Întreruperea schimbării
portului RB) Permite să aibă loc întreruperi la schimbarea stării pinilor 4, 5, 6, şi 7 ai
portului B.
1=permite întreruperi la schimbarea stării
0=întreruperi interzise la schimbarea stării
Dacă RBIE şi RBIF au fost simultan setate, va avea loc o întrerupere.
bit 4 INTE (INT External Interrupt Enable bit-bit Permite Întrerupere externă INT) Bit ce
permite întreruperea externă de la pinul RB0/INT.
1=întrerupere externă permisă
0=întrerupere externă interzisă
Dacă INTE şi INTF au fost setate simultan, va avea loc o întrerupere.
bit 5 T0IE (TMR0 Overflow Interrupt Enable bit-bit Permite Depăşire Întrerupere TMRO) Bit
ce permite întreruperile în timpul depăşirii contorului TMRO.
1=întrerupere permisă
0=întrerupere interzisă
Dacă T0IE şi T0IF au fost simultan setate, va avea loc întreruperea.
Bit 6 EEIE (EEPROM Write Complete Interrupt Enable bit-bit Permite Întrerupere Completă
a Scrierii EEPROM) Bit ce permite o întrerupere la sfârşitul unei rutine de scriere în EEPROM
1= întrerupere permisă
0= întrerupere interzisă
Dacă EEIE şi EEIF (ce este în registrul EECON1) au fost simultan setate, va avea loc o
întrerupere.
Bit 7 GIE (Global Interrupt Enable bit-bit Permite Întrerupere Globală) Bit ce permite sau
interzice toate întreruperile.
1=toate întreruperile sunt permise
0=toate întreruperile sunt interzise
În general, fiecare sursă de întrerupere are doi biţi legaţi la ea. Unul permite întreruperea,
iar celălalt detectează când au loc întreruperi. Există un bit comun numit GIE ce poate fi
folosit pentru a interzice sau permite toate întreruperile simultan. Acest bit este foarte
folositor când se scrie un program pentru că permite ca toate întreruperile să fie interzise
pentru o perioadă de timp, aşa ca execuţia unei părţi importante a programului să nu fie
întreruptă. Când instrucţiunea ce resetează bitul GIE a fost executată (GIE=0, toate
întreruperile interzise), fiecare întrerupere ce rămâne nerezolvată trebuie ignorată.
Întreruperile ce rămân nerezolvate şi ce au fost ignorate, sunt procesate când bitul GIE
(GIE=1, toate întreruperile sunt permise) va fi şters. Când i s-a răspuns întreruperii, bitul
GIE a fost şters, aşa că orice întreruperi adiţionale vor fi interzise, adresa de întoarcere a
fost trimisă în stivă, iar adresa 0004h a fost scrisă în contorul programului – numai după
aceasta începe răspunsul la o întrerupere! După ce este procesată întreruperea, bitul a
cărui setare a cauzat o întrerupere trebuie şters, sau rutina de întrerupere va fi procesată
automat tot mereu în timpul întoarcerii la programul principal.
Dacă mai sunt şi alte variabile sau regiştri ce trebuie stocaţi, atunci ei trebuie să fie păstraţi
după stocarea registrului STATUS (pasul 3), şi aduşi înapoi înainte ca registrul STATUS să
fie restaurat (pasul 5).
Acelaşi exemplu se poate realiza utilizând macro-uri, făcând astfel programul mai eligibil.
Macro-urile ce sunt deja definite, pot fi folosite pentru scrierea de noi macro-uri. Macro-
urile BANK1 şi BANK0 ce sunt explicate în capitolul "Organizarea memoriei" sunt folosite cu
macro-urile 'push' şi 'pop'.
Iniţializarea întreruperii
Pentru a folosi un mecanism de întrerupere a unui microcontroler, trebuie făcute unele
sarcini pregătitoare. Aceste proceduri sunt pe scurt numite "iniţializare". Prin iniţializare
definim la ce va răspunde microcontrolerul, şi ce va ignora. Dacă nu setăm bitul ce permite
o anumită întrerupere, programul nu va executa un subprogram întrerupere. Prin aceasta
putem obţine controlul asupra producerii întreruperii, ceea ce este foarte folositor.
Exemplul de mai sus arată iniţializarea unei întreruperi externe la pinul RB0 al
microcontrolerului. Unde se vede unu setat, înseamnă că întreruperea este permisă.
Producerea altor întreruperi nu este permisă, şi toate întreruperile împreună sunt interzise
până ce bitul GIE este ţinut în unu.
Următorul exemplu arată o cale tipică de a dirija întreruperile. PIC16F84 are doar o locaţie
unde adresa unui subprogram întrerupere este memorată. Aceasta înseamnă că mai întâi
trebuie să detectăm ce întrerupere este la îndemână (dacă mai mult de o sursă de
întreruperi este disponibilă), şi apoi putem executa acea parte a programului ce se referă la
acea întrerupere.
Reîntoarcerea dintr-o rutină de întrerupere poate fi făcută cu instrucţiunile RETURN, RETLW şi RET
Se recomandă ca să fie utilizată instrucţiunea RETFIE pentru că acea instrucţiune este singura ce
setează automat bitul GIE, ceea ce permite să se producă o nouă întrerupere.
2.7 Timer-ul liber TMR0
Timer-ele (temporizatoarele) sunt de obicei cele mai complicate părţi ale unui
microcontroler, aşa că este necesar să rezervăm mai mult timp pentru a le explica. Odată
cu aplicarea lor este posibil să se creeze relaţii între o dimensiune reală ca "timp" şi o
variabilă ce reprezintă starea timer-ului într-un microcontroler. Fizic, timer-ul este un
registru a cărui valoare creşte continuu până la 255, şi apoi porneşte de la capăt: 0, 1, 2, 3,
4...255....0,1, 2, 3......etc.
PIC16F84 are un timer de 8 biţi. Numărul de biţi determină până la ce valoare contorizează
timer-ul înainte de a începe să contorizeze de la zero din nou. În cazul unui timer de 8 biţi,
acel număr este 256. O schemă simplificată a relaţiei dintre un timer şi un prescaler-divizor
este reprezentată în diagrama anterioară. Prescalerul este numele acelei părţi din
microcontroler ce divide ceasul oscilatorului înainte de a ajunge la logica ce creşte starea
timer-ului. Numărul ce divide un ceas este definit prin trei biţi în registrul OPTION. Cel mai
mare divizor este 256. Aceasta înseamnă de fapt că doar la al fiecare 256-lea ceas,
valoarea timer-ului va creşte cu unu. Aceasta ne dă posibilitatea de a măsura perioade de
timp mai lungi.
După fiecare numărătoare până la 255, timer-ul îşi resetează valoarea la zero şi începe cu
un nou ciclu de contorizare până la 255. În timpul fiecărei tranziţii de la 255 la zero, bitul
TOIF în registrul INTCON este setat. Dacă se permit întreruperi, de aceasta se poate profita
în generarea şi în procesarea rutinei de întrerupere. Depinde de programator să reseteze
bitul TOIF în rutina de întrerupere, aşa ca noua întrerupere, sau noua depăşire să fie
detectate. În afară de ceasul oscilator intern, starea timer-ului poate de asemenea să
crească prin ceasul extern la pinul RA4/TOCKI. Alegerea uneia din aceste două opţiuni se
face în registrul OPTION prin bitul TOCS. Dacă a fost aleasă această opţiune de ceas extern,
va fi posibil să se definească frontul unui semnal (crescător sau descrescător), la care
timer-ul să-şi crească valoarea.
În practică, unul din exemplele tipice ce este rezolvat prin ceas extern şi unde timer-ul
contorizează rotaţiile complete ale unui ax al unei maşini de producţie, ca bobinatorul de
transformator de exemplu. Să rotim patru şuruburi de metal pe axul unui bobinator. Aceste
patru şuruburi vor reprezenta convexitatea metalică. Să plasăm acum un senzor inductiv la
o distanţă de 5 mm de capătul unui şurub. Senzorul inductiv va genera semnalul
descrescător de fiecare dată când capul şurubului este paralel cu capul senzorului. Fiecare
semnal va reprezenta o pătrime dintr-o rotaţie, şi suma tuturor rotaţiilor se va găsi în
timer-ul TMRO. Programul poate uşor citi aceste date din timer printr-un bus de date.
Prescalerul poate fi asignat fie de timer-ul TMRO fie de watchdog. Watchdogul este un
mecanism pe care microcontrolerul îl foloseşte să se apere împotriva blocării programelor.
Ca orice alt circuit electric, la fel şi cu microcontrolerul se pot întâmpla defectări, sau unele
stricăciuni. Din nefericire microcontrolerul are de asemenea un program unde se pot
întâmpla probleme. Când se întâmplă aceasta, microcontrolerul se va opri din funcţionare şi
va rămâne în acea stare până ce cineva îl resetează. Din cauza aceasta, a fost introdus
mecanismul watchdog. După o anumită perioadă de timp, watchdogul resetează
microcontrolerul (de fapt microcontrolerul se resetează singur). Watchdogul lucează pe
baza unui principiu simplu: dacă se întâmplă depăşirea timer-ului, microcontrolerul este
resetat, şi începe executarea programului mereu din nou. Astfel, se va întâmpla un reset
atât în cazul unei funcţionări corecte cât şi incorecte. Următorul pas este prevenirea
resetului în cazul unei funcţionări corecte, ce se face prin scrierea unui zero în registrul
WDT (instrucţiunea CLRWDT) de fiecare dată când se apropie de depăşire. Astfel programul
va preveni un reset cât timp este executat corect. De îndată ce s-a blocat, nu se va scrie
zero, va avea loc depăşirea timer-ului WDT şi un reset ce va duce microcontrolerul înapoi la
funcţionarea corectă din nou.
Prescalerul este acordat cu timer-ul TMRO, sau cu timer-ul watchdogului prin bitul PSA în
registrul OPTION. Ştergând bitul PSA, prescalerul va fi acordat cu timer-ul TMRO. Când
prescalerul este acordat cu timer-ul TMRO, toate instrucţiunile de scriere în registrul TMRO
(CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vor şterge prescalerul. Când prescalerul este
asignat timerului watchdog, numai instrucţiunea CLRWDT va şterge prescalerul şi timer-ul
watchdog în acelaşi timp. Schimbarea prescalerului este completă sub controlul
programatorului, şi poate fi schimbat în timp ce se rulează programul.
Există doar un prescaler şi un timer. Funcţie de nevoi, ele sunt asignate fie timer-ului TMRO fie
watchdog-ului.
Bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-bit Selectare Rată Prescaler)
Subiectul prescaler, şi cum afectează aceşti biţi lucrul unui microcontroler va fi abordat în
secţiunea despre TMRO.
bit 4 T0SE (TMR0 Source Edge Select bit-bit Selectare Front Sursă TMRO)
Dacă triggerul TMRO a fost activat cu impulsuri de la pinul RA4/T0CKI, acest bit va
determina dacă va fi la frontul crescător sau descrescător al semnalului.
1=front descrescător
0=front crescător
bit 5 T0CS (TMR0 Clock Source Select bit-bit Selectare Sursă Ceas TMRO)
Acest bit permite unui timer free-run să-şi incrementeze valoarea fie de la oscilatorul
intern, de exemplu ¼ din ceasul oscilatorului, sau prin impulsuri externe la pinul
RA4/T0CKI.
1=impulsuri externe
0=1/4 ceas intern
În practică, memoria EEPROM este folosită pentru stocarea unor date importante sau a
unor parametri de proces.
Un asemenea parametru este o temperatură dată, asignată când se setează un regulator de
temperatură la un proces. Dacă nu s-a reţinut, va fi nevoie să se ajusteze temperatura dată
după fiecare întrerupere a alimentării. Pentru că aceasta este foarte nepractic (chiar
periculos), producătorii de microntrolere au început să instaleze un tip mai mic de memorie
EEPROM.
Memoria EEPROM este plasată într-un loc special al memoriei şi poate fi accesată prin
regiştri speciali. Aceşti regiştri sunt:
• EEDATA la adresa 08h, care reţine datele de citit sau cele de scris.
• EEADR la adresa 09h, ce conţine o adresă a locaţiei EEPROM ce este accesată.
• EECON1 la adresa 88h, ce conţine biţi de control.
• EECON2 la adresa 89h. Acest registru nu există fizic şi serveşte la protejarea EEPROM-
ului de scrieri accidentale.
Registrul EECON1
bit 2 WREN (EEPROM Write Enable bit-bit Permite Scrierea EEPROM) Permite scrierea în
EEPROM
Dacă acest bit nu a fost setat, microcontrolerul nu va permite scrierea în EEPROM.
1=scriere permisă
0=scriere interzisă
bit 3 WRERR (Write EEPROM Error Flag-Steguleţ Eroare Scriere EEPROM ) Eroare în timpul
scrierii în EEPROM
Acest bit a fost setat doar în caz că scrierea în EEPROM a fost intreruptă de un semnal sau
prin terminarea timpului din timer-ul watchdog (dacă este activat).
1=a avut loc eroare
0=nu a avut loc eroare
bit 4 EEIF (EEPROM Write Operation Interrupt Flag bit-bit Steguleţ Întrerupere Operaţie
Scriere EEPROM) Bit folosit pentru a informa că scrierea datelor s-a terminat.
Când s-a terminat scrierea, acest bit va fi setat automat. Programtorul trebuie să şteargă
bitul EEIF în programul său pentru a detecta noua terminare a scrierii.
1=scrierea terminată
0=scrierea încă neterminată, sau încă nu a început
O mostră a părţii programului ce citeşte datele în EEPROM, ar putea arăta ca mai jos:
După ultima instrucţiune de program, conţinutul de la o adresă EEPROM zero poate fi găsit
în registrul w.
Exemplu unei părţi a programului ce scrie datele 0xEE în prima locaţie în memoria EEPROM
ar putea arăta ca mai jos:
Este recomandat ca WREN să fie închis tot timpul cu excepţia scrierii datelor în EEPROM, aşa că
posibilitatea unei scrieri accidentale va fi minimă. Scrierea în EEPROM va fi automat ştearsă!
SISTEME DE TIMP REAL
Fig. 1.1
În această schemă, în categoria perifericelor generale sunt incluse: consola calculatorului
(pentru inginerul de sistem), imprimanta, unităţi de discuri flexibile (floppy-disk), unităţi de
bandă magnetică (eventual) etc.
Consola operatorului de proces (operatorului tehnolog) - C.O.P. - este consola specialistului
tehnolog care cunoaşte foarte bine procesul condus, dar care, în general, nu este informaticican.
C.O.P.-ul este de regulă un panou cu un sistem de chei şi lămpi de semnalizare sau un tablou
sinoptic sau, mai modern, un video-display color cu schema funcţională a instalaţiei sau
elemente 1 – 1 din schema funcţională a instalaţiei la diferite nivele de detaliere. Astfel de
console (console cu display cu facilităţi grafice) permit şi alte funcţii speciale ca, de exemplu,
depanarea asistată de
calculator a instalaţiei.
Calculatorul universal este de obicei un microcalculator realizat cu microprocesor de 16 biţi sau
chiar de 8 biţi sau un minicalculator.
Cuplorul de proces asigură dialogul bidirecţional între procesul condus şi calculatorul
universal.
Evidenţiind căile de introducere şi extragere (furnizare) a datelor de la şi respectiv către proces
putem defini următoarele moduri potenţiale de conectare dintre calculator şi proces:
- Sisteme de calcul off-line, la care legătura informaţională între calculator şi proces este
stabilită prin intermediul operatorului uman. Datele din proces pot fi culese normal, prin citire,
de către operator, sau automat într-o formă care poate fi utilizată direct de
- Sisteme de calcul in-line, sunt sistemele la care operatorul poate introduce datele în mod
aleator direct de la tastatură, ele trebuind să fie "imediat" preluate şi prelucrate. Apare, în acest
caz, necesitatea "întreruptibilităţii" calculatorului în procesul de calcul;
- Sisteme de calcul on-line, care sunt cuplate direct cu procesul pe partea de culegere de date
prin intermediul cuploarelor de proces (convertoare analog-numerice).
În cazul în care datele de ieşire sunt transmise operatorului sub formă de mesaje, iar acesta
intervine în proces în urma interpretarii lor, sistemul de numeşte on-line în circuit deschis .
Calculatorul funcţionează în regim de "ghid operator" sau "consultant" al conducerii procesului.
În cazul în care, pe baza datelor culese, sistemul de calcul elaborează mărimi pe care le aplică
direct procesului, fară intervenţia operatorului, sistemul se numeşte on-line în circuit închis .
Conectarea on-line în circuit închis poate fi de urmărire, situaţie în care calculatorul calculează
(determină) şi modifică referinţele unor regulatoare convenţionale), sau directă (calculatorul
calculează şi elaborează comanda la nivelul elementelor de execuţie).
Pentru a realiza funcţiile impuse, calculatorul de proces trebuie să posede o serie de facilităţi:
- să fie întreruptibil;
- să permită prelucrarea datelor culese direct din procesul condus prin intermediul unor
periferice specializate;
- să ofere răspunsul într-un anumit interval de timp strict corelat cu evenimentele din process (să
funcţioneze în "timp real");
- să rezolve contradicţia între capacitatea lui de a executa la un moment dat un singur program şi
cerinţa procesului de a fi "servit" în n, n > 1, puncte simultan.
Definiţie: Sistemele de calcul care preiau suficient de rapid datele de intrare, le prelucrează într-
un interval de timp suficient de scurt şi oferă utilizatorului sau direct procesului (prin periferice
specializate) rezultatele suficient de rapid pentru a mai putea influenţa desfăşurarea fenomenelor
din procesul care a produs datele de intrare, se numesc sisteme de calcul în timp real (SCTR).
Deci, din definiţia dată, se observă că, calculatoarele de proces fac parte din clasa SCTR.
Dezvoltarea acestor clase de calculatoare a fost posibilă, pe de o parte datorită perfecţionărilor
tehnologice (unităţi centrale ultrarapide, specializarea echipamentelor periferice, perfecţionarea
transmisiei datelor), iar, pe de altă parte, prin dezvoltarea şi perfecţionarea sistemelor de operare
(SO). Toate aceste perfecţionări au dus la micşorarea timpului de răspuns al sistemului de calcul.
Definiţie: Se numeşte timp de răspuns al unui sistem de calcul intervalul de timp dintre
momentul generării datelor primare şi momentul obţinerii rezultatului prelucrării datelor.
Pentru un sistem de calcul on-line, timpul de răspuns este dat de intervalul de timp dintre
momentul producerii unui eveniment în procesul condus şi momentul în care se generează către
proces. Se observă că acest timp înglobează timpul necesar achiziţiei datelor, prelucrării datelor
şi generării comenzii către proces.
Indiferent de modul de conectare cu procesul, calculatorul de proces a format cel de-al doilea
nivel de conducere a proceselor industriale, primul nivel fiind reprezentat de elemente de
automatizare convenţionale realizate de regulă cu regulatoare de tip PID.
Creşterea complexităţii proceselor de conducere, impunerea unor cerinţe superioare de
fiabilitate, a avut drept efect imposibilitatea îndeplinirii întregului volum de sarcini legate de
conducerea acestora cu un singur calculator de proces. Din aceste considerente a apărut
necesitatea distribuirii funcţiilor de conducere între mai multe unităţi de calcul, care, la rândul
lor, au fost subordonate unui calculator "universal" de mare capacitate, care să rezolve rapid o
serie de probleme complexe cum ar fi: identificarea procesului, conducerea optimală sau
adaptivă a procesului etc. Se obţine astfel o ierarhizare funcţională clasică pe trei nivele a unei
structuri de conducere numită structură distribuită de conducere caracterizată prin fiabilitate,
flexibilitate şi potenţialitate ridicată. Prin intermediul unei astfel de structuri se poate asigura
conducerea proceselor de medie sau de mare complexitate după strategii de la cele mai simple
(de tipul PID) la cele mai evoluate care vizează conducerea adaptivă şi cea optimală. O structură
distribuita de conducere, frecvent întâlnită în prezent este prezentată în Fig.1.2.
Fig. 1.2
La nivelul 1 sunt plasate elementele de automatizare convenţională care primesc informaţiile
despre proces prin intermediul traductoarelor şi elaborează comenzi pentru reglarea acestuia
utilizând algoritmi simpli de reglare de tip PID.
Elementele de la nivelul 2, regulatoare numerice monocanal sau multicanal specializate sau
microcalculatoare pentru conducerea proceselor, au sarcini cvasi-identice şi cvasi-independente,
schimbul de informaţii între elemente realizându-se prin intermediul magistralei sistemului sub
controlul directorului de trafic. Funcţiile ce trebuie realizate la acest nivel sunt: achiziţia şi
validarea datelor culese din proces, calculul şi elaborarea comenzilor către procesul condus prin
intermediul cuploarelor de proces, comunicarea cu operatorul tehnolog (COP) şi cu nivelul
ierarhic superior (minicalculatorul universal). În mod curent, la acest nivel se utilizează
microcalculatoare realizate cu microprocesoare pe 8 sau 16 biţi sau regulatoare numerice
realizate tot cu astfel de elemente. Puterea de calcul a acestor microcalculatoare acoperă
necesităţile de rulare a programelor care asigură funcţiile de reglare pentru 8-16 bucle de reglare.
Dacă numărul buclelor de reglare este mai mare (peste 20) se recomandă folosirea unui
microcalculator industrial de uz larg. La cel de-al treilea nivel de automatizare se introduce un
minicalculator de capacitate mare destinat conducerii după strategii evoluate a întregului proces.
În cazul proceselor mai simple se poate utiliza chiar un microcalculator de proces de uz larg. Tot
la acest nivel este plasată consola operatorului de proces cu funcţii complexe de comunicare cu
toate echipamentele de calcul din cadrul structurii, având rolul de a permite supravegherea şi
conducerea operativă a procesului.
Dinamica elaborării rezultatelor la nivelul 3 este relativ lentă. Minicalculatorul primeşte date
sintetice despre evoluţia procesului de la nivelul inferior (nivelul 2), iar mărimile rezultate în
urma calculelor nu intervin direct în proces, deci la acest nivel nu sunt necesare cuploare de
proces.
O problemă importantă a acestei structuri de conducere este aceea a asigurării compatibilităţii
între structurile de date vehiculate între diferitele nivele pentru a permite un dialog corect între
acestea.
Unul din principalele avantaje ale unei astfel de structuri distribuite de conducere este acela că
ea poate fi dezvoltată în timp şi spaţiu, pe orizontală şi pe verticală, de la simplu la complex,
putându-se începe cu un singur echipament cu microprocesor plasat la nivelul 2 de automatizare,
dotat cu o consolă operator proprie (display, tastatură, imprimantă), Fig.1.3, având implementaţi
algoritmi de: achiziţie şi validare a datelor din proces, semnalizare şi protecţie la depăşirea
limitelor, calcul şi elaborare a comenzilor către proces, comunicare cu operatorul în vederea
realizarii configurării şi urmăririi evoluţiei mărimilor din proces, posibilităţi de comunicare cu
NIS (nivelul ierarhic superior).
Fig.1.3.
Acest echipament poate fi, aşa cum am arătat, fie un regulator numeric specializat având aceşti
algoritmi implementaţi sub forma unei biblioteci de programe organizată după o arhitectură bine
pusă la punct, corespunzătoare unei anumite clase de procese, sau poate fi un calculator destinat
conducerii proceselor industriale (microcalculator de proces) capabil de a fi dotat cu astfel de
algoritmi la momentul dorit.
Fără a face o analiză detaliată a avantajelor şi dezavantajelor celor două moduri de rezolvare a
problemei conducerii, precizăm că vom insista asupra celei de-a doua variante, şi anume,
utilizarea în conducerea directă a proceselor a unui microcalculator de proces. Aceste
echipamente permit eleborarea şi implementarea unor algoritmi strict necesari orientaţi către
aplicaţie şi sunt mult mai flexibile. Efortul de programare devine minim dacă este pusă la punct
tehnica şi tehnologia de elaborare a unor astfel de programe şi dacă organizarea hardware a
echipamentului
este capabilă să suporte un software după aceste principii.
1.2. Schema de principiu a unei structuri de echipament cu microprocesor destinate
conducerii proceselor industriale (microcalculator de proces)
Fig. 1.4.
Fig. 1.5.
Exploatarea avantajelor aduse de considerarea unei aplicaţii ca fiind compusă din mai multe
taskuri ce se execută în paralel sau concurent impune, aşa cum a rezultat şi din exemplele
prezentate în capitolul anterior, folosirea unor mecanisme care să asigure interacţiunea corectă a
taskurilor pentru ca programul în ansamblu să aibă evoluţia dorită. S-a demonstrat că
interacţiunea taskurilor poate fi redusă la trei tipuri de operaţii multitasking: comunicarea între
taskuri, sincronizarea taskurilor şi excluderea mutuală a taskurilor.
Comunicarea între taskuri este operaţia multitasking prin care se permite taskurilor să schimbe
date între ele. Datele comune (utilizate de mai multe taskuri) sunt memorate în memoria internă
a calculatorului în anumite zone declarate ca zone comune (pentru datele comune) şi la care vor
avea acces toate taskurile. Deoarece zonele de date comune organizate în memoria internă au o
capacitate mică şi limitează la un volum mic datele comune, în cazul unui volum mare de date,
acestea se organizează în fişiere plasate pe un suport de memorie externă (de obicei disc
magnetic).
Majoritatea sistemelor de operare actuale oferă un sistem de lucru cu fişierele prin intermediul
unui SGF (sistem de gestiune a fişierelor). Dezavantajul acestei metode este legat de timpii
relativ mari pentru accesarea datelor din fişiere, dar metoda este utilizată datorită capacităţii
mari de memorare a acestor sisteme.
Sincronizarea este operaţia multitasking care asigură eşalonarea corectă a execuţiei taskurilor în
timp sau, altfel spus, care stabileşte o relaţie de ordine între instrucţiunile executate de acestea,
independent de vitezele relative ale lor.
Scopul unei metode de sincronizare este de a oferi unui task Ti aflat în execuţie mijloacele care
să-i permită, în primul rând, să blocheze un alt task activ Tj sau să se blocheze el însuşi în
aşteptarea producerii unui eveniment extern sau expirării unui interval de timp şi, în al doilea
rând, să deblocheze un task Tk căruia să-i transmită eventual şi unele informaţii. În evoluţia lor
două sau mai multe taskuri se pot sincroniza fie în funcţie de o condiţie de timp, fie în funcţie de
un eveniment exterior. Mai exact, în cadrul unei aplicaţii, se poate întâlni situaţia ca un task Tk
pentru a-şi putea continua execuţia să fie nevoit să aştepte trecerea unui anumit interval de timp
sau realizarea unui eveniment din proces, eveniment controlat de regulă de un alt task Ti. În
cazul sincronizării pe o condiţie de timp, taskul Tk se va bloca până la expirarea intervalului de
timp menţionat după care va trece în starea READY şi îşi va putea continua execuţia. În cazul
sincronizării pe un eveniment exterior, taskul Tk se va bloca dacă evenimentul nu a avut loc. De
regulă, acest eveniment este supravegheat de un alt task Ti care va debloca taskul Tk în
momentul în care evenimentul s-a îndeplinit.
Operaţiile de sincronizare pot fi:
- explicite (directe), caz în care un task acţionează direct asupra altui task, primitivele de blocare
şi deblocare trebuind să fie astfel concepute încât să accepte ca parametru numele taskului
asupra căruia se acţionează;
- implicite (indirecte), caz în care un task acţionează asupra altui task prin declanşarea unor
mecanisme intermediare; primitivele de blocare şi deblocare nu mai folosesc explicit numele
taskului asupra căruia se acţionează, ci folosesc o serie de variabile special-create în acest scop
(semafoare, variabile eveniment etc.).
Restricţiile care determină sincronizarea taskurilor pot fi concentrate sub forma:
- operaţia A nu se poate executa înaintea trecerii intervalului de timp ΔT;
- operaţia A nu se poate executa înaintea operaţiei B.
Excluderea mutuală este operaţia multitasking prin care se exclude accesul simultan al mai
multor taskuri la una şi aceeaşi resursă (zona de date din memorie, fişier, periferic etc.).
Restricţiile, în acest caz, sunt de tipul: operaţiile A, B, C, ..., X nu pot avea loc simultan.
Definiţie: Secvenţa de program a fiecărui task în care se apelează o resursă comună partajată se
numeşte secţiune critică a taskului. (Din această cauză, de multe ori, excluderea mutuală a
taskurilor se mai întâlneşte şi sub denumirea de problema secţiunii critice).
Plecând de la ipoteza că intervalele de timp de execuţie ale taskurilor sunt diferite şi necunoscute
şi că orice task iese din secţiunea sa critică după un interval finit de timp, soluţia unei probleme
de acest tip trebuie să satisfacă următoarele condiţii:
a) - utilizarea exclusivă: la un moment dat un singur task şi numai unul se poate afla în secţiunea
sa critică corespunzătoare unei resurse;
b) - evitarea blocajului reciproc: dacă mai multe taskuri sunt blocate în aşteptarea aceleiaşi
resurse critice şi aceasta nu este ocupată, atunci unul dintre aceste taskuri (de regulă cel mai
prioritar), trebuie să poată să intre în secţiunea sa critică la capătul unui interval finit de timp;
c) - evitarea dependenţelor inutile: dacă un task este blocat în afara secţiunii sale critice, acest
blocaj nu trebuie să împiedice intrarea unui alt task în secţiunea sa critică.
Datorită condiţiilor restrictive similare, problemele sincronizării şi excluderii mutuale pot fi
tratate cu procedee comune. În prezent există o mare varietate de procedee puse la dispoziţia
utilizatorului pentru rezolvarea acestor operaţii multitasking şi anume:
- folosirea unor variabile de tip întreg numite semafoare
- folosirea unor variabile logice numite variabile eveniment
- cu ajutorul unor structuri de date numite mesaje şi a unor zone de memorie unde se depun
aceste mesaje numite celule mesaj sau cutii poştale - cu ajutorul conceptului de monitor
- cu ajutorul conceptului de rendezvous .
Observaţie: Ultimele trei procedee au avantajul de a rezolva în mod unitar şi problema
comunicării
între taskuri.
Primitiva V(SEM):
dacă v(SEM) ≠ 0 atunci
dacă q(SEM) ≠ ф atunci
Tj ← q(SEM) /* Deblochează taskul Tj, care poate fi fie primul task */
/* din coada de aşteptare a semaforului, fie taskul cel */
/* mai prioritar din aceasta */
altfel
v(SEM) = v(SEM) + 1
dacă q(SEM) ≠ ф atunci
Tk ← q(SEM) /* Deblochează toate taskurile Tk din coada */
/* de aşteptare q(SEM) a semaforului SEM */
Prin utilizarea semafoarelor binare şi a primitivelor P şi V care acţionează asupra lor aşa cum s-a
arătat mai sus, se poate rezolva eficient problema excluderii mutuale a resurselor critice
partajate. Pentru aceasta, fiecărei resurse critice i se asociază câte un semafor având iniţial
valoarea 1. Pentru claritate considerăm:
Exemplul 2.1. Considerăm n taskuri T1,T2, ..., Tn, care în execuţia lor pot apela simultan o
aceeaşi resursă. Pentru realizarea excluderii mutuale asociem acestei resurse critice un semafor
binar SEM având valoarea iniţială v0(SEM) = 1. Înainte de a intra în propria secţiune critică,
fiecare task este obligat să execute primitiva P(SEM), iar după părăsirea secţiunii critice trebuie
să execute operaţia V(SEM). Astfel, secvenţa de program care încadrează secţiunea critică a
fiecărui task arată
ca în Figura 21.
Taskul Ti aflat în execuţie care efectuează operaţia
P(SEM) se blochează dacă v(SEM) = 0 şi îşi
continuă execuţia dacă v(SEM) = 1. În cazul blocării
taskului Ti pe operaţia P(SEM), sistemul de operare
va da controlul unui alt task Tj din coada de aşteptare
q(SEM) a semaforului, aflat în starea READY. Dacă
taskul Ti intră în propria sa secţiune critică, atunci
v(SEM) = 0 şi nici o altă operaţie P(SEM) nu mai
poate avea loc, deci nici un alt task Tj, j ≠ i nu mai
poate intra în sectiunea critică a programului său,
până când taskul Ti nu o părăseşte pe a lui, moment
în care executând primitiva V(SEM), face v(SEM) =
1. În acest moment are loc deblocarea taskurilor care
aşteptau să intre în propria lor secţiune critică pentru
aceeaşi resursă.
Fig. 2.1.
Există şi situaţii nedorite şi care trebuie eliminate. De exemplu, dacă taskul aflat în
execuţie
este blocat în propria sa secţiune critică, atunci întrucât v(SEM) a rămas 0 (după execuţia
primitivei
P(SEM)) se realizează blocajul infinit al tuturor celorlalte taskuri care utilizau aceeaşi resursă.
Din
această cauză trebuie luate măsuri pentru eliminarea acestei situaţii, sau de eliberare a resursei.
Pentru a-i garanta fiecărui task introducerea în secţiunea sa critică după un interval de timp finit,
trebuie acordată o atenţie deosebită administrării cozilor de aşteptare a semafoarelor. Cea mai
simplă metodă din acest punct de vedere este metoda FIFO, dar, în multe situaţii, metoda după
priorităţi (utilizată în multe EXECUTIVE de timp real) poate prezenta avantaje evidente.
Semafoarele binare împreună cu primitivele P şi V pot constitui un mijloc de soluţionare a
problemelor de sincronizare indirectă a taskurilor cu evenimente exterioare. Primitiva P
acţionează
ca o operaţie de blocare a unui task, în timp ce primitiva V poate fi privită ca un semnal de
deblocare al acestuia. Valoarea semaforului v(SEM) se asociază cu starea evenimentului exterior
astfel:
v(SEM) = 0 - evenimentul nu a avut loc;
v(SEM) = 1 - evenimentul a avut loc.
În aceste condiţii, valoarea iniţială a semaforului va fi totdeauna zero (v0(SEM) = 0). În cazul a
două sau mai multe taskuri sincronizate pe un singur eveniment exterior, procedeul este foarte
eficient şi se desfăşoară ca în exemplul 2.2.
Exemplul 2.2. Considerăm 2 taskuri T1 şi T2 care trebuie sincronizate pe un eveniment exterior,
eveniment de îndeplinirea căruia este condiţionată la un moment dat execuţia taskului T1.
Pentru aceasta procedăm astfel. Asociem acestui eveniment un semafor SEM. Valoarea
semaforului
v(SEM) se asociază cu starea evenimentului exterior aşa cum s-a arătat mai sus. Realizarea
evenimentului respectiv este supravegheat de taskul T2. Atât timp cât evenimentul nu a avut loc,
semaforul SEM are valoarea v(SEM) = 0. Taskul T1 fiind în execuţie şi ajungând la momentul
critic al programului, va încerca să execute operaţia P(SEM) şi se va bloca deoarece v(SEM) =
0.
Taskul T2 va debloca taskul T1 executând primitiva V(SEM) care va face v(SEM) = 1 când va
sesiza îndeplinirea evenimentului. Structura programelor celor două taskuri în vederea
sincronizării
pe un eveniment exterior este prezentată în Figura 2.2.
Precizăm că acest procedeu devine ineficient în cazul unor taskuri sincronizate pe mai multe
evenimente externe. De asemenea, prin intermediul acestor variabile (semafoare binare), nu este
posibilă realizarea sincronizării taskurilor pe o condiţie de timp. Semafoarele rămân însă foarte
eficiente în rezolvarea problemei secţiunii critice.
Fig. 2.2.
Fig. 2.3
Exemplul 2.4. Considerăm trei taskuri T1, T2, T3, primele două urmărind îndeplinirea a două
evenimente externe, asincrone, asociate cu variabilele EV1 şi EV2, iar al treilea fiind condiţionat
în execuţia lui, la un moment dat, de îndeplinirea ambelor evenimente. Ca atare, la momentul
critic, taskul T3 va fi obligat să execute primitiva AŞTEAPTĂ(EV1 şi EV2) şi se va bloca dacă
cel puţin una dintre variabile are valoarea FALS, ceea ce semnifică faptul că cel puţin unul
dintre evenimente nu a avut loc. Pe măsură ce evenimentele au loc, taskul T1, respectiv T2 vor
executa primitivele DECLANŞAZĂ(EV1), respectiv DECLAN§AZĂ(EV2) care vor avea ca
efect
deblocarea taskului T3 şi aducerea lui în situaţia de aşi putea continua execuţia. Structura
programelor celor trei taskuri este prezentată în Figura 2.4.
Figura 2.4.
Fig. 2.5
Subiecte