Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

Circuite Programabile cu Aplicații în BiomedicinăLaborator 1

1. Microcontrolerul ATmega-328
1.1. Caracteristici generale
ATmega-328 este un microcontroller de tip RISC (Reduced Instruction Set) pe 8 biți din familia AVR
(Advanced Virtual RISC) a firmei Atmel (din 2016 Microchip). Este un microcontroller cu performanțe
bune ajungând sa execute instrucțiuni într-un singur ciclu de clock, atingând randamente de 1MIPS
(Millions of instructions per second) per MHz. Este optimizat pentru consum redus de putere raportat
la viteza de procesare și poate fi folosit în general în sisteme de tip “embedded”.

În Tabelul I sunt extrase cele mai importante resurse ale microcontrolerului ATmega328:
Tabelul I. Principalele resurse ale microcontrolerului ATmega328

Caracteristici ATmega328
Număr Pini 28/32
Încapsulări (4) 28-pin PDIP
32-lead TQFP
28-pad QFN/MLF
32-pad QFN/MLF
CPU RISC 8-Bit AVR
Frecvență maximă de operare (oscilator) 20 MHz
Performanță 20 MIPS la 20 MHz
Tensiune de operare De la 1.8 V la 5.5 V
Memorie de Program 32KB de tip Flash
Memorie SRAM 2048 Bytes (2KB)
Memorie EEPROM 1024 Bytes (1KB)
Rezoluție ADC 10-Bit
Număr de canale ADC 6/8
Pini PWM 6
Întreruperi externe 2
Timere (3) 8-Bit x 2 & 16-Bit x 1
Watchdog Timer Da
Comparator 1
USI (Universal Serial Interface) Da
SPI (Serial Peripheral Interface) Da
I2C Da
Reset Da
Temperatură de operare De la -40 C până la +85 C

1.2. Descrierea pinilor


Microcontrolerele ATmega328 pot fi regăsite sub următoarele forme de încapsulare:

• Plastic Dual in-line Package (PDIP) cu 28 pini


• Micro Lead Frame (MLF) cu 28 pini
• Thin Quad Flat Package (TQFP) cu 32 pini
• Micro Lead Frame (MLF) cu 32 pini
În Tabelul II sunt prezentate figuri cu cele 4 tipuri de încapsulări, cât și funcțiile pinilor.

Tabelul II. Tipuri de încapsulări pentru microcontrolerul ATmega328

Fig. 1. Plastic Dual in-line Package (PDIP) cu 28 pini

Fig. 2. Micro Lead Frame (MLF) cu 28 pini

Fig. 3. Thin Quad Flat Package (TQFP) cu 32 pini

Fig. 4. Micro Lead Frame (MLF) cu 32 pini

Pinii microcontrolerului ATmega328 sunt împărțiți în porturi astfel:

1. VCC este pinul pentru sursa de tensiune digitală (potențial pozitiv).

2. GND este pinul de masă (potențial negativ).

3. Portul B este format din pinii de la PB0 la PB7. Port B este un port bidirecțional (I/O) pe 8 biți cu
rezistențe interne de agățare (rezistențe de tip pull-up).
4. Portul C este un port bidirecțional (I/O) pe 7 biți cu rezistențe interne de agățare (rezistențe de tip
pull-up). Doar ca I/O sunt folosiți pinii de la PC0 la PC6.

5. PC6/RESET este un pin de I/O daca siguranța RSTDISBL este programată și este transformat în pinul
de RESET dacă siguranța RSTDISBL nu este programată.

6. Portul D este format din pinii de la PD0 la PD7. Port D este un port bidirecțional (I/O) pe 8 biți cu
rezistențe interne de agățare (rezistențe de tip pull-up).

7. AVCC este pinul unde se conectează sursa de tensiune pentru convertorul analog digital (ADC).
Trebuie conectat extern la VCC chiar daca ADC-ul nu este folosit.

8. AREF este pinul analog pentru tensiunea de referință pentru ADC.

9. ADC[6:7] reprezintă intrările 6 și 7 pentru ADC în cazul încapsulărilor TQFP și VFQFN. Acești pini sunt
alimentați de sursa de tensiune pentru partea analogică. Pinii PC[0:5] pot fi configurați ca celelalte 6
intrări pentru ADC.

În tabelul III este prezentată numerotarea pinilor microcontrolerului ATmega328 în ordine crescătoare
conform Figurii 3.
Tabelul III. Numerotarea pinilor microcontrolerului ATmega328

1.3. Arhitectura microcontrolerului ATmega328


O arhitectură a unui dispozitiv prezintă fiecare informație despre dispozitivul respectiv. Diagrama bloc
prezintă circuitul intern și fluxul programului oricărui dispozitiv. În Fig. 5 este prezentată diagrama
bloc a microcontrolerului ATmega328.
Fig. 5. Diagrama bloc microcontrolerului ATmega328

