Sunteți pe pagina 1din 214

Microcontrolere

Curs 7

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Modulul comparator analogic


 Modulul de comunicație SPI
 Noțiuni generale
 Configurarea

 Modulul de comunicație TWI


 Noțiuni generale
 Configurarea
2
Modulul comparator analogic

 Când tensiunea
pe AIN0 este
mai mare decât
cea de pe AIN1, PB2
ieșirea
comparatorului
devine 1 logic PB3

3
Modulul comparator analogic

4
Modulul comparator analogic

1 activează ieșirea 1 activează declanșarea unității de


modulul comparatorului captură a Timer/Counter1 de către
ieșirea comparatorului
1 activează flagul de
folosirea bandgap întrerupere 5

pentru V+
Modulul comparator analogic

1 activează întreruperea

6
Caracteristici principale modul SPI

 SPI = Serial Peripheral Interface


 Full duplex, sincronă
 Este de tip master/slave
 Conexiuni:
 SCLK – Serial clock, generat de Master
 MOSI – Master Output, Slave Input, date transmise de
Master
 MISO – Master Input, Slave Output, date recepționate de
Master
 SS – Slave select – activarea dispozitivului Slave de către
Master, activ pe zero 7
Principiul de funcționare modul SPI

 Master inițiază comunicația prin activarea SS


 Master generează semnalul de ceas SCLK
 Pe fiecare perioadă de ceas un bit se transmite de la
master la slave și un bit de la slave la master
 După fiecare pachet de date SS poate fi dezactivat
pentru sincronizarea Slave

SCLK SCLK
SPI MOSI MOSI SPI
Master MISO MISO Slave
8
SS SS
Principiul de funcționare modul SPI

 Pentru un dispozitiv Slave, SS este semnal de intrare


 SS cu valoare 0 înseamnă activarea dispozitivului slave. O
tranziție din 0 în 1 înseamnă resetarea ciclului de transfer
(marchează sfârșitul unui pachet)
 SS cu valoare 1 – dispozitiv Slave inactiv

 Pentru un dispozitiv Master, SS poate fi:


 Ieșire– prin el activează dispozitivul Slave pentru
comunicare
 Intrare – dacă se permit mai multe dispozitive master, o
valoare 0 la intrarea SS trece dispozitivul curent în modul
Slave 9
Principiul de funcționare modul SPI

 Configurații cu mai multe dispozitive: semnale SS


independente sau “daisy chain”

10
PB6
REGISTRU DEPLASARE
Modulul SPI PB5

 PB4 are rol de


SS doar când PB7
ATmega32 este
CEAS PB4 / ?
Slave
 Când ATmega32 CONTROL
este Master,
orice pin poate
fi folosit ca
semnal SS

11
Controlul pinilor pentru modulul SPI

12
Registrul de date SPDR

 Registrul SPDR este folosit și pentru recepție și


pentru emisie
 Când se citește din SPDR, valoarea citită
reprezintă datele recepționate
 in r16, SPDR

 Când se scrie în SPDR, valoarea respectivă este


transmisă
 out SPDR, r18 13
Regiștrii modulului SPI

valoarea 1 activează 1 – mod Master


întreruperea la finalizarea 0 – mod Slave
unui transfer
valoarea 1 activează 1 – LSB first
modulul SPI 0 – MSB first 14
Regiștrii modulului SPI

15
Regiștrii modulului SPI

Registrul
SPSR

16
Regiștrii modulului SPI

devine 1 la finalizarea
unui transfer

devine 1 dacă se încearcă scrierea în


17
SPDR în timpul unui transfer de date
Exemplu configurare SPI ca master

SPI_MasterInit: void SPI_MasterInit ()


ldi r17,0b10100000 {
out DDRB,r17 DDRB = (1<<PB7) | (1<<PB5);
ldi r17,0b01010001 SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
out SPCR,r17 }
ret

18
Exemplu transmitere date master

SPI_MasterTx: void SPI_MasterTx (uint8_t data)


out SPDR,r16 {
Wait_Tx: SPDR = data;
sbis SPSR,SPIF while ( !(SPSR & (1<<SPIF) ) );
rjmp Wait_Tx SPIF=1 }
ret

19
Exemplu configurare SPI ca slave

SPI_SlaveInit: void SPI_SlaveInit ()


ldi r17,0b01000000 {
out DDRB,r17 DDRB = (1<<PB6);
ldi r17,0b01000000 SPCR = (1<<SPE);
out SPCR,r17 }
ret

20
Exemplu recepție date slave

SPI_SlaveRx: uint8_t SPI_SlaveRx ()


sbis SPSR,SPIF {
rjmp SPI_SlaveRx SPIF=1 while ( !(SPSR & (1<<SPIF) ) );
in r16,SPDR return SPDR;
ret }

21
Caracteristici principale modul TWI

 TWI = Two-wire Serial Interface


 Este o variantă de implementare a I2C – Inter-integrated
Circuit
 Half duplex, sincronă
 Este de tip master/slave
 Conexiuni:
 SCL – Serial Clock, generat de Master
 SDA – Serial Data
 Fiecare dispozitiv are o adresă
 7 biți de adresă
 16 adrese rezervate
 112 adrese disponibile – 112 dispozitive pe un bus 22
Caracteristici principale modul TWI
 SDA, SCL sunt conectate “open collector” sau “open drain”
 Rezistențe “pull up” țin linia la Vcc
 Wired-AND: o linie poate fi ”trasă” la 0 de orice dispozitiv – ea va
deveni 0 dacă cel puțin un dispozitiv scrie 0, altfel este 1

23
Caracteristici principale modul TWI

 Dispozitivele pot avea 2 roluri:


 Master – generează semnalul de ceas și adresele
 Slave – primește semnal de ceas și adresa
 Rolurile se pot schimba pentru același dispozitiv
 Moduri de operare:
 master transmit — dispozitiv master trimite date la slave
 master receive — dispozitiv master recepționează date de la slave
 slave transmit — dispozitiv slave trimite date la master
 slave receive — dispozitiv slave primește date de la master
24
Întrebări ?

25
Microcontrolere
Curs 8

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Modulul de comunicație TWI


 Noțiuni generale
 Configurarea

 Accesarea memoriei EEPROM

2
Caracteristici principale modul TWI

 TWI = Two-wire Serial Interface


 Este o variantă de implementare a I2C – Inter-integrated
Circuit
 Half duplex, sincronă
 Este de tip master/slave
 Conexiuni:
 SCL – Serial Clock, generat de Master
 SDA – Serial Data
 Fiecare dispozitiv are o adresă
 7 biți de adresă
 16 adrese rezervate
 112 adrese disponibile – 112 dispozitive pe un bus 3
Caracteristici principale modul TWI
 SDA, SCL sunt conectate “open collector” sau “open drain”
 Rezistențe “pull up” țin linia la Vcc
 Wired-AND: o linie poate fi ”trasă” la 0 de orice dispozitiv – ea va
deveni 0 dacă cel puțin un dispozitiv scrie 0, altfel este 1

4
Caracteristici principale modul TWI

 Dispozitivele pot avea 2 roluri:


 Master – generează semnalul de ceas și adresele
 Slave – primește semnal de ceas și adresa
 Rolurile se pot schimba pentru același dispozitiv
 Moduri de operare:
 master transmit — dispozitiv master trimite date la slave
 master receive — dispozitiv master recepționează date de la slave
 slave transmit — dispozitiv slave trimite date la master
 slave receive — dispozitiv slave primește date de la master
5
Caracteristici principale modul TWI

 Stări hardware:
 Start - o tranziție a SDA din 1 în 0 cu SCL menținut pe 1
 Transfer biți – valoarea bitului în SDA se schimbă când SCL e 0 și
este menținută stabilă pentru preluare când SCL e 1
 Stop – o tranziție a SDA din 0 în 1 când SCL e 1
 Start repetat – Start generat fără a fi precedat de Stop

6
Caracteristici principale modul TWI

 Arbitrare multi-master:
 Fiecare master monitorizează semnalele de Start și Stop și nu
inițiază un mesaj cât timp alt master ține bus-ul ocupat (nu a
generat Stop)
 Dacă doi master inițiază transmisie în același timp, se produce
