Microcontrolerul

CAP 1. MICROCONTROLERE – NOȚIUNI GENERALE

1.1. INTRODUCERE ȘI DEFINIȚIE

De-a lungul timpului oamenii au încercat să găsească diverse metode de a automatiza procesele tehnologice din dorința de a spori productivitatea, de a mări precizia (corectitudinea) executării proceselor, de a micșora timpul alocat realizării acestor procese și de a mări calitatea și fiabilitatea produselor rezultate în urma proceselor.

Un controler este un sistem folosit pentru a comanda și a prelua stări sau informații de la un proces sau un aspect al mediului înconjurator, fără intervenția opeartorului uman.

La originile apariției lor, controlerele erau echipamente electronice de mari dimeniuni, consumul de energie era pe măsură, iar fiabilitatea lăsa de dorit. Primele controlere au fost realizate în tehnologii pur analogice, folosind componente electronice discrete și/sau componente electromecanice (de exemplu relee). Apoi, s-a trecut treptat la o tehnică numerică realizată pe baza logicii cablate (cu circuite integrate numerice standard SSI și MSI) având ca suport o electronică uneori complexă.

Odată cu trecerea timpului și deci cu evoluția tehnologică, dimensiunile, consumul și costurile acestor controlere s-au redus considerabil. Un rol important îl are apariția circuitelor integrate, care a permis încorporarea a câteva sute de mii de tranzistoare pe un singur chip.

O altă contribuție decisivă în miniaturizarea controlerelor a avut-o apariția microprocesoarelor de uz general. Acestea s-au dezvoltat pe două direcții și anume:

realizarea unor procesoare cât mai performante prin mărirea lungimii cuvântului (de ex. 32 de biți), creșterea vitezei de procesare pe baza creșterii frecvenței de tact (la sute și chiar mii de MHz) și prin introducerea unor tehnici de prelucrare în paralel (pipe-line);

realizarea unor procesoare de funcționare în timp real, destinate conducerii proceselor

Astfel, toate componentele necesare unui controler au fost integrate pe același chip. A luat naștere, prin urmare, calculatorul pe un singur chip, specializat pentru implementarea operațiilor de control: acesta este microcontroler-ul.

O definiție, cu un sens foarte larg de cuprindere, ar fi aceea că un microcontroler este un microcircuit care încorporeaza o unitate centrală (CPU) și o memorie împreună cu resurse care îi permit interacțiunea cu mediul exterior.

1.2. COMPONENTELE SPECIFICE UNUI MICROCONTROLER

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

O unitate centrală de procesare (CPU), cu un oscilator intern pentru ceasul de sistem. CPU este o unitate care execută operații aritmetice, logice, operații la nivel de bit, mută conținutul unor locații de memorie în alte locații și altele. Această unitate dispune și ea de niște locații de memorie numite regiștri.

Pentru a executa operații asupra unor date din memorie, CPU aduce datele din memorie și le stochează în regiștrii proprii. Operația propriu-zisă este efectuată de subunități din cadrul CPU, precum: UAL (unitate aritmetico-logică), multiplicatoare, registre de deplasare sau rotație etc. Rezultatul operației este mai întâi depus în registrele interne, pentru ca apoi să fie mutate de CPU în memorie.

O memorie locală de tip ROM/PROM/EPROM/FLASH și eventual una de tip RAM. Este acea parte a microcontrolerului a cărei funcție este de a înmagazina date.

Pentru o anumită intrare se returnează conținutul unei anumite locații de memorie adresate. Memoria reprezintă totalitatea locațiilor de memorie ce pot fi adresate. Accesul la memorie este gestionat de o linie de control, care specifică dacă se scrie în memorie sau se citește din memorie.

Un sistem de magistrale. Magistralele reprezintă calea de comunicație dintre CPU, memorie și unitățile I/O. Fizic, magistrala este un grup de fire. Procesorul furnizează adresa datei ce trebuie citită sau scrisă și o depune pe magistrala de adrese (unidirecțională). Operanzii sau rezultatul unei operații sunt aduse din memorie respectiv depuse în memorie prin magistrala bidirecțională de date.

I/O – intrări/ieșiri numerice (de tip port paralel). Aceste unități de I/O sunt adesea numite ‘porturi’. Porturile permit comunicarea dintre microcontroller și lumea externă.

Când se lucrează cu el, portul se comportă ca o locație de memorie (se scrie în el sau se citește din el). Magistralele de date care preiau informații din exterior sau transmit informația în exterior sunt vizibile cu ochiul liber ca pini ai componentei electronice.

Un sistem de întreruperi. Acest sistem este format din semnale de control ce provoacă oprirea procesorului (a execuției instrucțiunii curente) sau a altor elemente ale microcontrollerului, atunci cand apare o situație excepțională, cum ar fi: atingerea unei valori a unui fanion de depășire, execuția unei instrucțiuni de salt sau de apel al unei subrutine, intrarea microcontrolerului în stare de inactivitate (idle) în vederea unui consum mai mic de energie etc. O întrerupere poate fi inițiată hardware sau software. Toate întreruperile sunt stocate într-o tabelă cu vectori de întrerupere, ce se află de obicei la începutul sau sfârșitul zonei de memorie.

Un port serial de tip asincron și/sau sincron, programabil. Prin acest port se comunică într-un mod ordonat cu exteriorul.

Există cel puțin o linie de recepție a datelor, una de transmisie a datelor și o linie de referință.

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

Timerul se bazează pe un contor liber care este de fapt un registru a cărui valoare numerică este incrementată la intervale egale de timp (cu o frecvență prestabilită). Timerul generează semnale la intervale regulate de timp.

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

Un sistem de conversie analog numerică (una sau mai multe intrări analogice).

Un sistem de conversie numeric analogic și/sau iesiri PWM (cu modulare în durată). Acest sistem preia o valoare numerică returnată de CPU și o convertește în valoare analogică.

Un comparator analogic.

O memorie de date nevolatilă de tip EEPROM. Cea mai importantă caracteristică a acestei memorii este că păstrează conținutul din locațiile sale de memorie și după închiderea sursei de alimentare.

Facilități suplimentare pentru sistemul de temporizare/numărare (captare și comparare)

Un ceas de gardă (timer de tip watchdog).

Această unitate se bazează tot pe un contor liber, unde programul trebuie să scrie un zero ori de câte ori se execută corect.

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 întreruperilor rapid și 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.

OBSERVAȚIE 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).

1.3. FAMILIA DE MICROCONTROLERE ATMEL AVR

Compania Atmel produce microcontrolere ce pot fi divizate în 3 familii:

Atmel AVR pe 8 și 32 de biți. Această soluție livrează o combinație unică între performanță, consum eficient de putere și un design flexibil. Sunt proiectate pentru a se adapta noilor cerințe de pe piață, bazându-se pe una dintre cele mai eficiente arhitecturi din punct de vedere al codului, atât pentru limbajul de programare C cât și pentru limbajul de asamblare.

Microcontrolere bazate pe arhitectura ARM. Un exemplu este microcontrolerul Atmel ARM Cortex A5. Este un design pe 32 de biți, cu un nivel ridicat de integrare și flexibilitate. Aceste microcontrolere sunt destinate optimizării controlului unor sisteme, conexiunilor cu fir și wireless, gestiunii interfeței cu utilizatorul, consumului scăzut de energie și utilizării facile.

Microcontrolere bazate pe arhitectura 8051. Dezvoltatorii pot alege între procesorul puternic pe 8 biți AT89LP (cu execuție a instrucțiunilor într-un singur ciclu de ceas și cu eficiență energetică) sau procesorul industrial MCS-51 cu tehnologie Flash avansată.

În lucrarea de față voi alege un microcontroler din familia AVR. Microcontrolerele din această familie au la bază un nucleu RISC cu arhitectură Harvard. Aceste microcontrolere sunt destinate aplicațiilor simple: controlul motoarelor, controlul fluxului de informație pe portul USB, aplicații din domeniul automotive, controlul accesului de la distanță (Remote Access Control), s.a.. Pe baza acestui nucleu firma Atmel a dezvoltat mai multe familii de microcontrolere, cu diferite structuri de memorie și de interfețe I/O, destinate diferitelor clase de aplicații.

Familia de procesoare AVR pe 8 biți are următoarele caracteristici:

Arhitectură RISC

32 de registre de lucru pe 8 biți

Multiplicator hardware

Arhitectură Harvard a spațiului (memorie internă: 16 KB memorie de program flash, 1 KB memorie de date de tip SRAM, 512 B memorie de date de tip EEPROM)

Frecvența de lucru poate fi controlată prin software de la 0 la 16 MHz

Procesoarele sunt prevăzute cu o gamă largă de dispozitive I/O și de periferice încorporate

Timer programabil cu circuit de prescalare

Surse de întrerupere interne și externe

Timer de urmărire (watchdog) cu oscilator independent

Interfață JTAG (standardul IEEE 1149.1 Compliant)

6 moduri de operare SLEEP și POWER DOWN pentru economisirea energiei

Oscilator integrat RC

Densitate mare a codului și compatibilitate integrală a codului între membrii familiei

Procesoarele sunt disponibile în capsule variate, de la circuite cu 8 pini la procesoare cu 68 de pini

Familia AVR beneficiază de existența unui set unitar de instrumente software pentru dezvoltarea aplicațiilor

Microcontrolerele din familia AVR folosesc o arhitectură RISC care permite execuția celor mai multe instrucțiuni într-un singur ciclu de tact, ceea ce duce la îmbunătățirea performanței de 10 ori față de procesoarele convenționale (de exemplu, Intel 8051) care operează la aceeași frecvență.

CAP 2. PLACA DE DEZVOLTARE ARDUINO UNO CU MICROCONTROLER ATMEL ATMEGA328P-PU

2.1. PREZENTARE GENERALĂ

Arduino Uno este un sistem de dezvoltare ce are la bază microcontrolerul Atmel ATmega328P. Dispune de 14 pini digitali de intrare / ieșire (6 dintre acești 14 pini de ieșire fiind uitilizați ca ieșiri cu pulsuri modulate în durată – “Pulse Width Modulation”PWM ), 6 pini de intrare analogici, un rezonator ceramic cu frecvența de până la 16 MHz, o conexiune USB, o alimentare cu mufă de tip jack, un header ICSP și un buton de reset. Placuța de dezvoltare poate fi conectată la calculator prin conexiunea USB, poate fi alimentată cu baterii sau cu ajutorul unui adaptor AC-DC direct de la rețeaua de tensiune (de la priză). Spre deosebire de alte placuțe Arduino, Arduino Uno nu folosește driverul FTDI pentru comunicația USB-serială, ci vine cu chipul ATmega16U2 încorporat, programat ca și convertor USB-serial. Au existat 3 variante ale plăcuței Arduino.

Varianta 2 vine cu îmbunătățiri față de prima variantă aparută. Această îmbunătățire constă în faptul că există un rezistor care cuplează linia 8U2 HWB la masă, fiind astfel mai facilă intrarea în modul DFU. Acest mod DFU este un mod de programare în care este permisă actualizarea firmware-ului.

Varianta revizuită nr. 3 (cea actuală) a venit cu următoarele modificări:

Se adaugă pinii SDA și SCL care sunt lângă pinul AREF și încă doi pini noi plasați lângă pinul de RESET. Unul este pinul IOREF care îi permite unui shield (adaptor) să se adapteze la tensiunea furnizată de placuță. Celălalt este un pin neconectat, rezervat unor scopuri ulterioare.

Se montează un circuit de RESET mai puternic

Chipul ATmega8U2 se înlocuiește cu cipul ATmega16U2.

2.2. CARACTERISTICILE PLĂCII DE DEZVOLTARE

Microcontroler : ATmega328P

Operează pe două nivele de tensiune: 3.3V și 5V;

Tensiuni de intrare recomandate între 7 – 12V;

Tensiuni de intrare limită între 6 – 20V;

Pini digitali I/O: 14 (dintre care 6 ieșiri PWM);

Pini analogici de intrare : 6;

Curent continuu per pin I/O: 40mA;

Curent continuu per pin alimentat la 3.3V: 50mA;

Memorie de tip FLASH: 32KB (ATmega328) din care 0.5KB folosiți pentru bootloader;

Memorie de tip SRAM : 2 KB (ATmega328);

Memorie de tip EEPROM : 1 KB (ATmega328);

Viteza ceasului de sistem : 16MHz.

2.3. ALIMENTAREA PLĂCII DE DEZVOLTARE

Plăcuța Arduino Uno poate fi alimentată prin conexiunea USB sau printr-o sursă de putere externă. Sursa de putere este selectată automat.

