Dispozitiv Pentru Determinarea Vitezei de Reactie a Unui Jucator de Fotbal

CUPRINS

Intoducere

Dispozitive si circuite electronice

1.1. Proprietăți ale dispozitivelor electronice

1.2. Observații privind studiul circuitelor electronice

1.3. Noțiuni introductive privind materialele semiconductoare

1.3.1. Semiconductori intrinseci (chimic pur)

1.3.2 Semiconductoare extrinseci (chimic impure)

1.4.Curenții de difuziune

1.5. Joncțiunea p-n

1.5.1 Joncțiunea p-n polarizată direct

1.5.2. Joncțiunea p-n polarizată invers

1.6. Modele echivalente pentru dioda semiconductoare

1.6.1. Dioda redresoare

1.6.2. Dioda fotoemisivă (electroluminișcentă LED)

1.7. Tranzistor bipolar

1.8. Convenția de semn

1.9. Tranzistoare cu efect de câmp

1.10. Tranzistoare cu efect de câmp cu joncțiune (J-FET)

1.11. Tranzistoare cu efect de câmp MOS

1.11.1. TEC-MOS cu canal inițial

1.11.2. TEC-MOS cu canal indus

1.12. Plasarea punctului static de funcționare

1.13. Circuite de polarizare

1.14. Polarizarea tranzistoarelor cu efect de câmp

1.14.1. TEC-J

1.14.2. TEC-MOST

1.15. Stabilitatea P.S.F.

1.16. Reacție negativa de tip paralel

1.17. Soluții pentru stabilizarea P.S.F.

1.18. Etapele de rezolvare ale unui circuit electronic

1.19. Metode de rezolvare

2. Microcontrolere

2.1 Aplicațiile microcontrolerelor

2.2 Caracteristici arhitecturale ale unității centrale

2.3 Aspecte legate de memoria microcontrolerelor

2.4 Limbaje de programare

2.5 Dezvoltarea și testarea aplicațiilor

2.6 Criterii de alegere a unui microcontroler

2.7 Cu ce si cum se poate programa un microcontroler?

3. Schema si descrierea licrarii practice

Introducere

Ideea temei acestei lucrări a rezultat în urma discuțiilor dintre conf. dr. Liviu Moldovan de la catedra de Electronică și lector dr. Petru Pețan de de Educație Fizică și Sport. Penru înbunătățirea activității cu studenții la orele de educați fizică, s-a plănuit realizarea unui dispozitiv electronic care să ofere cadrelor didactice posibilitatea de a determina și compara vitezele de reacție sportivă a studenților. Mai exact, un dispozitiv care să ofere timpul scurs între momentul aprinderii unui LED și momentul în care studentul lovește o minge. Pentru o și mai bună apreciere a vitezei de reacție și coordonare, se pot folosi două LED-uri, de culori diferite, pentru cazul lovirii mingii cu piciorul drept, respectiv stâng. Pornind de la această temă, în primul capitol sunt prezentate dispozitivele și circuitele electronice în general, împreună cu diversele caracteristici și metode de îmbunătățire a funcționării acestora. Capitolul al doilea este destinat microcontrolerelor, de la prezentarea diferitelor tipuri de microcontrolere până la modul de alegere al unuia sau altuia în funcție de aplicația dorită. În capitolul trei sunt abordate convertoarele analog – numerice fiind prezentate în funcție de clasificarea lor Capitolul patru este destinat prezentării schemei și funcționării dispozitivului practic realizat.

Țin să mulțumesc tuturor cadrelor didactice de la programul de studii „Rețele și software de telecomunicații” pentru formarea mea ca inginer electronist și ca om.

Capitolul 1. Dispozitive si circuite electronice

Dispozitivele electronice sunt componente de circuit a căror funcționare se bazează pe controlul purtătorilor de sarcină in corpul solid, in gaze respectiv in vid. Aceste dispozitive se numesc electronice datorită mecanismului de construcție electrică ce se realizează prin electroni.

Rațiunea de a fi a circuitelor electronice este legată de faptul că ele realizează anumite funcții specifice cum ar fi amplificarea sau generarea de oscilații sau stabilizarea tensiunii de alimentare, modularea, demodularea, etc.

Mărimile electrice care apar la interfața dintre dispozitivul electronic și circuitul electric filiform, sunt tensiuni si curenți. De regulă se utilizează dispozitive electronice cu două sau cu trei borne.

Figura 1.1 Dispozitiv electronic cu două borne

Având relația (1), caracteristica statică care o reprezintă este model pentru un dispozitiv electronic.

În cazul unor relații de forma (2) comportarea dispozitivului este reprezentată de schemele echivalente.

În cele mai multe situații este suficientă caracteristica dispozitivului prin caracteristica statică.

(3)

Figura 1.2 Sensul curenților și tensiunilor printr-un dispozitiv electronic cu trei borne

1.1. Proprietăți ale dispozitivelor electronice

a. Dispozitivele electronice sunt în general elemente neliniare.

b. Dispozitivele electronice au un caracter parametric, ceea ce înseamnă că un parametru esențial al dispozitivului electronic poate fi controlat pe cale electrică.

c. Unele dispozitive electronice au un caracter activ, ceea ce înseamnă că ele sunt capabile să amplifice sau să genereze semnale variabile în timp pe seama unui consum de la o sursă de tensiune continuă.

1.2. Observații privind studiul circuitelor electronice

1. Circuitele electronice fiind neliniare (datorită caracterului neliniar al dispozitivelor electronice) studiul lor nu se poate face aplicând direct legile electrotehnicii care se referă la circuite liniare. Pentru depășirea acestei dificultăți comportamentul dispozitivului electronic se liniarizează. Această liniarizare se poate face in 2 feluri:

Fie pentru semnal mare prin aproximarea caracteristicii neliniare prin segmente de dreaptă pe porțiuni.

Fie prin liniarizarea la semnal mic în jurul unui punct static de funcționare (P.S.F).

Figura1.3 Caracteristica de ieșire Figura 1.4 Caracteristica liniarizată

Se constată că pentru semnalul variabil dioda se comportă ca o rezistență. În cazul general, în cazul dispozitivelor electrice mai complexe, pe lângă rezistențe și capacități intervin și surse controlate de tensiune și respectiv de curent.

2. Metoda uzuală de analiză si proiectare a circuitelor electronice este aceea de a împărți schema complexă in etaje funcționale ce se proiectează separat. Avantaje: pot apărea simplificări de calcul, este facilitată înțelegerea mai profundă a diferitelor circuite electrice, pot fi mai ușor alese valorile pentru datele de proiectare.

3. Un calcul numeric foarte exact nu este necesar în cazul circuitelor electronice având în vedere că dispozitivele electronice se caracterizează printr-o dispersie însemnată a parametrilor și pe de altă parte valorile acestor parametri depind de temperatură și de punctul static de funcționare.

4. Există circuite electronice a căror funcționare este explicit neliniară. Este cazul circuitelor ce funcționează la semnal mare (amplificatoarele de putere). În aceste situații, pentru a evita un calcul analitic dificil, se recurge la o metodă grafică de rezolvare a circuitului, și determinarea punct cu punct a formei de variație în timp a tensiunii și curentului, și pe baza acestora se calculează parametrii ce ne interesează. Metoda se aplică ușor, în momentul de față, daca se utilizează calculatorul.

1.3 Noțiuni introductive privind materialele semiconductoare

Materialele semiconductoare se caracterizează printr-o rezistivitate specifică, situată intre cea a metalelor și cea a materialelor izolatoare (1014 cm – izolatori, 10-3 cm – metale,10-1 cm – semiconductoare).

Semiconductori intrinseci (chimic pur)

La temperatura T = 0K electronii ocupă toate legăturile covalente, rezultă că în material nu există electroni liberi și deci nu este posibilă conducția de curent electric.

1,12 eV (Si)

0,67 eV (Ge)

Figura 1.5 Legătura covalentă și benzile de energie  = 0K

Pentru T 0K, datorită creșteri de temperatură, crește energia electronilor și în consecință, unii dintre acești electroni părăsesc legăturile covalente. Pentru T 0K este posibilă conducția de curent electric prin doua mecanisme: deplasarea ordonată a electronilor liberi respectiv deplasarea ordonată de goluri

Figura 1.6 Legăturile covalente  > 0K

Fenomenul de conducție prin aportul atât a electronilor cât și a golurilor este specific materialelor semiconductoare (la metale, conducția este asigurată exclusiv de circulația electronilor liberi). Materialele izolatoare se comportă în mod similar cu cel al semiconductorilor, cu diferența că numărul de perechi electroni-goluri este mult mai mic.

1.3.2 Semiconductoare extrinseci (chimic impure)

Aceste semiconductoare sunt de două tipuri:

cu exces de electroni – semiconductor ,,n”.

cu exces de goluri – semiconductor ,,p”.

Întru-un semiconductor pot fi introduse impurități dopante în scopul creeri de nivele permise în banda interzisă. Impuritățile donoare tipice, cum ar fi fosforul pentru siliciu, au energia donoare cu apoximativ 50 meV sub banda de conducție. Energia de excitare termică kT este suficientă pentru a elibera electronii atomilor dopanți și a-i trmite în banda de conducție. În mod similar, impuritățile acceptoare, cum este borul pentru siliciu au o energie acceptoare situată la aproximativ 50 meV deasupra benzii de valență.

Figura 1.7 Doparea cu impurități electronegative

Figura 1.8 Doparea cu impurități electropozitive

1.4.Curenții de difuziune

Curenții de difuzie sunt descriși de fluxul F de particule ce difuzează în unitatea de timp perpendicular pe unitatea de suprafață și de coeficientul de difuzie D.

Figura 1.9 Fluxul de particule

1.5. Joncțiunea p-n

Joncțiunea p-n reprezintă o structură fizică realizată într-un monocristal care are doua regiuni vecine dopate cu impurități donore respectiv acceptoare și la care concentrația de impurități se modifică pe o distanță suficient de mică.

Figura 1.10 Joncțiune p – n

1.5.1 Joncțiunea p-n polarizată direct

Figura 1.11 Curenții de purtători prin joncțiune polarizată direct

Prezența tensiunii de polarizare directă determină apariția unui câmp de sens contrar câmpului electric generat de sarcina spațială din regiunea de trecere. Prezența câmpului determinat de tensiunea aplicată la borne conduce la o creștere însemnată a curenților de difuzie și la o scădere cu efect neglijabil a curenților de purtători minoritari. În consecință, printr-o joncțiune p-n polarizată direct circulă un curent de valoare însemnată.

Figura 1.12 Regiunile purtătorilor în prezența polarizării directe

Prezența tensiunii de polarizare directă determină apariția fenomenului de injecție de purtători minoritari de sarcină și deci apariția unei sarcini stocate. Mărimea sarcinii stocate depinde de nivelul tensiunii de polarizare directă.

1.5.2. Joncțiunea p-n polarizată invers

Figura 1.14 Curenții de purtători prin joncțiune polarizată invers

În acest caz curentul prin joncțiune este neglijabil, motiv pentru care joncțiunea este blocată. Prezența tensiunii de polarizare inversă determină extinderea regiunii de sarcină spațială in detrimentul regiunii neutre.

Figura 1.13 Regiunile purtătorilor în prezența polarizării inverse

1.6. Modele echivalente pentru dioda semiconductoare

O diodă semiconductoare conține o joncțiune semiconductoare p-n, două contacte ohmice pentru legătura cu un circuit extern și o capsulă care să asigure protecția mecanică a ansamblului joncțiune-contacte și în același timp posibilitatea evacuării spre mediul ambiant a energiei termice dezvoltate la nivelul joncțiunii.

Figura 1.15 Reprezentarea unei diode

Există două tipuri de modele:

1. modelul de semnal mare (static respectiv dinamic)

2. model de semnal mic (static, de frecvențe joase, respectiv dinamic, de frecvențe înalte).

Avem un model de tip 1 dacă dispozitivul electric (dioda) este modelat neliniar cu ajutorul unor modele liniare pe porțiuni. Perechile de valori (id, ud) se pot afla în tot domeniul permis al caracteristicii diodei.