arbitrarea, pe baza liniei SDA
 Fiecare master verifică linia SDA și dacă nivelul acesteia nu este cel
așteptat (cel scris), acel master pierde arbitrarea
 Primul master care pune pe linie 1, când altul pune 0, pierde
 Master-ul care pierde așteaptă un nou semnal de stop, apoi încearcă
din nou
7
Caracteristici principale modul TWI

 Adresarea dispozitivelor slave:


 Master transmite un octet format din 7 biți de adresă și
un bit R/W 1 – read 1 – NACK
 Slave răspunde cu ACK sau NACK prin comanda liniei SDA 0 – write 0 – ACK
 Adresa 0000000 este folosită pentru broadcast
 Adresele de forma 1111XXX sunt rezervate

8
Caracteristici principale modul TWI
 Transmiterea datelor:
 Master transmite un octet
 Slave răspunde cu ACK sau NACK prin comanda liniei SDA

9
PC0 PC1
Modul TWI

CEAS

COMPARAȚIE ADRESĂ CONTROL

10
Stabilirea vitezei de comunicație

11
Registrul de date TWDR

 Registrul TWDR este folosit și pentru recepție și


pentru emisie în funcție de rolul uC
 Poate fi modificat doar când flagul TWINT din
registrul TWCR are valoarea 1

12
Regiștrii modulului TWI

valoarea 1 determină - valoarea 1 determină generarea Start


generarea ACK atunci când este posibil
- trebuie resetat de utilizator după ce
- devine 1 la finalizarea operației se confirmă generarea
curente
- utilizatorul trebuie să scrie 1 pe 13

poziția lui pentru a-l reseta


Regiștrii modulului TWI

- valoarea 1 determină valoarea 1 activează


generarea Stop modulul TWI
- este resetat automat

devine 1 dacă se încearcă valoarea 1 activează întrerupere


scrierea TWDR când TWINT este 0 cât timp14TWINT este 1
Regiștrii modulului TWI

Biți de status, generează


diferite coduri în funcție
de contextul de operare
15
Regiștrii modulului TWI

Reprezintă adresa uC în valoarea 1 activează recunoașterea


modul Slave adresei de broadcast

16
Memoria EEPROM

 ATmega32 are 1024 bytes de memorie EEPROM


 Accesul pentru citire/scriere se face la nivel de byte
cu adresare liniară de la adresa 0 la 1023
 La scrierea EEPROM utilizatorul trebuie să se asigure
că tensiunea de alimentare are valoarea nominală,
altfel se poate produce coruperea datelor
 Întreruperile trebuie dezactivate pe durata unei
operații de citire/scriere
 În memoria EEPROM se poate scrie/citi și la
programarea uC
17
Memoria EEPROM

 Memoria EEPROM nu poate fi scrisă simultan cu


scrierea în memoria Flash
 Scrierea EEPROM implică o secvență predefinită
de pași
 La citirea EEPROM, CPU este oprit 4 perioade de
tact înainte de a executa următoarea instrucțiune
 La scrierea EEPROM, CPU este oprit 2 perioade de
tact înainte de a executa următoarea instrucțiune
18
Regiștrii pentru acces la memoria
EEPROM
 Regiștrii de adresă
 EEARH:EEARL

 Registrul de date EEDR


 Conține valoarea care trebuie scrisă sau cea citită
din EEPROM
 Registrul de control EECR

19
Regiștrii pentru acces la memoria
EEPROM

1 activează întreruperea 1 permite scrierea în


care se semnalizează EEPROM; devine
cât timp EEWE este 0 automat 0 la 4 perioade
de tact după ce a fost
20
scris în 1
Regiștrii pentru acces la memoria
EEPROM

1 declanșează scrierea;
devine automat 0 la 1 declanșează citirea
finalizarea scrierii
21
Procedura de scriere în memoria
EEPROM
1. Se așteaptă ca EEWE să devină 0
2. Opțional, se așteaptă ca bitul SPMEN din SPCR să
devină zero
3. Se scrie adresa în regiștrii EEAR
4. Se scrie valoarea în registrul EEDR
5. Se scrie 1 în bitul EEMWE simultan cu 0 în bitul EEWE
6. În mai puțin de 4 perioade de tact se scrie 1 în EEWE

22
Procedura de citire din memoria
EEPROM
1. Se așteaptă ca EEWE să devină 0
2. Opțional, se așteaptă ca bitul SPMEN din SPCR să
devină zero
3. Se scrie adresa în regiștrii EEAR
4. Se scrie 1 în bitul EERE
5. Se citește valoarea din registrul EEDR

23
Exemplu scriere în memoria EEPROM

EEPROM_write: void EEPROM_write(unsigned int uiAddress, uint8_t


sbic EECR,EEWE ucData)
rjmp EEPROM_write { uint8_t status;
in r20,SREG
cli while(EECR & (1<<EEWE));
out EEARH, r18 status=SREG;
out EEARL, r17 cli();
out EEDR,r16 EEAR = uiAddress;
sbi EECR,EEMWE EEDR = ucData;
sbi EECR,EEWE EECR |= (1<<EEMWE);
out SREG,r20
EECR |= (1<<EEWE);
ret 24
SREG=status; }
Exemplu citire din memoria EEPROM

EEPROM_read: uint8_t EEPROM_read(unsigned int uiAddress)


sbic EECR,EEWE { uint8_t status;
rjmp EEPROM_read
in r20,SREG while(EECR & (1<<EEWE));
cli status=SREG;
out EEARH, r18
cli();
out EEARL, r17
EEAR = uiAddress;
sbi EECR,EERE
EECR |= (1<<EERE);
in r16,EEDR
SREG=status;
out SREG,r20
return EEDR; }
ret
25
Gestiunea consumului de energie

 În anumite aplicații este necesar ca uC să consume cât


mai puțină energie

 Soluții uzuale de reducere a consumului de energie:


 Tensiune mică de alimentare
 Frecvență cât mai mică a semnalului de tact
 Dezactivarea modulelor care nu sunt necesare și care au
această opțiune
 Aducerea uC într-un mod de tip sleep ori de câte ori este
posibil
26
Gestiunea consumului de energie

 În funcție de configurația din registrul MCUCR, după


execuția instrucțiunii SLEEP uC intră în unul dintre
următoarele moduri:
 Idle
 ADC Noise Reduction
 Power-down
 Power-save
 Standby
 Extended standby
 Pe toată perioada de inactivitate conținutul RAM și al
regiștrilor este păstrat 27
Gestiunea consumului de energie

 uC poate fi trezit de anumite întreruperi

 Dacă apare semnal de RESET, uC se trezește și execută


vectorul RESET

 După trezire execuția codului se reia de la instrucțiunea


imediat următoare după SLEEP
 Dacă trezirea a fost declanșată de o întrerupere, mai întâi
se execută rutina întreruperii
28
Întrebări ?

29
Microcontrolere
Curs 9

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Gestiunea consumului de energie la ATmega32


 Prezentarea generală a platformei ARDUINO
 ARDUINO Uno și ARDUINO Mega 2560
 Funcții pentru temporizări
 Intrare/ieșire la ARDUINO

2
Gestiunea consumului de energie

 uC poate fi trezit de anumite întreruperi

 Dacă apare semnal de RESET, uC se trezește și execută


vectorul RESET

 După trezire execuția codului se reia de la instrucțiunea


imediat următoare după SLEEP
 Dacă trezirea a fost declanșată de o întrerupere, mai întâi
se execută rutina întreruperii
3
Gestiunea consumului de energie

4
Gestiunea consumului de energie

 uC intră în mod sleep doar dacă SE=1


 Procedura de activare mod sleep
 Se scrie 1 pentru bitul SE și se configurează modul dorit
 Se execută instrucțiunea SLEEP
 După trezire se scrie imediat 0 pentru bitul SE

5
Modul Idle

 Dacă nu este necesară


trezirea pe întrerupere
de la comparator
analogic, se recomandă
ca acesta să fie
dezactivat pentru a
reduce consumul de
energie
 Dacă ADC este activat,
se va iniția automat o
conversie după ce se
intră în acest mod
6
Modul Idle

 Trezirea poate fi declanșată de următoarele


surse:
 INT0, INT1, INT2
 TWI Address Match
 Timer 2
 SPM / EEPROM Ready
 ADC

 Alte module I/O (ex. Timer 1)


