Sunteți pe pagina 1din 28

Microcontrolere

Curs 7
Microcontrolere

Dr.ing. Mihaela Hnatiuc


Structura curs
• Comunicarea seriala
• Portul serial la microcontrolerele CISC şi RISC
• Portul serial la microcontrolerul 8051
• Portul serial la microcontrolerul PIC 16F877
• Comparaţii privind arhitecturi ale porturi
serial la CISC şi RISC
COMUNICAREA SERIALĂ
• Comunicarea microcontrolerelor cu mediul
extern se realizează serial, paralel, prin wi-fi, USB,
etc.
• Modul de comunicare fără fir foloseşte de fapt tot
dispozitivele de comunicare serial asincronă
(UART). Metodele de comunicare serială sunt
asincrone prin portul serial (UART) şi sincron prin
interfeţe seriale la căre sunt conectate diverse
dispozitive pentru a lucra în modul Master-Slave.
Magistralele seriale pot fi clasificate după
mai multe criterii :
După modul de sincronizare :
• transfer sincron - se utilizează un semnal explicit de ceas pentru
specificarea momentului în care un bit de dată este valid
• transfer asincron - nu se utilizează semnal de ceas
După lungimea blocului de date transmis :
• transfer pe octet
• transfer pe bloc de octeţi
După numarul de unităţi comunicante :
• transfer serial între două dispozitive
• transfer serial între mai multe dispozitive
După direcţia de transfer
• transfer unidirecţional
• transfer bidirecţional
Portul serial (UART) la microcontrolerul
8051
• Datele sunt primite/trimise în registrul SBUF. Pinii de transmisie respectiv
recepţie sunt TxD şi RxD care sunt configuraţi ca ieşire respectiv intrare
• Bufferul de date seriale. Bufferul de date seriale este format în realitate
din două registre separate, un transmiţător şi un receptor. Când data este
transferată în SBUF, ea merge în registrul transmiţător şi este păstrată
pentru transmisia serială.
• Când data este transferată din SBUF, ea provine de la receptor.
Inițializare Port serial
• Iniţializarea portului serial se realizează prin
soft utilizând biţii registrului SCON. La
iniţializare se stabilesc: modul de lucru,
numărul de biţi utilizaţi în transmiterea
datelor, paritatea.
Reprezentarea modurilor de comunicare în
funcţie de numărul de biţi şi viteza de transmisie

SM0 SM1 Mod Descriere Baud Rate


0 0 0 Registru de deplasare pe 8 biţi 1/12 fosc
Determinat de
0 1 1 Pachet de date pe 8-biţi
Timer 1
1/32 fosc
1 0 2 Pachet de date pe 9-biţi
(1/64 fosc)
Determinat de
1 1 3 Pachet de date pe 9-biţi
Timer 1
Moduri de lucru
• Modul 0 - datele seriale sunt transferate în ambele
sensuri prin pinii RXD şi TXD. Rata transferului este 1/12
din frecvenţa de oscilaţie. Transmisia începe cu cel mai
puţin semnificativ bit (LSB) şi se realizează pe 8 biţi.
•  
• Mode 1 - transmisie asincronă, pe 10 biţi, se transmit
date prin TXD, se recepţionează prin RXD în formatul 1
bit de Start, 8 biţi de date, 1 bit de Stop, cu rata de
transfer programabilă folosind Numărător/Temporizator
1.
Moduri de lucru
• Mode 2 - ca modul 1, dar se transmite şi un al 9-lea bit de date
care poate fi bitul de paritate. Rata de transfer este egală cu
frecvenţa oscilatorului divizată cu 32 sau cu 64, funcţie de starea
bitului SMOD (Fig.5.3 ). Diagrama de comunicare este 1 bit Start,
8 biţi date, 1 bit de paritate (RB8, TB8) şi 1 bit de Stop.
• Mode 3 este la fel ca modul 2, diferă rata de comunicare.
• Rata de transmisie (Baud Rate). Definiţie. Reprezintă numărul de
transmisii/recepţii pe secundă. În cazul în care este utilizat UART-
ul, rata de transmisie depinde de: modul de lucru selectat,
frecvenţa oscilatorului, starea registrului SMOD selectat din
registrul SCON. Formulele necesare sunt prezentate în Tabelul
5.2.
Stabilirea ratei de transfer la Modul 2 şi 3
Modul de selectie a ratei de transfer

Modul de Baud Rate BitSM