Modelul este de semnal mic dacă dioda este modelată liniar iar valorile numerice ale parametrulu și la o scădere cu efect neglijabil a curenților de purtători minoritari. În consecință, printr-o joncțiune p-n polarizată direct circulă un curent de valoare însemnată.

Figura 1.12 Regiunile purtătorilor în prezența polarizării directe

Prezența tensiunii de polarizare directă determină apariția fenomenului de injecție de purtători minoritari de sarcină și deci apariția unei sarcini stocate. Mărimea sarcinii stocate depinde de nivelul tensiunii de polarizare directă.

1.5.2. Joncțiunea p-n polarizată invers

Figura 1.14 Curenții de purtători prin joncțiune polarizată invers

În acest caz curentul prin joncțiune este neglijabil, motiv pentru care joncțiunea este blocată. Prezența tensiunii de polarizare inversă determină extinderea regiunii de sarcină spațială in detrimentul regiunii neutre.

Figura 1.13 Regiunile purtătorilor în prezența polarizării inverse

1.6. Modele echivalente pentru dioda semiconductoare

O diodă semiconductoare conține o joncțiune semiconductoare p-n, două contacte ohmice pentru legătura cu un circuit extern și o capsulă care să asigure protecția mecanică a ansamblului joncțiune-contacte și în același timp posibilitatea evacuării spre mediul ambiant a energiei termice dezvoltate la nivelul joncțiunii.

Figura 1.15 Reprezentarea unei diode

Există două tipuri de modele:

1. modelul de semnal mare (static respectiv dinamic)

2. model de semnal mic (static, de frecvențe joase, respectiv dinamic, de frecvențe înalte).

Avem un model de tip 1 dacă dispozitivul electric (dioda) este modelat neliniar cu ajutorul unor modele liniare pe porțiuni. Perechile de valori (id, ud) se pot afla în tot domeniul permis al caracteristicii diodei.

Modelul este de semnal mic dacă dioda este modelată liniar iar valorile numerice ale parametrului elementului modelului depind de perechea (ID UD). O astfel de pereche se numește punct static de funcționare (PSF).

Spunem că modelăm în regim static atunci când elementele reactive pot fi neglijate (capacitatea și inductanța).

Un model de regim dinamic ține cont de efectele reactive dar și de anumite fenomene fizice suplimentare ce limitează viteza maximă de variație a tensiunii, respectiv a curentului prin diodă.

1.6.1 Dioda redresoare

Dioda redresoare se utilizează pentru redresarea curenților alternativi de relativ joasă frecvență. La această diodă nu prezintă interes parametrii de comutație și nici capacitatea joncțiunii. Ne interesează curentul maxim în stare de conducție și tensiunea maxim admisibilă la polarizarea inversă. Cu toate că puterea disipată pe diodele cu siliciu este mai însemnată, ele pot fi utilizate pentru redresarea unor curenți mai mari decât diodele cu germaniu având în vedere că funcționează la temperaturi mai ridicate ( ). De asemenea rezistă la tensiuni inverse mai mari (1000V 100V).

1.6.2. Dioda fotoemisivă (electroluminescentă – LED)

Joncțiunea utilizată într-o asemenea diodă se caracterizează prin energie mare de recombinare a perechilor electron-volt.

Acest proces are loc mai cu seamă în regiunea de trecere în situația în care dioda este polarizată direct. Procesul de recombinare este însoțit de emisie de lumină a cărui spectru depinde de combinațiile metalice introduse în materialele semiconductoare.

Căderea de tensiune pe un LED la polarizarea în sens direct este relativ mare (1,5 1,8 V) iar variația de tensiune la variația curentului este scăzută.

Figura 1.16 Caracteristica spectrală a unui LED

1.7. Tranzistorul bipolar

Tranzistorul bipolar este un dispozitiv cu trei borne numite emitor, bază și colector și care sunt conectate la un monocristal semiconductor având trei regiuni, cea din mijloc fiind dopată diferit față de regiunile marginale.

Figura 1.17 Joncțiunile și simbolul unui Figura1.18 Joncțiunile și simbolul unui

Tranzistor npn tranzistor pnp

Sensul săgeții reprezintă sensul de circulație al curentului prin joncțiunea emitoare polarizată în sensul direct. În funcție de polaritatea tensiunilor aplicate celor două joncțiuni, tranzistorul prezintă mai multe regiuni de funcționare cărora le corespund în planul caracteristicilor statice mai multe regiuni de funcționare.

1.8. Convenția de semn

Figura 1.19 Sensul tensiunilor și curenților Figura 1.20 Sensul tensiunilor și curenților

pentru un tranzistor npn pentru un tranzistor pnp

Există patru situații în care se poate găsi un tranzistor bipolar din punct de vedere al polarizării joncțiunilor sale.

joncțiunea E polarizată direct:

joncțiunea C polarizată invers: regim de funcționare activ

ambele joncțiuni sunt polarizate direct: regim de funcționare saturat.

ambele joncțiuni sunt polarizate invers: regim de funcționare blocat.

joncțiunea E invers polarizată tranzistor in conectare inversă (joncțiunea C direct polarizată).

1.9. Tranzistoarele cu efect de câmp

Denumirea provine de la faptul că acel curent prin dispozitiv se comandă cu ajutorul unui câmp electric.

Caracteristicile acestora sunt:

Curentul este format numai de purtători de sarcină de un anumit tip (goluri sau electroni) motiv pentru care tranzistoarele se mai numesc și tranzistoare unipolare.

Tehnologia acestor tranzistoare este simplă, iar dispozitivul ocupă puțin loc.

Au o rezistență de intrare mult mai mare decât tensiunea bipolară, tipic de ordinul M.

Prezintă, in general, un zgomot mai redus comparativ cu tranzistoarele bipolare.

La tranzistoarele mici dispozitivul se comportă ca o rezistență comandată și care spre deosebire de cazul tranzistoarelor bipolare nu are înseriată cu ea o sursă de tensiune.

Dependența de temperatură a parametrilor tranzistorului este mai slabă decât a tranzistorului bipolar.

Clasificarea acestora poate fi făcută astfel:

cu canal n

J-FET ( cu joncțiune)

cu canal p

TEC

(FET)

cu canal n

cu canal inițial

MOST-FET cu canal p

(metel-oxid- cu canal n

semiconductor) cu canal indus

cu canal p

1.10. Tranzistoarele cu efect de câmp cu joncțiune (TEC-J)

Mai jos este urmărită funcționarea TEC-J considerând cazul unui tranzistor cu canal n.

Figura 1.21 Tranzistoare TEC-J cu efect de câmp

La o funcționare normală joncțiunea grilă-canal este invers polarizată. În consecință, tranzistorul prezintă între grilă și sursă (intrarea tranzistorului) o rezistență de intrare foarte mare.

Figura 1.22 Polarizarea și funcționiarea tranzistorului TEC-J

Deoarece joncțiunea grilă-canal este invers polarizată, rezultă că acest tranzistor nu are caracteristică de intrare. În consecință, se va urmări funcționarea studiind caracteristicile de ieșire și respectiv caracteristica de transfer a dispozitivului.

uGS=0

Figura 1.23 Distribuția sarcinilor în timpul funcționării tranzistorului

– tensiunea D-S prag la care are loc strangularea canalului.

Figura 1.24 Caracteristica de ieșire a unui tranzistor cu efect de câmp

După strangulare curentul circulă prin dispozitiv în mod similar cu circulația de curent în joncțiunea colectoare a unui tranzistor bipolar.

UGS<0

Se constată existența în planul caracteristicilor de ieșire a trei regiuni: prima regiune este regiunea triodă căreia îi corespund relațiile

,

cea de a doua este regiunea de ștrangulare,

și regiunea pentodă, cu relațiile

1.11. Tranzistoarele cu efect de câmp de tip MOS

Principala diferență între acest tip de tranzistor și tranzistoarele cu grilă joncțiune o constituie faptul că de această dată grila tranzistorului este izolată de canal printr-un strat de oxid. Mai jos este prezentată structura unui asemenea tranzistor, considerând cazul unui tranzistor cu canal n.

Figura 1.25 Structura unui tranzistor cu efect de câmp de tip MOS

Electrodul bază este legat de sursă. Tranzistoarele MOS-FET sunt de 2 feluri:

Cu canal inițial, caz în care canalul superficial este întotdeauna prezent fiind realizat prin mijloace tehnologice.

Cu canal indus, situație în care canalul apare în condițiile în care tranzistorul este polarizat corespunzător.

1.11.1. TEC-MOS cu canal inițial

În cazul acestui tip de tranzistor canalul superficial între sursă și drenă, prin care se realizează conducția de curent între cei doi electrozi, este realizat tehnologic (și nu indus).

Mai jos este ilustrat cazul unui tranzistor cu canal n.

Figura 1.26 Structura unui tranzistor cu efect de câmp de tip MOS cu canal n

Funcționarea acestui tip de tranzistor este asemănătoare cu funcțiunea unui TEC-J cu canal n.

Pentru uGS=0 canalul împreună cu substratul reprezintă o joncțiune p-n polarizată invers. În consecință, apare o regiune de trecere care pătrunde mai adânc în semiconductorul mai puțin dopat (p) lipsită de purtători mobili de sarcină și care izolează astfel canalul de substrat.

Nici de această dată tranzistorul nu prezintă caracteristica de intrare. Pe măsură ce crește uDS se extinde regiunea de sarcină spațială dar fără efect asupra conducție canalului care, spre deosebire de TEC-J, este un canal superficial și nu unul de volum. În schimb, apariția câmpului electric E sărăcește canalul de purtători mobili de sarcină și prin urmare scade conducția în canal până când aceasta se optimizează.

Figura 1.27 Caracteristica de ieșire a tranzistorului MOS cu canal n

Spre deosebire de TEC-J cu canal n, uGS poate avea orice polaritatea. O tensiune de grilă pozitivă va conduce la îmbogățirea cu electroni a canalului și deci la o mai bună conductibilitate, în timp ce o tensiune negativă va sărăci canalul în purtători mobili de sarcină.

În regiunea pentodă rămâne valabilă relația . Această relație reprezintă în același timp caracteristica de transfer a TEC-MOS corespunzător funcționării in regiunea pentodă.

TEC-MOS prezintă în regiunea triodă un comportament similar cu tranzistorul TEC-J iar TEC-MOS cu canal p funcționează similar cu TEC-MOS cu canal n cu diferența că polaritatea tensiunilor și sensul curenților sunt schimbate.

Figura 1.28 Caracteristica de transfer a tranzistorului MOS cu canal n

1.11.2. TEC-MOS cu canal indus

Este important modul în care este introdus canalul de inducție. Mai jos este analizat un tranzistor cu canal n.

Figura 1.29 Structura unui tranzistor TEC-MOS cu canal indus

Canalul n odată format, curentul de drenă se modifică în uDS similar cu situația de cu cana inițial. Canalul se strangulează chiar în origine pentru uGS=UP. În rest uDS= uGS- UP.

Figura 1.30 Caracteristică de transfer a unui Figura 1.31 Caracteristica de ieșire a unui

tranzistor TEC-MOS cu canal indus tranzistor TEC-MOS cu canal indus

Tranzistoarele MOS se caracterizează printr-o rezistență de intrare foarte mare, 1010 . Stratul de oxid izolator fiind foarte subțire, există pericolul străpungerii acestuia prin descărcare electrostatică de către sarcina electrică acumulată în mod nedorit (operator sau echipamentul care îl manipulează). Fabricantul prevede, de regulă, circuite complexe pe fiecare terminal, care limitează valoarea maximă a tensiunii electrostatice pe terminalul respectiv. În cazul tranzistorului MOS prezența circuitelor de protecție micșorează rezistența de intrare. În unele situații baza nu este conectată electric la sursa tranzistorului. Acest electrod trebuie astfel polarizat încât întotdeauna joncțiunea canal-substrat să fie invers polarizată. În consecință, în cazul tranzistoarelor cu canal n, baza trebuie conectată la cel mai scăzut potențial din circuit, respectiv, în cazul tranzistoarelor cu canal p, baza trebuie conectată la cel mai ridicat potențial.

1.12. Plasarea punctului static de funcționare