7
Modul ADC Noise
Reduction
 Obiectivul principal
este reducerea
semnalelor de tact
care port perturba
procesul de conversie
A/D
 Dacă ADC este activat,
se va iniția automat o
conversie după ce se
intră în acest mod
8
Modul ADC Noise Reduction

 Trezirea poate fi declanșată de următoarele


surse:
 INT2

 Întrerupere de nivel pe INT0, INT1


 TWI Address Match
 Timer 2
 SPM / EEPROM Ready
 ADC

9
Modul
Power-down
 Aproape toate
generatoarele de
semnal de ceas sunt
oprite, mai puțin
Watchdog dacă a fost
activat
 Trezirea durează mai
mult comparativ cu
alte moduri deoarece
necesită stabilizarea
generatoarele de
semnal de ceas
10
Modul Power-down

 Trezirea poate fi declanșată de următoarele


surse:
 INT2

 Întrerupere de nivel pe INT0, INT1


 TWI Address Match

11
Modul
Power-save
 Aproape toate
generatoarele de
semnal de ceas sunt
oprite, mai puțin
Watchdog dacă a fost
activat și Timer 2
asincron
 Permite funcționarea
Timer 2 dacă acesta a
fost configurat cu
semnal de ceas
asincron
12
Modul Power-save

 Trezirea poate fi declanșată de următoarele


surse:
 INT2

 Întrerupere de nivel pe INT0, INT1


 TWI Address Match
 Timer 2

13
Modul
Standby
 Poate fi activat doar
dacă a fost configurat
generator de tact cu
cristal de cuarț
 Are aceleași
caracteristici ca modul
Power-down, dar
trezirea durează mai
puțin comparativ cu
acesta – doar șase
perioade de tact
14
Modul Standby

 Trezirea poate fi declanșată de următoarele


surse:
 INT2

 Întrerupere de nivel pe INT0, INT1


 TWI Address Match

15
Modul Extended
Standby
 Poate fi activat doar
dacă a fost configurat
generator de tact cu
cristal de cuarț
 Are aceleași
caracteristici ca modul
Power-save, dar
trezirea durează mai
puțin comparativ cu
acesta – doar șase
perioade de tact
16
Modul Extended Standby

 Trezirea poate fi declanșată de următoarele


surse:
 INT2

 Întrerupere de nivel pe INT0, INT1


 TWI Address Match
 Timer 2

17
Alți factori care contribuie la consumul
de energie
 Modulul ADC nu este dezactivat de nici unul
dintre modurile sleep și astfel poate consuma
energie. Utilizatorul ar trebui să îl dezactiveze
dacă nu îl folosește
 Comparatorul analogic
 În modul Idle ar trebui dezactivat dacă nu este folosit
 În modul ADC Noise Reduction ar trebui dezactivat
 Înafară de modurile Idle și ADC Noise Reduction, în
toate celelalte este dezactivat automat
18
Alți factori care contribuie la consumul
de energie
 Modulele Brown-out Detector și Watchdog ar
trebui dezactivate de utilizator dacă nu sunt
folosite
 Sursa internă de tensiune de referință este
menținută în funcționare dacă a fost selectată
pentru unul din modulele Brown-out Detector,
Comparator analogic sau ADC, chiar dacă aceste
module sunt dezactivate automat în anumite
moduri sleep
 Este
recomandabil ca utilizatorul să dezactiveze
manual aceste module 19
Caracteristici tipice privind consumul de
energie

Consumul de curent în funcționare raportat la


frecvență (gama 1 – 16 MHz)

Consumul de curent în funcționare raportat la


frecvență (gama 0,1 – 1,0 MHz)
20
Caracteristici tipice privind consumul de
energie

Consumul de curent în modul Idle raportat la


frecvență (gama 0,1 – 1,0 MHz)

Consumul de curent în funcționare


raportat la frecvență (gama 0,1 – 1,0 MHz)
21
Caracteristici tipice privind consumul de
energie

Consumul de curent în modul Idle raportat la


frecvență (gama 1 – 16 MHz)

Consumul de curent în funcționare raportat la


frecvență (gama 1 – 16 MHz)
22
Caracteristici tipice privind consumul de
energie

Consumul de curent în Power-down raportat


la Vcc cu Watchdog activat

Consumul de curent în Power-down raportat la


Vcc cu Watchdog dezactivat
23
Caracteristici tipice privind consumul de
energie
Consumul de curent în Standby raportat
la Vcc cu Watchdog activat, 2 MHz

Consumul de curent în Standby raportat la Vcc


cu Watchdog dezactivat, 6 MHz
24
Caracteristici principale ARDUINO

 ARDUINO reprezintă o platformă de


proiectare cu uC având 3 componente
principale:
 Plăci de dezvoltare cu uC (de multe ori AVR) și
alte componente electronice
 Mediu de programare dedicat
 Montaje specializate (shielduri) care sunt
proiectate să se conecteze direct la plăcile de
dezvoltare compatibile
 https://www.arduino.cc/

25
Caracteristici principale ARDUINO

 Diagramele de proiectare pentru plăcile de


dezvoltare, shielduri și alte montaje hardware
sunt puse la dispoziție ca open-source
 Toate resursele software sunt open-source
 Limbaj de programare bazat pe C/C++
 Gamă variată de uC: de la AVR clasic 8 bit până la
ARM 32 bit

26
Caracteristici principale ARDUINO

 Majoritatea implementează pe
interfața de programare USB o
funcționalitate de tip serial-monitor:
codul poate trimite și recepționa
date către/de la PC folosind un
modul dedicat al mediului de
programare și interfața serială USART
 Transferul codului se face cu ajutorul
unui bootloader care comunică cu PC
prin interfața serială USART 27
ARDUINO Uno
 Bazată pe microcontrolerul ATMega  Memorie Flash 32KB
328P, pe 8 biți  Memorie EEPROM 1KB
 14 pini de I/O digitali  Memorie SRAM 2 KB
 6 pini de I/O digitali cu PWM  Frecvența procesorului: 16 MHz
 6 pini de intrare pentru semnale  Alimentare și programare prin cablu
analogice USB
 1 port de comunicare serială UART

28
ATmega 328p

29
ATmega 328p

 131 instrucțiuni, majoritatea  2 timere pe 8-biti


executate pe 1 ciclu  1 timer pe 16 biți
 32 regiștri pe 8 biți  6 canale PWM
 Flash 32 KBytes  8 canale A/D pe 10 biți
 EEPROM 1KByte  Interfață USART
 SRAM 2KBytes  2 interfețe SPI master/slave
 23 linii I/O de uz general  Interfață two-wire (TWI)
30
ATmega 328p

31
ARDUINO Mega 2560
 Bazată pe uC ATMega2560, pe 8 biți  Memorie Flash 256 KB
 54 pini de I/O digitali  Memorie EEPROM 4KB
 15 pini de I/O digitali cu PWM  Memorie SRAM 8 KB
 16 pini de intrare pentru semnale  Frecvența procesorului: 16 MHz
analogice  Alimentare si programare prin cablu
 4 porturi de comunicare serială USB
UART

32
ATmega 2560

33
ATmega 2560

 135 instrucțiuni, majoritatea  4 timere pe 16 biți


executate pe 1 ciclu  4 canale PWM pe 8 biți
 32 regiștri pe 8 biți  12 canale PWM pe 16 biți
 Flash 256 KBytes  16 canale A/D pe 10 biți
 EEPROM 4KByte  4 interfețe USART
 SRAM 8KBytes  Interfață SPI master/slave
 86 linii I/O de uz general  Interfață two-wire (TWI)
 2 timere pe 8-biti
34
ATmega 2560

35
Structura codului în ARDUINO

void setup() {  Funcțiile setup() și loop()


// put your setup code here, to run sunt obligatorii
once:  Codul din setup() se
} execută primul și o
void loop() { singură dată

// put your main code here, to run  Codul din loop() se repetă
repeatedly: continuu

}  Se pot adăuga și alte


funcții 36
Funcții pentru temporizări

void delay(unsigned long ms)


 Generează o temporizare de ms milisecunde
 Funcționează pe bază de întreruperi HW

unsigned long millis()


 Returnează numărul de milisecunde de la începutul