Sursa externă de putere (non USB) poate fi o baterie sau rețeaua de tensiune (220V și 50 Hz în Europa sau 230V și 60Hz în America) , caz în care se va utiliza un adaptor AC-DC. Adaptorul poate fi cuplat la alimentarea de pe placă cu ajutorul unei mufe de centru pozitiv de 2.1mm. Bornele bateriei se pot cupla la pinii Gnd și Vin de la headerul POWER de pe plăcuță pentru a o alimenta.

Plăcuța poate opera normal primind tensiune de la sursa externă în limitele 6 – 20V. Totuși, s-ar putea ca atunci când este alimentată cu o tensiune sub 7V, pinul ce lucrează la tensiuni de 5V să primească mai puțin de 5V și astfel microcontrolerul devine instabil. La tensiuni de alimentare mai mari de 12V, stabilizatorul de tensiune încorporat să se supraîncălzească și să afecteze funcționarea corectă a plăcuței. Gama de valori de tensiuni de alimentare recomandate este între 7 și 12 volți.

Pinii de alimentare sunt următorii:

Vin. Acesta este pinul de alimentare al plăcuței Arduino doar în cazul în care se utilizează o sursă de alimentare externă (alimentarea prin USB sau printr-o altă sursă stabilizată de alimentare se face cu o tensiune de 5 V). Prin acest pin se poate furniza tensiune sau se poate accesa tensiunea de alimentare în cazul în care alimentarea cu tensiune se face prin mufa jack.

5V. Acest pin are asociată o tensiune stabilizată de 5V care vine de la stabilizatorul de pe plăcuță. Plăcuța poate fi alimentată cu energie prin intermediul unui cablu cu mufă jack ce furnizează tensiune continuă (7 – 12V) , prin conectorul USB (5V) sau prin pinul Vin de pe plăcuță (între 7 și 12V). Atunci când alimentarea plăcuței se realizează prin pinii de 5V și respectiv de 3.3V stabilizatorul este șuntat (în plăcuță intră tensiune nestabilizată), iar acest lucru poate distruge plăcuța și nu este recomandat, mai ales în cazul unor fluctuații de tensiune.

3V3. Acest pin furnizează o tensiune de 3.3V, generată de stabilizatorul on-board. Curentul maxim aferent este de 50mA.

GND. Reprezintă pinii de masă ai plăcuței.

IOREF. Acest pin de pe plăcuță asigura tensiunea de referință cu care operează microcontrolerul. Un shield configurat corect poate citi valoarea tensiunii de pe pinul IOREF și poate selecta sursa de alimentare corespunzătoare procesului în desfășurare sau poate activa traductoarele de tensiune de pe ieșirile pinilor de lucru la 5V sau la 3.3V.

2.4. MICROCONTROLERUL AVR ATMEL ATMEGA328P-PU

2.4.1. Caracteristicile generale ale acestui microcontroler sunt:

Microcontroler pe 8 biți cu performanță crescută și putere consumată mică

Arhitectură RISC avansată:

131 de instrucțiuni puternice, majoritatea fiind executate într-un singur ciclu de ceas

32 de registre de uz general de 8 biți

Capacitate de execuție de până la 20MIPS la frecvența maximă de 20MHz

Multiplicator on-chip cu execuție în 2 ciclii de ceas

Segmente de memorie non-volatilă de mare anduranță:

32KB memorie Flash auto-programabilă

1KB memorie EEPROM

2KB memorie SRAM internă

Ciclii de scriere / ștergere: 10.000 Flash , 100.000 EEPROM

Secțiune de memorie de Boot Code cu biți de blocare, programare in-system de către programul Boot on-chip și caracteristică True Read-While-Write Operation

Retenția datelor: 20 de ani la 85 ̊C / 100 de ani la 25 ̊C

Modul de blocare a programării pentru securitate software

Caracteristici periferice:

Două timere/numărătoare pe 8 biți cu circuit de prescalare și comparare

Un timer/numărător pe 16 biți cu circuit de prescalare, comparare și capturare

Numărător de timp real cu oscilator separat

6 canale PWM

Circuit de măsurare a temperaturii

Comunicație serială USART

Interfață serială SPI master/slave

Interfață serială orientată pe bit cu 2 fire (compatibilă Philips I2C)

Watchdog timer programabil cu oscilator separat on-chip

Comparator analogic on-chip

Modul de întrerupere și trezire declanșate la schimbarea valorii unuia dintre pini

Caracteristici speciale:

Modul Power-on-Reset și modul programabil de detectare a căderilor de tensiune

Oscilator intern calibrat

Surse de întrerupere interne și externe

6 module de ‘adormire’: Idle, ADC cu reducere de zgomot, Power-save (economie de putere), Power-down, Standby și Extended Standby

I/O și moduri de împachetare:

23 de linii programabile de intrare / ieșire

Prindere cu 28 pini de tip PDIP (Dual-In-Line-Package);

Tensiune de operare de la 1.8 la 5.5V

Temperatura de bună funcționare se întinde pe o gamă de la 40 ̊C la 85 ̊C

Viteza de execuție între 0 – 20MHz la tensiuni de 1.8 – 5.5V

Consum mic de energie la 1MHz, 1.8V și 25 ̊C:

Mod activ: 0.2mA

Mod Power-down: 0.1μA

Mod Power-save: 0.75μA

2.4.2. Diagrama Bloc

Procesorul AVR combină setul bogat de instrucțiuni cu cele 32 de registre de uz general. Toate cele 32 de registre sunt direct conectate la ALU (Unitatea Aritmetico-logică), permițând astfel ca două registre independente să fie accesate într-o singură instrucțiune executată într-un singur ciclu de ceas. Rezultă asfel o arhitectură eficientă din punctul de vedere al codului, efectuând operații de 10 ori mai rapid decât un microcontroler CISC convențional.

În modul ‘Idle’ procesorul este oprit în timp ce memoria SRAM, timerele/numărătoarele, USART, Interfața serială bifiliară, portul SPI și sistemul de întreruperi continuă să funcționeze.

În modul ‘Power-down’ se salvează conținutul registrelor, însă oscilatorul ‘îngheață’, astfel dezactivându-se celelalte funcții ale chipului până la următoarea întrerupere sau până la un reset hardware.

În modul ‘Power-save’, timerul continuă să funcționeze, permițând utilizatorului să aibă o evidență a timpului scurs în timp ce restul dispozitivului este dezactivat.

Modul ADC Noise Reduction (Convertor Analog-Digital cu reducere de zgomot) oprește activitatea procesorului și a modulelor de intrare/ieșire, cu excepția timerului asincron și a convertorului A/D pentru a minimiza zgomotul de comutare în timpul conversiei analog-digitale.

În modul Standby, cristalul oscilatorului este activ în timp ce restul dispozitivului este oprit. Astfel se obține o repornire rapidă a dispozitivului și în același timp un concum mic de energie.

Dispozitivul este fabricat cu tehnologia memoriei non-volatile de înaltă densitate specifică Atmel. Memoria ISP Flash on-chip permite memoriei de program să fie reprogramată in-system (auto-programare) printr-o interfață serială SPI de către un programator de memorie nevolatilă sau de către programul on-chip Boot ce rulează pe procesorul AVR. Programul Boot poate utiliza orice interfață pentru a descărca programul specific aplicației implementate în memoria Flash Application. Software-ul din secțiunea de memorie Boot Flash va continua să ruleze în timp ce secțiunea de memorie Application Flash este actualizată, obținându-se operația de Read-While-Write (‘citește cât timp scrie’), specifică acestui tip de microcontroler. Combinația dintre procesorul RISC pe 8 biți și auto-programarea in-system de tip Flash pe un chip monolitic face ca Atmel ATmega328P să fie un microcontroler puternic ce oferă o înaltă flexibilitate și un cost redus , reprezentând soluția ideală în multiple aplicații de control de tip embedded.

Microcontrolerul ATmega328P AVR este compatibil cu o întreagă suită de programe și sisteme de dezvoltare precum: Compilatoare C, Macro-Assemblere, Debuggere/Simulatoare de program, Emulatoare In-circuit și kituri de evaluare.

2.4.3. Procesorul AVR – Diagrama Bloc

Pentru a maximiza performanța și paralelismul, procesorul AVR utilizează o arhitectură Harvard, cu memorii și magistrale separate pentru program și date. Instrucțiunile din cadrul memoriei de program sunt executate printr-un pipeline cu un singur nivel. În timp ce o instrucțiune este executată, următoarea instrucțiune este în etapa de pre-fetch, adică de culegere din memoria de program. Acest concept permite execuția instrucțiunilor într-un singur ciclu de ceas. Memoria de program este o memorie de tip Flash reprogramabil in-system (autoprogramabil).

Cele 32 de registre de uz general pe 8 biți formează Register File (fișierul de registre) și pot fi accesate într-un singur ciclu de ceas. Astfel operațiile tipice ALU se pot executa într-un singur ciclu de ceas. O operație ALU înseamnă aducerea din Register File a doi operanzi diferiți, executarea operației între cei doi operanzi și salvarea rezultatului operației înapoi în Register File – într-un singur ciclu de ceas. Register File poate avea ca intrări și ieșiri în cadrul unei operații una din următoarele variante:

1 operand pe 8 biți și un rezultat pe 8 biți (pentru operații pe bit)

2 operanzi pe 8 biți și un rezultat pe 8 biți

2 operanzi pe 8 biți și un rezultat pe 16 biți

1 operand pe 16 biți și un rezultat pe 16 biți

Șase dintre cele 32 de registre pot fi folosite ca trei registre-pointer pentru adresare indirectă de câte 16 biți fiecare (registrele X, Y și Z fiecare având o parte de 8 biți superioară ‘HIGH’ și una de 8 biți inferioară ‘LOW’). Se accesează astfel spațiul de adrese de date și se calculează eficient adresele. Unul dintre aceste pointere de adresă poate fi folosit și pentru a indica spre o adresă în tabela de căutare a memoriei de program de tip Flash.

ALU poate efectua operații aritmetice și logice între registre sau între o constantă și un registru. ALU poate efectua și operații pe bit asupra unui singur registru. După efectuarea operației aritmetice, registrul de stare (Status Register) este actualizat pentru a evidenția informația referitoare la rezultatul operației. În cadrul ALU se găsește și un multiplicator puternic care este capabil să execute înmulțiri atât cu semn și fără semn căt și în format fracțional. Cei 8 biți ai registrului de stare sunt:

Bit 7 – I: Bitul Întreruperilor Globale. Acest bit trebuie setat pentru a activa întreruperile. Fiecare întrerupere în parte este tratată separat în registrele de control. Dacă acest bit este nesetat atunci nicio întrerupere nu poate fi tratată. Bitul – I este pus pe ‘0’ prin hardware în momentul apariției unei întreruperi pentru a trata doar acea întrerupere și a le dezactiva pe celelalte, iar apoi este setat din nou de instrucțiunea ‘RETI’ pentru a putea deservi întreruperi viitoare.

Bit 6 – T: Bit Copy Storage. Instrucțiunea BST copiază un bit dintr-un registru în bitul T, iar cu instrucțiunea BLD se copiază bitul T într-un bit dintr-un registru.

Bit 5 – H: Half Carry Flag. Acest bit indică o jumătate de carry (transport) în unele operații matematice.

Bit 4 – S: Bitul de semn, S = N⊕V. Acest bit este un sau exclusiv între fanionul negativ ‘N’ și fanionul de depășire a complementului față de doi ‘V’.

Bit 3 – V: fanionul de depășire al complementului față de doi. Acest bit este setat când apare o depășire în urma operației de complement față de doi.

Bit 2 – N: Fanionul negativ. Acest bit indică un rezultat negativ în urma unei operații aritmetice sau logice.

Bit 1 – Z: Fanionul de zero. Acest bit indică un rezultat nul în urma unei operații aritmetice sau logice.

Bit 0 – C: Fanionul de Carry. Acest bit indică un transport în urma unei operații aritmetice sau logice.

Fluxul firesc al programului este asigurat de instrucțiuni de salt condiționat sau necondiționat sau de instrucțiuni de apelare a unor subrutine, aceste instrucțiuni fiind capabile sa adreseze întregul spațiu de adrese. Majoritatea instrucțiunilor AVR au un format pe cuvânt de 16 biți. Fiecare adresă din memoria de program conține o instrucțiune pe 16 sau 32 de biți.

Memoria de program de tip Flash este divizată în două secțiuni: secțiunea Boot Program și secțiunea Application Program. Fiecare din cele două secțiuni au biți de blocare dedicați pentru a asigura protecția la citire sau scriere. Instrucțiunea SPM care scrie în secțiunea memoriei Flash Application trebuie să se gasească în secțiunea Boot Program.