Se poate considera, pentru început, cazul unui etaj de amplificare cu tranzistor bipolar (în conexiune E-C).

Figura 1.32 Etaj de amplificare cu tranzistor bipolar

Rolul rezistorului (rezistor de colector) este de a converti variabila de curent în variabilă de tensiune la ieșire. Divizorul , polarizează baza astfel încât în regim static să avem un anumit PSF.

Condensatorii și se numesc condensatori de cuplaj. Ei au rolul de a bloca componentele continue la intrare respectiv la ieșire și de a lăsa să treacă neatenuate componentele variabile ale semnalului (prin alegerea potrivită a valorii capacității dependent de frecvența amplificatorului).

Figura 1.33 Blocarea componentelor continue la intrare si iesire

Să considerăm cazul când

Atunci avem

Dacă se consideră variațiile în raport cu un anumit P.S.F atunci relația (2) devine:

Ultima relație definește așa numita dreaptă de sarcină dinamică. Punctul de funcționare a tranzistorului în regim dinamic, caracterizat de mărimile se situează în permanență pe acea dreaptă dinamică dată de relația:

Din ultimele două relații rezultă că în cazul în care dreapta de sarcină dinamică se confruntă cu dreapta de sarcină statică.

Dacăatunci din schema echivalentă pentru variații a etajului de amplificare avem.

Pentru variații, condensatoarele de cuplaj au reactanță neglijabilă deci constituie un scurt.

Plasarea P.S.F se face având în vedere dreapta de sarcină dinamică, și alegând un curent care să reprezinte circa jumătate din curentul maxim pe care îl acceptă tranzistorul utilizat.

Plasarea P.S.F trebuie să țină seama în același timp de mărimile limită ce intervin în funcționarea unui tranzistor: .

Figura 1.34 Sensul curenților și tensiunilor

pentru un tranzistor bipolr npn

Figura 1.35 Parabola regimului critic

Puterea se disipă aproape în exclusivitate pe joncțiunea BC, căreia i se aplică o tensiune mult mai mare decât pe joncțiunea emitoare.

1.13. Circuite de polarizare

Rolul circuitelor de polarizare este acela de a asigura P.S.F dorit de tranzistor. Sunt analizate cazurile tipice pentru tranzistorul bipolar respectiv tranzistorul cu efect de câmp.

În cazul tranzistoarelor bipolare, polarizarea se realizează prin două metode:

cu rezistență respectiv divizor în baza tranzistorului.

polarizare prin cuplaj în curent continuu.

Figura 1.36 Circuit de polarizare cu Figura 1.37 Circuit de polarizare cu divizor

rezistență în bază în bază

Varianta cu divizor în bază se comportă mai favorabil cu temperatura, adică variațiile de temperatură influențează în mai mică măsură P.S.F.

Rezistența din ciclul de emitor are rolul de a stabiliza P.S.F-ul la variațiile factorilor de influență externă dintre care cel mai important este temperatura. Această rezistență introduce o așa numită reacție negativă de curent (serie-serie):

În realitate prezența rezistenței face ca variațiile curentului să fie diminuate la variații de temperatură comparativ cu situația în care nu este inclusă în circuit. Prezența rezistenței determină în același timp diminuarea variațiilor curentului de colector cauzate de semnalul util aplicat la intrare. Se spune că introduce o reacție negativă.

Prezența reacției negative determină scăderea amplificării. Acest lucru poate fi evitat șuntând rezistența cu un condensator. Prezența condensatorului , care are o reactanță neglijabilă la frecvențe de lucru, elimină reacția negativă pentru semnalul util. În schimb reactanța lui este foarte mare pentru variațiile lui determinate de temperatură, aceste variații având o frecvență scăzută. În consecință nu este scurtcircuitată de .

În schemă, P.S.F a lui este asigurat de tensiunea din colectorul .

Figura 1.38 Șuntarea rezistenței RE cu un condensator

1.14. Polarizarea tranzistoarelor cu efect de câmp

Problema polarizării tranzistoarelor cu efect de câmp se abordează în mod similar celor prezentate în cazul tranzistoarelor bipolare, adică se alege un P.S.F. în planul caracteristicilor de ieșire.

1.14.1. TEC-J

Pentru un TEC-J ilustrat mai jos, avem relațiile, schema și caracteristica:

Figura 1.39 Polarizarea unui tranzistor Figura 1.40 Caracteristica de transfer…

cu efect de câmp a unui tranzistor cu efect de câmp

Schema prezentată, simplă, prezintă neajunsul unei stabilități reduse cu temperatura. O bună stabilitate a P.S.F. ar necesita o pantă cât mai mică a dreptei .

Figura 1.41 Schema de stabilizarea a PSF Figura 1.42 Ameliorarea pantei

Astfel, .

În cazul TEC-MOS procedura este similară cu cea de , având însă în vedere diferențele pe care aceste tranzistoare le prezintă în ceea ce le privește caracteristica de transfer.

1.14.2. TEC-MOS

Schema prezentată mai sus prezintă dezavantajul unei slabe stabilități a P.S.F. cu temperatura.

Figura 1.43 Polarizarea unui Figura 1.44 Caracteristica de transfer a unui

TEC – MOS TEC-MOS

Prezența rezistenței îmbunătățește stabilitatea cu temperatura a P.S.F.

Figura 1.45 Stabilizarea PSF Figura 1.46 Noua formă a

caracteristicii de transfer

Relațiile corespunzătoare sunt

Conectarea grilei la divizor printr-o rezistență de valoare foarte mare asigură o rezistență de intrare mare a etajului de amplificare (în lipsa lui divizorul reduce valoarea rezistenței de intrare).

Figura 1.47 Polarizarea cu divizor Figura 1.48 Caracteristica de transfer

1.15. Stabilitatea P.S.F.

Prin stabilitatea P.S.F. se înțelege menținerea în anumite limite a valorilor ce caracterizează P.S.F –ul, atunci când se modifică factorii de influență externi, dintre care cel mai important e temperatura. Deoarece depinde de fapt de ,, înseamnă că de fapt stabilitatea P.S.F. este asigurată dacă se limitează variațiile lui , care depinde de temperatură prin

Mărimile ; , se numesc factori de sensibilitate în raport cu curentul, temsiunea, și acești parametrii depind de tipul circuitului de polarizare utilizat.

Factorii de sensibilitate pot fi calculați pentru fiecare schemă în parte, deci pot fi evaluate performanțele circuitului cu temperatura.

1.16. Soluții pentru stabilizarea P.S.F.

Există două tipuri de circuite prin care se asigură stabilitatea P.S.F.

Se utilizează rezistențe liniare și reacție negativă.

Se utilizează elemente neliniare conform procedurii de compensare al variaților cu temperatura.

Figura 1.49 Stabilizarea PSF cu rezistență Figura 1.50 Divizarea rezistenței pentru

în emitor evitarea scăderii amplificării

1.17. Reacție negativă de tip paralel-paralel

Rezistența realizează pe de o parte polarizarea tranzistorului și în același timp P.S.F., introducând așa-numita reacție negativă de tip paralel-paralel.

Figura 1.51 Reacție negativă de tip paralel – paralel (cu ajutorul RB)

Ce-a de a doua metodă compensează variațiile cu temperatura ale unor mărimi specifice tranzistorului (exemplu ), utilizând elemente neliniare și al căror comportament depinde de temperatură.

Cele mai frecvent utilizate componente în cadrul metodei de compensare sunt diodele sau termistoarele. Cel mai frecvent se compensează variația cu temperatura a lui .

Figura 1.52 Metoda compensării cu termistor Figura 1.53 Metoda compensării cu diodă

și termistor

Termistorul T compensează variația cu temperatura a lui dacă el prezintă un coeficient negativ de temperatură.

1.18. Etapele de rezolvare ale unui circuit electronic

Se desenează schema electronică completă a circuitului.

Se desenează schema echivalentă pentru variații păstrând elementele pasive din schema inițială și respectiv tranzistoarele. În această schemă sursele de tensiune vor apărea ca scurtcircuit, sursele de curent vor apărea ca întreruperi, se marchează clar terminalele tranzitoarelor din schemă.

Se fac eventualele simplificări legate de influența elementelor reactive din schemă.

Se înlocuiesc tranzistoarele cu un model de semnal mic corespunzător.

Se rezolvă circuitul, adică se calculează mărimile care reprezintă interes: rezistența de intrare a circuitului, rezistența de ieșire, amplificarea de tensiune, amplificarea de curent.

1.19. Metode de rezolvare

Pentru semnal cu variație oarecare în timp se face calculul în real utilizând ecuațiile diferențiale sau se poate apela la calculul operațional.

Pentru semnale sinusoidale procedura poate fi considerabil simplificată, utilizându-se reprezentarea mărimilor tensiuni și curenți prin fazori și aplicând calculul în complex.

În schemele electronice de semnal mic tranzistorul poate fi înlocuit cu modelul corespunzător oricărei conexiuni. Rezultatele obținute vor fi evident aceleași, complexitatea calculelor însă poate diferi de la o situație la alta. Ca regulă, se recomandă înlocuirea tranzitoarelor care funcționează într-o anumită conexiune cu modelul corespunzător conexiunii respective.

Capitolul 2. Microcontrolerele

La modul general un controler este o structură electronică destinată controlului unui proces sau, mai general, unei interacțiuni caracteristice cu mediul exterior, fără să fie necesară intervenția operatorului uman.

Resursele integrate la nivelul microcircuitului ar trebui să includă cel puțin următoarele componente:

1. o unitate centrală (CPU), cu un oscilator intern pentru ceasul de sistem

2. o memorie locală tip ROM/PROM/EPROM/FLASH și eventual una de tip RAM

3. un sistem de întreruperi

4. I/O – intrări/ieșiri numerice

5. un port serial de tip asincron și/sau sincron, programabil

6. un sistem de timere-temporizatoare/numărătoare programabile.

Este posibil ca la acestea să fie adăugate, la un preț de cost avantajos, caracteristici specifice sarcinii de control care trebuie îndeplinite:

7. un sistem de conversie analog numerică (una sau mai multe intrari analogice)

8. un sistem de conversie numeric analogic și/sau ieșiri PWM (cu modulare în durată)

9. un comparator analogic

10. o memorie de date nevolatilă de tip EEPROM

11. facilități suplimentare pentru sistemul de temporizare/numărare (captare și

comparare)

12. un ceas de gardă (timer de tip watchdog)

13. un RTC (Real Time Clock – ceas, dată ,calendar)

14. alte protocoale de transmisie serială sau paralelă (I2C , SPI , 1WIRE , CAN…)

15. facilități pentru optimizarea consumului propriu

Un microcontroler tipic mai are la nivelul unității centrale facilități de prelucrare a informației la nivel de bit, de acces direct și ușor la intrări/ieșiri și un mecanism de prelucrare a intreruperilor rapid si eficient.

Utilizarea unui microcontroler constituie o soluție prin care se poate reduce dramatic numărul componentelor electronice precum și costul proiectării și al dezvoltării unui produs.

Utilizarea unui microcontroler, oricât de evoluat, nu elimină unele componente ale interfeței cu mediul exterior (atunci când ele sunt chiar necesare): subsisteme de prelucrare analogică (amplificare, redresare, filtrare, protecție-limitare), elemente pentru realizarea izolării galvanice (optocuploare, transformatoare), elemente de comutație de putere (tranzistoare de putere, relee electromecanice sau statice).

Un exemplu de microcontroler este ATMEGA162. Mulți pini ai microcontrolerului au mai multe utilizari si resursele respective se folosesc numai pentru o anumita functionalitate

Figura 2.1 Pinii unui microcontroler cu 40 de pini

Figura 2.2 Imaginea unui microcontroler cu 40 de pini

2.1 Aplicațiile microcontrolerelor

Toate aplicațiile în care se utilizează microcontrolere fac parte din categoria așa ziselor sisteme încapsulate-integrate.