execuției codului
 Funcționează pe bază de întreruperi HW
 Atinge valoarea maximă și se resetează după aproximativ
50 zile
37
Funcții pentru temporizări

void delayMicroseconds(unsigned int us)


 Generează o temporizare de us microsecunde
 Nu funcționează pe bază de întreruperi HW
 Recomandată pentru temporizări între 3 și 16383 us

unsigned long micros()


 Returnează numărul de microsecunde de la începutul execuției
codului
 Funcționează pe bază de întreruperi HW
 Atinge valoarea maximă și se resetează după aproximativ 70
minute 38
Intrare/ieșire la ARDUINO

 Pini de intrare/ieșire digitali, conectați la porturile uC


 Mediul de programare se ocupă de problema
corespondenței
 Logica de programare este orientată pe numărul pinului
 O parte din pini au funcții speciale (comunicație serială
UART sau I2C, generator PWM sau semnale analogice)
 Pinii care au funcția RX și TX trebuie evitați dacă uC are
o singură interfață USART. Ei sunt rezervați pentru
comunicarea serială prin USB, care include programarea
plăcii
 De obicei există un LED pe placă, conectat la pinul 13 39
Intrare/ieșire la ARDUINO

40
Intrare/ieșire la ARDUINO

uC PLACĂ

41
Intrare/ieșire la ARDUINO

 Exemplu: push-buton cu pull-up extern pe 2 și LED pe 13


const int ledPin = 13; if (val==HIGH)
const int inputPin = 2; {
digitalWrite(ledPin, HIGH);
void setup() { }
pinMode(ledPIN, OUTPUT); else
pinMode(inputPin, INPUT); {
} digitalWrite(ledPin, LOW);
}
void loop() { }
int val = digitalRead(inputPin); 42
Intrare/ieșire la ARDUINO

 Exemplu: push-buton cu pull-up intern pe 2 și LED pe 13


const int ledPin = 13; int val = digitalRead(inputPin);
const int inputPin = 2; if (val==HIGH)
{
void setup() { digitalWrite(ledPin, HIGH);
pinMode(ledPIN, OUTPUT); }
pinMode(inputPin, INPUT); else
digitalWrite(inputPin, HIGH); {
} digitalWrite(ledPin, LOW);
}
void loop() { } 43
Intrare/ieșire la ARDUINO
 Exemplu: push-buton cu pull-up intern pe 2 și LED pe 13
 Arduino 1.0.1 și mai recent
const int ledPin = 13; if (val==HIGH)
const int inputPin = 2; {
digitalWrite(ledPin, HIGH);
void setup() { }
pinMode(ledPIN, OUTPUT); else
pinMode(inputPin, INPUT_PULLUP); {
} digitalWrite(ledPin, LOW);
}
void loop() { }
int val = digitalRead(inputPin);
44
Intrare/ieșire la ARDUINO

 Exemplu: debounce software