În timpul întreruperilor și al apelului subrutinelor, adresa numărătorului de program (Program Counter – cel care conține adresa instrucțiunii la care a rămas programul înainte de deservirea întreruperii sau apelului subrutinei și la care trebuie să se întoarcă execuția programului după ce se termină execuția întreruperii sau a subrutinei) este stocată în Stivă. Stiva este utilizată pentru a stoca date temporare, variabile locale și/sau adresele de întoarcere în program dupa execuția întreruperilor sau a subrutinelor. Stiva se alocă efectiv din spațiul datelor generale din SRAM, iar dimensiunea maximă a acesteia este limitată la dimensiunea memoriei SRAM și a gradului de ocupare al acesteia. Toate programele utilizatorului vor trebui să inițializeze indicatorul de stivă (Stack Pointer – cel care indică spre vârful stivei) în cadrul rutinei de Reset (înaintea executării altor subrutine sau întreruperi). Indicatorul de stivă poate fi accesat pentru citire/scriere în spațiul de memorie de I/O. Datele din SRAM pot fi accesate cu ușurință cu ajutorul unuia dintre cele 5 moduri de adresare disponibile în arhitectura AVR. Stiva este implementată de sus în jos (vârful stivei se află în locațiile de memorie cu valoare mare). Instrucțiunea ‘PUSH’ (introducere dată în stivă) decrementează SP cu 1 (o locație de memorie) în timp ce ‘POP’ (scoatere din stivă) incrementează SP cu 1. Cu instrucțiunile ‘CALL’, ‘ICALL’ și ‘RCALL’ se introduce în stivă adresa instrucțiunii la care va trebui să revină execuția programului după deservirea întreruperii sau a altei subrutine (se decrementează SP cu 2 întrucât o adresă ocupă 2 locații de memorie), iar instrucțiunile ‘RET’ și ‘RETI’ scot din stivă adresa la care revine execuția programului după execuția întreruperii sau subrutinei (se incrementează SP cu 2).

Un modul de întrerupere flexibil are registrele proprii de control în spațiul de memorie de I/O și poate fi activat prin bitul de activare a întreruperilor globale din cadrul registrului de stare (Status Register). Fiecare întrerupere are asociat un anumit vector de întrerupere din tabela vectorilor de întrerupere. Prioritatea întreruperilor este stabilită în funcție de poziția vectorilor lor de întrerupere din tabelă. Cu cât adresa vectorului de întrerupere este mai mică, cu atât prioritatea întreruperii corespunzătoare este mai mare.

Spațiul de memorie de I/O conține 64 de adrese pentru funcțiile de control ale procesorului, precum: adresa Registrelor de control, SPI și alte funcții I/O. Memoria I/O poate fi accesată direct, sau se poate considera ca fiind spațiul de date ce urmează în memorie după Register File, 0x20 – 0x5F. ATmega328P are și o extensie a spațiului de I/O în memoria SRAM, între adresele 0x60 – 0xFF, unde pot fi utilizate doar instrucțiuni de store (salvare) și load (încarcare):ST/STS/STD și LD/LDS/LDD.

2.4.4. Organizarea memoriei microcontrolerului ATmega328P

Microcontrolerul ATmega328P dispune de 32KB de memorie (0.5KB fiind utilizați de bootloader, care încarcă la pornire ultima configurație validă a plăcuței înainte de deconectarea alimentării). Are de asemenea 2KB de memorie SRAM (Static Random Access Memory) și 1KB de memorie EEPROM pentru stocarea datelor (ce poate fi citită sau scrisă cu ajutorul librăriei EEPROM).

Întrucât microcontrolerul are la bază arhitectura Harvard, memoriile enumerate mai sus pot fi divizate în două spații: memoria de date și cea de program. În plus ATmega328P vine în sprijinul stocării datelor și cu memoria de tip EEPROM. Toate aceste trei spații de memorie sunt liniare și regulate.

Memoria de program. Este o memorie auto-programabilă (in-system), reprogramabilă de tip Flash, cu dimensiunea de 32KB, destinată stocării programelor. Întrucât instrucțiunile procesorului AVR sunt pe 16 sau 32 de biți și memoria de program este organizată ca 16K x 16 (32KB) locații de memorie. Din motive de securitate software, memoria Flash de program a fost divizată în două secțiuni: secțiunea de Boot Loader și secțiunea Application Program.

Numărătorul de program (Program Counter) este un registru pe 14 biți, pentru a adresa toate cele 16 K locații de memorie de program (214=16K).

Harta de memorie de program pentru ATmega328P este următoarea:

Memoria de date. Este o memorie de tip SRAM de 2KB, organizată astfel:

Cele 2304 locații de memorie sunt utilizate pentru a adresa cele 32 de registre de uz general, cele 64 de registre I/O, cele 160 de registre de extindere I/O și datele interne memoriei SRAM. Primele 32 locații adresează fișierul cu 32 de registre de uz general (Register File). Apoi urmează spațiul adreselor rezervate perifericelor de I/O ale căror instrucțiuni specifice sunt IN și OUT. Urmează spațiul de adrese extins pentru periferice, în SRAM, întrucât microcontrolerul poate avea mai mult de 64 de periferice. Acest spațiu poate fi accesat doar prin instrucțiuni de încărcare și salvare (ST/STS/STD și LD/LDS/LDD). La finalul spațiului de adresare se află cele 2K locații de memorie pentru adresarea datelor interne.

Cele 5 moduri de adresare a datelor din memoria de date sunt: Direct, Indirect, Indirect cu deplasament, Indirect cu pre-decrementare și Indirect cu post-incrementare. Registrele 26 – 31 (registrele X, Y și Z) din Register File reprezintă pointerii de adresare indirectă. Adresarea directă acoperă întregul spațiu al memoriei de date.

Adresarea indirectă cu deplasament adresează cele 63 locații de adresă de la bază, indicate de registrele Y sau Z. Adresarea indirectă cu pre-decrementare sau post-incrementare automată implică decremenatrea sau incrementarea registrelor de adrese X, Y și Z.

Timpii de acces la datele din memoria de date, pentru procese de scriere sau citire sunt evidențiate în figura de mai jos:

Se poate observa din imaginea de mai sus ca instrucțiunea de acces la datele din memoria de date se execută în două perioade de ceas, indiferent că este vorba de citire sau de scriere în memorie. În prima perioadă se calculează adresa la care se găsește data căutată, iar în cea de-a doua perioadă adresa devine validă, deci datele se pot citi / scrie. De notat este că în procesul de scriere se validează mai intâi data și apoi se activează semnalul de scriere (WR) pe când la citire semnalul de citire (RD) trebuie să fie activ înainte de validarea datei.

Memoria de date de tip EEPROM. Are o dimensiune de 1KB și o anduranță de 10 ori mai mare la ștergere/scriere (100.000 cicluri) decât memoria Flash de program (10.000 cicluri). Accesul dintre procesor și EEPROM se definește în relație cu registrele specifice de acces EEPROM de adrese, de date și de control, aceste registre fiind accesibile în spațiul de memorie I/O.

O funcție automată de control informează programul software care este timpul corect între două scrieri sau citiri succesive în EEPROM, întrucât procesorul este oprit timp de 4 ciclii de ceas când EEPROM-ul este citit și 2 cilcii de ceas când este scris și abia după aceea este reactivat pentru a executa următoarea instrucțiune.

Apare uneori fenomenul de corupere a EEPROM-ului, atunci când sursa de alimentare este puternic filtrată. În această situație, tensiunea Vcc are un front crescător/scăzător extrem de lent. În timpul palierului scăzut, datele din EEPROM pot fi corupte întrucât tensiunea sursei de alimentare este prea mică iar procesorul și/sau EEPROM-ul nu lucrează corect. Această situație poate fi evitată activând detectorul de căderi de tensiune intern și menținând astfel RESET-ul activ pe perioada în care sursa de tensiune nu furnizează suficientă tensiune.

Intrările, ieșirile și celelalte periferice ale microcontrollerului au alocată o zona de memorie ce le deservește scopurile specifice. Locațiile din această zonă de memorie pot fi accesate prin instrucțiuni de încărcare din memorie (LD/LDS/LDD) sau de stocare în memorie (ST/STS/STD). Prin aceste instrucțiuni se transferă datele între cele 32 de registre generale de lucru și spațiul ocupat de periferice și dispozitive I/O. Registrele aflate în spațiul de adresare 0x00 – 0x1F sunt adresabile la nivel de bit utilizând instrucțiunile SBI și CBI (aceste instrucțiuni sunt utilizate mai ales în cazul setării sau resetării unor fanioane). În aceste registre, valorile biților constituenți pot fi verificate cu instrucțiunile SBIS și SBIC. Când se folosesc comenzile IN sau OUT (specifice perifericelor), se folosește spațiul de adresare 0x00 – 0x3F. Când registrele I/O sunt adresate ca spațiu de date (cu intrucțiuni de tip LD și ST), acestor adrese li se adaugă valoarea 0x20. Prin instrucțiunile IN și OUT se pot accesa 64 de locații specifice perifericelor. Microcontrollerul suportă un număr mai mare de periferice, așa că s-a implementat în memoria SRAM un spațiu extins pentru periferice, în spațiul de adrese 0x60 – 0xFF, unde se pot folosi numai instrucțiunile ST/STS/STD sau LD/LDS/LDD.

2.5. INTERFAȚA PERIFERICĂ SERIALĂ (SPI – SERIAL PERIPHERAL INTERFACE)

2.5.1. Caracteristicile interfeței SPI sunt:

Este compusă din trei fire fizice prin care se realizează transferul sincron al datelor, în mod full-duplex (transmisie și recepție simultană);

Poate opera atât ca Master cât și ca Slave;

Poate efectua transferul datelor setând MSB-ul sau LSB-ul ca prim bit de transmis/recepționat

Se pot selecta șapte rate de bit programabile

Deține un fanion de întrerupere ce marchează sfârșitul transmisiei

Are un sistem de protecție împotriva coliziunii datelor la scriere printr-un fanion special

Are o funcție de ‘trezire’ din starea de inactivitate (Idle Mode)

Lucrând în modul Master SPI interfața transferă date la viteză dublă (clock/2)

2.5.2. Generalități ale interfeței SPI

Interfața SPI realizează transferul sincron de mare viteză al datelor, între microcontrollerul ATmega328P și alte dispozitive periferice sau diverse dispozitive AVR. Unitatea USART poate fi folosită și ea în modul Master SPI, prin scrierea valorii 0 în bitul PRSPI, astfel activându-se modulul SPI.

2.5.3. Schema bloc a interfeței SPI este următoarea:

Interconexiunea dintre unitatea de procesare de tip Master și cea de tip Slave este demonstrată în figura ce urmează:

Sistemul de mai sus este constituit din două registre de deplasare și un generator de semnal de ceas Master. Unitatea Master inițiaza ciclul de comunicație serială prin setarea în stare de joasă impedanță a pinului de selecție de modul Slave (Slave Select SS’), corespunzător unității Slave dorite. Atât unitatea Master cât și cea Slave pregătesc datele pentru transfer în registrele lor de deplasare corespunzătoare, iar Masterul generează impulsurile de ceas necesare pe linia SCK pentru a interschimba date. Datele sunt deplasate mereu de la Master la Slave pe linia MOSI (Master Out – Slave In), iar pe linia MISO (Master In – Slave Out) datele sunt deplasate de la Slave la Master. După fiecare pachet de date transmis, Slave se va sincroniza după Master, punând linia Slave Select SS’ în stare de înaltă impedanță.

Atunci când este configurată ca Master, interfața SPI nu deține controlul automat asupra liniei SS’. Acest control va fi gestionat prin implementare software, înainte să înceapă comunicația. Când începe comunicația serială, scrierea unui octet de date în registrul de date SPI (data register) va determina declanșarea generatorului de ceas SPI și odată cu aceasta va porni și deplasarea celor 8 biți către unitatea Slave. După ce se deplasează câte un octet de date, generatorul de ceas SPI se oprește și se setează fanionul de sfârșit al transmisiunii (SPIF). Dacă bitul de activare a întreruperii SPI (SPIE) din registrul SPCR este setat, se formulează o cerere de întrerupere. Unitatea Master poate continua să deplaseze următorul octet de date prin scrierea acestuia în registrul SPDR sau poate semnala sfârșitul pachetului de date punând linia SS’ în stare de înaltă impedanță. Ultimul octet din registrul buffer va fi păstrat aici pentru utilizări ulterioare.