Printre multele domenii unde utilizarea lor este practic un standard industrial se pot menționa: în industria de automobile (controlul aprinderii/motorului, climatizare, diagnoză, sisteme de alarmă, etc.), în așa zisa electronică de consum (sisteme audio, televizoare, camere video și videocasetofoane, telefonie mobilă, GPS-uri, jocuri electronice, etc.), în aparatura electrocasnică (mașini de spălat, frigidere, cuptoare cu microunde, aspiratoare), în controlul mediului și climatizare (sere, locuințe, hale industriale), în industria aerospațială, în mijloacele moderne de măsurare – instrumentație (aparate de măsură, senzori și traductoare inteligente), la realizarea de periferice pentru calculatoare, în medicină.

Există la ora actuală un număr extrem de mare de tipuri constructive de microcontrolere. Un criteriu de clasificare care se poate aplica întotdeauna este lungimea (dimensiunea) cuvântului de date. Funcție de puterea de calcul dorită și de alte caracteristici se pot alege variante având dimensiunea cuvântului de date de 4, 8,16, 32 sau 64 de biți. Nu este obligatoriu ca dimensiunea cuvântului de date să fie egală cu dimensiunea unui cuvânt mașină (cuvânt program). Există și multe variante dedicate, neprogramabile de utilizator la nivel de cod mașină, strict specializate pe o anumită aplicație, prin intermediul codului preprogramat și al resurselor hardware, utilizate pentru comunicații, controlul tastaturilor, controlul aparaturii audio/video, prelucrarea numerică a semnalului, etc.

Practic, toate microcontrolerele se realizează la ora actuală în tehnologie CMOS. Se pot realiza astfel structuri cu o mare densitate de integrare, cu un consum redus (care va depinde de

frecvența de lucru). Logica internă este statică (total sau în cea mai mare parte) permițând astfel, în anumite condiții, micșorarea frecvenței de ceas sau chiar oprirea ceasului în ideea optimizării consumului. Tehnologia este caracterizată și de o imunitate mai mare la perturbații, esențială într-un mare număr de aplicații specifice. Se realizează variante pentru domeniu extins al temperaturii de funcționare (de ex.- 40 la +).

Există foarte multe variante de încapsulare (capsule de plastic și mai rar de ceramică), multe din ele destinate montării pe suprafață (SMD): SOIC, PLCC, PQFP, TQFP (x100pini), etc., dar și variante clasice cu pini tip DIP/DIL (tipic de la 8 la 68 pini).

2.2 Caracteristici arhitecturale ale unității centrale

Arhitectura unității centrale de calcul (CPU) este unul din elementele cele mai importante care trebuie avut în vedere în analiza oricărui sistem de calcul. Principalele concepte luate în considerare și întâlnite aici sunt următoarele:

Arhitecturi de tip " von Neumann "

Cele mai multe microcontrolere sunt realizate pe baza acestei arhitecturi de sistem. Microcontrolerele bazate pe această arhitectură au o unitate centrală (CPU) caracterizată de existența unui singur spațiu de memorie utilizat pentru memorarea atât a codului instrucțiunilor cât și a datelor ce fac obiectul prelucrării.

Există deci o singură magistrală internă (bus) care este folosită pentru preluarea instrucțiunilor și a datelor; efectuarea celor două operații separate, în mod secvențial, are ca efect, cel puțin principial, încetinirea operațiilor. Este arhitectura standard cea mai des întâlnită și pentru microprocesoarele de uz general.

Figura 2.3 Structura microcontrolerelor bazate pe arhitectura de tip "von Neumann"

Arhitecturi de tip " Harvard "

La această arhitectură există spații de memorie separate pentru program și date. În consecință ar trebui să existe și magistrale separate (de adrese și date) pentru codul instrucțiunilor și respectiv pentru date. Principial există astfel posibilitatea execuției cvasiparalele (suprapunerii) a celor două operații menționate anterior. Codul unei instrucțiuni poate fi preluat din memorie în timp ce se execută operațiile cu datele aferente instrucțiunii anterioare. Este posibilă (cel puțin teoretic) o execuție mai rapidă, pe seama unei complexități sporite a microcircuitului. Este arhitectura standard pentru procesoarele numerice de semnal (DSP). Datorită costului mare al implementării unei astfel de arhitecturi, în cazul microcontrolerelor se întâlnește mai ales o arhitectură Harvard modificată, cu spații de memorie separate pentru program și date, dar cu magistrale comune pentru adrese și date.

Figura 2.4 Structura microcontrolerelor bazate pe arhitectura de tip „Harvard”

c. CISC

Aproape toate microcontrolerele au la baza realizării CPU conceptul CISC (Complex

Instruction Set Computer). Aceasta înseamnă un set uzual de peste 80 instrucțiuni, multe din

ele foarte specializate. De obicei multe din aceste instrucțiuni sunt foarte diferite între ele: unele operează numai cu anumite spații de adrese sau registre, altele permit numai anumite moduri de adresare, etc. Pentru programatorul în limbaj de asamblare există unele avantaje prin utilizarea unei singure instrucțiuni complexe în locul mai multor instrucțiuni simple (analog macroinstrucțiunilor clasice dintr-un limbaj de asamblare) .

d. RISC

RISC (Reduced Instruction Set Computer) este un concept de realizare a CPU care a început să fie utilizat cu succes de ceva timp și la realizarea microcontrolerelor. Prin implementarea unui set redus de instrucțiuni care se pot executa foarte rapid și eficient se obține o reducere a complexității microcircuitului, suprafața disponibilizată putând fi utilizată în alte scopuri. Printre caracteristicile asociate de obicei unui CPU RISC se pot menționa:

– arhitectură Harvard modificată sau von Neumann

– viteză sporită de execuție

– set de instrucțiuni ortogonal (simetric): orice instrucțiune operează cu orice spațiu de adrese (de memorie) sau orice registru, instrucțiunile nu prezintă combinații speciale, excepții, restricții sau efecte colaterale.

2.3 Aspecte legate de memoria microcontrolerelor

În afară de memoria locală de tip RAM, de dimensiuni relativ reduse (de la x10 octeți la x1k), implementată ca atare sau existentă sub forma unui set de registre și destinată memorării datelor (variabilelor), mai există o serie de aspecte specifice, marea majoritate a acestora fiind legată de implementarea fizică a memoriei de program (și eventual a unei părți a memoriei de date) cu ajutorul unor memorii nevolatile. Clasic, memoria de program era implementată într-o variantă de tip ROM: EPROM pentru dezvoltare și producție pe scară mică/medie sau mask-ROM pentru producția de masă.

În continuare sunt enumerate principalele concepte noi apărute de-a lungul timpului în legătură cu implementarea memoriei de program sau date.

a. OTP – majoritatea producătorilor oferă variante de microcontrolere la care memoria locală de program este de tip OTP (One Time Programmable), practic o memorie PROM identică intern cu varianta EPROM, dar fără fereastra de cuarț pentru ștergere (deci și mai ieftine); aceste variante pot fi utilizate ca o alternativă pentru o producție limitată, până în momentul testării și validării finale a codului, moment în care pot fi comandate variantele (mask) ROM propriu-zise, cele mai economice pentru o producție de masă

b. FLASH EPROM – este o soluție mai bună decât EPROM-ul propriu-zis atunci când este necesar un volum mare de memorie program (nevolatilă); mai rapidă și cu un număr garantat suficient de mare (x10000) de cicluri de programare (de ștergere/scriere), este caracterizată și prin modalități mai flexibile de programare; este utilizată numai ca memorie de program.

c. EEPROM – multe microcontrolere au și o memorie de acest tip, de dimensiune limitată (de la x10 octeți la x K octeți), destinată memorării unui număr limitat de parametrii (memorie de date) care eventual trebuie modificați din timp în timp, este o memorie relativ lentă (la scriere), dar cu un număr de cicluri de ștergere/scriere mai mare ca FLASH-ul

d. NOVRAM (RAM nevolatil) – realizată prin alimentarea locală (baterie, acumulator) a unui masiv RAM CMOS atunci când este necesar un volum mare de memorie de program și date nevolatile, mult mai rapidă decât toate celelalte tipuri și fără limitări ca număr de cicluri.

e. Memoria externă de program sau date. Marea majoritate a familiilor de microcontrolere permit si utilizarea de memorie externă de program (tipic ROM) sau date (tipic RAM). Aceasta presupune existența si utilizarea unor magistrale externe de adrese si date. Conexiunile externe necesare pentru acestea sunt disponibile ca funcții alternative ale pinilor. Din păcate, in această situație numărul de conexiuni exterioare disponibile pentru interfața cu exteriorul se reduce dramatic, reducând mult din versatilitatea microcontrolerului. Mai mult, la variantele constructive cu un număr mic de pini (conexiuni externe) nu este posibilă utilizarea de memorie externă, decât, eventual, intr-o variantă cu interfață serială (memorie RAM, FLASH sau EEPROM cu interfață I2C, SPI, etc.) și numai ca memorie de date.

2.4 Limbaje de programare

Limbajul mașină și cel de asamblare

Limbajul mașină (instrucțiunile mașină) este singura formă de reprezentare a informației pe care un microcontroler o "înțelege". Din păcate această formă de reprezentare a informației este total nepractică pentru un programator, care va utiliza cel puțin un limbaj de asamblare, în care o instrucțiune are drept corespondent o instrucțiune în limbaj mașină.

Un program în limbaj de asamblare este rapid și compact. Aceasta nu înseamnă că un

astfel de program, prost scris, nu poate fi lent și de mari dimensiuni, programatorul având controlul total pentru execuția programului și gestiunea resurselor. Utilizarea numai a limbajului de asamblare pentru dezvoltarea unei aplicații complexe este neproductivă de multe ori, deoarece există și familii de microcontrolere cu CPU de tip CISC care au un număr foarte mare de instrucțiuni (x100) combinate cu moduri de adresare numeroase și complicate.

Totuși, nu trebuie uitat că la ora actuală mulți din producătorii mari de microcontrolere oferă medii de dezvoltare software gratuite care includ programe asambloare gratuite. De asemenea, comunitatea utilizatorilor diverselor familii de microcontrolere a dezvoltat și ea, în timp, multe astfel de asambloare, care sunt disponibile ca freeware.

Interpretere

Un interpreter este o implementare a unui limbaj de nivel înalt, mai apropiat de limbajul natural. Caracteristic pentru execuția unui program interpretat, este citirea și executarea secvențială a instrucțiunilor (instrucțiune cu instrucțiune). De fapt fiecare instrucțiune de nivel înalt este interpretată într-o secvență de instrucțiuni mașină care se execută imediat.

Cele mai răspândite interpretere sunt cele pentru limbajele C++,BASIC și JAVA .

Marele avantaj al utilizării unui interpreter este dezvoltarea interactivă și incrementală a aplicației: se scrie o porțiune de cod care poate fi testată imediat, instrucțiune cu instrucțiune; dacă rezultatele sunt satisfăcătoare se poate continua cu adăugarea de astfel de porțiuni până la finalizarea aplicației.

Compilatoare

Un compilator combină ușurința în programare oferită de un interpreter (de fapt de limbajul de nivel înalt) cu o viteză mai mare de execuție a codului. Pentru aceasta programul în limbaj de nivel înalt este translatat (tradus) direct în limbaj mașină sau în limbaj de asamblare. Codul mașină rezultat are dimensiuni relativ mari (dar mai mici decât cel interpretat) și este executat direct, ca un tot, de microcontroler. De regulă codul generat poate fi optimizat fie ca dimensiune, fie ca timp de execuție.

Cele mai populare și utilizate sunt cele pentru limbajul C.

Deci codul este obținut cu ajutorul unui mediu integrat de dezvoltare a programelor (IDE-Integrated Development Environment) care conține în mod tipic următoarele componente software:

un editor specializat (orientat pe codul sursă),

un asamblor/compilator,

un editor de legături/locator ("link-editor/locator"),

programe de gestiune a unor biblioteci de cod ("librarians"),

programe de conversie a formatelor de reprezentare a codului (de exemplu din binar în format Intel HEX )

un simulator și/sau depanator ("debugger")

posibilitatea de atasare a unui programator ICSP (vezi schema de mai jos)

Figura 2.5 Schema electrica pentru programatorul ICSP: STK200

2.5 Dezvoltarea și testarea aplicațiilor

Cele mai răspândite mijloace hardware/software utilizate în dezvoltarea și testarea aplicațiilor sunt enumerate în continuare.