1.3.1. Nucleul de procesare a arhitecturii AVR


Principala funcție a nucleului procesorului este să asigure executarea corectă a programului. Prin
urmare, CPU (Central Process Unit) trebuie să poată accesa memorii, să efectueze calcule, să
controleze periferice și să poată manipula întreruperile. Diagrama bloc a arhitecturii AVR este
prezentată în Figura 6.

Fig. 6. Diagrama bloc a arhitecturii AVR


Pentru a maximiza performanța și paralelismul, AVR folosește o arhitectură Harvard - cu memorii și
magistrale separate pentru program și date. Instrucțiunile din memoria de program sunt executate cu
un singur nivel de paralelism. În timp ce o instrucțiune este executată, următoarea instrucțiune este
preluată din memoria programului. Acest concept permite instrucțiunilor să fie executate la fiecare
ciclu de ceas. Memoria de program este o memoria reprogramabilă de tip Flash.

Tabela de regiștrii cu acces rapid conține 32 regiștri de lucru de uz general pe 8 biți cu timp de acces
unic de un ciclu de ceas. Aceasta permite funcționarea unității de logică aritmetică (ALU) pe un ciclu
de ceas. Într-o operație tipică ALU, doi operanzi sunt extrași din tabela de regiștri, operația este
executată, iar rezultatul este stocat din nou în tabela de regiștri într-un ciclu de ceas.

ALU acceptă operații aritmetice și logice între registre sau între o constantă și un registru. Operațiunile
cu un singur registru pot fi, de asemenea, executate în ALU. După o operație aritmetică, Registrul de
Stare (STATUS Register) este actualizat pentru a reflecta informațiile despre rezultatul operației.

Stiva este utilizată în principal pentru stocarea datelor temporare, pentru stocarea variabilelor locale
și pentru stocarea adreselor de retur după întreruperi și apeluri de subrutină. Stiva este implementată
crescând de la locații de memorie mai mari la locații de memorie mai mici. Registrul indicator de Stivă
(Stack Pointer Register ) indică întotdeauna partea de sus a Stivei. Stiva este alocată efectiv în SRAM-
ul de date generale și, în consecință, dimensiunea acesteia este limitată doar de dimensiunea totală a
SRAM-ului și de modul de utilizare al acestuia.

1.3.2. Registrii microcontrolerului ATmega328


Tabela de regiștri de uz general este optimizată pentru setul de instrucțiuni de tip RISC. Majoritatea
instrucțiunilor care funcționează în tabela de regiștri au acces direct la toți regiștrii, iar majoritatea sunt
instrucțiuni cu un singur ciclu. Toți acești regiștrii fac parte din memoria de tip SRAM.

Fig. 7. Tabela de regiștri de uz general

Registrele R26:R31 au unele funcții adăugate pentru utilizarea lor în scop general. Aceste registre sunt
indicatoare de adresă pe 16 biți pentru adresarea indirectă a spațiului de date.
1.3.3. Memoria microcontrolerului ATmega328
Arhitectura AVR are două spații de memorie principale (arhitectură Harvard):

• spațiul pentru memorie de program


• spațiul pentru memorie de date

ATmega328 conține 32 Kbytes memorie de tip Flash reprogramabilă pentru stocarea programului.
Întrucât toate instrucțiunile AVR au o lungime de 16 sau 32 de biți, memoria Flash este organizată în
16K x 16. Pentru securitate software, memoria de program de tip Flash este împărțit în două secțiuni,
secțiunea de program de aplicații și secțiunea de program de Boot. Ambele secțiuni au biți de blocare
dedicați pentru protecția la scriere și citire / scriere.

Fig. 8. Harta memoriei de program a microcontrolerului ATmega328

Memoria Flash rezistă la cel puțin 10.000 de cicluri de scriere / ștergere. Este o memorie de citire
programabilă (Programmable Read Only Memory - ROM) non volatilă. Contorul de program al
microcontrolerului ATmega328 (PC) are o lungime de 14 biți, adresându-se astfel locațiile de memorie
ale programului 16K.

În memoria SRAM, cele 2304 locații de memorie de date adresează tabela de regiștri cu uz general
(primele 32 de locații), memoria de I/O standard (următoarele 64 de locații), memoria de I/O extinsă
(următoarele 64 de locații ) și datele interne din SRAM (ultimele 2K locații). Memoria SRAM este
volatilă și se șterge după întreruperea sursei de tensiune. Harta memoriei este prezentată în Fig. 9.

Fig. 9. Harta memoriei de date SRAM