Atunci când este configurată în modul Slave, interfața SPI va rămâne în stare de inactivitate (‘adormire’) iar linia MISO va avea trei stări cât timp pinul SS’ este în stare de înaltă impedanță. În această stare, programul software poate actualiza conținutul registrului de date SPI, SPDR, însă datele nu vor fi deplasate pe fronturile impulsurilor de ceas care vin pe pinul SCK, până când semnalul SS’ nu este pus în stare de joasă impedanță. Odată ce un anumit octet a fost deplasat, se setează fanionul de semnalare al sfârșitului transmisiei (SPIF). Dacă bitul de activare al întreruperii SPI (din registrul SPCR) este setat, se formulează o cerere de întrerupere. Modulul Slave poate continua să plaseze noi date de trimis în registrul SPDR înainte să citească datele care urmează să vină. Ultimul octet va fi reținut în registrul buffer pentru utlizări ulterioare.

Întregul sistem are un buffer pentru a stoca datele de transmis si două buffere pentru a stoca datele de recepționat. Prin urmare, octeții care trebuie transmiși nu pot fi scriși în registrul de date SPI înainte de terminarea completă a întregului ciclu. Atunci când se recepționează date, însă, un caracter recepționat trebuie să fie citit din registrul de date SPI înainte ca următorul caracter să fie deplasat integral în registru. Altfel, primul octet va fi pierdut.

În modul SPI Slave, blocul de control logic al pinilor va eșantiona semnalul care vine pe pinul SCK. Pentru a asigura o eșantionare corectă a semnalului de ceas, se impun condițiile ca:

Perioadele de joasă impedanță să fie mai mari decât două perioade de ceas ale CPU;

Perioadele de înaltă impedanță să fie mai mari decât două perioade de ceas ale CPU.

Când modulul SPI este activat, direcția datelor (intrare / ieșire) de pe pinii MOSI, MISO, SCK și SS’ este suprascrisă conform urmatorului tabel.

2.5.4. Registrul de control SPI – SPCR

Bit 7 – SPIE – Activarea întreruperilor SPI. Acest bit determină execuția unei întreruperi SPI dacă bitul SPIF din registrul SPSR și bitul de activare a întreruperilor globale din SREG sunt setați;

Bit 6 – SPE – Activarea modulului SPI. Acest bit este setat pentru a activa orice operație a modulului SPI;

Bit 5 – DORD – Ordinea de transmitere a datelor. Dacă DORD conține valoarea 1, cuvântul va fi transmis începând cu LSB-ul, iar daca DORD conține valoarea 0, cuvântul va fi transmis începând cu MSB-ul

Bit 4 – MSTR – Selecția modului Master / Slave. Valoarea 1 selectează modul Master SPI, iar valoarea 0 selectează modul Slave.

Bit 3 – CPOL – Polaritatea Ceasului. Când acest bit are valoarea 1, SCK este în stare de înaltă impedanță atunci când este inactiv, iar când bitul are valoarea 0, SCK este în stare de joasă impedanță când este inactiv.

Bit 2 – CPHA – faza ceasului. Configurația acestui bit decide dacă eșantionarea datelor se face pe primul sau pe ultimul palier al semnalului de ceas.

Bitii 1, 0 – SPR1, SPR0 – Selecția ratei de ceas SPI. Acești doi biți controlează rata divizării frecvenței de ceas a dispozitivului în modul Master și nu au niciun efect asupra dispozitivului în modul Slave.

2.5.5. Registrul de stare SPI – SPSR

Bit 7 – SPIF – Fanionul de întreruperi SPI. Acest bit este setat atunci când un transfer serial se termină complet.

Bit 6 – WCOL – fanionul de semnalare a coliziunilor. Acest bit este setat atunci când se scriu date în registrul de date SPI în timpul unui transfer de date, ceea ce duce la o coliziune a datelor. Bitul se resetează atunci când accesul datelor din registrul de date SPI se face după transferul datelor când bitul WCOL este setat.

Bitii 1-5 – Biti rezervați. Acești biți sunt rezervați de producător și sunt citiți ca zerouri.

Bit 0 – SPI2X – bitul de dublare a vitezei SPI. Când acest bit are valoarea 1, frecvența de ceas (viteza de transmisie) se dublează atunci când interfața SPI se află în modul Master. Prin urmare, perioada minimă de ceas va fi de cel puțin două perioade de ceas ale CPU.

Interfața SPI a microcontrolerului ATmega 328P este folosită și pentru memoria de program și pentru descărcarea sau încărcarea memoriei EEPROM.

2.5.6. Registrul de date SPI – SPDR

Registrul de date SPI este un registru citire / scriere utilizat pentru transferul datelor între fișierul de registre (cele 32 de registre de uz general) și registrul de deplasare SPI. Scrierea în acest registru inițiază procesul de transmisie a datelor. Citirea din acest registru determină citirea bufferului de recepție a registrului de deplasare.

2.6. PINII DE INTRARE/IEȘIRE DE PE ARDUINO UNO

Fiecare din cei 14 pini digitali de pe plăcuță poate fi utilizat atât ca pin de intrare cât și ca pin de ieșire, cu ajutorul funcțiilor ‘pinMode()’, ‘digitalWrite()’ si ‘digitalRead()’. Acești pini operează la 5 volți. Fiecare pin poate furniza sau recepționa maximum 40mA și are o rezistență internă (deconectată în stare implicită) de 20 – 50 kΩ. În plus, unii dintre acești pini au definite și anumite funcții specializate, precum:

Comunicare serială: pinii 0 (RX) și 1 (TX). Acești doi pini sunt utilizați pentru a recepționa (RX) și transmite (TX) în mod serial date, sincron cu semnalul de ceas al sistemului, semnal de tip TTL (dreptunghiular simetric). Acești pini sunt conectați la pinii corespunzători de pe chipul ATmega8U2 USB-to-TTL.

Întreruperile externe: pinii 2 și 3. Acești pini pot fi configurați în așa fel încât să declanșeze o întrerupere la întâlnirea unei valori scăzute sub un anumit prag, la întâlnirea unui front crescător sau scăzător de semnal sau atunci când apare o schimbare de valoare pe pinul respectiv.

PWM: pinii 3, 5, 6, 9 ,10 și 11. Acești pini asigură o modulare a pulsurilor în durată pe 8 biți, cu ajutorul funcției ‘analogWrite()’.

SPI: pinii 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Acești pini asigură comunicația SPI a datelor utilizând librăria SPI existentă.

LED: pinul 13. Există un LED încorporat pe plăcuță care este conectat la pinul digital 13. Când pe pin este o tensiune de valoare mare (nivel 1 logic) LED-ul este aprins, iar când valoarea tensiunii de pe pin este scăzuta (nivel 0 logic), LED-ul este stins.

Arduino Uno are în componență 6 intrări analogice, etichetate de la A0 până la A5, fiecare dintre acestea acoperind o rezoluție de 10 biți (1024 valori diferite). Implicit, acești pini pot măsura valori cuprinse între valoarea de pe pinul de masă și până la 5V, dar este posibilă schimbarea limitei superioare de măsură prin utilizarea pinului AREF și a funcției ‘analogReference()’. În plus, unii dintre acești pini au și funcții specializate precum:

TWI: pinul A4 (SDA) și pinul A5 (SCL). Acești pini fac posibilă comunicația de tip TWI a datelor utilizând librăria Wire existentă.

Mai există alți doi pini pe plăcuță și anume:

AREF. Acest pin este referința de tensiune pentru intrările analogice. Este utilizat împreună cu funcția ‘analogReference()’.

Reset. Odată ce această linie se află la nivel de 0 logic, se declanșează resetarea microcontrollerului. Este utilizat de obicei pentru adăugarea unui buton de reset unor adaptoare a căror conectare obturează accesul la butonul de reset existent pe plăcuță.

Mai jos este descrisă maparea (corespondența) dintre pinii plăcuței Arduino Uno și cei ai microcontrollerului ATmega328P.

Pinii digitali 11, 12 și 13 sunt folosiți de headerul ICSP și trebuie evitate valorile de joasă impedanță pe acești pini atunci când se folosește headerul ICSP.

2.7. COMUNICAȚIA PLĂCII DE DEZVOLTARE ARDUINO UNO CU ALTE SISTEME

Arduino Uno dispune de mai multe facilități pentru a comunica cu un computer, un alt Arduino sau alte microcontrolere. ATmega328P asigură comunicația serială de tip UART (Universal Asynchronous Receiver-Transmitter) TTL printr-o linie de 5 volți, disponibilă pe pinii digitali 0 (recepție) și 1 (transmisie). Circuitul integrat ATmega16U2 de pe plăcuța Arduino Uno canalizează această comunicație serială prin USB și poate fi recunoscută de calculator ca și un port COM virtual. Chipul ‘16U2 folosește driverele USB COM standard, neavând nevoie de driver extern. Pentru a rula corect pe Windows, este necesar un fișier ‘.inf’. Software-ul Arduino include și un monitor serial care permite ca date textuale simple să fie trimise și recepționate de la și către placa Arduino. LED-urile RX și TX de pe plăcuță vor clipi când sunt transmise date prin chipul USB-to-serial și prin conexiunea USB către calculator (dar nu clipesc pentru comunicația serială de pe pinii 0 și 1).

Librăria SoftwareSerial permite comunicația serială pe oricare din pinii digitali de pe plăcuță.

ATmega328P permite și comunicația SPI (librăria SPI) sau comunicația I2C (TWI).

2.8. RESETAREA PLĂCII DE DEZVOLTARE

Pentru a putea fi resetată, plăcuța Arduino Uno are atât un buton de reset hardware, cât și un mod de resetare software automat, înainte de încărcarea unui program pe plăcuță atunci când este conectat la un calculator. Una dintre liniile fluxului de control hardware (DTR) ale chipului ATmega16U2 este conectată la linia de reset a microcontrolerului ATmega328P printr-un capacitor de 100nF. Astfel i se permite utilizatorului să încarce programul pe plăcuță apăsând butonul de upload din software-ul Arduino, ceea ce înseamna că bootloader-ul are un timeout mai mic, în timp ce DTR-ul se poate sincroniza cu începutul uploadului.

Plăcuța conține și un fir ce poate fi tăiat pentru a dezactiva auto-resetul. Plăcuțele de pe ambele fețe ale firului de reset pot fi apoi lipite pentru a reactiva auto-resetul. Auto resetul se mai poate dezactiva prin conectarea unui rezistor de 110Ω de la linia de 5V către linia de reset.

2.9. PROTECȚIA USB LA SUPRACURENȚI

Arduino Uno are o siguranță polifuzibilă care protejează porturile USB ale calculatorului împotriva scurtcircuitelor și supracurenților. Chiar dacă majoritatea calculatoarelor are propria ei protecție internă, siguranța plăcuței prezintă protecție suplimentară. Dacă portului USB i se aplică mai mult de 500mA, siguranța va întrerupe conexiunea dintre plăcuță și computer până la înlăturarea cauzei scurtcircuitului sau suprasarcinii.

2.10. CARACTERISTICI FIZICE

Lungimea și lățimea maxime ale plăcuței Arduino Uno sunt de 2.7 respectiv 2.1 inci. Pe suprafața plăcuței se găsesc 4 găuri care permit fixarea în șuruburi a plăcuței pe o anumita suprafață sau echipament electronic. De notat este că distanța dintre pinii digitali 7 și 8 este diferită de distanța dintre ceilalți pini de pe plăcuță.

CAP.3 ADAPTORUL GAMEDUINO 1.2

Gameduino este un adaptor grafic pentru Arduino (sau orice altă plăcuță cu o interfață SPI), construit ca un shield de sine stătător care se cuplează la pinii de pe Arduino și care are o ieșire pentru monitor VGA și o mufă jack pentru difuzoare stereo.

Sunetul și grafica sunt un pic învechite dacă ne raportăm la grafica modernă însă mulțumită ultimei tehnologii FPGA existente pe plăcuță, capabilitățile sprite-urilor (un sprite este o imagine bidimensională sau o animație care este integrată într-o scenă mai mare, de ansamblu) sunt mai mult decât mulțumitoare pentru multe dintre aplicațiile cu reprezentare grafică.

3.1. CARACTERISTICILE IEȘIRILOR PLĂCUȚEI GAMEDUINO

Rezoluție video la ieșire de 400 x 300 pixeli în 512 culori:

Toate culorile sunt procesate intern cu o precizie de 15 biți

Este compatibil cu orice monitor standard VGA (800 x 600 la 72Hz)

Grafica de fundal conține:

Aspect de fundal cu rezoluție de 512 x 512 pixeli

256 caractere, fiecare cu 4 palete de culori independente

Funcție de netezire a pixelilor pe axele X-Y cu împachetare