Simulatoarele

Un simulator este un program care rulează programul microcontrolerului – implementează un microcontroler virtual – folosind ca sistem de calcul gazdă un PC. Programul se poate executa pas cu pas, conținutul variabilelor și registrelor poate fi vizualizat și modificat. Reprezintă un punct de plecare atunci când se abordează un microcontroler, pentru familiarizarea cu resursele lui și cu limbajul de asamblare. Nu permite simularea în timp real a întreruperilor și, de regulă, programul rulează mai încet decât pe mașina reală. De regulă există mijloace pentru evaluarea vitezei de execuție a codului simulat (ca număr de cicluri mașină sau de stări). Ideal, un simulator ar trebui să permită și simularea completă a interacțiunii, cel putin din punct de vedere logic, cu toate perifericele disponibile.

b. Programele de depanare ("debbugers").

Sunt programe "monitor" pe mașina țintă (microcontrolerul) oferind facilități de depanare similare simulatorului. Interfața cu utilizatorul este realizată prin intermediul unui sistem gazdă (PC) și/sau a unui terminal alfanumeric, conectate prin intermediul unui port serial. Utilizează o parte din resursele microcontrolerului: memorie de program pentru el însuși (de tip ROM) și memorie de date (RAM) pentru variabile proprii, memorie pentru programul ce se depanează, un port serial pentru comunicația cu sistemul gazdă, eventual întreruperi, etc. Se utilizează de regulă împreună cu un sistem de dezvoltare (sau evaluare), care este un sistem minimal realizat în jurul microcontrolerului pe care rulează depanatorul, dar având resurse suficiente pentru a permite testarea și depanarea aplicațiilor uzuale.

Emulatoarele în circuit (ICE-In Circuit Emulators).

Sunt cele mai eficiente mijloace de testare și dezvoltare și au fost mult timp cele mai complexe și mai costisitoare. Presupun existența unui hardware dedicat care înlocuiește practic microcontrolerul (se conectează în locul acestuia în sistemul pentru care se dezvoltă aplicația), în același timp fiind disponibile toate facilitățile descrise anterior și altele suplimentare. Permit un control total al mașinii țintă (în timp real), fără a folosi nimic din resurse. Ele sunt realizate de cele mai multe ori ca un mijloc de testare și depanare de sine stătător, conectat la un PC prin intermediul unui port paralel, serial sau USB. Nu este necesară înlocuirea microcontrolerului de pe sistemul țintă, conectarea cu acesta făcându-se printr-un număr minim de interconexiuni. Exemple de astfel de interfețe ar fi: JTAG/ICE – In Circuit Emulation – la multe familii de microcontrolere, BDM (Background Debug Monitor) – pentru Freescale/Motorola. Existența acestui tip de interfețe face posibilă realizarea de emulatoare cu un preț de cost mult mai mic decât cele clasice.

d. Simulatoarele de sistem

Reprezintă o categorie aparte de simulatoare destinate simulării cat mai complete a sistemului și a aplicației în ansamblu, cu alte cuvinte a microcontrolerului împreuna cu dispozitivele hardware externe. Ele integrează de regulă și un simulator SPICE. Cele mai cunoscute sunt Proteus VSM (Virtual System Modelling) al firmei Labcenter Electronics . Un astfel de simulator permite rularea aplicației (codului), în mod continuu sau pas cu pas și evaluarea în detaliu a modului cum aceasta (și microcontrolerul) interacționează cu hardware-ul extern. El permite ceea ce se numește co-simularea: interacțiunea dintre software-ul microcontrolerului și dispozitivele electronice analogice sau numerice conectate cu acesta. Sunt bazate pe utilizarea unor modele avansate ale unor familii de microcontrolere precum și pe modelele SPICE ale dispozitivelor electronice. Pentru fiecare model de microcontroler există un asamblor și un editor de legături integrat astfel că se poate face, în anumite limite, și dezvoltarea codului în asamblare. Pe lângă aceasta ele au asigurate și interfețe corespunzătoare pentru a se putea dezvolta codul cu medii de programare consacrate pentru familia respectivă de microcontrolere, folosind de exemplu un compilator C. Facilitățile de simulare a codului sunt similare celor întâlnite la simulatoarele deja menționate. Pe lângă numeroasele dispozitive electronice discrete, circuite integrate analogice sau numerice, circuite de memorie sau periferice, în categoria dispozitivelor externe se mai pot menționa și sisteme de afișare (LED, LCD), tastaturi matriciale sau butoane, relee, etc.

e. Nucleele (sistemele de operare) de timp real (Real Time kernel, Real Time

Operating System-RTOS)

Pe piața de software pentru microcontrolere există și componente numite nuclee de timp real sau sisteme de operare în timp real (RTOS). Un astfel de program de sistem de nivel profesional este o componentă software scumpă sau foarte scumpă, funcție de complexitatea lui, de accesibilitatea surselor programului, de familia de microprocesoare căreia îi este adresat, de modul în care va fi distribuit împreuna cu aplicația. Există însă și variante de RTOS, de mai mică complexitate, din categoria freeware sau shareware, care pot fi utilizate cu performante mulțumitoare.

Un sistem de operare în timp real facilitează crearea aplicațiilor așa zise de timp real dar nu garantează și faptul ca ele chiar se vor executa în timp real, aceasta depinzând de modul în care este utilizat acest software la nivel de sistem.

Spre deosebire de un calculator cum este PC-ul, un sistem integrat este proiectat întotdeauna într-un anumit scop și are un cod care se execută aproape întotdeauna dintr-o memorie ROM, fiind de presupus că nu se modifică pe parcursul execuției aplicației. Astfel lucrurile sunt ușurate deoarece comportarea sistemului poate fi specificată complet încă din faza de proiectare. Din aceasta cauză, în cazul multora din aplicații, multe probleme se pot rezolva în timp real și fără să se utilizeze un RTOS. Esențială este pană la urmă calitatea și competența celui care programează aplicația.

2.6 Criterii de alegere a unui microcontroler

În momentul în care se dorește alegerea unui microcontroler (sau mai bine zis a unei familii de microcontrolere) pentru dezvoltarea unei aplicații de tip “embedded system” există mai multe criterii care trebuie luate în considerare, ținând cont de implicațiile multiple ale acestei alegeri. Se poate încerca gruparea acestor criterii după cerințele impuse aplicației și prezentarea câtorva din întrebările rezultate, la care trebuie dat un răspuns.

Costurile aplicației

Care va fi scara de producție: prototip, producție mică/medie sau de masă?

Care sunt costurile permise pentru microcontroler?

Care sunt costurile permise pentru mediul de programare și dezvoltare?

Timpul de dezvoltare al aplicației

Ce limbaj de programare să aleg?

Ce limbaje de programare cunosc bine și ce medii de dezvoltare am utilizat?

Ce modalitate de testare și depanare folosesc: simulator, sistem de dezvoltare, emulator?

Caracteristicile fizice

Care este viteza de prelucrare (de calcul) necesară?

De câtă memorie am nevoie pentru program și respectiv date?

Va fi necesară si o memorie externă?

Ce fel de alimentare este disponibilă și care sunt limitările acesteia?

De câte intrări și/sau ieșiri am nevoie?

Ce fel de intrări și/sau ieșiri sunt necesare: intrări/ieșiri analogice, ieșiri numerice de curent mai mare?

Care sunt resursele necesare în materie de temporizare/numărare si care ar fi caracteristicile lor cele mai importante (rezoluție, frecventa maxima de numărare) ?

Ce tip de capsulă, ce dimensiuni fizice și număr de pini ar trebui să aibă?

Care este gama temperaturilor de lucru necesare?

Aplicația va funcționa într-un mediu cu caracteristici speciale, de exemplu în care există perturbații electromagnetice puternice?

Conectivitatea

Care sunt resursele de comunicație necesare: câte porturi seriale asincrone și cu ce caracteristici, ce tipuri de magistrale seriale sincrone sunt disponibile?

Este necesară o conectivitate Ethernet (o stivă TCP/IP), USB sau wireless (stive Bluetooth, Zigbee, etc.)?

Compatibilitate, scalabilitate și dezvoltarea ulterioară

Cu ce tipuri de circuite se poate interfața cât mai simplu: sisteme de afișare, senzori, elemente de comandă și execuție (relee, motoare de cc, motoare pas cu pas, etc.)?

Cum se poate realiza extinderea ulterioară, atunci când este necesară?

Există mai multe variante în familia respectivă de microcontrolere care să acopere eventualele cerințe suplimentare în materie de viteză de lucru, resurse periferice sau de memorie?

Alte aspecte

Ce distribuitori există și cât sunt de accesibili pentru mine?

Care este suportul oferit de fabricant sau distribuitor și care este baza de cunostințe existentă: site-uri web, documentație on-line sau pe CD-uri, note de aplicații, exemple de proiectare (reference designs), software din categoria freeware/shareware si, nu în ultimul rând, forumuri de discuții pentru utilizatori?

Din păcate răspunsurile la multe din aceste întrebări sunt corelate între ele. Un exemplu este legătura care există între criteriile de cost și cele de timp de dezvoltare. Principial, utilizarea unui limbaj de nivel înalt împreună cu un emulator pentru testare și

depanare poate duce la scurtarea consistentă a timpului de dezvoltare. Dar prețul unui compilator este întotdeauna mai mare decât cel al unui asamblor, iar prețul unui emulator este și el mai mare decât cel al unor mijloace mai simple de testare și depanare.

În practică, de cele mai multe ori, alegerea unui microcontroler pentru o anumită aplicație este și trebuie să fie rezultatul unui compromis.

2.7 Cu ce si cum se poate programa un microcontroler?

a.Programator specializat extern (ex.STK200) – este un circuit electronic care conectează un port al PC-ului (serial, paralel sau USB ) cu pinii de programare ai microcontrolerului. Programatoarele acestea au de obicei un soclu ZIP in care se pot conecta mai multe tipuri de microcontrolere in diferite poziții, pentru că pinii de programare diferă ca poziție de la familie la familie. Unele programatoare pot programa chiar și diferite familii de microcontrolere.

b. Programarea "In System" (ISP-In System Programming) – folosirea unor memorii nevolatile de tip FLASH face posibilă și "programarea" unui astfel de microcontroler fără a-l scoate din sistemul în care este încorporat (programare on-line, In System Programming); programarea se face de regulă prin intermediul unei interfețe seriale dedicate de tip ISP (poate avea nume diferite) sau a unei interfețe standard JTAG.

c. Bootloader – multe din microcontrolerele recente la care memoria de program este de tip FLASH au și facilitatea (au de fapt instrucțiuni dedicate acestui scop) de a putea și scrie în această memorie de program fără a utiliza un circuit de programare extern. Astfel în microcontroler poate exista permanent (rezident) un cod de mici dimensiuni (denumit și bootloader) care pur și simplu va încărca prin intermediul portului serial (este doar un exemplu) codul utilizator sau constantele pe care acesta vrea eventual să le actualizeze. Bootloader-ul este și cel care lansează în execuție programul utilizator după încărcarea acestuia.

Protejarea codului program dintr-o memorie locală nevolatilă împotriva accesului neautorizat (la citire –deoarece pirateria soft există și aici) este oferită ca o opțiune la variantele FLASH, EPROM sau OTP. Codul poate proteja atât la citire cât și la scriere (practic circuitul trebuie șters, înainte de a se mai putea scrie ceva în el). Este eliminată astfel posibilitatea de a se realiza, în acest caz, alterări cu un anumit scop ale codului original. La variantele mask-ROM protecția propriu-zisă este de cele mai multe ori implicită.

3. CONVERTOARE ANALOG-NUMERICE (CAN)

Convertorul analog numeric este un circuit care transformă o mărime cu variație analogică aplicată la intrare într-o mărime numerică la ieșire. Într-un sens mai larg procesul de conversie analog numerică poate fi considerat ca o plasare a mărimii de intrare într-un interval de cuantificare obținut prin divizarea intervalului de variații a mărimii de intrare într-un număr egal de clase. Operațiile ce duc la conversia analog numerică sunt eșantionarea și cuantificarea. Eșantionarea definește aspectul temporal al conversiei și modul de prelevare al eșantioanelor în timp ce cuantizarea definește chiar modul de obținere al echivalentului numeric al mărimii analogice.