Microcontrolerul ATmega328 conține 1K bytes memorie de date EEPROM (Electrically Erasable


Programmable Read Only Memory). Este organizată ca un spațiu de date separat, în care fiecare byte
poate fi citit și scris. EEPROM are o rezistență de cel puțin 100.000 de cicluri de scriere / ștergere.
1.4. Exemplu de implementare cu microcontrolerul ATmega328p

1.4.1. Placa de dezvoltare Arduino


Arduino este una dintre cele mai simplu de utilizat platforme cu microcontroller. Este
asemănătoare unui minicalculator (are puterea de calcul a unui computer obișnuit de acum 15 ani),
fiind capabil sa culeagă informații din mediu si sa reacționeze la acestea.

Fig. 10. Placa de dezvoltare Arduino UNO


In jurul lui Arduino exista un ecosistem de dispozitive extrem de bine dezvoltat. Orice fel de
informație se dorește fi culese din mediu, orice fel de conexiuni cu alte sisteme ar avea nevoie, există
o șansă foarte mare să se găsească un dispozitiv pentru Arduino capabil să ofere ceea ce e nevoie.
Astfel, dacă se discută despre preluarea de informații din mediu, mai jos sunt doar câteva
exemple de senzori : senzori ce determină nivelul de alcool în aerul respirat, senzor de incendiu, gaz
GPL, monoxid de carbon, accelerații ale dispozitivelor în mișcare, curent consumat de diverse
dispozitive casnice, forța de apăsare, gradul de rotire, cartele RFID, distanțe, nivel de iluminare, direcția
nordului, prezența umană, sunet, temperatură, umiditate, presiune atmosferică sau video.
Daca ne referim la posibilitatea de a ne conecta cu alte sisteme, există plăci de rețea Ethernet
pentru Arduino capabile sa comunice informații prin Internet, dispozitive capabile să transmită date
prin conexiune radio, plăci de rețea WIFI, dispozitive GSM pentru Arduino (capabile sa trimită /
recepționeze SMS-uri, sa inițieze apeluri de voce sau sa trimită date prin rețeaua 3G/4G) sau conectori
Bluetooth pentru conectarea Arduino cu telefonul mobil sau laptop. In zona mecanică, exista motoare
de curent continuu (utilizate pentru robotică), motoare pas cu pas (utilizate de obicei în zona
industrială) sau servomotoare, controlate foarte exact. Pentru afișarea informațiilor preluate, există
ecrane LCD pentru Arduino, începând cu cele mai simple (LCD text cu 16 caractere) până la ecran LCD
grafice.
In cazul Arduino, totul este foarte simplu de utilizat. Sunt necesare câteva minute pentru
instalarea mediului de dezvoltare si pentru scriere primul program pe Arduino. Nu este necesar lipirea
de fire, este suficient un port USB liber.

1.4.2. Arduino IDE, Program Arduino, Upload


După instalarea driverelor pentru placa de dezvoltare și a interfeței de programare Arduino,
următorul pas este programarea microcontrolerului. Se rulează programul "arduino" (vezi screenshot-
ul de mai jos).
Arduino se conectează la PC prin intermediul unui port serial. Primul pas este determinarea
portului. Cea mai simplă cale este să se conecteze placa, se așteaptă circa 30 de secunde pentru a fi
detectata de PC, iar apoi se deschide meniul "Tools -> Serial Port". Ar trebui să se vadă una sau mai
multe intrări (“Com”). La deconectarea plăcii Arduino din portul USB (se scoate cablul din PC), acel port
care a dispărut este portul asociat plăcii Arduino. Se conectează din nou placa Arduino la PC, se
așteaptă sa fie recunoscută de PC, și apoi se selectează portul respectiv din meniul "Tools -> Serial
Port".
Următorul pas este selectarea tipului de placă cu care se lucrează. Din meniul "Tools -> Board",
se selectează Arduino Uno.

Fig. 11. Mediul de dezvoltare Arduino

1.4.3. Structura unui program Arduino


Orice program Arduino are doua secțiuni. Secțiunea "setup", care este rulată doar o singură
dată, atunci când placa este alimentată (sau este apăsat butonul "Reset"), și secțiunea "loop", care
este rulată în ciclu, atât timp cât este alimentată placa.

void setup() {
//codul scris aici rulează o singura data
}

void loop() {
//codul scris aici rulează tot timpul
}

Astfel, în rutina "setup" se va scrie de obicei cod de inițializare, iar in rutina "loop" se va scrie
partea principală a programului.
1.4.4. Exemplu: Arduino Blink
Ca exemplu de implementare de cod, vom folosi un led montat din fabricație pe placa. Placa
Arduino are din construcție un led conectat la pinul digital 13. Acest led se aprinde atunci când pinul
13 digital este pus în HIGH (din programul scris pe Arduino) se stinge atunci când pinul 13 este pus in
LOW (HIGH = VCC: 5V, LOW = GND). Codul se poate încarcă și din exemplele pe care le pune la dispoziție
interfața Arduino (File -> Examples -> Basics -> Blink).