const int ledPin = 13; delay(1);
const int inputPin = 2; state = digitalRead(pin);
const int debounceDelay = 10; if(state!=previousState)
{
boolean debounce(int pin) counter = 0;
{ boolean state, previousState; previousState = state;
} }
previousState = digitalRead(pin); return state; }
for(int counter=0;counter<debounceDelay;counter++)
{ 45
Intrare/ieșire la ARDUINO

 Exemplu: debounce software (cont.)


void setup() { }
pinMode(ledPIN, OUTPUT); else
pinMode(inputPin, INPUT); { digitalWrite(ledPin, LOW);
digitalWrite(inputPin, HIGH); } }
}
void loop() {
if (debounce(inputPin))
{ digitalWrite(ledPin, HIGH); 46
Intrare/ieșire la ARDUINO

 Funcțiile digitalRead(), digitalWrite(), pinMode()


lucrează doar la nivel de pin
 Avantaje: ușor de folosit, nu necesită cunoașterea
corespondenței cu pinii uC și nici a arhitecturii HW a
acestuia
 Dezavantaje: devin ineficiente când trebuie configurați
mai mulți pini simultan

 Alternativă: accesul direct la regiștrii uC

47
Intrare/ieșire la ARDUINO

 Exemplu: se leagă 8 led-uri la pinii 22…29 ai Arduino Mega (conectați la


Port A). Se dorește aprinderea alternativă a led-urilor pare și impare, cu o
întârziere de 1 secundă între aprinderi
 Abordare clasică Arduino
const int PortAPins[8]={22, 23, 24, 25,26, 27, 28, for (int b=0; b<8; b+=2) {
29}; digitalWrite(PortAPins[b],HIGH);
void setup() digitalWrite(PortAPins[b+1], LOW); }
{ delay(1000);
for (int b=0; b<8; b++) for (int b=0; b<8; b+=2) {
pinMode(PortAPins[b],OUTPUT); digitalWrite(PortAPins[b], LOW);
} digitalWrite(PortAPins[b+1], HIGH); }
void loop() delay(1000);
{ }
48
Intrare/ieșire la ARDUINO

 Exemplu: se leagă 8 led-uri la pinii 22…29 ai Arduino Mega (conectați la


Port A). Se dorește aprinderea alternativă a led-urilor pare și impare, cu o
întârziere de 1 secundă între aprinderi
 Varianta cu acces direct la regiștri

void setup() { delay(1000);


DDRA= B11111111; PORTA = B10101010;
} delay(1000);
}
void loop() {
PORTA = B01010101; 49
Întrebări ?

50
Microcontrolere
Curs 10

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Prezentarea generală a platformei ARDUINO


 Tratarea întreruperilor
 Comunicatii

2
Caracteristici principale ARDUINO

 ARDUINO reprezintă o platformă de


proiectare cu uC având 3 componente
principale:
 Plăci de dezvoltare cu uC (de multe ori AVR) și
alte componente electronice
 Mediu de programare dedicat
 Montaje specializate (shielduri) care sunt
proiectate să se conecteze direct la plăcile de
dezvoltare compatibile
 https://www.arduino.cc/

3
Tratarea întreruperilor externe la
ARDUINO
 Pentru utilizarea unei întreruperi, acestei întreruperi trebuie să i se atașeze o funcție
de tratare (Interrupt Service Routine - ISR). În acest scop se folosește funcția
attachInterrupt()
 Funcția digitalPinToInterrupt(pin) returnează codul intern al întreruperii disponibile pe
pinul pin al ARDUINO

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)


ISR – numele funcției de tratare a întreruperii
mode – modul de declanșare:
LOW – declanșare pe nivel 0
CHANGE – declanșare când se schimbă nivelul pinului
RISING – declanșare pe front crescător
FALLING – declanșare pe front descrescător
4
Tratarea întreruperilor externe la
ARDUINO
 Funcțiile ISR nu primesc nici un parametru și nu returnează
nimic
 Dezactivarea tratării unei întreruperi se face prin apelul
funcției detachInterrupt(digitalPinToInterrupt(pin))
 Dacă se dorește dezactivarea temporară a tuturor
întreruperilor, se apelează funcția noInterrupts()
 Pentru re-activarea întreruperilor, se apelează funcția
interrupts()
5
Tratarea întreruperilor externe la
ARDUINO
 Dezactivarea lor trebuie făcută doar pentru perioade
scurte de timp, în caz contrar alte funcții ARDUINO pot fi
afectate
 delay() și millis() nu pot fi utilizate în funcții ISR
 Toate variabilele care se pot modifica într-o funcție de tip
ISR trebuie să fie declarate ca “volatile”. Astfel,
compilatorul va ști că aceste variabile se pot modifica în
orice moment și nu va optimiza codul prin atașarea
acestora la regiștri, ci le va stoca întotdeauna in RAM
6
Tratarea întreruperilor externe la
ARDUINO
 Exemplu: măsurarea lățimii pulsurilor unui semnal (de exemplu,
semnalul recepționat de un senzor IR de la o telecomandă, unde
lățimea pulsului face diferența dintre un ‘0’ și un ‘1’)
const int irReceiverPin = 2; void setup() {
const int numberOfEntries = 64; pinMode(irReceiverPin, INPUT);
Serial.begin(9600);
volatile unsigned long microseconds;
volatile byte index = 0; attachInterrupt(digitalPinToInterrupt(irR
eceiverPin),analyze, CHANGE);
volatile unsigned long
results[numberOfEntries]; results[0]=0;
} 7
Tratarea întreruperilor externe la
ARDUINO
 Exemplu: măsurarea lățimii pulsurilor unui semnal (de exemplu,
semnalul recepționat de un senzor IR de la o telecomandă, unde
lățimea pulsului face diferența dintre un ‘0’ și un ‘1’)
void loop() { void analyze()
if (index>=numberOfEntries) { {
Serial.println("Durata in us:“); if(index<numberOfEntries) {
for(byte i=0;i<numberOfEntries;i++) if(index>0) results[index] = micros() - microseconds;
Serial.println(results[i]); index = index+1;
index = 0; }
} microseconds = micros();
delay(1000); }
8
}
Tratarea întreruperilor la ARDUINO

 La modul general se poate folosi sintaxa ISR(eticheta_vector) pentru


a declara orice funcție de întrerupere
 eticheta_vector reprezintă o codificare predefinită pentru vectorii
de întrerupere ai unui uC

ISR(ADC_vect)
{
//cod intrerupere
}

9
Generarea de semnale PWM

analogWrite(int pin, int value)


pin reprezintă pinul plăcii de dezvoltare pe care se dorește
generarea semnalului
value ia valori de la 0 (factor de umplere 0%) la 255 (factor
de umplere 100%)

 Frecvența semnalului generat este prestabilită (de obicei 500


Hz) și nu poate fi modificată
10
Generarea de semnale PWM

 Exemplu: fade-in și fade-out pe un LED


int led = 9; void loop() {
int brightness = 0; analogWrite(led, brightness);
int fadeAmount = 5; brightness = brightness + fadeAmount;
if (brightness == 0 || brightness == 255)
void setup() { fadeAmount = -fadeAmount ;
pinMode(led, OUTPUT); delay(30);
} }

11
Generarea de semnale cu o anumită
frecvență
 Funcția tone() produce pulsuri cu factor de umplere 50% și
frecvență variabilă
 tone(pin, frequency) – produce un semnal de frecvența
‘frequency’ pe pinul ‘pin’, de durată nedefinită
 tone(pin, frequency, duration) – produce un semnal de
frecvența ‘frequency’, pe pinul ‘pin’, cu durata de timp
‘duration’ în milisecunde
 Funcția noTone(pin) oprește generarea semnalului pentru pinul
‘pin’. Doar un singur pin poate genera ton la un moment dat.
Dacă se dorește generarea de ton pe alt pin, în timp ce un ton
este activ, trebuie apelată funcția noTone() pentru oprirea
tonului activ
12
Folosirea ADC la ARDUINO

int analogRead(int pin)


pin reprezintă pinul plăcii de dezvoltare folosit ca
intrare analogică
funcția returnează o valoare între 0 și 1023

13
Folosirea ADC la ARDUINO

analogReference(tip)
tip poate fi
DEFAULT – tensiunea de alimentare
INTERNAL – referința internă de tensiune (nu este
valabil pentru ARDUINO Mega)
INTERNAL1V1 – referință internă 1,1V (doar pentru
ARDUINO Mega)
INTERNAL2V56 - referință internă 2,56V (doar pentru
ARDUINO Mega)
EXTERNAL – tensiunea de pe pinul AREF 14
Folosirea ADC la ARDUINO

int analogPin = 3; void loop()


int val = 0; {
val = analogRead(analogPin);
void setup() Serial.println(val);
{ }
Serial.begin(9600);
}
15
Folosirea USART la ARDUINO

 Toate plăcile Arduino au cel puțin un port serial, accesibil


prin obiectul C++ Serial
 Comunicarea între uC și PC se face prin conexiunea USB,
folosind adaptorul USB-UART integrat pe placă –
comunicare folosită și pentru programarea plăcii
 Placa Arduino MEGA are trei porturi seriale suplimentare:
Serial1 folosește pinii 19 (RX) și 18 (TX), Serial2 pinii 17
(RX) și 16 (TX), Serial3 pinii 15 (RX) și 14 (TX)

16
Folosirea USART la ARDUINO

 Metodele principale ale obiectului Serial


 Serial.begin(speed) – configurează viteza de transmisie
(speed) și formatul implicit de date (8 data bits, no parity,
one stop bit)
 Serial.begin(speed, config) – configurează viteza (speed) +
selectează un alt format al datelor (config):
Exemple pentru config: SERIAL_8N1 (implicit), SERIAL_7E2,
SERIAL_5O1

17
Folosirea USART la ARDUINO

 Metodele principale ale obiectului Serial


 Serial.print(val) – trimite valoarea val ca un șir de caractere citibil de
către utilizator (ex: Serial.print(20) va trimite caracterele ‘2’ și ‘0’)
 Serial.print(val, format) – format specifică baza de numerație folosită
(BIN, OCT , DEC, HEX). Pentru numere în virgulă mobilă, format
specifică numărul de zecimale folosit.
 Serial.println – Trimite datele, plus (ASCII 13, sau '\r') + (ASCII 10, sau
'\n’)

Serial.print(78) transmite "78"


Serial.print(78, BIN) transmite "1001110"
18
Serial.print("Hello") transmite "Hello"
Folosirea USART la ARDUINO

 Metodele principale ale obiectului Serial


 byte IncomingByte = Serial.read() – citește un byte
 intNoOfBytesSent = Serial.write(data) – scrie date în format
binar prin interfața serială
 intNoOfBytes = Serial.available() – returnează numărul de
octeți disponibili pentru a fi citiți prin interfața serială.
Datele sunt deja primite și stocate într-o zonă de memorie
buffer (capacitate maximă 64 octeți)
 serialEvent()
– funcție definită de utilizator, care este
apelată automat când există date disponibile în zona19
buffer
Folosirea USART la ARDUINO

 Exemplu pentru ARDUINO Mega

void setup(){
Serial1.begin(38400);
Serial2.begin(19200);

Serial1.println("Hello Serial 1");


Serial2.println("Hello Serial 2");
}
void loop() { } 20
Folosirea USART la ARDUINO

 Exemplu: recepționează o cifră (caracter de la ‘0’ la ‘9’) și


modifică starea unui LED proporțional cu cifra citită
const int ledPin = 13; char ch = Serial.read(); void blink() {
int blinkRate=0; if( isDigit(ch) ) { digitalWrite(ledPin,HIGH);
void setup() { blinkRate = (ch - '0'); delay(blinkRate);
Serial.begin(9600); blinkRate = blinkRate * 100; digitalWrite(ledPin,LOW);
pinMode(ledPin, OUTPUT); // Rata = 100ms * cifra delay(blinkRate);
} citita }
}}
void loop() {
if ( Serial.available()) { blink();
21
}
Folosirea USART la ARDUINO

 În afara interfețelor seriale hardware, ARDUINO permite


comunicarea serială și pe alți pini digitali, realizând
procesul de serializare / de-serializare a datelor prin
program
 Se folosește biblioteca SoftwareSerial, inclusă în pachetul
software (headerul softwareserial.h)
 Pinul de recepție (RX) trebuie conectat la un pin digital
care suportă întreruperi externe declanșate prin
schimbarea stării acestuia
22
Folosirea USART la ARDUINO

 Se pot crea mai multe obiecte C++ de tip SoftwareSerial,


dar numai unul poate fi activ la un moment dat

SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin)

 Sunt implementate funcțiile begin, read, write, print,


println, care se folosesc în același mod ca în cazul
interfețelor seriale hardware
23
Folosirea USART la ARDUINO

 Exemplu: ARDUINO Uno ca releu de comunicație între un


dispozitiv cu interfață USART și un PC
#include <SoftwareSerial.h> void loop() {
SoftwareSerial mySerial(10, 11); if (mySerial.available())
Serial.write(mySerial.read());
void setup() { if (Serial.available())
Serial.begin(9600); mySerial.write(Serial.read());
mySerial.begin(9600); }
}
24
Folosirea SPI la ARDUINO

 Este disponibilă o bibliotecă SPI cu următoarele funcții:


 SPI.setBitOrder(order) – ordinea biților: LSB FIRST sau MSB
FIRST
 SPI.setDataMode(mode) – faza și polaritatea transmisiei
(combinațiile CPHA și CPOL)
 SPI.setClockDivider()