Există în prezent o mare varietate de scheme de conversie analog-numerică. Alegerea uneia din ele se face pornind de la principalele cerințe impuse în aplicația concretă (viteză, precizie, cost, consum, complexitate). Convertoarele utilizate în instrumentele de măsură pot fi clasificate în două mari categorii:

– CAN integratoare – lente, precise, ieftine – frecvent folosite în voltmetrele numerice, motiv pentru care vor fi prezentate în capitolul referitor la măsurarea tensiunilor și a curenților.

– CAN neintegratoare – rapide, relativ scumpe și de regulă mai puțin precise decât primele. Sunt preferate în cazurile în care principala cerință este viteza, de exemplu în cazul osciloscopului numeric.

3.1 Frecvența Nyquist a convertoarelor numeric analogice.

Pentru o tensiune , U poate fi reprezentat cu ajutorul unei serii de puteri de forma:

Aceasta înseamnă că U poate fi reprezentat, în principiu, exact, în raport cu Uref, prin secvența binară (b1, b2, ….) de lungime, în general, infinită. În realitate semnalul trebuie aproximat astfel încât să poată fi reprezentat cu un număr finit de biți.

Eșantionarea unui semnal constă în prelevarea valorilor semnalului la momente de timp echidistante t0 denumite și perioadă de eșantionare.

Spectrul semnalului eșantionat XS(ω) constă în repetări periodice axate față de kω0 ale spectrului original denumite spectre secundare. Pentru a reface semnalul inițial este necesar ca aceste spectre secundare să poată fi eliminate . Acest lucru este posibil doar dacă ω0 >2ωm în caz contrar semnalul original nu poate fi reconstituit în întregime.

Acest rezultat este cunoscut sub numele de teorema eșantionării (Shannon) care precizează că pentru reconstrucția unui semnal de bandă limitată la fB din eșantioanele sale, preluate cu o frecvență de eșantionare fs este necesar ca frecvența de eșantionare să fie cel puțin dublă față de frecvența maximă fB, din spectrul semnalului. Frecvența fs/2 se numește frecvență Nyquist.

3.2 Relația de conversie

Valoarea trunchiată sau rotunjită se poate exprima în mod exact cu un număr n de biți. De exemplu, în cazul trunchierii,

unde

În cazul rotunjirii,

În cazul convertoarelor bipolare, dacă limitarea numărului de biți este făcută prin trunchiere și se utilizează codul “binar deplasat”:

sau

Dacă limitarea numărului de biți este făcută prin rotunjire,

Eroarea de cuantizare poate fi echivalată cu un zgomot suprapus peste semnal. Parametrii statistici ai acestui zgomot sunt cei ce caracterizează eroarea de cuantizare. Sunt însă necesare ipoteze suplimentare referitoare la caracteristicile spectrale ale zgomotului. Vom accepta următoarele ipoteze:

– zgomotul este alb, având densitatea spectrală de putere, constantă în toată banda de frecvență. În baza acestei ipoteze, două eșantioane de zgomot luate la momente diferite sunt necorelate.

– zgomotul este independent față de semnalul cuantizat.

Ambele ipoteze sunt discutabile. De exemplu, în cazul unui semnal continuu, eroarea este constantă, deci componenta continuă nu are un caracter de zgomot.

Modelul este mai apropiat de realitate în cazul unui semnal aleator.

3.3 Clasificarea CAN

Convertoarele analog numerice neintegrate pot fi împărțite în două mari categorii:

– cu reacție; – cu aproximări succesive;

– cu rampă în trepte;

fără reacție ; – cu rampă liniară;

– paralel;

– serie;

– paralel-serie.

3.3.1 Convertoare cu aproximări succesive

Figura 3.1. Schema bloc a unui CAN cu aproximari succesive

Din schema rezulta:

RAS – registru de aproximări succesive

COMP – comparator;

CAN – convertor numeric analog;

REF – sursa de referință a CAN;

RM – registru de memorie.

Registrul de aproximări succesive este un bloc logic specific acestui tip de convertor. El funcționează secvențial, cu tactul aplicat la intrarea T. Pe intrarea SC (start conversie) se aplică semnalul de comandă pentru începerea unui ciclu de conversie, iar D este o intrare de date. Registrul de aproximări succesive generează pe ieșirile numerele N după un anumit algoritm. După primirea semnalului SC=1, pe frontul primului impuls de tact, se pune bitul cel mai semnificativ Q1=1 și . Valoarea corespunzătoare a tensiunii Uc , generată de CAN, este aplicată comparatorului și comparată cu tensiunea de intrare, Uin. Pe următorul tact, semnalul de la ieșirea COMP, aplicat pe D, este memorat în Q1, rămânând astfel până la sfârșitul ciclului de conversie, iar Q2=1. Procesul continuă până la epuizarea celor n biți.

Sfârșitul conversiei este semnalizat prin semnalul “conversie completă”, CC=1. Funcționarea convertorului este sintetizată în organigrama din figura 3.2.

Fig. 3.2. Schema de funcționare a CAN

Operațiile cuprinse între punctele a și b se execută pe durata unui tact, ta-b =T (ciclul de tact).

Un ciclu de conversie tCONV va avea minimum n tacte, tCONV = n T. Uneori se prevede un tact în plus pentru înregistrarea rezultatului final și inițializări.

3.3.2 Convertoare cu rampă în trepte

Un convertor mai ieftin se poate obține înlocuind registrul de aproximări succesive cu un bloc logic de control, (BLC) mult mai simplu .

Figura 3.3 Schema unui CAN cu rampa in trepte

Odată cu aplicarea comenzii ‘start conversie’ (SC), bistabilul SR trece în starea 1 și deschide poarta P ce permite accesul impulsurilor de tact către numărător. Acesta începe să numere pornind din starea 0, iar numărul respectiv este aplicat pe intrările convertorului numeric-analog. La ieșirea lui va rezulta deci o tensiune de forma unei rampe în trepte. Procesul continuă până când tensiunea Uc depășește nivelul Uin . In momentul când acest nivel a fost depășit, comparatorul trece în starea 1 și resetează bistabilul. In consecință, se blochează poarta P și se oprește accesul impulsurilor de tact către numărător. Totodată se semnalează sfârșitul conversiei prin semnalul CC și se transferă conținutul numărătorului în registrul de memorie RM.

Timpul de conversie este dependent de tensiunea Uin, conform relației

Valoarea maximă este de 2nT , deci crește exponențial cu numărul de biți. Cum alegerea perioadei tactului T este supusă acelorași restricții ca în cazul convertorului cu aproximări succesive, rezultă că în general, acest convertor este mai lent, mai simplu, deci mai ieftin și comparabil ca precizie cu convertorul cu aproximații succesive.

3.3.3 CAN cu rampă liniară (convertor tensiune-timp)

GTLV este un generator de tensiune liniar variabilă comandat. Acesta generează o rampă liniară crescătoare începând de la nivelul -UfM, pe durata cât tensiunea de comandă are nivel logic 0. Bucla formată de COMP3, MS și bistabilul D are rolul de a permite pornirea acestei tensiuni atunci când se aplică un front pozitiv pe intrarea SC, și oprirea, când s-a atins nivelul UfM. Panta TLV este m=UfM/T. În figurile 3.6 și 3.7 sunt date formele de undă în cazurile și respectiv . Din analiza acestora rezultă următoarele concluzii:

– durata deschiderii porții P este în ambele cazuri dată de:

deci circuitul efectuează o conversie tensiune-timp.

– ieșirea bistabilului D din partea superioară a schemei va avea nivel logic 0 dacă tensiunea convertită este negativă și 1 dacă aceasta este pozitivă, deci ea indică semnul tensiunii.

Figura3.4 CAN de tip tensiune-timp

Figura 3.5 Forma de unda in cazul Figura 3.6 Forma de unda in cazul

În continuare problema se reduce la măsurarea numerică a unui interval de timp.

Numărătorul NUM numără impulsurile date de un generator de tact GI pe durata cât poarta P este deschisă. Dacă frecvența tactului este fr=1/Tr, numărul de impulsuri contorizate de numărător pe durata deschiderii porții, tp, este

La cap de scară, , pentru un convertor lucrând cu n biți, inclusiv bitul de semn,

Rezultă deci un timp de conversie tconv=2T=2(2n-1-1)Tr. Frecvența tactului poate fi mai mare decât în cazul convertoarelor cu reacție prezentate mai înainte, fiind limitată în principal de viteza de lucru a numărătorului. De exemplu, pentru 8 biți și fr=10 MHz, , rezultă , ceea ce corespunde unui convertor cu performanțe medii în ceea ce privește viteza.

Rezoluția se obține din

deci este

O rezoluția bună implică o frecvență de tact fr mare și panta UfM/T mică.

Precizia este determinată de:

– liniaritatea tensiunii liniar variabile și precizia pantei acesteia;

– precizia și stabilitatea frecvenței fr;

– calitatea comparatoarelor COMP1,2.

3.3.4 CAN paralel

Convertoarele paralel sunt, din punct de vedere al concepției, cele mai simple și sunt totodată cele mai rapide. În figura 3.8 este prezentată schema unui asemenea convertor de trei biți. Cu ajutorul divizorului format din cele 8 rezistoare se realizează tensiunile de prag pentru cele 7 comparatoare. Acestea sunt: 1/16Uref, 3/16 Uref………….13/16Uref. Se mai poate eventual utiliza un al optulea comparator, având drept prag tensiunea , cu scopul sesizării depășirii.

.Semnalele de la ieșirile comparatoarelor indică nivelul tensiunii în așa-numitul “cod termometric”, ineficient din punct de vedere al numărului de biți utilizați. În consecință va fi necesară o logică de decodare, care realizează trecerea la trei biți. Precizia convertorului este determinată de calitatea comparatoarelor și de precizia cu care sunt realizate pragurile. Aceasta din urmă, este, la rândul ei dependentă de precizia realizării divizorului rezistiv. Dezavantajul major al schemei constă în numărul mare (2n – 1), de comparatoare de mare viteză . Aceasta implică și consumuri foarte mari.

Figura 3.7 CAN paralel cu 3 biti

Utilizând această tehnică, se realizează în prezent convertoare de cel mult 6-8 biți, de viteză mare (timpi de conversie de zeci de nanosecunde) utilizate pentru achiziția semnalului în osciloscoapele numerice, sistemele video, instalații radar. Ca exemplu, circuitul AD9002, produs de Analog Devices, este un convertor de 8 biți, cu o rată de conversie maximă de 150 Meșantioane/secundă.

3.3.5 CAN paralel-serie

Având în vedere complexitatea ridicată a convertoarelor paralel în cazul în care este necesar un număr mai mare de biți, se pot realiza combinații de 2-4 asemenea convertoare, fiecare lucrând pe maximum 4-5 biți. O asemenea schemă este dată în figura 3.9, unde se realizează un convertor de 8 biți, utilizând două convertoare paralel de 4 biți. Primul CAN generează primii 4 biți (cei mai semnificativi) ai rezultatului. Valoarea cuantizată pe 4 biți este apoi aplicată unui CNA, și rezultatul este scăzut din semnalul inițial, evaluându-se în acest mod eroarea de cuantizare. La efectuarea acestei scăderi, semnalul de intrare va trebui să fie întârziat cu un timp egal cu timpul de conversie al primului CAN. Eventual, se poate renunța la această întârziere, dacă se utilizează un circuit de eșantionare-memorare la intrare, care să mențină semnalul aplicat la intrarea convertorului constant pe durata unei conversii. În continuare, eroarea rezultată după prima conversie este și ea cuantizată în al doilea convertor, care generează ultimii 4 biți ai rezultatului. În acest mod se obține un convertor de 8 biți utilizând 30 de comparatoare, în loc de 255, câte ar fi fost necesare în varianta paralel. Evident, și timpul de conversie va fi mai mare, el incluzând de două ori timpul necesar unui CAN, plus timpul de conversie al CNA.