Grafica de prim plan contine:

96 sprite-uri per linie scanată, cu 1536 texeli per linie

Fiecare sprite are o rezoluție de 16 x 16 pixeli cu transparență per pixel

Fiecare sprite poate utiliza 4, 16 sau 256 de culori

Flip și rotație în 4 direcții

Detecția coliziunii sprite-urilor cu precizia de 1 pixel

Ieșirea audio este un sintetizator de frecvență stereo pe 12 biți:

Capacitate de 64 voci independente cu frecvențe între 10 – 8000Hz

Unda sinusoidală sau zgomot alb per voce

Canal de redare a eșantioanelor

Acest adaptor este controlat prin operații de citire / scriere SPI, iar procesorul este interpretat ca o memorie RAM de 32 KB. Spre deosebire de alte procesoare pe 8 biți, în acest caz nu există restricții în ceea ce privește momentul în care se acceseaza RAM-ul.

3.2. CONEXIUNILE FIZICE

Pentru a putea comunica în mod corect cu plăcuța Arduino, shield-ul Gameduino are nevoie de urmatoarele conexiuni:

Pinul GND de pe Arduino va deveni masa de semnal a shieldului

Pinul de 3.3V de pe Arduino va deveni pin Vcc pentru Gameduino

Pinul de 5V de pe Arduino devine principala alimentare pentru Gameduino, cu valori între 3 – 6 V

Pinul 11 de pe Arduino devine pinul de comunicație SPI MOSI

Pinul 12 de pe Arduino devine pinul de comunicație SPI MISO

Pinul 13 de pe Arduino devine pinul de comunicație SPI SCK

Pinul 9 de pe Arduino devine pinul de comunicație SPI SEL

În plus, pinul 2 poate fi folosit pentru control auxiliar.

3.3. INTERFAȚA SPI LOW-LEVEL

Gameduino este văzut de microcontroler ca fiind un periferic SPI, cu două comenzi: scriere în memorie și citire din memorie. Gameduino are o memorie totală de 32 KB, deci adresele sunt de 15 biți. Bitul rămas (procesorul este proiectat pe 16 biți) indică dacă se execută o citire din memorie sau o scriere în memorie.

Pentru a citi din memorie, microcontrolerul selectează plăcuța Gameduino iar apoi inițiază o comandă de citire din memorie:

high byte

low byte

Astfel, fiecare citire a octetului care urmează returnează următoarea locație de memorie.

Comanda de scriere în memorie operează similar:

(high byte | 0x80)

low byte

De asemenea, această comandă permite scrierea unui bloc întreg de memorie continuând să trimită octeți.

Exemplul următor va demonstra modul în care Arduino va copia locația de memorie 0x0113 la locația 0x0a00:

digitalWrite(9, LOW); // începutul tranzacției SPI

SPI.transfer(highByte(0x0113)); // începutul operației de citire de la 0x0113

SPI.transfer(lowByte(0x0113));

byte value = SPI.transfer(0); // citește octetul de la 0x0113

digitalWrite(9, HIGH); // sfârșitul tranzacției SPI

digitalWrite(9, LOW); // începutul tranzacției SPI

SPI.transfer(highByte(0x0a00) | 0x80); // începutul operației de scriere la locația 0xa00

SPI.transfer(lowByte(0x0a00));

SPI.transfer(value); // scrie octetul la 0x0a00

digitalWrite(9, HIGH); // sfârșitul tranzacției SPI

Aceste operații sunt gestionate mult mai bine de librăria GD:

GD.wr(0xa00, GD.rd(0x113));

3.4. GRAFICA DE FUNDAL

Grafica de fundal este definită de RAM-ul de 64 x 64 de locații pentru ecranul caracterelor împreuna cu RAM-ul pentru paletele de reprezentare a caracterelor. Imaginea rezultată are o rezulție de 512 x 512 pixeli, din care hardware-ul afișează doar o fereastră de 400 x 300. Registrele SCROLL_X și SCROLL_Y determină locația colțului din partea stângă-sus al acestei imagini. Fereastra de afișare se deplasează în jurul zonei de ecran de 512 x 512, astfel încât este posibilă o defilare infinită pe tot parcursul imaginii.

Zona de memorie de la 0000 la 0FFF (RAM_PIC) este o matrice de 64 x 64 conținând codurile referitoare la octeții de reprezentare a caracterelor. Hardware-ul utilizează aceste coduri ale caracterelor pentru a găsi imaginea și paleta de culori a caracterelor în zonele de memorie 1000-1FFF (RAM_CHR – corespunzătoare imaginii caracterului) și respectiv 2000-27FF (RAM_PAL – corespunzătoare paletei de culori a caracterului). Deci, pentru fiecare pixel afișat, hardware-ul efectuează următoarele operațiuni:

Caută codul caracterului în porțiunea RAM_PIC;

Caută pixelul caracterului în porțiunea RAM_CHR;

Caută culoarea pixelului caracterului în porțiunea RAM_PAL.

Porțiunea RAM_CHR (1000-1FFF) determină care sunt cei 64 pixeli (8 x 8) ai imaginii corespunzătoare fiecăruia dintre cele 256 caractere. Layoutul imaginii se determină din partea stângă-sus până în partea dreaptă-jos, pixelii fiind împachetați câte 4 în fiecare octet, pixelul cel mai din stânga ocupând cei mai semnificativi doi biți.

Porțiunea RAM_PAL (2000-27FF) determină cele 4, 16 sau 256 culori utilizate de fiecare dintre cele 256 caractere. Dacă bitul A al valorii culorii este setat, culoarea este preluată din registrul BG_COLOR.

3.5. GRAFICA SPRITE-URILOR (a elementelor din grafica de prim plan)

Hardware-ul va reprezenta întotdeauna în cadrul imaginii sprite-urile în ordine, de la cele mai mici la cele mai mari ca și număr de ordine. Asta înseamnă că sprite-urile cu număr mare de ordine vor fi afișate în fața celor cu numar mic de ordine. Coordonatele sprite-urilor sunt numere pe 9 biți (cu valori 0-511). Coordonatele (0 , 0) corespund colțului stânga sus al imaginii. Spriteurile pot apărea și parțial în afara ecranului.

Porțiunea de memorie 3000-37FF (RAM_SPR) conține datele de control pentru cele 256 sprite-uri. Există două pagini de sprite-uri care permit afișarea cu buffer-dublu. Pagina afișată este selectată de registrul SPR_PAGE. Fiecare sprite este controlat de o valoare pe 32 de biți:

Bitul 31 determină apartenența la clasa de coliziune (J sau K)

Biții 25-30 determină sursa imaginii 0-64

Biții 16-24 determină coordonata Y, de la 0-511

Biții 12-15 determină paleta de culori utilizată, astfel:

Pentru 256 culori, biții 14-15=00, iar biții 12-13 specifică paleta

Pentru 16 culori, biții 14-15=01, bitul 13 specifică cei 4 biți sursă, iar bitul 12 specifică paleta (A/B)

Pentru 4 culori, bitul 15=1, biții 13-14 specifică perechea biților sursa (00 este LSB, 11 este MSB), iar bitul 12 specifică paleta (A/B)

Biții 9-11 determină rotația și flipul (valori de la 0-7)

Biții 0-8 determină coordonata X, de la 0-511

Zona de memorie 3800-3FFF (RAM_SPRPAL) conține cele 4 palete de culori disponibile pentru reprezentarea celor 256 de sprite-uri color. Fiecare paletă este un bloc de 256 de culori (512 octeți). Pentru sprite-uri, setarea bitului 15 (A) a unei culori indică transparența.

Zona de memorie 4000-7FFF (RAM_SPRIMG) conține cele 64 iamgini de spriteuri disponibile. Fiecare imagine are 256 octeți, un octet per pixel pentru cei 16 x 16 pixeli ai sprite-ului. Utilizând paletele de culori înseamnă că imaginea de 256 octeți a unui singur sprite poate conține o imagine de 256 culori, 2 imagini de 16 culori sau 4 imagini de 4 culori.

3.6. SUNETUL

Sunetul plăcuței se bazează pe un sistem de sinteză aditiv. Se pot obține 64 de voci independente: fiecare voce generează un ton la o anumită frecvență. Aceste tonuri pot fi semnale sinusoidale simple sau zgomot alb. Pe lângă valoarea frecvenței corespunzătoare tonului (măsurată în sferturi de Hz), fiecare voce are și un bit de selecție a formei de undă corespunzătoare tonului (sinus sau zgomot) și valori ale amplitudinii stânga și dreapta. Pentru a evita fenomenul de tăiere a sunetului (depașirea amplitudinii maxime), amplitudinile însumate ale tuturor vocilor ar trebui să fie sub valoarea de 255 atât pentru canalul stâng cât și pentru cel drept.

3.7. REGISTRE

2800 (IDENT) identificarea plăcuței Gameduino – întotdeauna citește 0x6D

2801 (REV) numărul reviziei hardware. Cei mai semnificativi 4 biți sunt revizie majoră, iar ceilalți 4 sunt revizie minoră

2802 (FRAME) este numărătorul de cadre (1 octet read-only)

2803 (VBLANK) este fanionul de golire a imaginii pe verticală (1 octet read-only, setat pe perioada de golire pe verticală a imaginii de 1.3ms)

2804 (SCROLL_X) este registrul de defilare a pixelilor pe orizontală (2 octeți, 0-511, read-write)

2806 (SCROLL_X) este registrul de defilare a pixelilor pe verticală (2 octeti, 0-511, read-write)

2808 (JK_MODE) este activarea controlului sprite-ului în mod JK (1 octet 0-1, read-write)

2809 (J1_RESET) resetează coprocesorul: se scrie valoarea 1 pentru a menține coprocesorul în stare de reset și valoarea 0 pentru a se elibera resetul

280A (SPR_DISABLE) dezactivează sprite-urile : 0 activează spriteul, 1 îl dezactivează

280B (SPR_page) selectează pagina sprite-ului: 0 afișează spriteurile de la locațiile 3000-33FF, 1 afișează spriteurile de la 3400-37FF

280C (IOMODE) controlează comportamentul pinului 2, astfel:

0x00 – pinul 2 este ignorat

0x46 (ascii ‘F’) – pinul 2 este onboard și activează dataflashul (acces mai rapid la unele elemente din memorie și mai mult spațiu de stocare pentru date)

0x4A (ascii ‘J’) – pinul 2 este sub controlul coprocesorului

280E (BG_COLOR) utilizat atunci când culoarea de fundal este transparentă

2810 (SAMPLE_L) eșantionul audio stânga (2 octeți, cu semn, read-write)

2812 (SAMPLE_R) eșantionul audio dreapta (2 octeți, cu semn, read-write)

281E (SCREENSHOT_Y) registru care citește pixelii de pe o linie de ecran Y, atunci când se încarcă în registru valoarea (0x8000|Y). După încărcarea acestei valori, se așteaptă până când bitul MSB al registrului citește valoarea 1. Data corespunzătoare pixelilor poate fi citită din secțiunea de 800 de octeți alocați zonei SCREENSHOT RAM. Ultimii 9 biți LSB ai registrului conțin valorile pixelilor liniei Y, 0-299. Pentru a dezactiva screenshotul, trebuie scris 0 în acest registru.

2840 (PALLETE16A) reprezintă paleta de 16 culori pentru un sprite, A (32 octeți, read-write)

2860 (PALLETE16B) reprezintă paleta de 16 culori pentru un sprite, B (32 octeți, read-write)

2880 (PALLETE4A) reprezintă paleta de 4 culori pentru un sprite, A (8 octeți, read-write)

2888 (PALLETE4B) reprezintă paleta de 4 culori pentru un sprite, B (8 octeți, read-write)

2890 (COMM) Blocul de comunicație a coprocesorului (48 octeți read-write)

2900 (COLLISION) RAM ul de 256 octeți pentru coliziuni. La sfârșitul refreshului pentru fiecare cadru, această porțiune de RAM conține numărul spriteului care a făcut coliziune sau valoarea 0xFF dacă spriteul nu a acoperit niciun alt sprite. În modul JK numai spriteurile cu valoare J/K diferită (bitul 31 din RAM_SPR) pot declanșa fanionul de coliziune. De notat este că datorită faptului că aceste coliziuni sunt sesizabile în timpul golirii imaginii pe verticală, acest registru citește doar valoarea 0xFF în alte momente de timp din afara perioadei de golire pe verticală.

2A00 (VOICES) reprezintă baza celor 64 registre de voce. Fiecare registru este o valoare pe 32 de biți:

Frecvența (biții 0-14) în Hz adevarată este cea masurată multiplicată cu 4. 440×4=1760Hz

