You are on page 1of 44

Microcontrolere

Curs 7

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Modulul comparator analogic


 Modulul de comunicație USART
 Noțiuni generale
 Configurarea
 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 USART

 Full duplex

 Funcționează în mare măsură conform standardului


RS232

 Comunicație sincronă sau asincronă

 Are asociate 3 surse de întrerupere

7
Modulul USART GENERARE CEAS

 Regiștrii de PB0
comandă și
control: EMISIE

 UBRRH:UBRRL PD1
 UDR
 UCSRA
 UCSRB PD0

 UCSRC
RECEPȚIE

8
Tipuri de comunicație

XCK XCK

TxD TxD TxD TxD

RxD RxD RxD RxD

ATmega32 ATmega32 ATmega32 ATmega32

Comunicație sincronă Comunicație asincronă


 Cine generează XCK ?
 Master/slave !
9
Stabilirea vitezei de comunicație

10
Folosirea semnalului de ceas în modul
sincron

11
Formatul cadrului de transmisie – frame

 St – bitul de start, întotdeauna nivel 0


 (n) – biții de date
 P – bit de paritate
 ă

 ă

 Sp – bitul/biții de stop, întotdeauna nivel 1


 IDLE – nu se transmit date, întotdeauna nivel 1
12
Recuperarea datelor în modul asincron

NORMAL

VITEZĂ DUBLĂ

 Modulul USART monitorizează permanent pinul RX


pentru a detecta o tranziție din nivel 1 în nivel 0
 După detecția unei tranziții valide se declanșează
procesul de detecție a bitului de start
13
Recuperarea datelor în modul asincron

NORMAL

VITEZĂ DUBLĂ

 Nivelul de tensiune este eșantionat de 16 ori în modul


asincron normal și de 8 ori în modul asincron cu viteză dublă
 Se verifică valoarea eșantioanelor 8,9,10 respectiv 4,5,6
 Dacă 2 sau toate eșantioanele verificate au nivel 0, bitul de START
este validat
 Dacă 2 sau toate eșantioanele verificate au nivel 1, bitul de START
14
este invalidat și se așteaptă o nouă tranziție
Recuperarea datelor în modul asincron

NORMAL

VITEZĂ DUBLĂ

 Nivelul de tensiune este eșantionat corelat cu ceasul intern al


modulului USART
 Se verifică valoarea eșantioanelor 8,9,10 respectiv 4,5,6
 Dacă 2 sau toate eșantioanele verificate au nivel 0, se consideră că
s-a recepționat 0
 Dacă 2 sau toate eșantioanele verificate au nivel 1, se consideră că
s-a recepționat 1 15
Recuperarea datelor în modul asincron

NORMAL

VITEZĂ DUBLĂ

 Procedura continuă până la recepția bitului de STOP,


conform dimensiunii programate a cadrului de date
 Dacărezultă că bitul considerat de STOP are valoarea 0, se
semnalează eroare de cadru de date (FE)

16
USART în modul multi-procesor (MPM)

 Permite comunicația între un procesor master și mai


multe procesoare slave
 Fiecare slave are o adresă unică de 8 biți
 Se folosește pachet de date de 9 biți
 Bitul 9 este folosit pentru adresare
 Dacă bitul 9 este 1 se transmite o adresă
 Dacă bitul 9 este 0 se transmit date
 Modulul USART ignoră (nu semnalează) informațiile
recepționate care nu sunt de tip adresă
17
Recepția datelor în modul multi-
procesor
DA Am primit NU
Activare mod MPM toate
datele?

NU Am
recepționat
adresă?

DA

NU DA
Este adresa Dezactivare mod
Recepție date
proprie? MPM 18
Registrul de date UDR

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


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

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


transmisă
 out UDR, r18 19
Regiștrii modulului USART

devine 1 când bufferul devine 1 când registru de valoarea 1 activează


de recepție are date date UDR este gol modul multi-procesor

devine 1 când s-a finalizat


20
transmisia datelor
Regiștrii modulului USART

valoarea 1 indică Frame valoarea 1 indică Parity


Error Error

valoarea 1 indică Data


OverRun Error 21
Regiștrii modulului USART

valoarea 1 activează valoarea 1 activează întrerupere


întrerupere la recepție când registrul de date UDR este gol

valoarea 1 activează
întrerupere la emisie 22
Regiștrii modulului USART

valoarea 1 activează Folosit pentru a stabili


Bitul 9 la emisie
unitatea de recepție dimensiunea cadrului de date

valoarea 1 activează Bitul 9 la23 recepție


unitatea de emisie
Regiștrii modulului USART

trebuie să fie 1 când 1 pentru 2 biți STOP


scriu în registru 0 pentru 1 bit STOP

1 pentru mod sincron 24


0 pentru mod asincron
Regiștrii modulului USART

25
Regiștrii modulului USART

26
Exemplu inițializare

 fosc = 8 MHz, 300bps, cadru de 8 biţi, mod asincron normal, paritate


pară şi 2 biţi de stop

 ;

USART_init: out UBRRH,r16 void USART_init ()


ldi r16,0b00001000 ldi r16,0x81 {
out UCSRB,r16 out UBRRL,r16
UCSRB=(1<<TXEN);
UCSRC = (1<<URSEL) | (1<<UPM1) |
ldi r16,0b10101110 ret (1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0);
out UCSRC,r16 UBRR = 0x0681;
27
ldi r16,0x06 }
Exemplu transmiterea datelor

USART_transmit: void USART_tx (uint8_t data)


sbis UCSRA,UDRE {
rjmp USART_transmit UDRE=1 while ( !(UCRA & (1<<UDRE) ) );

out UDR,r16 UDR = data;


ret }

28
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 29
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
30
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 31
Principiul de funcționare modul SPI

 Configurații cu mai multe dispozitive: semnale SS


independente sau “daisy chain”

32
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

33
Controlul pinilor pentru modulul SPI

34
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 35
Regiștrii modulului SPI

valoarea 1 activează 1 – mod Master


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

37
Regiștrii modulului SPI

Registrul
SPSR

38
Regiștrii modulului SPI

devine 1 la finalizarea
unui transfer

devine 1 dacă se încearcă scrierea în


39
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

40
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

41
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

42
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 }

43
Întrebări ?

44

You might also like