Un exemplu de asemenea convertoare este familia AD7820, 7821, convertoare de 8 biți în două etape, lucrând la circa 1MHz. Un convertor mai rapid este AD9049, lucrând cu 9 biți, la o frecvență maximă de 30MHz.

Figura 3.8 CAN paralel-serie pe 8 biți

3.4 Convertoare analog numerice cu supraeșantionare

Convertoarele cu supraeșantionare se bazează pe utilizarea unui CAN într-o structură ce funcționează în regim de supraeșantionare și cuantizare diferențială cu scopul creșterii rezoluției prin reducerea erorilor de cuantizare. Performanțele unui astfel de convertor pot ajunge până la o rezoluție de 16 18 biți pentru semnale cu banda de frecvență de până la 50 kHz și la rezoluții de 810 biți pentru un semnal banda de frecvență de până la 5 10 MHz.

Raportul de supraeșantionare, notat M este raportul între frecvența impulsurilor de clock și frecvența Nyquist a semnalului de intrare. Acest raport poate fi între 8 și 256. De asemenea, banda de frecvență a semnalului de intrare este invers proporțională cu raportul de supraeșantionare.

Principalele avantaje ale acestor tipuri de convertoare sunt :

– circuitele ce intră în componența unui astfel de convertor sunt în cea mai mare măsură circuite numerice;

– obținerea de rezoluții ridicate;

– cuatizarea pe un bit necesită un CNA de 1 bit ce nu introduce erori INL și DNL

– furnizează mijloacele necesare creșterii preciziei în detrimentul vitezei.

Principalele dezavantaje ale acestor tipuri de convertoare sunt :

– dificultatea modelării și simulării;

– limitarea benzii de frecvență la valoarea dată de frecvența de clock divizată cu factorul de supraeșantionare.

Schema bloc a unui convertor analog numeric cu supraeșantionare este următoarea:

– Circuitul de filtrare previne posibilele erori de aliere datorită frecvențelor ce depășesc frecvența ne lucru

– Circuitul de eșantionare este necesar oricărui circuit de conversie analog numerică

– Circuitul de cuantizare decide care este cea mai apropiată valoare a tensiunii analogică de valoarea tensiunii eșantionate

– Circuitul de codare digitală convertește informația cuantizată într-un semnal numeric

Fie :

fB = banda de frecvență a semnalului analogic

fN = frecvența Nyquist ( = 2f0 )

fS = frecvența de eșantionare sau de clock

factorul de supraeșantionare

Spectrul de frecvență corespunzător unui CAN cu supraeșantionare este prezentat :

Capitolul 4 Schema si descrierea lucrarii practice

4.1 Introducere

Acest capitol este destinat aplicatiei practice realizate. Pe baza cunostintele expuse in primele capitole, a fost realizata o placa multifunctionala destinata in principal scopului propus expus in introducerea lucrarii dar cu ajutorul careia se pot realiza si alte obiective. Obiectivul principal, cel al determinarii vitezei de reactie poate fi realizat fie cu preluarea manuala a informatiei, fie prin stocarea automata a informatiei pentru o prelucrare mai usoara a datelor. In acest scop s-a folosit un calculator al carui microprocesor (in varianta fara calculator ar fi un microcontroler) realizeaza comenzile cu ajutorul unui program ce se gaseste anexat.

Legatura intre calculator si placa se face prin port paralel. In sistemele digitale actuale se folosesc două moduri de transmisie a datelor: paralel si serie. În cazul celor seriale se transmite de la un dispozitiv la altul câte un singur bit odată. In cazul unei transmisii paralele un echipament trimite altuia mai multi biti odată, in paralel pe mai multe fire. În cazul portului paralele de se folosesc opt fire. S-ar parea ca portul paralel transmite de opt ori mai repede decat portul serie. De asemenea costul unui cablu pentru portul paralel pare a fi de opt ori mai mare in mod logic. Cu toate acestea datorită modului în care sunt proiectate cablurile lucrurile nu stau chiar așa. Cablurile pentru transmisii seriale sunt mai performante, capabile de transmisii pe distante mai mari și putin mai scumpe. Cele pentru transmisiile paralele sunt mai scurte și putin mai ieftine.

Transmisia datelor pe un port paralel cere încă alte trei linii, strobe, acknowledge și busy(ocupat)

Scenariul unei transmisii digitale este descries in pașii de mai jos:

Expeditor:

Verifică dacă linia este ocupată, în caz că e ocupată așteaptă până la eliberarea acesteia.

Expeditorul pune datele pe magistrală

Activează linia strobe

Așteaptă ca linia de confirmare să devină activă

Setează strobe inactive

Asteaptă ca linia de confirmare să devină inactive

Se repetă pașii 1-6 pentru fiecare bit transmis

Destinatar:

1) Setează linia de ocupat inactivă, în cazul în care este gata să primească date

2) Așteaptă în buclă pentru ca linia de strobe să devină activă

3) Citește data de pe magistrala de date, eventual o prelucrează dacă este necesar

4) Activează linia de confirmare

5) Așteaptă în buclă pentru ca linia de strobe să devină inactivă

6) Setează linia de confirmare înactivă

7) Repetă pașii 1-6 pentru fiecare bit primit.

Table 4.1 Pini portului paralel

Registrul de stare are 8 biți, cu semnificația urmatoare:

0-nefolosit

1-imprimanta recunoaste sisteme PS/2

3-eroare

4-echipament selectat

5-echipamentul nu mai are hârtie

6-linia de confirmare

7-imprimantă ocupată

Registrul de control are tot 8 biți:

0-Strobe(date disponibile)

1-countinuă cu linie nouă

2-inițializare

3-selectare intrare

4-activează portul paralel IRQ

5-direcția datelor PS/2

6-nefolosit

7-nefolosit

4.2 Prezentarea schemei electronice a dispozitivului folosit.

Figura 4.2 Montajul de realizare practică

Folosim o placă universală, cu conecatre la portul paralel al calculatorului, care contine următoarele component:

-un convertor analog-numeric

-un convertor numeric analogic

-generator semnal de tact cu ajutorul unui timer

-latch

-două butoane comandate manual

-un set de leduri

Figura 4.3 Schema montajului utilizat in aplicație

La pinii de date ai portului paralel se trimit biții care comandă starea LED-urilor. Se vor alege două stări usor de identificat de catre subiectul testului vitezei de reactie. Se folosește latchul SN74HC573AN pentru a transmite mai departe semnalul catre LED-uri.

Semnalul de la timerul realizat cu circuitul integrat TS 555IN este folosit pentru contorizarea timpului. Semnalul merge la linia de ocupat.

Semnalul de la intrerupătoare, comandate manual, merge la linia de hartie lipsă și cea de selectare imprimantă. Chiar dacă destinațiile inițale nu sunt specifice circuitului nostrum, ele pot fi schimbate prin programul ce va controla aplicația.

Algoritmul necesar pentru implemantarea programului care să controleze dispozitivul respecte cele ce urmeaza. Se atribuie in mod aleator unei variabile valoarea 0 sau 1 (pentru ca LED-ul sa lumineze). Pentru reactii diferite (de exemplu in cazul unui jucator de jotbal piciorul stang – piciorul drept) sunt folosite doua seturi de cate 4 LED-uri. Celeilalte variabile i se atribuie valoarea complementară. Pentru fiecare caz se seteaza biții pentru cele 8 LED-uri. Cele două variante trebuie sa fie cât mai usor de distins cu ochiul liber. Se incepe apoi numărarea cu ajutorul semnalului de pe pinul 11, de linie ocupată. După fiecare incrementare a variabilei timp se verifică registrul de stare. Conținutul registrului de stare se returnează in registrul AH, biții 4

și 5. Dacă unul din buoane a fost apăsat atunci bitul corespunzător va avea valoarea nulă. Prin operația logică ȘI cu variabilele stabilite aleator trebuie să se obtină valoarea 0 0. In acest caz se oprește timerul și se afișează timpul. În cazul în care un bit e nenul înseamană că a fost apăsat butonul greșit.

Concluzii

La aceleasi rezulte (in cazul de fata testarea vitezei de reactie a unui sportiv) se poate ajunge prin mai multe metode si chiar dispozitivele electronice ajutatoare pot fi realizate in diverse moduri (comanda de la calculator sau cu microcontroler, comanda si cu microcontroler si de la microprocesorul unui calculator sau doar cu microcontroler), decizia pentru alegerea metodei fiind influentata, asa cum am aratat si in capitolele doi si trei, de mai multi factori. Este bine caatunci cand se realizeaza o astfel de placa sa se aiba in vedere posibilitatea ca ea sa poata fi folosita si in scopul altor aplicatii sau aplicatia initiala sa poata fi imbunatatita cu usurinta. De multe ori inginerul electronist trebuie sa “prevada” ca cel care comanda placa este posibil sa aduca sugestii in vederea imbunatatirii scopului initial, fara a-si da seama ca o modificare “minora” a aplicatiei poate implica modificari majore asupra placii.

Anexe

// ParallelPortDlg.cpp : implementation file

//

#include "stdafx.h"

#include "ParallelPort.h"

#include "ParallelPortDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

#define DATA 0x378

#define STATUS 0x379

#define CONTROL 0x37a

short _stdcall Inp32(short portaddr);

void _stdcall Out32(short portaddr, short datum);

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CParallelPortDlg dialog

CParallelPortDlg::CParallelPortDlg(CWnd* pParent /*=NULL*/)

: CDialog(CParallelPortDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CParallelPortDlg)

m_pin1 = FALSE;

m_pin10 = FALSE;

m_pin11 = FALSE;

m_pin12 = FALSE;

m_pin13 = FALSE;

m_pin14 = FALSE;

m_pin15 = FALSE;

m_pin16 = FALSE;

m_pin17 = FALSE;

m_pin2 = FALSE;

m_pin3 = FALSE;

m_pin4 = FALSE;

m_pin5 = FALSE;

m_pin6 = FALSE;

m_pin8 = FALSE;

m_pin7 = FALSE;

m_pin9 = FALSE;

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CParallelPortDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CParallelPortDlg)

DDX_Check(pDX, IDC_Pin1, m_pin1);

DDX_Check(pDX, IDC_Pin10, m_pin10);

DDX_Check(pDX, IDC_Pin11, m_pin11);

DDX_Check(pDX, IDC_Pin12, m_pin12);

DDX_Check(pDX, IDC_Pin13, m_pin13);

DDX_Check(pDX, IDC_Pin14, m_pin14);

DDX_Check(pDX, IDC_Pin15, m_pin15);

DDX_Check(pDX, IDC_Pin16, m_pin16);

DDX_Check(pDX, IDC_Pin17, m_pin17);

DDX_Check(pDX, IDC_Pin2, m_pin2);

DDX_Check(pDX, IDC_Pin3, m_pin3);

DDX_Check(pDX, IDC_Pin4, m_pin4);

DDX_Check(pDX, IDC_Pin5, m_pin5);

DDX_Check(pDX, IDC_Pin6, m_pin6);

DDX_Check(pDX, IDC_Pin8, m_pin8);

DDX_Check(pDX, IDC_Pin7, m_pin7);

DDX_Check(pDX, IDC_Pin9, m_pin9);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CParallelPortDlg, CDialog)

//{{AFX_MSG_MAP(CParallelPortDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_TIMER()

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

//}}AFX_MSG_MAP

//Code added by me from here.

ON_COMMAND_RANGE(IDC_Pin2, IDC_Pin9, ChangePin)

ON_COMMAND(IDC_Pin14, ChangeControl)

ON_COMMAND(IDC_Pin16, ChangeControl)

ON_COMMAND(IDC_Pin17, ChangeControl)

ON_COMMAND(IDC_Pin1, ChangeControl)

//Code added by me till here

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CParallelPortDlg message handlers

BOOL CParallelPortDlg::OnInitDialog()

{

//App.Wiz generated code

// TODO: Add extra initialization here

SetTimer(1,200,NULL);

Out32(CONTROL, Inp32(CONTROL) & 0xDF);

UpdatePins();

return TRUE; // return TRUE unless you set the focus to a control

CDialog::OnInitDialog();

// Add "About…" menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

}

void CParallelPortDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CParallelPortDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() – cxIcon + 1) / 2;