Forma de undă (bitul 15): valoarea 0 selectează o undă sinusoidală, iar 1 selectează zgomot alb

Amplitudine canal stâng (biții 16-23)

Amplitudine canal drept (biții 24-31)

2B00 (J1_CODE) Spațiul instrucțiunilor coprocesorului (256 octeți, read-write)

2C00 (SCREENSHOT) citirea pixelilor din imagine, 400 pixeli (800 octeți, read-only)

3.8. COPROCESORUL

3.8.1. Caracteristicile generale ale coprocesorului

Coprocesorul este un CPU de mici dimensiuni pe 16 biți, care are acces direct la toată memoria și registrele de pe Gameduino. Codul executat de acest coprocesor se găsește în porțiunea de memorie 2B00-2BFF, o porțiune ce conține 128 instrucțiuni pe 16 biți.

În timpul rulării unui program pe plăcuța Gameduino, acest coprocesor este inactiv (idle). Posibile sarcini ale acestuia sunt:

Crearea unor copii rapide ale memoriei video sau ștergeri rapide ale acesteia

Desenarea liniilor, cercurilor și triunghiurilor utilizând un bitmap

Producerea unor efecte de split screen (împărțire a ecranului) prin schimbarea registrelor de cadru

CPU-ul existent pe coprocesor este o versiune modificată a CPU J1. Acesta execută instrucțiunile din propriul RAM de instrucțiuni și poate scrie / citi în oricare dintre cele 32K locații de adresă ale lui Gameduino, inclusiv în RAM-ul său de instrucțiuni. Câteva trăsături ale coprocesorului sunt:

50 MIPS (mega instrucțiuni pe secundă)

Magistrală internă pe 16 biți

Interfață cu memoria de 8 biți, poate să scrie / citească în toate locațiile de memorie disponibile

Multiplicare 16 x 16 biți într-un singur ciclu de ceas și are barrel shifter (unitate ce execută deplasări și rotații asupra unuia dintre operanzi)

Masină rapidă și eficientă bazată pe stivă

3.8.2. Schema logică a acestui CPU este următoarea:

J1 este un CPU de mici dimensiuni (200 de linii Verilog) destinat atașării altui microcontroller și creat pentru FPGA.

3.8.3. Trăsături ale CPU J1:

Densitate extrem de mare a codului.

Instrucțiunile de apel se execută într-un singur ciclu de ceas, iar cele de revenire din apel se execută în 0 cicluri de ceas

Rețeaua setului de instrucțiuni este specifică Forth

Compilatorul încrucișat poate rula atât pe Windows, cât și pe Mac sau Unix

Are RAM, un numărător de program, o stivă de date și o stivă de apelare/revenire din subrutine

Are un set mic intern de instrucțiuni aritmetice

Anumite câmpuri din instrucțiunile J1 controlează funcțiile aritmetice și scriu rezultatul în stiva de date.

J1 nu are întreruperi sau excepții, execuție pipeline a instrucțiunilor, registre condiționale, fanion de transport sau suport pentru înmulțire și împărțire.

Un CPU J1 cu 16KB de memorie RAM poate încape cu ușurință pe un FPGA de mici dimensiuni de la Xilinx. În cazul de față, J1 este montat pe un FPGA Xilinx Spartan XC3S200A.

3.8.4. Caracteristile Xilinx Spartan XC3S200A sunt:

200.000 de porți logice de sistem

4.032 celule logice echivalente

Aria de blocuri logice configurabile (CLB) este compusă din:

448 CLB-uri

32 rânduri

16 coloane

1.792 celule ale CLB (slice)

3.584 bistabile

3.584 LUT-uri (lookup table – tabel de adevăr) cu 4 variabile de intrare

28KB de RAM distribuit

288K biți per bloc RAM

16 multiplicatoare dedicate

4 DCM-uri (Digital Clock manager – funcție de manipulare a semnalelor de ceas)

3.8.5. Realizarea unui program presupune următorii pași pentru coprocesor:

Compilarea și încărcarea microprogramului.

Execuția programului. Pentru Arduino, execuția programului implică următoarele procese:

Se scrie valoarea ‘1’ în registrul J1_RESET pentru a opri activitatea coprocesorului

Se scriu octeții de program în zona de memorie 2B00-2BFF

Se scrie valoarea ‘0’ in registrul J1_RESET pentru a începe execuția programului, începând cu adresa de memorie 2B00.

Toate aceste procese sunt realizate cu ajutorul librăriei GD, utilizând sintaxa: ‘GD::microcode()’.

3.8.6. Organizarea memoriei coprocesorului

Coprocesorul este un CPU pe 16 biți, iar RAM-ul de pe Arduino este organizat pe octeți. Prin urmare coprocesorul trebuie să acceseze memoria pe octeți, nu pe dualocți, ceea ce înseamnă că instrucțiunile de citire din memorie vor umple cei mai semnificativi 8 biți ai valorii cu zero-uri, iar în operațiile de scriere se ignoră primii 8 biți ai valorii.

Instrucțiunile de acces a memoriei (c@ si c!) sunt executate fiecare în doi ciclii de ceas.

Pentru a ușura activitatea coprocesorului există microinstrucțiunea ‘swab’ care interschimbă octetul superior cu cel inferior într-un cuvânt pe 16 biti.

Există o arie de memorie de 48 de octeți (COMM) dedicată comunicației dintre plăcuța Arduino și coprocesor. Orice arie de memorie poate fi folosită pentru comunicație, însă COMM este utilă întrucât nu este folosită decât pentru scopul mai sus menționat.

3.8.7. Stive

Există două stive ale acestui coprocesor: stiva de date pentru uz general și stiva ce conține adresele de întoarcere din subrutine. Stiva de date are o adâncime de 33 de celule. Stiva cu adrese de întoarcere din subrutine are o adâncime de 32 de celule. Ambele stive se blochează la întâlnirea depășirii stivei.

3.8.8. Salvarea spațiului memoriei coprocesorului

Coprocesorul are în memorie un spațiu de cod extrem de mic, însă cu o codare atentă chiar și unii algoritmi mai complecși pot fi implementați. Pentru a economisi spațiu de cod, se recomandă:

Utilizarea subrutinelor oricând este posibil. Procesorul J1 execută instrucțiunile de apel într-un ciclu de ceas, iar cele de revenire în program în 0 cicluri de ceas. Deci orice secvență repetitivă de instrucțiuni este de recomandat să fie îmbrăcată într-o subrutină ce poate fi apelată.

Exploatarea revenirii din subrutină în 0 ciclii de ceas. Programul de asamblare poate optimiza reîntoarcerea din subrutină în două cazuri: când reîntoarcerea din subrutină este combinată cu o instrucțiune aritmetică precedentă sau când instrucțiunea precedentă este un alt apel, în acest al doilea caz asamblorul înlocuind apelul cu o instrucțiune de salt (jump).

Utilizarea operațiilor fuzionate care sunt utile buclelor.

3.8.9. Registrele specifice coprocesorului

Pe lânga spațiul normal de adrese de 32KB de la 0x0000-0x7FFF, coprocesorul are acces și la următoarele registre interne pe 16 biți, începând de la adresa 0x8000:

0x8000 – YLINE (R) =rastrul curent pe linia Y (0-299). Valorile din timpul golirii pe verticală nu sunt definite

0x8002 – ICAP_O (R) = portul FPGA ICAP, ieșire pe 8 biți

0x8006 – ICAP (W) = ICAP_WRITE (bit10), ICAP_CE (bit9), ICAP_CLK (bit8), ICAP_I (biții 7-0)

0x800A – FREQHZ (W) = frecvența timerului în Hz, pe 16 biți unsigned. Valoarea de reset este 8000

0x800C – FREQTICK (R) = numărător pe 8 biți, se incrementează la frecvența descrisă de FREQHZ

0x800E – P2_V (RW) = valoarea pinului 2: 0-1

0x8010 – P2_DIR (R) = direcția pinului 2: 0-ieșire, 1-intrare. Valoarea de reset este 1

0x8012 – RANDOM (R) = număr aleator pe 16 biți

0x8014 – CLOCK (R) = semnal de ceas de 50MHz pe 16 biți

0x8016 – FLASH_MISO (R) = SPI flash MISO

0x8018 – FLASH_MOSI (W) = SPI flash MOSI

0x801A – FLASH_SCK (W) = SPI flash SCK

0x801C – FLASH_SSEL (W) = SPI flash SSEL

Alte trăsături ale acestor registre sunt:

Registrele ICAP_ au o conexiune directă cu portul de configurații intern FPGA-ului

Registrele FREQ măsoara frecvența de lucru constantă, cum ar fi, de exemplu, redarea sunetului. Dacă se încarcă de pildă valoarea frecvenței de 44.100 în registrul FREQHZ, registrul de 8 biți FREQTICK se incrementează la frecvența de mai sus.

Registrele P2_ controlează direcția și valoarea liniei de date P2, atunci când registrul IOMODE este încărcat cu valoarea 0x4A (ascii ‘J’).

Registrul RANDOM furnizează un număr aleator ce se actualizează continuu, derivat din generatorul de zgomot alb de pe plăcuță

Registrul CLOCK este un numărător pe 16 biți care se incrementeaza la fiecare ciclu de ceas, cu frecvența de 50MHz.

Registrele FLASH_ sunt o interfață către flash SPI-ul de pe placă.

NOTĂ: Pentru a preveni ca programele coprocesorului să schimbe accidental configurația flash, plăcuța Gameduino trebuie să se afle în modul IOMODE ‘J’ în așa fel încât coprocesorul să poată accesa SPI flash.

3.9. CULORILE DE REPREZENTARE A IMAGINII

Culorile sunt reprezentate în cadrul memoriei în format ARGB1555:

Un bit alfa (bit 15)

5 biți rosu (biții 14-10)

5 biți verde (biții 9-5)

5 biți albastru (biții 4-0)

CAP.4 MEDIUL DE DEZVOLTARE ARDUINO IDE

Plăcuța de dezvoltare Arduino Uno se poate programa cu software-ul Arduino IDE 1.0.5r2. Acesta este un mediu open-source care permite scrierea facilă a codului și încărcarea acestuia pe plăcuță. Poate rula pe Windows, Mac OS X și Linux. Acest mediu de dezvoltare integrat este scris în Java și se bazează pe diverse software-uri open source precum Pocessing, AVR-GCC și altele.

Mediul de dezvoltare Arduino IDE conține un editor de text pentru scrierea codurilor, o zonă de mesaje, o consola de text, o bară de instrumente cu butoane pentru funcții comune și o serie de meniuri. Se conectează la hardware-ul de pe plăcuța Arduino pentru a încărca programe și pentru a comunica cu acestea.

4.1. SCRIEREA SCEMELOR DE COD (de reformulate titlul)

Programele software scrise cu Arduino IDE se numesc scheme (‘sketches’). Aceste scheme sunt scrise în editorul de text. Schemele se salvează în fișiere cu extensia .ino. Printre posibilități se numără și decuparea/lipirea textului sau căutarea / înlocuirea de text. Zona de mesaje oferă informație de feedback în timpul salvării și exportării unui program și de asemenea, afișează și erorile de programare. Consola afișează mesajele returnate de mediul de dezvoltare Arduino, inclusiv mesaje complete de eroare și alte informații.

Colțul din partea dreaptă jos afișează plăcuța curentă pe care se lucrează și portul serial folosit. Butoanele din bara de instrumente permit verificarea și încărcarea programelor pe plăcuță, crearea, deschiderea și salvarea schemelor și deschiderea monitorului serial.

Butonul ‘Verify’ este cel care verifică dacă există erori în cod sau nu.

Butonul ‘Upload’ este cel care compilează codul și îl încarcă pe plăcuța Arduino. În cazul în care se utilizează un programator extern, se ține apăsată tasta ‘shift’ pentru a putea transforma acest buton în buton ‘Upload using programmer’.

Butonul ‘New’ crează o nouă schemă

Butonul ‘Open’ prezintă un meniu cu toate schemele create de utilizator. Se va selecta o schemă care se deschide în fereastra curentă

Butonul ‘Save’ salvează schema

Butonul ‘Serial monitor’ deschide monitorul serial.

4.2. MENIURILE MEDIULUI DE DEZVOLTARE ARDUINO IDE

Alte comenzi suplimentare se găsesc într-unul din cele 5 meniuri: File, Edit, Sketch, Tools, Help. Aceste meniuri se vor detalia în cele ce urmează:

Meniul File.