25
Folosirea SPI la ARDUINO

 Este disponibilă o bibliotecă SPI cu următoarele funcții:


 SPI.begin() – inițializare interfața SPI, configurând pinii SCK,
MOSI, și SS ca ieșire, punând SCK și MOSI pe LOW și SS pe HIGH
 SPI.end() – dezactivează SPI, dar lasă pinii în modul în care au
fost setați la inițializare
 ReturnByte SPI.transfer(val) - transferă un byte (val) pe
magistrala SPI, recepționând în același timp octetul ReturnByte
 Biblioteca SPI suportă doar modul master
 Orice pin poate fi folosit ca Slave Select (SS)
26
Folosirea I2C la ARDUINO

 O placă ARDUINO poate fi I2C master sau I2C slave


 Este disponibilă o bibliotecă Wire cu următoarele funcții:
 Wire.begin(address) – activează interfața I2C. Parametrul address
indică adresa de 7 biți cu care Arduino se atașează la bus-ul I2C
ca slave. Dacă funcția este apelata fără parametri, dispozitivul
este master
 Wire.requestFrom(address, quantity) – master cere o cantitate
quantity de date de la un slave identificat prin address. Funcția
poate fi apelată și ca Wire.requestFrom(address, quantity, stop),
stop fiind o valoare booleană specificând dacă masterul va
elibera bus-ul, sau va menține conexiunea activă 27
Folosirea I2C la ARDUINO

 Este disponibilă o bibliotecă Wire cu următoarele funcții:


 Wire.beginTransmission(address) – începe procesul de
transmisie dinspre master către un slave specificat de
address. După apelul acestei funcții, datele pot fi scrise cu
write()
 Wire.write(value) – scrie un byte. Funcția poate fi apelată de
slave, dacă a fost solicitat de către master, sau de master,
după ce a apelat beginTransmission
 Wire.endTransmission() – apelat de master pentru a realiza
efectiv transmisia începută cu beginTransmission, cu datele
pregătite prin apelul Wire.write() 28
Folosirea I2C la ARDUINO

 Este disponibilă o bibliotecă Wire cu următoarele funcții:


 Wire.available() – returnează numărul de bytes disponibili pentru
a fi citiți
 Wire.read() – citește un byte, dacă available() > 0. Apelabilă de
către master sau slave
 Wire.onReceive(handler) – configurează o funcție handler, la
dispozitivul slave, care va fi apelată automat la primirea datelor
de la master
 Wire.onRequest(handler) – configurează o funcție handler, la
dispozitivul slave, care va fi apelată automat atunci când
masterul cere date
29
Întrebări ?

30
Microcontrolere
Curs 11

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Caracteristici avansate ale arhitecturii AVR 8 bit


 Exemplificare pentru familia XMEGA

2
Definirea caracteristicilor avansate
 Se consideră că un uC are caracteristici avansate ale arhitecturii AVR 8 bit
dacă implementează cel puțin unul dintre următoarele elemente:

ATiny1 ATmega2 Xmega


Spațiu extins pentru regiștri I/O (mai mult de 64 locații)
Maparea memoriei EEPROM în spațiul de adrese SRAM
Modul pentru acces la memorii SRAM/SDRAM externe, mapate ca 3
extensie a spațiului de adrese SRAM intern
Modul DMAC – Direct Memory Access Controller
Sistem de comunicare directă și semnalizare a evenimentelor între
periferice
Controler de întreruperi multinivel
Module criptografice (de ex. AES, DES)
1 ATtiny20x/40x/80x/160x și ATtiny21x/41x/81x/161x/321x 3
2 ATmega1281/2561
3 Doar sub-familia A1U
ATmega 2561

4
ATmega 2561

 135 instrucțiuni, majoritatea  4 timere pe 16 biți


executate pe 1 ciclu  4 canale PWM pe 8 biți
 32 regiștri pe 8 biți  12 canale PWM pe 16 biți
 Flash 256 KBytes  16 canale A/D pe 10 biți
 EEPROM 4KByte  4 interfețe USART
 SRAM 8KBytes  Interfață SPI master/slave
 86 linii I/O de uz general  Interfață two-wire (TWI)
 2 timere pe 8-biti
5
ATmega 2561

6
ATXmega 64A1U

7
ATXmega 64A1U

 mai mult de 135 instrucțiuni,  78 linii I/O de uz general


majoritatea executate pe 1  8 timere pe 16 biți
ciclu
 1 interfață USB
 32 regiștri pe 8 biți
 controller DMA cu 4 canale
 Flash 64 KBytes
 sistem de comunicare directă și
 EEPROM 2KByte semnalizare a evenimentelor
 SRAM 4KBytes între periferice cu 8 canale
 Interfață de control pentru  8 interfețe USART
memorie externă: maxim 16MB  modul AES și modul DES
SRAM sau 128 Mb SDRAM
8
Spațiu extins pentru regiștri I/O

 Organizarea SRAM la ATmega 2561

9
Spațiu extins pentru regiștri I/O

 Organizarea SRAM la ATXmega 64A1U

10
Spațiu extins pentru regiștri I/O

 Numărul mare de periferice generează un număr


mare de regiștri I/O pentru comanda și controlul
lor
 Codul instrucțiunilor in și out conține și adresa
locației unde se află registrul I/O accesat pe o
dimensiune de 6 biți
 Instrucțiunile
nu pot accesa un spațiu de adrese
mai mare de 64 locații !
11
Spațiu extins pentru regiștri I/O

 Regiștrii I/O peste spațiul de 64 locații nu pot fi


accesați decât cu instrucțiuni pentru citire și
scriere din/în memoria RAM:
 LD / LDD / LDS
 ST / STD / STS

12
Spațiu extins pentru regiștri I/O

 Instrucțiunile LD / ST
 citește (LD) de la o locație de memorie cu adresa
indicată de pointerii X, Y sau Z într-un registru de uz
general
 scrie(ST) la o locație de memorie cu adresa indicată
de pointerii X, Y sau Z dintr-un registru de uz general
 accesul la un spațiu de memorie mai mare de 64KB
necesită utilizarea regiștrilor de tip I/O RAMPX, RAMPY
și RAMPZ
13
Spațiu extins pentru regiștri I/O
 Instrucțiunile LD / ST
 regiștri de tip I/O RAMPX, RAMPY și RAMPZ sunt automat concatenați cu
regiștri X, Y sau Z pentru a forma pointeri de 24 biți
 Instrucțiunile pot folosi post incrementare sau pre decrementare, inclusiv pe
24 biți

14
Spațiu extins pentru regiștri I/O

 Instrucțiunile LD / ST

clr r27 ; r27 este octetul superior X


ldi r26,$60 ; r26 este octetul inferior X
ld r0,X+ ; post incrementare

clr r27
ldi r26,0x63
ldi r17,0x4A
st -X,r17 ; se scrie valoarea 0x4A la adresa RAM 0x62 15
Spațiu extins pentru regiștri I/O

 Instrucțiunile LDD / STD


 citește (LDD) de la o locație de memorie cu adresa
indicată de pointerii Y sau Z într-un registru de uz
general
 scrie(STD) la o locație de memorie cu adresa indicată
de pointerii Y sau Z dintr-un registru de uz general
 accesul la un spațiu de memorie mai mare de 64KB
necesită utilizarea regiștrilor de tip I/O RAMPY și
RAMPZ
16
Spațiu extins pentru regiștri I/O

 Instrucțiunile LDD / STD


 regiștride tip I/O RAMPY și RAMPZ sunt automat
concatenați cu regiștri Y sau Z pentru a forma
pointeri de 24 biți
 Instrucțiunile includ un offset al pointerilor cu
valori în intervalul 0...63, inclusiv pe 24 biți

17
Spațiu extins pentru regiștri I/O

 Instrucțiunile LDD / STD

clr r29 ; r29 este octetul superior Y


ldi r28,$60 ; r28 este octetul inferior Y
ldd r0,Y+5 ; copiază valoarea de la adresa RAM 0x0065 în registrul r0

clr r31 ; r31 este octetul superior Z


ldi r30,0x63 ; r30 este octetul inferior Z
ldi r17,0x4A
std Z+8,r17 ; se scrie valoarea 0x4A la adresa RAM 0x006B 18
Spațiu extins pentru regiștri I/O

 Instrucțiunile LDS / STS


 citește (LDS) de la o locație de memorie cu adresa