int y = (rect.Height() – cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CParallelPortDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CParallelPortDlg::UpdatePins()

{

int reg;

reg=Inp32(STATUS);

if((reg & 0x40)==0) m_pin10=0; else m_pin10=1;

if((reg & 0x80)==0) m_pin11=0; else m_pin11=1;

if((reg & 0x20)==0) m_pin12=0; else m_pin12=1;

if((reg & 0x10)==0) m_pin13=0; else m_pin13=1;

if((reg & 0x08)==0) m_pin15=0; else m_pin15=1;

//////////

reg=Inp32(DATA);

if((reg & 0x01)==0) m_pin2=0; else m_pin2=1;

if((reg & 0x02)==0) m_pin3=0; else m_pin3=1;

if((reg & 0x04)==0) m_pin4=0; else m_pin4=1;

if((reg & 0x08)==0) m_pin5=0; else m_pin5=1;

if((reg & 0x10)==0) m_pin6=0; else m_pin6=1;

if((reg & 0x20)==0) m_pin7=0; else m_pin7=2;

if((reg & 0x40)==0) m_pin8=0; else m_pin8=1;

if((reg & 0x80)==0) m_pin9=0; else m_pin9=1;

//////

reg = Inp32(CONTROL);

if((reg & 0x01)==0) m_pin1=0; else m_pin1=1;

if((reg & 0x02)==0) m_pin14=0; else m_pin14=1;

if((reg & 0x04)==0) m_pin16=0; else m_pin16=1;

if((reg & 0x08)==0) m_pin17=0; else m_pin17=1;

UpdateData(FALSE);

}

void CParallelPortDlg::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

int status_reg;

status_reg=Inp32(STATUS);

if((status_reg & 0x40)==0) m_pin10=0; else m_pin10=2;

if((status_reg & 0x80)==0) m_pin11=0; else m_pin11=1;

if((status_reg & 0x20)==0) m_pin12=0; else m_pin12=1;

if((status_reg & 0x10)==0) m_pin13=0; else m_pin13=1;

if((status_reg & 0x08)==0) m_pin15=0; else m_pin15=1;

UpdateData(FALSE);

if (nIDEvent == 2){

timp=timp+1;

if (m_pin12==FALSE || m_pin13==FALSE) {

if (m_pin9==FALSE){

tireg=timp;

timp=0;

m_pin9=TRUE;

char text[255];

sprintf(text,"For an A you will need: %d", timp);

MessageBox(text,"Graded Needed",MB_OK);

}

}

}

CDialog::OnTimer(nIDEvent);

}

void CParallelPortDlg::ChangePin()

{

int data_register, new_register;

UpdateData(TRUE);

data_register=Inp32( DATA );

new_register=0;

if( m_pin2==TRUE ) new_register |= 0x01;

if( m_pin3==TRUE ) new_register |= 0x02;

if( m_pin4==TRUE ) new_register |= 0x04;

if( m_pin5==TRUE ) new_register |= 0x08;

if( m_pin6==TRUE ) new_register |= 0x10;

if( m_pin7==TRUE ) new_register |= 0x20;

if( m_pin8==TRUE ) new_register |= 0x40;

if( m_pin9==TRUE ) new_register |= 0x80;

Out32(DATA, new_register);

}

void CParallelPortDlg::ChangeControl()

{

int control_register, new_register;

UpdateData(TRUE);

control_register = Inp32( CONTROL );

new_register = control_register;

if( m_pin1== 0 ) new_register &= 0xFE;

else new_register |= 0x01;

if( m_pin14==0 ) new_register &= 0xFD;

else new_register |= 0x02;

if( m_pin16==0 ) new_register &= 0xFB;

else new_register |= 0x04;

if( m_pin17==0 ) new_register &= 0xF7;

else new_register |= 0x08;

Out32(CONTROL, new_register);

}

void CParallelPortDlg::OnButton1()

{

// TODO: Add your control notification handler code here

int a=rand()%2;

m_pin9=FALSE;

m_pin2=FALSE;

m_pin3=FALSE;

m_pin4=FALSE;

m_pin5=FALSE;

m_pin6=FALSE;

m_pin7=FALSE;

m_pin8=FALSE;

m_pin9=FALSE;

if (a==1){

m_pin2=TRUE;

m_pin3=TRUE;

m_pin4=TRUE;

m_pin5=TRUE;

SetTimer(2,10,NULL);

}

else {

m_pin6=TRUE;

m_pin7=TRUE;

m_pin8=TRUE;

SetTimer(2,10,NULL);

}

}

Anexe

// ParallelPortDlg.cpp : implementation file

//

#include "stdafx.h"

#include "ParallelPort.h"

#include "ParallelPortDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

#define DATA 0x378

#define STATUS 0x379

#define CONTROL 0x37a

short _stdcall Inp32(short portaddr);

void _stdcall Out32(short portaddr, short datum);

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CParallelPortDlg dialog

CParallelPortDlg::CParallelPortDlg(CWnd* pParent /*=NULL*/)

: CDialog(CParallelPortDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CParallelPortDlg)

m_pin1 = FALSE;

m_pin10 = FALSE;

m_pin11 = FALSE;

m_pin12 = FALSE;

m_pin13 = FALSE;

m_pin14 = FALSE;

m_pin15 = FALSE;

m_pin16 = FALSE;

m_pin17 = FALSE;

m_pin2 = FALSE;

m_pin3 = FALSE;

m_pin4 = FALSE;

m_pin5 = FALSE;

m_pin6 = FALSE;

m_pin8 = FALSE;

m_pin7 = FALSE;

m_pin9 = FALSE;

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CParallelPortDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CParallelPortDlg)

DDX_Check(pDX, IDC_Pin1, m_pin1);

DDX_Check(pDX, IDC_Pin10, m_pin10);

DDX_Check(pDX, IDC_Pin11, m_pin11);

DDX_Check(pDX, IDC_Pin12, m_pin12);

DDX_Check(pDX, IDC_Pin13, m_pin13);

DDX_Check(pDX, IDC_Pin14, m_pin14);

DDX_Check(pDX, IDC_Pin15, m_pin15);

DDX_Check(pDX, IDC_Pin16, m_pin16);

DDX_Check(pDX, IDC_Pin17, m_pin17);

DDX_Check(pDX, IDC_Pin2, m_pin2);

DDX_Check(pDX, IDC_Pin3, m_pin3);

DDX_Check(pDX, IDC_Pin4, m_pin4);

DDX_Check(pDX, IDC_Pin5, m_pin5);

DDX_Check(pDX, IDC_Pin6, m_pin6);

DDX_Check(pDX, IDC_Pin8, m_pin8);

DDX_Check(pDX, IDC_Pin7, m_pin7);

DDX_Check(pDX, IDC_Pin9, m_pin9);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CParallelPortDlg, CDialog)

//{{AFX_MSG_MAP(CParallelPortDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_TIMER()

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

//}}AFX_MSG_MAP

//Code added by me from here.

ON_COMMAND_RANGE(IDC_Pin2, IDC_Pin9, ChangePin)

ON_COMMAND(IDC_Pin14, ChangeControl)

ON_COMMAND(IDC_Pin16, ChangeControl)

ON_COMMAND(IDC_Pin17, ChangeControl)

ON_COMMAND(IDC_Pin1, ChangeControl)

//Code added by me till here

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CParallelPortDlg message handlers

BOOL CParallelPortDlg::OnInitDialog()

{

//App.Wiz generated code

// TODO: Add extra initialization here

SetTimer(1,200,NULL);

Out32(CONTROL, Inp32(CONTROL) & 0xDF);

UpdatePins();

return TRUE; // return TRUE unless you set the focus to a control

CDialog::OnInitDialog();

// Add "About…" menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

}

void CParallelPortDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CParallelPortDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() – cxIcon + 1) / 2;

int y = (rect.Height() – cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CParallelPortDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CParallelPortDlg::UpdatePins()

{

int reg;

reg=Inp32(STATUS);

if((reg & 0x40)==0) m_pin10=0; else m_pin10=1;

if((reg & 0x80)==0) m_pin11=0; else m_pin11=1;

if((reg & 0x20)==0) m_pin12=0; else m_pin12=1;

if((reg & 0x10)==0) m_pin13=0; else m_pin13=1;

if((reg & 0x08)==0) m_pin15=0; else m_pin15=1;

//////////

reg=Inp32(DATA);

if((reg & 0x01)==0) m_pin2=0; else m_pin2=1;

if((reg & 0x02)==0) m_pin3=0; else m_pin3=1;

if((reg & 0x04)==0) m_pin4=0; else m_pin4=1;

if((reg & 0x08)==0) m_pin5=0; else m_pin5=1;

if((reg & 0x10)==0) m_pin6=0; else m_pin6=1;

if((reg & 0x20)==0) m_pin7=0; else m_pin7=2;

if((reg & 0x40)==0) m_pin8=0; else m_pin8=1;

if((reg & 0x80)==0) m_pin9=0; else m_pin9=1;

//////

reg = Inp32(CONTROL);

if((reg & 0x01)==0) m_pin1=0; else m_pin1=1;

if((reg & 0x02)==0) m_pin14=0; else m_pin14=1;

if((reg & 0x04)==0) m_pin16=0; else m_pin16=1;

if((reg & 0x08)==0) m_pin17=0; else m_pin17=1;

UpdateData(FALSE);

}

void CParallelPortDlg::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

int status_reg;

status_reg=Inp32(STATUS);

if((status_reg & 0x40)==0) m_pin10=0; else m_pin10=2;

if((status_reg & 0x80)==0) m_pin11=0; else m_pin11=1;

if((status_reg & 0x20)==0) m_pin12=0; else m_pin12=1;

if((status_reg & 0x10)==0) m_pin13=0; else m_pin13=1;

if((status_reg & 0x08)==0) m_pin15=0; else m_pin15=1;

UpdateData(FALSE);

if (nIDEvent == 2){

timp=timp+1;

if (m_pin12==FALSE || m_pin13==FALSE) {

if (m_pin9==FALSE){

tireg=timp;

timp=0;

m_pin9=TRUE;

char text[255];

sprintf(text,"For an A you will need: %d", timp);

MessageBox(text,"Graded Needed",MB_OK);

}

}

}

CDialog::OnTimer(nIDEvent);

}

void CParallelPortDlg::ChangePin()

{

int data_register, new_register;

UpdateData(TRUE);

data_register=Inp32( DATA );

new_register=0;

if( m_pin2==TRUE ) new_register |= 0x01;

if( m_pin3==TRUE ) new_register |= 0x02;

if( m_pin4==TRUE ) new_register |= 0x04;

if( m_pin5==TRUE ) new_register |= 0x08;

if( m_pin6==TRUE ) new_register |= 0x10;

if( m_pin7==TRUE ) new_register |= 0x20;

if( m_pin8==TRUE ) new_register |= 0x40;

if( m_pin9==TRUE ) new_register |= 0x80;

Out32(DATA, new_register);

}

void CParallelPortDlg::ChangeControl()

{

int control_register, new_register;

UpdateData(TRUE);

control_register = Inp32( CONTROL );

new_register = control_register;

if( m_pin1== 0 ) new_register &= 0xFE;

else new_register |= 0x01;

if( m_pin14==0 ) new_register &= 0xFD;

else new_register |= 0x02;

if( m_pin16==0 ) new_register &= 0xFB;

else new_register |= 0x04;

if( m_pin17==0 ) new_register &= 0xF7;

else new_register |= 0x08;

Out32(CONTROL, new_register);

}

void CParallelPortDlg::OnButton1()

{

// TODO: Add your control notification handler code here

int a=rand()%2;

m_pin9=FALSE;

m_pin2=FALSE;

m_pin3=FALSE;

m_pin4=FALSE;

m_pin5=FALSE;

m_pin6=FALSE;

m_pin7=FALSE;

m_pin8=FALSE;

m_pin9=FALSE;

if (a==1){

m_pin2=TRUE;

m_pin3=TRUE;

m_pin4=TRUE;

m_pin5=TRUE;

SetTimer(2,10,NULL);

}

else {

m_pin6=TRUE;

m_pin7=TRUE;

m_pin8=TRUE;

SetTimer(2,10,NULL);

}

}

Similar Posts