lucru OD
Mod 0 Fosc. / 12  
Mod 1 2^SMOD/32* Fosc/ 12* (256- BitSMO
TH1) D
Mod 2 Fosc. / 32, Fosc. / 64 1,0
Mod 3 2^SMOD/32* Fosc/ 12* (256-  
TH1)
Valoarea încărcată în TH1 pentru rata
de transfer
Baud Fosc. (MHz) Bit
Rate 11.0592 12 14.7456 16 20 SM
150 40 h 30 h 00 h 0
OD
300 A0 h 98 h 80 h 75 h 52 h 0
600 D0 h CC h C0 h BB h A9 h 0
1200 E8 h E6 h E0 h DE h D5 h 0
2400 F4 h F3 h F0 h EF h EA h 0
4800 F3 h EF h EF h 1
4800 FA h F8 h F5 h 0
9600 FD h FC h 0
9600 F5 h 1
19200 FD h FC h 1
38400 FE h 1
76800 FF h 1
Comunicarea cu calculatorul
Paşii de programare ai portului serial la 8051 pentru
transmisia unui caracter serial
1. registrul TMOD se încarcă cu valoarea 30H, indicând
utilizarea temporizatorului 1 în mod 3 (8-bit auto-încărcare)
pentru a stabili rata de transmisie
2. registrul TH1 este încărcat cu valoarea din table, funcţi de
rata de transmisie dorită
3. registrul SCON este încărcat cu valoarea 50H care
reprezintă Mod 1 de lucru a portului serial
4. TR1 este setat în 1 logic pentru pornirea temporizatorului
5. bitul TI este şters soft
6. registrul SBUF este încărcat cu valoarea care reprezintă
codul ASCII al caracterului transmis
7. bitul TI este testat prin pooling pentru a afla când s-a
terminat transmisia
8. pentru a transfera un alt caracter se sare la pasul 5
• Exemplu de program care urmează paşii descrişi mai sus
• Program scris în asamblor
MOV TMOD,#20H ;temporizator 1 în mod 2
MOV TH1,#0FA ; rata de transmisie 4800
MOV SCON,#50H ;transmisie pe 8 biţi, 1 bit de stop şi validare REN
SETB TR1 ;start temporizator 1
x: MOV SBUF,#”A” ;cod ASCII litera A
stai: JNB TI,stai ;test bit TI
CLR TI ;ştergere TI pentru o nouă transmisier
SJMP x;salt pentru o nouă transmisie
 
Acelaşi program de mai sus realizat în C
#include <reg51.h>
void main(void){
TMOD=0x20; // Temporizator 1, mod 2
TH1=0xFA; //4800 rata
SCON=0x50;
TR1=1;
while (1) {
SBUF=‘A’; //încărcare
while (TI==0);//test TI
TI=0;
}
}
Exemplu de program scris în asamblor pentru lucurl în întreruperi al portului serial
•  Să se transmită în mod repetat caracterul “a” pe portul serial. Rata de comunicare este de 9600bauds iar UART-ul lucrează în modul 1. Frecvenţa de lucru este de
11,0592MHz. Se va utiliza Temporizatorul 1 pentru generarea semnalului de tact. Portul serial va lucra în întreruperi.
  Org 00h
Jmp Start
Org 0023h ; adresa vectorului de întrerupere a portului serial
JMP serial
;******************************************************
;Iniţializare transmisie
; ******************************************************
Start: MOV TMOD,#20h
MOV TH1,#0FAh
SETB TR1
MOV SCON, #50h
SETB EA
SETB ES
;******************************************************
;transmisie caracter “a”
;******************************************************
  MOV SBUF,#´a´
JMP $
 ;******************************************************
;Subrutina de întreruperi
;******************************************************
serial: JNB TI,init
CLR TI
MOV SBUF,`a`
init: RETI
END 
Portul serial la microcontrolerul PIC
16F877
• Portul serial de la microcontrolerul PIC 16F877 poate fi sincron sau
asincron. Poate lucra pe 8 sau 9 biţi de date şi poate fi configurat să
lucreze în trei moduri :
1) Asincron (bidirecţional)
2) Sincron ca Master (unidirecţional)
3) Sincron ca Slave (unidirecţional)
Registrele utilizate în programarea acestui periferic sunt:
• Registrul TXSTA - controlează starea transmisiei
• Registrul RCSTA – controlează starea recepţiei
• Datele ce urmează a fi transmise sunt încărcate în registrul TXREG iar cele care sunt
recepţionate în RCREG.
• Registrul SPBRG este utilizat în alegerea ratei de transmisie.
• Portul serial în cazul acestui microcontroler poate lucra şi în
întreruperi.
Schema portului serial de transmisie
asincronă la PIC 16F877
Schema bloc de recepţie a datelor pe
portul serial asincron la PIC 16F877
Schema bloc a portului serial, funcţia
de detectarea adresei la PIC16F877
Registrul TXSTA de la adresa 98h
CSRC TX9 TXEN SYNC - BRGH TRMT TX9D

Registrul RCSTA de la adresa 18h


SPEN RX9 SREN CREN ADDEN FERR OERR RX9D

Registrul PIE1 de la adresa 8Ch pentru programarea întreruperilor


PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

Registrul PIR1 de la adresa 8Ch pentru programarea întreruperilor


PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

Toate regsitrele din memoria cu funcţii special la PIC16F877 sunt