indicată de o valoare de 16 biți într-un registru de
uz general
 scrie (STS) la o locație de memorie cu adresa
indicată de o valoare de 16 biți dintr-un registru de
uz general
 accesul la un spațiu de memorie mai mare de 64KB
necesită utilizarea registrului de tip I/O RAMPD
19
Spațiu extins pentru regiștri I/O

 Instrucțiunile LDS / STS


 valoareadirectă de 16 biți este automat
concatenată cu registrul RAMPD

20
Spațiu extins pentru regiștri I/O

 Instrucțiunile LDS / STS

lds r2,0xFF00 ; copiază valoarea de la adresa RAM 0xFF00 în


; registrul r2
add r2,r1
sts 0xFF01,r2 ; se scrie noua valoare la adresa RAM 0xFF01
21
Exercițiu

 Pentru uC ATmega 2561, să se configureze pinii PL7...PL4


ca intrare cu rezistențe de pull-up active și pinii PL3...PL0
ca ieșire

REGISTER LOCATIONS

22
Exercițiu

 ASM C
ldi r16,0b00001111 unsigned char *r_port=(unsigned char*)0x010B;
unsigned char *r_ddr=(unsigned char*)0x010A;
sts 0x010A,r16
ldi r16,0b11110000 *r_port = 0b00001111;
sts 0x010B,r16 *r_ddr = 0b11110000;

23
Memorii externe RAM/SDRAM

 uC au un modul numit External Bus Interface –


EBI. Caracteristici principale:
 folosește porturile I/O pentru a comunica pe o
interfață paralelă cu o memorie RAM externă
 accesul este transparent pentru utilizator care
poate folosi aceleași instrucțiuni de tip LD/ST ca și
în cazul RAM intern
 posibilități multiple de configurare pentru a
asigura o utilizare eficientă a porturilor
24
Memorii externe RAM/SDRAM

 Spațiul de adrese intern are prioritate față de


memoria externă, astfel:
 adresa de început a memoriei RAM externe este
întotdeauna mai mare decât ultima adresă de RAM
intern
 ex: se folosește ATmega2561 cu 8KB RAM intern și o
memorie RAM externă de 64KB – în implementarea
obișnuită doar 56KB de RAM extern sunt disponibili
 în anumite situații se pot folosi soluții speciale de
implementare care permit accesarea integrală a
memoriei externe
25
Memorii externe RAM/SDRAM

 Exemplu de implementare specială pentru o


memorie externă RAM de 32KB:
 este suficientă o adresă de 15 biți, prin urmare
bitul de adresă A15 nu se conectează la modulul de
memorie
 adresele de la 0x8000 la 0xA1FF sunt vizibile în
exterior ca 0x0000 la 0x21FF
 tot spațiul de memorie poate fi adresat de la
0x22FF la 0xA1FF
26
Memorii externe RAM/SDRAM

 Exemplu de implementare specială pentru o


memorie externă RAM de 32KB

A15 A12 A8 A4 A0
0x8000 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0x0000

27
Memorii externe RAM/SDRAM

 Exemplu de implementare specială pentru o


memorie externă RAM de 32KB

A15 A12 A8 A4 A0
0xA1FF 1 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1

0x21FF

28
Memorii externe RAM/SDRAM
0x0000 0x0000
 Exemplu de
0x21FF
implementare 0x2200
0x21FF
0x2200
specială pentru
o memorie
externă RAM de
32KB
0x7FFF
0x7FFF
0x8000

0xA1FF

29

0xFFFF
Memorii externe RAM/SDRAM

 Caracteristici principale privind multiplexarea


magistralelor de date/adrese:
 modulul EBI permite folosirea multiplexării doar pentru
memorii SRAM, nu pentru SDRAM
 permite reducerea numărului de pini necesari pentru
comanda modulului de memorie
 necesită circuite de tip latch paralel, de ex. 74HC573
 alegerea circuitului latch trebuie să țină cont de
frecvența de tact a uC și caracteristicile memoriei RAM

30
Memorii externe RAM/SDRAM
 Exemplu de utilizare a multiplexării
magistralelor de date/adrese pentru
ATmega2561:
 uC pune biții de adresă A15:8 pe
magistrala de adrese dedicată
 semnalul ALE comandă latchul în modul
transparent
 uC pune biții de adresă A7:0 pe
magistrala de adrese comună cu
magistrala de date
 semnalul ALE comandă latchul în modul
memorare
 pentru scriere, uC pune biții de date D7:0
pe magistrala de date comună cu
magistrala de adrese
 uC comandă citire sau scriere folosind 31
semnalul RD sau WR
Memorii externe RAM/SDRAM

 Exemplu de utilizare a multiplexării magistralelor de date/adrese pentru


ATXmega conectat la SRAM

32
Memorii externe RAM/SDRAM

 Exemplu de utilizare a magistralelor de date/adrese pentru ATXmega


conectat la SDRAM

33
Întrebări ?

34
Microcontrolere
Curs 12

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Caracteristici avansate ale arhitecturii AVR 8 bit


 Exemplificare pentru familia XMEGA

2
Controler de întreruperi multinivel la
ATXmega
 Caracteristici principale:
 pentru fiecare sursă de întrerupere se poate aloca unul din
cele 3 niveluri de prioritate: redus, mediu, înalt. O
întrerupere de nivel superior va întrerupe execuția unei
rutine de întrerupere asociată cu o întrerupere pe niveluri
inferioare
 sursele de întrerupere sunt definite într-o tabelă de
întreruperi, la fel ca în cazul ATmega32
 implementează 2 variante de algoritmi pentru managementul
întreruperilor: static sau dinamic (round-robin)
 producătorul uC poate defini Non-Maskable Interrupts – 3NMI
Controler de întreruperi multinivel la
ATXmega
 Caracteristici principale:
 NMI sunt surse de întrerupere care au prioritate absolută și se
execută chiar dacă bitul I din SREG are valoarea 0
 NMI nu pot fi întrerupte de alte sursele de întrerupere
 dacă apar mai multe NMI simultan, prioritizarea se face
întotdeauna în funcție de poziția din tabela de întreruperi, în
ordine descrescătoare începând de la prima poziție (la fel ca
la ATmega32)

4
Controler de întreruperi multinivel la
ATXmega
 Schema bloc a controlerului de întreruperi

5
Controler de întreruperi multinivel la
ATXmega
 Algoritmul de management
static:
 este aplicabil pentru toate
nivelurile de prioritate
 întreruperile cu același nivel sunt
prioritizate în funcție de poziția
din tabela de întreruperi, în
ordine descrescătoare începând
de la prima poziție (la fel ca la
ATmega32) 6
Controler de întreruperi multinivel la
ATXmega
 Algoritmul de management
round-robin:
 esteaplicabil doar pentru nivelul
redus de prioritate
 vectorul de întrerupere cel mai
recent deservit primește cel mai
mic nivel de prioritate

7
Controler de întreruperi multinivel la
ATXmega
 Exemplu de configurare a nivelului de întrerupere pentru modulul SPI

INTCTRL

8
Controler de întreruperi multinivel la
ATXmega

STATUS

devine 1 când se execută devine 1 când se execută o devine 1 când se execută o


o întrerupere NMI întrerupere de niv. ridicat întrerupere de niv. redus
devine 1 când se execută
9
o
întrerupere de niv. mediu
Controler de întreruperi multinivel la
ATXmega

CTRL

1 activează algoritmul 1 activează întreruperile 1 activează întreruperile


round-robin de niv. ridicat de niv. redus
selectează dacă vectorii de
1 activează întreruperile
întrerupere sunt plasați în zona de 10
de niv. mediu
aplicație sau cea de boot
DMAC – Direct Memory Access Controller

 Caracteristici principale:
 permite transferul de date între diferite zone de RAM
(inclusiv locații de RAM extern și spațiul de regiștri) cu
un consum minim de resurse ale CPU
 4 canale independente care pot funcționa în paralel
 se pot transfera până la 16 MB într-o singură tranzacție
 posibilitate de resetare automată a adresei pentru
sursă și destinație
 se pot genera întreruperi, separat pentru fiecare canal,