Din acest meniu se poate crea o nouă schemă, deschide o schemă existentă pe disc, se poate salva sau închide o schemă, se poate încărca programul descris în schemă pe plăcuța Arduino, se pot seta unele preferințe ale utilizatorului, se poate printa o anumită schemă sau se poate seta așezarea în pagină a acesteia.

Tot în acest meniu se găsește Sketchbook-ul (dosarul cu toate schemele create) și exemplele puse la dispoziție de mediul de dezvoltare Arduino IDE, cu schemele create și gata să fie încărcate pe plăcuță (se exemplifică utilizarea LEDurilor, senzorilor, comunicației seriale, a servomotoarelor, modulelor wifi, ethernet, controlul memoriei EEPROM, precum și a funcționalităților diferitelor shield-uri atașate).

Meniul Edit. Acest meniu are ca scop editări ale textelor precum:

Acțiuni de undo și redo

Acțiuni de selecție, decupare, copiere și lipire de text. De menționat în această secțiune sunt opțiunile:

Copy for Forum, care copiază codul din schemă într-un clipboard, sub o formă ce poate fi postată pe forumuri, formă ce respectă culorile sintaxei.

Copy as HTML, care copiază codul din schemă într-un clipboard, ca fișier HTML ce poate fi integrat în pagini web.

Crearea și ștergerea unor comentarii, creșterea și scăderea spațierii

Găsirea unui anumit text în cadrul schemei sau a unei selecții din schemă

Meniul Sketch. Opțiunile din acest meniu sunt:

Verify/Compile, verifică dacă există sau nu erori în schemă

Show Sketch Folder, deschide directorul curent în care se află schema

Add File…, adaugă la schemă un fișier sursă (acesta va fi copiat din locația sa curentă). Acest nou fișier va apărea într-un nou tab din fereastra schemei. Fișierele pot fi eliminate din scheme cu ajutorul meniului de taburi

Import Library, adaugă o librărie nouă în schemă, inserând declarații de forma ‘#include ’ la începutul codului. Se poate importa o librărie și dintr-un fisier .zip.

Meniul Tools. Cuprinde opțiunile:

Auto Format, care formatează codul într-un mod lizibil și corect. Un exemplu ar fi alinierea acoladelor pe tot parcursul textului sau spațierea corespunzătoare a declarațiilor din interiorul acoladelor

Archive Sketch, care arhivează o copie a schemei curente în formatul .zip. Arhiva va fi plasată în același director cu schema

Fix Encoding & Reload, care repară codul scris și reîncarcă programul pe plăcuță.

Serial Monitor, care deschide într-o fereastră nouă monitorul de comunicație serială

Board, care selectează tipul plăcuței Arduino care va fi programată

Serial Port, acest meniu conține și afișează toate dispozitive seriale (reale sau virtuale) atașate la calculator. Se actualizează automat de fiecare dată când se deschide meniul tools

Programmer, utilizat atunci când se programează plăcuța sau chipul cu ajutorul unui programator de tip hardware și nu se folosește conexiunea onboard USB-serială. În mod normal nu este necesară această opțiune decât dacă intenționăm să imprimăm secțiunea de bootloader unui alt microcontroller.

Burn Bootloader. Itemii din acest submeniu permit imprimarea unui bootloader pe un microcontroller de pe plăcuța Arduino. În cazul utilizării normale ale plăcuței Arduino acest lucru nu este necesar, dar se poate întâmpla ca microcontrollerul de pe plăcuță să fie schimbat cu un nou microcontroller ATmega (care de obicei vine fără bootloader). Trebuie să ne asigurăm că am ales plăcuța corectă din submeniul ‘Board’ înainte să rulăm imprimarea bootloader-ului.

Meniul Help. Acest meniu conține:

Informații despre Arduino și despre mediul de dezvoltare

Întrebări frecvente referitoare la Arduino și la mediul de dezvoltare

O secțiune de referințe (cu sintaxa specifică a funcțiilor, structurilor și variabilelor) și de găsire printre referințe

O secțiune de depanare (troubleshooting)

O secțiune pentru începători și cum să începem să folosim acest mediu de dezvoltare (achiziționare cabluri, descărcarea mediului de dezvoltare, conectarea plăcuței la calculator, instalarea driverelor, lansarea aplicației, deschiderea exemplelor, selecția plăcuței și a portului serial și încărcarea programelor)

O legătura către site-ul Arduino

4.3. DOSARUL DE SCHEME – SKETCHBOOK

Mediul de dezvoltare Arduino IDE folosește conceptul de ‘sketchbook’: acel loc standard unde utilizatorul își stochează programele (sau schemele). Schemele din sketchbook pot fi deschise din meniul ‘File>Sketchbook’ sau din butonul ‘Open’ din bara de instrumente. Prima oară când se rulează mediul de dezvoltare, se va crea automat un director pentru sketchbook. Se poate schimba locația sketchbookului din submeniul ‘Preferences’.

4.4. TABURI, FIȘIERE MULTIPLE ȘI COMPILARE

Taburile ne permit să gestionăm schemele cu fișiere multiple (fiecare schemă apare în propriul tab). Fișierele multiple pot fi fișiere de cod Arduino (fără extensie), fișiere C (cu extensia .c), fișiere C++ (extensia .cpp) sau fișiere header (extensie .h).

4.5. ÎNCĂRCAREA SCHEMELOR PE PLĂCUȚĂ

Înainte de a încărca schema pe plăcuță trebuie selectate tipul plăcuței și portul serial corect din meniul Tools. După ce se execută acest pas, se apasă pe ‘Upload’ din bara de instrumente sau din meniul File. Plăcuța Arduino se va reseta în mod automat și vor începe încărcarea programului. Veți vedea cum LED-urile RX și TX vor clipi în timpul încărcării schemei. Mediul de dezvoltare Arduino IDE va afișa un mesaj când încărcarea este gata sau va afișa o eroare.

Când se încarcă o schemă pe plăcuță, se utilizează bootloader-ul Arduino, care este un mic program ce a fost încărcat pe microcontrolerul de pe plăcuță. Acesta ne permite să încărcăm codul fără să folosim alt hardware suplimentar. Bootloader-ul este activ pentru câteva secunde atunci când se resetează plăcuța; apoi acesta pornește pe plăcuța cel mai recent program încărcat pe microcontroler. Bootloader-ul va determina clipirea LED-ului de pe plăcuță (pinul 13) atunci când va porni.

4.6. LIBRĂRIILE

Librăriile au rolul de a furniza mai multe funcționalități de utilizat în scheme, cum ar fi manipularea datelor, conectarea la diverși senzori sau utilizarea unor hardware-uri precum adaptorul Gameduino. Pentru a utiliza o librărie într-o schemă, aceasta se importă din meniul ‘Sketch>Import Library’. Acest lucru va insera una sau mai multe declarații de tip ‘#include’ la începutul schemei și va compila librăria odată cu schema actuală. Din pricina faptului că librăriile sunt încărcate pe plăcuță odată cu schema, acestea vor ocupa și ele un spațiu suplimentar în memoria microcontrolerului. Atunci când o schemă nu mai are nevoie de o anumită librărie ce apare în cod, nu trebuie decât să se șteargă declarația ‘#include’ corespunzătoare acestei librării.

Există o listă de librării în mediul de dezvoltare, dar se pot descărca și alte librării dintr-o diversitate de surse, ce pot fi apoi importate și utilizate. De asemenea, utilizatorul are posibilitatea de a-și crea propria librărie.

4.7. ADĂUGAREA ALTOR HARDWARE-URI

Se poate adăuga suportul pentru hardware-uri noi în directorul ‘hardware’ din directorul ‘sketchbook’. Platformele instalate aici pot include definițiile plăcii (care vor apărea în meniul plăcuței), librăriile procesorului, bootloadere și definițiile programatorului. Pentru a instala noul hardware, trebuie să i se creeze directorul corespunzător (cu numele acestuia), iar apoi dezarhivată platforma acestuia în directorul creat. Pentru a-l dezinstala, trebuie doar să ștergeți acest director.

4.8. MONITORUL SERIAL

Monitorul serial afișează datele ce sunt trimise serial de plăcuța Arduino (placa USB sau serială). Pentru a transmite date spre plăcuță, trebuie introdus textul și apoi apăsat pe ‘send’ sau pe tasta enter. În partea de jos a monitorului se poate selecta daca trasmisia sau recepția se face cu autodesfășurare a ecranului (autoscroll). Se mai poate selecta modul de afișare a datelor (cu linie nouă sau cu alineat nou) precum și rata de transfer a simbolurilor care trebuie să fie aceeași cu cea menționată în sintaxa ‘Serial.begin’ din codul schemei. În Linux sau Mac, plăcuța Arduino va fi resetată când se deschide monitorul serial.

4.9. SELECȚIA PLĂCUȚEI

Selecția plăcuței are două efecte. Unul dintre ele este setarea parametrilor utilizați la compilarea și încărcarea schemelor pe plăcuță, precum: viteza ceasului procesorului sau rata de transfer a simbolurilor. Celălalt efect al selecției plăcuței este stabilirea setărilor siguranței și a fișierului utilizate de comanda de scriere (imprimare) a bootloaderului pe un microcontroler.

În lucrarea de față se va selecta plăcuța Arduino Uno, avînd un microcontroler Atmel ATmega328P-PU ce rulează la o viteză de ceas de 16MHz, cu proprietate de auto-reset, ce utilizează un bootloader optiboot (specific ATmega328P-PU, cu rata de transfer a simbolurilor de 115200 simboluri/sec și care ocupă un spațiu de memorie de 0.5KB).

4.10. LIMBAJUL DE PROGRAMARE C

La începutul anilor 1970 Ken Thompson și Dennis Ritchie pun bazele unui limbaj de programare simplu și portabil pentru scrierea nucleului sistemului de operare Unix: limbajul de programare C. Astăzi, acest limbaj de programare este implementat pe majoritatea platformelor de calcul, fiind cel mai popular limbaj de programare pentru scrierea de software de sistem.

C a fost creat având drept scop important de a face programele mari să poată fi scrise mai ușor și cu mai puține erori în paradigma programării procedurale, dar fără a pune obstacole în scrierea compilatorului de C, care este încărcat de caracteristicile complexe ale limbajului.Multe compilatoare, biblioteci și interpretoare ale limbajelor de nivel înalt sunt adesea implementate în C.

4.10.1. Caracteristicile definitorii ale limbajului de programare C sunt următoarele:

Este un limbaj de programare standardizat, compilat, de nivel mediu, aceasta indicând strânsa legătura între interoperabilitate și echipamentul hardware;

Este apreciat pentru eficiența codului obiect pe care îl poate genera și pentru portabilitatea sa. C este prezentat uneori ca ‘asamblor portabil’, făcându-se astfel diferențele principale față de limbajele de asamblare: codul unui program C poate fi compilat și rulat pe aproape orice tip de mașină, asemănător altor limbaje de programare, în timp ce limbajele de asamblare sunt specifice unui anumit model de mașină.

Se dovedește a fi un limbaj de programare relativ minimalist ce operează în strânsă legătură cu hardware-ul, fiind cel mai apropiat de limbajul de asamblare față de majoritatea celorlelte limbaje de programare;

Este un limbaj de bază simplu, cu importante funcționalități cum ar fi funcțiile matematice sau cele de manipulare ale fișierelor;

Este focalizat pe paradigma programării procedurale, care facilitează programarea într-un mod structurat;

Utilizează un set simplu de tipuri de date ce împiedică multe operații neintenționate;

Folosește un limbaj preprocesor (preprocesorul C) pentru sarcini cum ar fi definirea de macrouri și includerea mai multor fișiere sursă;

Permite accesarea la nivel scăzut a memoriei calculatorului prin utilizarea pointerilor;

Permite folosirea parametrilor, care sunt comunicați funcțiilor prin valoare și nu prin referință;

Utilizează pointeri la funcții, ce permit forme rudimentare de închidere și polimorfism

Permite declararea variabilelor;

Utilizează structuri de date sau tipuri de date agregate, definite de utilizator prin (struct), ce permit ca date înrudite să fie combinate și manipulate ca un întreg.

4.10.2. Limbajul de programare C cuprinde tipuri de date cum ar fi:

Întregi de diferite dimensiuni, cu sau fără semn,

Numere în virgulă mobilă,

Enumerări (enum)

Structuri de date (struct)

Uniuni (union)