void setup() {
pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
Dacă se încarcă acest program pe placa Arduino și se urmărește led-ul conectat la pinul 13, se
va observa ca el clipește o dată pe secundă.
În secțiunea "setup" avem o singură instrucțiune, care declară că pinul 13 digital va fi folosit în
continuare pentru a controla un dispozitiv (OUTPUT) (daca am fi vrut să citim informație din mediu –
sa atașăm un senzor la el – am fi scris "pinMode(13, INPUT)"). Aceasta instrucțiune se execută o singură
dată.
Urmează secțiunea "loop", care aprinde led-ul conectat la pinul 13 ("digitalWrite(13, HIGH)"),
așteaptă o secunda, îl stinge și iarăși așteaptă o secundă. Instrucțiunile din secțiunea "loop" se execută
ciclic, astfel ca imediat după ce s-a terminat un ciclu, led-ul iarăși se aprinde, apoi iarăși se stinge și tot
așa până când tăiem alimentarea plăcii.

1.4.5. ATmega328 și Arduino


Placa de dezvoltare Arduino are la bază microcontrolerul Atmega328p. În principal, Atmega328p este
o variantă constructivă cu o putere mai scăzută față de Atmega328. Microcontrolerul Atmega328p
poate fi programat utilizând cod C în mediul de dezvoltare Arduino folosind structura specifică mediului
Arduino. Microcontrolerele sunt programate de obicei printr-un programator, cu excepția cazului în
care există instalat un firmware în microcontroler care permite instalarea programului nou, fără a fi
nevoie de un programator extern. Aceasta se numește bootloader. Firmware-ul este instalat in
prealabil în zona de memorie dedicată acestuia.
Pinii microcontrolerului ATmega328p sunt conectati la pinii de I/O ai plăcii de dezvoltare Arduino
conform Fig. 12 (pinii plăcii Arduino – IDE fond roz).
Fig. 12. Funcționalitățile pinilor microcontrolerului ATmega328p corelați cu pinii plăcii de dezvoltare
Arduino

Pentru aprinderea Led-ului atașat din fabricație la placa de dezvoltare Arduino la pinul 13, va
trebui programat pinul corespunzător microcontrolerului (PB5) ca sursă de tensiune (1 logic). Astfel,
trebuie setați 2 regiștri ai microcontrolerului pentru programarea pinului PB5 ca pin de ieșire cu
valoarea logică 1.
Tabelul IV. Tabela cu regiștrii de configurare a porturilor

Pentru setarea direcției unui pin ce aparține portului B se folosește registrul DDRB:

DDRB = 0bB7B6B5B4B3B2B1B0
unde B0-B7 sunt valorile asignate pinilor microcontrolerului în registrul DDRB.

De exemplu, pentru setarea pinului PB5 ca pin de ieșire se inițializează registrul

DDRB = 0b00100000.
Pentru setarea stării unui pin ce aparține portului B se folosește registrul PORTB:

PORTB = 0bB7B6B5B4B3B2B1B0
unde B0-B7 sunt valorile asignate pinilor microcontrolerului în registrul PORTB.

De exemplu, pentru setarea pinului PB5 cu valoarea logică 1 se inițializează registrul


PORTB = 0b00100000.
Programul corespunzător aprinderii și stingerii Led-ului de pe placa de dezvoltare la un interval
de 1 secunda este:

#include <avr/io.h> // se include biblioteca ce conține definiția termenilor utilizați (de ex. DDRD)
#include <util/delay.h> // conține definiția funcției de așteptare

void setup() {
DDRB = 0b00100000; // Setare Pin PB5 ca pin de ieșire
PORTB = 0b00000000; // Stinge LED-ul
}
void loop() {
PORTB = 0b00100000; //Aprinde LED-ul
_delay_ms(1000); // Întârziere de 1000ms
PORTB = 0b00000000; //Stinge LED-ul
_delay_ms(1000); // Întârziere de 1000ms
}

Exerciții:

1. Realizați un circuit prin care să modificați starea unui led conectat la pinul 7 al plăcii de dezvoltare
Arduino la un interval de 2s. Valorile se vor implementa cu numere în baza 16.

2. Să se realizeze un program care să simuleze funcționarea unui semafor în mod continuu după
secvența: verde (aprins 3s), portocaliu (aprins 0,5s), roșu (aprins 2s). Ledul verde se va conecta la
pinul 2, ledul portocaliu la pinul 4 iar ledul roșu la pinul 8.

You might also like