în caz de eroare și la finalizarea unui transfer
11
DMAC – Direct Memory Access Controller

 Schema bloc:

12
DMAC – Direct Memory Access Controller

 Organizarea transferului:
 unitatea de bază a unui transfer se numește rafală
(burst)
 dimensiunea unei rafale poate fi configurată la 1, 2, 4
sau 8 bytes
 pe durata unei rafale DMAC are acces exclusiv la
magistrala de date a uC
 magistrala de date este partajată cu CPU iar acesta are
prioritate în cazul unei solicitări de acces simultane cu
DMAC

13
DMAC – Direct Memory Access Controller

 Organizarea transferului:
 mai multe rafale sunt grupate în pachete (blocks) cu
dimensiune configurabilă de până la 64 KB
 unul sau mai multe pachete succesive formează o tranzacție
(transaction) DMA

14
DMAC – Direct Memory Access Controller

 Declanșarea transferului:
 pentru fiecare canal poate fi definită o sursă de declanșare
(trigger)
 în funcție de configurare, apariția unui trigger determină
inițierea unei tranzacții sau doar a unei rafale
 canalul DMA este dezactivat automat la finalizarea unei
tranzacții și trebuie reactivat pentru a răspunde din nou la
trigger
 primul trigger care apare în timpul unui transfer în derulare
este memorat, dar alte apariții ulterioare se vor pierde

15
DMAC – Direct Memory Access Controller

 Stabilirea adreselor pentru sursă și destinație:


 se poate configura separat incrementare/decrementare
automată pentru adresa sursei și cea a destinației
 adresa sursei sau a destinației poate fi încărcată
automat la valoarea inițială după finalizarea unei
rafale, a unui pachet sau a unei tranzacții
 câte 2 canale pot forma o pereche, astfel încât atunci
când unul finalizează o tranzacție, celălalt să continue
transferul
 se pot configura niveluri de prioritate între canale
pentru a gestiona solicitările simultane de acces la
date 16
DMAC – Direct Memory Access Controller

 Configurarea nivelului de prioritate între canale:

17
DMAC – Direct Memory Access Controller

 Exemple de trigger:
 lafinalizarea unei operații de criptare/decriptare
a modulului AES
 lafinalizarea unei conversii a modulului DAC sau
ADC
 la recepția datelor pe un modul USART
 la atingerea valorii de prag de către un modul
timer
18
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Caracteristici principale:
 permite comunicarea directă și semnalizarea între
periferice fără intervenția CPU sau folosirea de
întreruperi
 timpi de semnalizare garantați
8 canale de semnalizare care pot opera în paralel
ceea ce permite transmiterea de 8 evenimente
simultan
19
Sistem de comunicare directă și semnalizare a
evenimentelor între periferice

 Schema bloc:

20
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Definirea termenilor:
 Event = schimbarea stării unui periferic (în
majoritatea cazurilor este echivalent cu o
întrerupere)
 Eventgenerator = perifericul care generează un
eveniment
 Event user = perifericul care folosește evenimentul
generat
21
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Definirea termenilor:
 Event source = schimbarea de stare care generează
un eveniment
 Event action = reacția unui event user la primirea
unui eveniment
 Signalling event = eveniment care indică doar o
schimbare de stare
 Data event = un eveniment care conține informații
suplimentare în afară de schimbarea de stare
22
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Definirea
termenilor:

23
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Evenimente software:
 Generate în funcție de perechea de biți de pe
aceeași poziție din regiștri DATA și STROBE
 Pozițiaperechii de biți corespunde canalului pe
care se generează evenimentul
 Scrierea
în registrul STROBE declanșează
evenimentul
 mai întâi se scrie în DATA și apoi în STROBE
24
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Evenimente software:

25
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Fiecare canal are asociat un registru de tip CHnMUX care configurează


event source pentru acel canal
 Exemple:

26
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Event action la recepția pe un anumit canal se configurează din


regiștrii fiecărui periferic
 Exemplu pentru modulul ADC:

EVCTRL

27
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Event action la recepția pe un anumit canal se configurează din


regiștrii fiecărui periferic
 Exemplu pentru modulul ADC:

28
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Event action la recepția pe un anumit canal se configurează din


regiștrii fiecărui periferic
 Exemplu pentru modulul ADC:

EVCTRL

29
Sistem de comunicare directă și semnalizare
a evenimentelor între periferice

 Event action la recepția pe un anumit canal se configurează din


regiștrii fiecărui periferic
 Exemplu pentru modulul ADC:

30
 Caracteristici principale ale arhitecturii AVR 32 bit

31
Caracteristici principale ale arhitecturii
AVR 32 bit
 Regiștrii cu dimensiunea de 32 biți
 15 regiștri de uz general
 Stack Pointer, Program Counter și Link Register sunt
implementați ca regiștri de uz general
 Multiple niveluri de prioritate la întreruperi
 Contexte de execuție privilegiate și neprivilegiate
 Instrucțiuni DSP
 Modul Memory Protection Unit – MPU sau Memory
Management Unit - MMU
32
Regiștri folosiți frecvent AVR 32 bit

Denumire Descriere
R0 ... R14 Folosiți ca operanzi în instrucțiuni
PC Program Counter, echivalent cu R15
SP Stack Pointer, echivalent cu R13
LR Link Register, echivalent cu R14. Memorează adresa de
retur din subrutină
SR Status Register
RSR Return Status Register. Memorează SR al contextului
curent la comutarea de context
RAR Return Address Register. Memorează SP al contextului
33
curent la comutarea de context
Microarhitecturi ale arhitecturii AVR 32 bit

AVR 32A AVR 32B


Proiectată pentru aplicații de Proiectată pentru aplicații complexe
complexitate și costuri reduse și cele care necesită timpi de răspuns
mici la întreruperi
Nu implementează seturi de Implementează seturi de regiștri
regiștri individuale pentru individuale și LR dedicat pentru
contextele de întrerupere, dar anumite contexte de întrerupere.
salvează automat R8-R12 și LR în Toate modurile privilegiate au RSR și
stivă. PC și SP sunt de asemenea RAR individuale
salvate automat în stivă
SP pentru contextele privilegiate este diferit de SP pentru contextul
34
aplicație
Contexte de execuție AVR 32 bit

 Execuția în context aplicație restricționează accesul la SR, memorie și


alte componente importante
 Execuția în context privilegiat permite accesul la toate resursele uC
 Un context poate fi întrerupt de altul cu prioritate mai mare

35
Contexte de execuție AVR 32 bit

36
Registrul de stare AVR 32 bit

 Partea superioară, biții 16 ... 31

37
Registrul de stare AVR 32 bit

 Partea superioară, biții 16 ... 31

38
Registrul de stare AVR 32 bit

 Partea inferioară, biții 0 ... 15

39
Implementarea regiștrilor de uz general
pentru AVR 32A

40
Implementarea regiștrilor de uz general
pentru AVR 32B

41
Exemple de instrucțiuni AVR 32 bit

 add Rd, Rs add r3,r5


 Rd = Rd + Rs
 add Rd, Rx, Ry<<sa add r3, r5, r12<<2
 sa = 0, 1, 2, 3
 Rd = Rx + (Ry<<sa) cp.w r8,r9
 add{cond} Rd, Rx, Ry addeq r3, r8, r9
 if (cond) Rd=Rx + Ry addlo r5, r8, r9
42
Exemple de instrucțiuni AVR 32 bit

 mov Rd, Rs mov r3,r5


 Rd = Rs
 mov{cond} Rd, Rs cp.w r8,r9
 if (cond) Rd=Rs moveq r8, r0
movlo r8, r11

43
Exemple de instrucțiuni AVR 32 bit

 max Rd, Rx, Ry max r3, r5, r9


 Rd = max(Rx,Ry)
 signed min r12, r7, r1
 min Rd, Rx, Ry
 Rd = min(Rx,Ry)
 signed

44
Exemple de instrucțiuni AVR 32 bit

 divu Rd, Rx, Ry divu r3, r5, r9


 Rd = Rx / Ry
 Rd+1 = Rx % Ry mulu.d r12, r7, r1
 unsigned

 mulu.d Rd, Rx, Ry


 Rd+1:Rd = Rx * Ry
 unsigned

45
Întrebări ?

46

S-ar putea să vă placă și