O caracteristică ce individualizează limbajul de programare C de celelalte limbaje de programare este utilizarea pointerilor, un tip de referință foarte simplu, care păstrează adresa locației de memorie. Adresa poate fi manipulată cu ajutorul atribuirilor și a aritmeticii pointerilor. În momentul rulării unui program, un pointer reprezintă o adresă de memorie. În momentul compilării, un pointer este un tip de dată complex, ce reprezintă atât adresa de memorie cât și tipul de dată. Acest lucru permite expresiilor ce utilizează pointeri să fie evaluate după tipul de dată. Pointerii au mai multe utilizări în C. De exemplu, șirurile de caractere sunt adesea reprezentate printr-un pointer la un vector de caractere. Alocarea dinamică a memoriei este realizată tot cu ajutorul pointerilor.

Un pointer null are o valoare rezervată, indicând faptul că face referire la o locație nevalidă. Acest lucru este folositor în cazuri speciale cum ar fi pointerul next (următorul) în nodul final al unei liste înlănțuite. Dereferențierea unui pointer null poate cauza un comportament imprevizibil al aplicației. De asemenea, există și pointeri de tip void, fapt ce indică referirea la un obiect de tip necunoscut. Acești pointeri sunt foarte folositori în programarea generică. Deoarece dimensiunea și tipul obiectelor la care acest tip de pointeri face referire sunt necunoscute, aceștia nu pot fi dereferențiați, dar pot fi convertiți la alt tip de pointeri.

În C, anterior standardului C99, tablourile (vectorii) sunt de dimensiune fixă, statică, cunoscută la momentul compilării; în practică, acest lucru nu reprezintă o piedică, având în vedere că se pot aloca blocuri de memorie în momentul rulării, tratându-le ca pe tablouri utilizând librăria standard. Spre deosebire de multe alte limbaje de programare, C reprezintă tablourile ca și pe pointeri: o adresă și un tip de dată. Prin urmare, valorile index pot depăși dimensiunea actuală a unui tablou.

De asemenea, C oferă posibilitatea de lucru cu tablouri multidimensionale. Din punct de vedere semantic, tablourile multidimensionale sunt tablouri de tablouri, dar, din punct de vedere fizic, acestea sunt stocate ca un singur tablou unidimensional cu un offset calculat.

C este adesea folosit în programarea de nivel scăzut, unde poate fi necesar ca un întreg să fie tratat ca o adresă de memorie, un număr în virgulă mobilă ca un întreg sau un tip de pointer ca un alt tip de pointer. Pentru astfel de cazuri C oferă operatorul de casting, care forțează explicit conversia unei valori dintr-un tip de dată în alt tip de dată.

4.10.3. Alocarea memoriei

Una din cele mai importante funcții ale unui limbaj de programare este ca acesta să furnizeze metode de management a memoriei și al obiectelor stocate în memorie. C furnizează trei metode distincte de alocare a memoriei pentru obiecte:

Alocarea statică a memoriei: adresele și dimensiunile obiectelor ce fac uz de alocarea statică a memoriei sunt fixate în momentul compilării și pot fi plasate într-o zonă de dimensiune fixă ce corespunde unei secțiuni din cadrul fișierului linkedidat final. Acest tip de alocare a memoriei se numește statică deoarece locația și dimensiunea lor nu variază pe durata de execuție a programului.

Alocarea automată a memoriei: obiectele temporare (variabilele locale declarate în cadrul unui bloc de cod) sunt stocate în cadrul de stivă asociat funcției apelate, iar spațiul alocat este automat eiberat și reutilizat după ce s-a părăsit blocul în care acestea au fost declarate.

Alocarea dinamică a memoriei: blocuri de memorie de orice dimensiune pot fi alocate într-o zonă de memorie numită heap prin intermediul funcțiilor malloc(), calloc() și realloc(). Aceste blocuri de memorie pot fi reutilizate după ce zona de memorie a fost eliberată prin apelul funcției free().

Nu toate variabilele sunt automat alocate. Următoarele tipuri de variabilă sunt alocate static:

toate variabilele globale, indiferent dacă au fost sau nu declarate ca statice;

variabilele locale declarate explicit ca fiind statice.

Variabilele alocate static au alocată locația lor de memorie și inițializată înainte ca funcția main să fie executată și nu sunt dealocate până când se termină execuția funcției main. Variabilele alocate static nu sunt reinițializate la fiecare apel al funcției în cadrul cărora au fost declarate. O variabilă alocată static are avantajul că își păstrează valoarea, chiar dacă funcțiile care accesează acea valoare nu mai sunt active.

4.10.4. Sintaxa

C-ul are o formă liberă, lăsând programatorul să-și organizeze codul folosind spațiile albe. Comentarii pot fi înserate oriunde în cadrul programului utilizând delimitatorii /* și */.

Fiecare fișier sursă conține declarații de variabile și definiții de funcții. Funcțiile, la rândul lor, conțin alte declarații de variabile și comenzi. Declarațiile de variabile fie definesc noi tipuri folosind cuvinte cheie precum struct, union și enum sau atribuind un tip de date predefinite, prin scrierea tipului de dată și urmat de numele variabilei. Cuvinte cheie precum char, int, precum și pointerul la unul din aceste tipuri * reprezintă tipuri de date implementate nativ în C. Secțiuni de cod sunt incluse între paranteze acolade ({ și }), pentru a indica pentru ce porțiune a codului se aplică declarațiile de variabile și celelalte structuri de control.

Comenzile execută acțiuni cum ar fi cele de modificare ale valorii unei variabile sau afișarea unui text la consolă. Structurile de control sunt variabile pentru execuții condiționale sau iterații, realizate cu ajutorul cuvintelor rezervate if, else, switch, do, while și for. Salturi arbitrare sunt posibile prin folosirea cuvântului cheie goto. Cu ajutorul unei varietăți de operatori implementați în C, se pot realiza operații aritmetice, logice, comparative, pe biți, indexarea tablourilor și atribuiri. Comenzile pot de asemenea apela funcții, incluzând un număr mare de funcții din bibliotecile standard ale limbajului C, necesare pentru realizarea diferitelor sarcini cerute de programator.

4.11. LIMBAJUL DE PROGRAMARE C++

C++ este un limbaj de programare general, compilat. Este un limbaj multi-paradigmă, cu verificarea statică a tipului variabilelor ce suportă programare procedurală, abstractizare a datelor, programare orientată pe obiecte. În anii 1990, C++ a devenit unul dintre cele mai populare limbaje de programare comerciale, rămânând astfel până azi.

Limbajul de programare C++ a fost inițial derivat din C. Totuși, nu absolut orice program scris în C este valid C++, deoarece C și C++ au evoluat independent. Diferențele fac să fie greu de scris programe și biblioteci care să fie compilate și să ruleze corect în calitate de cod C sau C++ și produce confuzii celor care programează în ambele limbaje.

Bjarne Stroustrup de la Bell Labs, creatorul limbajului C++, a dezvoltat acest limbaj de programare ca o serie de îmbunătățiri ale limbajului C. Aceste îmbunătățiri reprezintă:

adăugarea noțiunii de clase,

adăugarea funcțiilor virtuale,

suprascrierea operatorilor,

moștenire multiplă,

șabloane (template-uri)

excepții.

4.11.1. Cele mai importante diferențe dintre cele două limbaje de programare sunt:

inline —funcțiile inline apar în secțiunea de declarare a variabilelor globale în C++, iar în C acestea apar în așa zisele „fișiere statice“.

Cuvântul cheie bool are în C99 propriul său header, <stdbool.h>. În variantele anterioare de C tipul de date boolean nu era definit, în schimb erau folosite o serie de metode (incompatibile) pentru a simula acest tip de date.

Constantele caracter (cuprinse între apostrofuri) au dimensiunea unui int în C și char în C++. Cu alte cuvinte, în C, sizeof('a') == sizeof(int); în C++, sizeof('a') == sizeof(char). Chiar și în aceste condiții, valoarea acestui tip de constante nu va depăși valoarea maximă ce poată fi păstrată de char, deci o conversie de genul (char)'a' este sigură.

Cuvinte cheie suplimentare au fost introduse în C++, deci acestea nu pot fi folosite ca identificatori așa cum ar putea fi folosite în C. (de exemplu, code>try, catch, template, new, delete, …)

În C++, compilatorul creează automat o „etichetă“ pentru orice structură (struct), uniune (union) sau enumerație (enum), astfel încât struct S {}; în C++ este echivalent cu typedef struct S {} S; în C.

C99 a adoptat unele funcționalități ce au apărut inițial în C++. Printre acestea se enumeră:

Declararea obligatorie a prototipului funcțiilor

Cuvântul cheie inline

Eliminarea variabilei implicite int ca valoare de întoarcere.

4.11.2. Construcția unui program in C++

Construcția unui program în C++ se rezumă la execuția a 3 pași:

Introducerea instrucțiunilor programului. Pentru a scrie un program în C++ trebuie introduse instrucțiunile programului sub formă de text într-un mediu integrat de dezvoltare (IDE). Un mediu de dezvoltare este un editor de texte combinat cu alte instrumente utile de programare: de exemplu Arduino IDE.

Construcția programului (compilarea și legarea). Construcția programului reprezintă procesul de conversie a codului sursa ( instrucțiuni C++ ) într-o aplicație care poate fi utilizată. Figura următoare rezumă modul de funcționare a procesului de contrucție.

Mediul de dezvoltare integrat execută toate aceste etape în mod automat, prin apăsarea unei taste funcționale.

Testarea programului. După construirea cu succes a programului, acesta trebuie rulat de câteva ori pentru a ne convinge că îndeplinește cu rigoare scopul dorit.

Similar Posts

  • Colorectal Cancer

    Content Introduction ………………………………………………………………………………………..2 Actuality of the topic …………………………………………………………………………………….4 Purpose of thesis……………………………………………………………………………….……4 Objectives of thesis…………………………………………………………………………….…..4 Theoretical importance and value of the work ……………………………………………..……4 Chapter 1 ………………………………………………………………………………………………………5 1.1 General information ………………………………………………….…………….……5 1.1.1. Anatomy of the colon ……………………………………………………….……..5 1.1.2 Blood and nerve supply ……………………………………………………………10 1.2 colorectal cancers …………………………………………………………………………12 1.2.1. Etiopathology ……………………………………………………..…………………….13 1.2.2. Morphopathology …………………………………………………………….…………15 1.2.3. Epidemiology …………………………………………………………………………….17 1.2.4….

  • Contractul de Transport Maritim

    CUPRINS: ………………………………………………………………………………..…3 CAPITOLUL I CONSIDERAȚII GENERALE ASUPRA TRANSPORTULUI MARITIM………………………………………………………………………………………..6 Reglementarea juridică privind noțiunea și clasificarea transporturilor. …………………6 Aspecte conceptuale cu privire la transportul maritim…………………………………9 Particularități ale activității de transport maritim………………………………………..11 Cadrul general privind desfășurarea activității de transport maritim……………………20 CAPITOLUL II CONTRACTUL TRANSPORTULUI MARITIM ȘI DE MĂRFURI………………………………………………………………………………………28 2.1. Contractul de transport maritim. Noțiunea și caracterele juridice…

  • Boala Purpura Henoch Schönlein

    Capitolul I Introducere Purpura Henoch Schönlein este o vasculită generalizată (boală inflamatorie a vaselor sanguine) a vaselor mici, caracterizată prin inflamație și distrugerea vaselor sanguine,iar din punct de vedere clinic prin purpură palpabilă (localizată în mod specific la nivelul membrelor inferioare si feselor), artrita, dureri abdominale si hematurie. O astfel de afectiune poate fi diagnosticata…

  • Cerințe Internaționale Privind Supravegherea Riscurilor Bancare

    CERINȚE INTERNAȚIONALE PRIVIND SUPRAVEGHEREA RISCURILOR BANCARE SolnițăAmalia Elena,masterand Universitatea „Constantin Brâncuși”din Târgu Jiu Facultatea de Științe Economice e-mail:[anonimizat] Rezumat: Studiul de față își propune să realizeze o incursiune în ceea ce privesc cele mai importante implicații ale implementării mecanismului unic de supraveghere bancară asupra funcțiilor Băncii Centrale Europene și de asemenea asupra diverselor fațete ale…

  • Analiză Comparativă a Instituțiilor Europene Intre Maastricht Si Lisabona

    Universitatea Titu Maiorescu Facultatea de Drept Lucrare de licența la disciplina Dreptul Uniunii Europene cu titlul Analiză comparativă a instituțiilor europene intre Maastricht si Lisabona CUPRINS INTRODUCERE………………………………………………………………………………1 Capitolul 1.TRATATUL DE LA MAASTRICHT, FUNDAMENT AL UNIUNII EUROPENE MODERNE I.1 MODIFICARI ADUSE DE TRATATUL DE LA MAASTRICHT IN CEEA CE PRIVESTEINSTITUTIILE UNIUNII EUROPENE I.1.1 COMISIA I.1.2 CONSILIUL…