prezentate, conform datelor de catalog, în Anexa 3.
Modul de lucru sincron în mod
Master
• Ambele moduri de lucru sincrone, Master sau Slave, lucrează unidirectional, datele
neputând fi transmise sau recepţionate în acelaţi timp. Diferenţa dintre cele două
moduri Slave şi Master este cine generează impulsurile de ceas pentru sincronizare.
În mod Master acestea sunt generate de microcontroler iar în mod Slave
microcontrolerul le primeşte din exterior.Există multe asemănări între cele două
moduri de lucru sincrone, astfel că se vor specifica doar deosebirile dintre ele.
• Generatorul ratei de transmisie lucrează după un model şi o formula diferită de
modul asincron. Bitul BRGH care influenţează viteza de lucru nu mai este utilizat
aici.
• Rata de transfer este stabilită cu formula:

• Rata = Fosc / (4 * (X + 1))

• Unde X este valoarea scrisă în SPBRG, permiţând stabilirea unei viteze mai mari de
transfer.
• Impulsurile de ceas sunt transmise pe pinul RC6 (CK) iar datele sunt transmise pe
pinul RC7 (DT).
Modul de lucru sincron în mod SLAVE

• În acest mod nu este necesar să fie iniţializat


registrul SPBRG deoarece nu se generează
impuls de ceas. Ambii pini ai Portului C, RC6 şi
RC7, trebuie iniţializaţi ca intrări folosind
TRISC. Pentru a se selecta acest mod de lucru
bitul CSRC trebuie şters. Opţiunea de recepţie
a unui singur octet este dezactivată. Lucrul în
acest mod poate trezi unitatea centrală din
modul SLEEP.
 
• Funcţii C utilizate în programarea USART-ului sunt:
• Getc()
• Putc()
• Fgetc()
• Puts()
• Fgets()
• Fputs()
• Printf()
• Kbhit()
• Fprintf()
• Set_uart_speed()
• Assert()
• Getchar()
• Putchar()
• Setup_uart()
• Programe în C a portului USART la PIC16F877
– Se programeză portul USART în mod asincron şi se transmite şi recepţioneză date
cu viteza de 1,2 KBauds.
•  
• Void main (void)
• {
• TRISB=0// PORT B intrare
• PORTB=0x0// transmisie la ieşiere
• SBRG=51//valoare rata transfer din tabel
• TXTA=0x22// iniţializare transmisie
• RCSTA=0x90// iniţializare pentru recepţie
• TXREG=0x0//valoare pentru transmisia informaţiei
• do
• {
• TEREG++// incremetare registru tampon
• While ( !TRMT)// testare bit pentru ca data să fie pregătită
• While(!RCIF)// test recepţie data
• PORTB=RCREG// data recepţionată e transmisă în PORT B
• }
• While(1);
• }
– Rutină în asamblor de transmisie date
• ------ Data este în (W) -----------------------
• MOVWF TXREG ; trimite data
• WAIT:
• BTFSS PIR1,TXIF ; pooling
• GOTO WAIT
•  
– Rutină în asamblor de iniţializare USART să lucreze în întreruperi
• MOVLW 0x80; USART pe 8-Bit
• MOVWF RCSTA ;
• BANKSEL TRISC ; selecţie Bank 1
• BCF TRISC,6 ; RC6 = ieşire
• BSF TRISC,7 ; RC7 = Intrare
• MOVLW D’12’ ; Setare Rată = 19200
• MOVWF TXSTA
• BSF PIE1,RCIE ; iniţializare întreruperi
• BANKSEL PORTC ; Bancul 0
• BSF INTCON,PEIE ; validare întreruperi periferic
• BSF INTCON,GIE ; validare întreruperi globale
• BSF RCSTA,CREN ;
• BSF TXSTA,TXEN ; validare XMTR
•  
Mod de configurare a portului serial la
PIC16F877 folosind directiva use
• #include<16F877.h>
• #include <STDLIB.h>
• #use rs232 (baud=19200, xmit=PIN_C6,
rcv=PIN_C7, Parity=N, Bits=8)
• #use delay(clock = 19660800)
Comparaţii privind arhitecturi ale portui
serial la CISC şi RISC
• Modul de transmisie este mai evoluat la PIC avînd şi posibilitatea de a
transmite sincron. Având în vedere că modul asincron se regăseşte la
amble microcontrolere se observă că la PIC sunt mai multe moduri de
lucru: transmisie pe 8 sau 9 biţi, având şi posibilitatea de detectare a
adresei. Modul de iniţializare este mai complex la PIC tocmai datorită
prezenţei mai multor moduri de comunicare.
• Datele recepţionate sunt transferate într-un registru tampon pentru a
nu se pierde. Tot la PIC există şi metode de detecţie a erorilor
realizate din fabricaţie, având biţi identificatori prevăzuţi pentru
aceasta.
• Programarea în C este asemănătoare pentru cele două
microcontrolere dar în asamblor programul la PIC este mai mare
tocmai datorită setului redus de instrucţiuni.

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