Sunteți pe pagina 1din 59

Curs 7

Introducere în microcontrolere
Arhitectura microcontrolerului PIC16F887
Convertorul analog-digital
Generatorul PWM
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Mag. de date
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 7 – Microprocesoare şi microcontrolere
Curs 8

Microcontrolere
Circuite aferente pinilor I / O
Circuite de temporizare
Curs 8 – Microprocesoare şi microcontrolere
• Microcontrolerul PIC16F887 dispune de 35 de pini de I / O de uz
general.
• Aceşti pini pot fi programaţi individual sau în grup (port) pentru a fi
folosiţi fie ca pini / porturi de intrare fie ca pini / porturi de ieşire.
• Programarea pinilor de uz general, respectiv stabilirea sensului de
transfer a datelor la nivel de pin sau de port, se face cu ajutorul
registrelor TRISX, unde, în cazul de faţă, X este A … E. Existenţa celor
5 registre indică faptul că cei 35 de pini I / O de uz general sunt grupaţi
în cinci porturi. Porturile A … D sunt formate din 8 pini iar portul E
conţine doar 3 pini.
• Datele care urmează a fi trimise la / primite de la un pin sau port sunt
reţinute temporar în registrele PORTX, unde X este A … E. Registrele
PORTX de tip LATCH asigură o interfaţă între magistrala internă de
date a microcontrolerului şi pinii respectiv porturile I / O.
• În cazul în care un circuit intern dedicat (convertor analog digital,
comparator etc.) foloseşte pinul sau pinii corespunzători, pinul sau pinii
respectivi nu mai pot fi utilizaţi ca şi pini de I / O de uz general.
Curs 8 – Microprocesoare şi microcontrolere
o linie a magistralei de date (linia 1)

TRISA1 = 1  pinul RA1 este setat ca


intrare
TRISA1 = 0  pinul RA1 este setat ca
ieşire
Figura preluată din datele de catalog ale uC PIC16F887

Pinul RA1 al microcontrolerului PIC16F887


Curs 8 – Microprocesoare şi microcontrolere

• În figura anterioară se observă că informaţia care se va transmite la


pin este reţinută cu ajutorul unui circuit de tip LATCH. Astfel, informaţia
se menţine neschimbată până în momentul în care în LATCH se înscrie
o nouă dată. Data transmisă la pinul RA1 se face prin setarea
corespunzătoare a bitului RA1 din registrul PORTA.
• Informaţia care se citeşte de la pinul RA1 este trecută printr-un buffer
şi este disponibilă pentru citire doar cât timp este menţinută din
exterior.
•Pentru fiecare pin al microcontrolerului este dată o schemă electronică
de principiu a circuitului său de comandă aferent, schemă care indică şi
celelalte resurse interne ale microcontrolerului care au legătură cu
exteriorul prin intermediul pinului respectiv.
• Stabilirea sensului de transfer a datelor la nivel de pin sau de port se
face prin program în faza de iniţializarea a microcontrolerului, imediat
după pornirea sau resetarea acestuia.
Curs 8 – Microprocesoare şi microcontrolere

Circuit de temporizare / numărare


(exemplu modulul TIMER0 al PIC16F887)

• Circuitul temporizator TIMER0 este un temporizator / numărător pe 8


biţi ce conţine un registru TMR0 pe 8 biţi folosit pentru temporizare /
numărare şi un registru pe 8 biţi pentru prescalare.
• Modulul dispune de următoarele facilităţi:
- Selectarea prin program a unei surse de tact internă sau externă;
- Selectarea prin program a frontului activ al semnalului de tact;
- Generează întreruperi la depăşire.
Curs 8 – Microprocesoare şi microcontrolere

Figura preluată din datele de catalog ale uC PIC16F887


Curs 8 – Microprocesoare şi microcontrolere

A. Modul de funcţionare ca temporizator


- Acest mod de lucru este selectat prin resetarea bitului T0CS din
registrul OPTION;
- Registrul TMR0 este incrementat la fiecare ciclu de instrucţiune;
- Când se înscrie o dată în TMR0, incrementarea este oprită pe
durata a două cicluri de instrucţiune urmând imediat înscrierea.

B. Modul de funcţionare ca numărător


- Acest mod de lucru este selectat prin setarea bitului T0CS din
registrul OPTION;
- Registrul TMR0 se incrementează la fiecare apariţie de front
crescător sau descrescător a semnalului aplicat pe pinul T0CKI.
- Selectarea frontului activ al semnalului aplicat pe pinul T0CKI este
stabilit prin programarea bitului T0SE din registrul OPTION.
Curs 8 – Microprocesoare şi microcontrolere
Curs 9

Portul serial (EUSART)


Organizarea memoriei
Curs 9 – Microprocesoare şi microcontrolere

Portul serial (EUSART) la PIC16F887

Modulul permite realizarea unei comunicaţii I / O seriale. După caz,


modulul permite transmiterea şi recepţia datelor independent de
execuţia programului.
Moduri de transmisie / recepţie admise:
- Comunicaţie asincronă;
- Comunicaţie sincronă;
- Comunicaţie full-duplex (duplex) asincronă – comunicaţie cu diferite
periferice seriale sau cu PC-uri prevăzute cu port serial RS232;
- Comunicaţie half-duplex (semi-duplex) sincronă – comunicaţie cu alte
microcontrolere, circuite externe de memorie serială EEPROM sau
CAN /CNA cu transfer serial de date.
Curs 9 – Microprocesoare şi microcontrolere
Curs 9 – Microprocesoare şi microcontrolere
Curs 9 – Microprocesoare şi microcontrolere
Curs 9 – Microprocesoare şi microcontrolere

Circuitul de transmitere al portului serial

Fig. preluată din foile de catalog ale PIC16F887


Curs 9 – Microprocesoare şi microcontrolere

Registrul de stare şi control la transmisie TXSTA

CSCR – 1 mod Master, 0 mod slave (semnalul de tact primit din exterior)
TX9 – formatul datelor – 1 data reprez. pe 9 biţi, 0 data reprez. pe 8 biţi
TXEN – 1 transmisie permisă, 0 transmisie invalidată
SYNC – 1 mod de transmisie sincron, 0 mod de transmisie asincron
SENDB – trimite break character bit pentru transmiterea asincronă
BRGH – bit de selecţie a transmisiei cu rată ridicată la modul asincron
TRMT – bit care indică starea registrului de deplasare de la transmisie (1 gol, 0 plin)
TX9D – valoarea celui de al 9-lea bit care se transmite
Curs 9 – Microprocesoare şi microcontrolere

Diagrama de semnal pentru transmisia asincronă

Fig. preluată din foile de catalog ale PIC16F887


Curs 9 – Microprocesoare şi microcontrolere

Circuitul de recepţie al portului serial

Fig. preluată din foile de catalog ale PIC16F887


Curs 9 – Microprocesoare şi microcontrolere

Registrul de stare şi control la recepţie RCSTA

SPEN – activarea portului serial


RX9 – selectează formatul datelor recepţionate: 1 date reprez. pe 9 biţi, 0 pt. date pe 8 biţi
SREN – bit de activare a unei singure recepţii în modul de lucru master sincron
CREN – bit pentru activarea modului de recepţie continuă
ADDEN – bit pentru activarea detecţiei de adresă pentru date în format cu 9 biţi.
FERR – bit pentru semnalizarea erorilor de cadru
OERR – bit pentru semnalizarea erorii datorate depăşirii
RX9D – bit care reprezintă valoarea celui de-al 9-lea bit recepţionat
Curs 9 – Microprocesoare şi microcontrolere

Diagrama de semnal pentru recepţia asincronă

Fig. preluată din foile de catalog ale PIC16F887


Curs 9 – Microprocesoare şi microcontrolere

Calculul ratei şi erorii de Baud

Exemplu preluat din foile de


catalog ale PIC16F887
Curs 9 – Microprocesoare şi microcontrolere

Organizarea memoriei la microcontrolerul PIC16F887

Memoria program:
- Tip FLASH
- există un numărător de program PC pe 13 biţi
- se pot adresa (şi există fizic) 8 k locaţii de memorie
- fiecare locaţie de memorie de program este organizată pe 14 biţi
(instrucţiunile sunt codate pe 14 biţi)
- există un mecanism de protecţie la citire a memoriei program
- vectorul de RESET se află la adresa 0000 H iar vectorul de
întrerupere se găseşte la adresa 0004 H
-…
Curs 9 – Microprocesoare şi microcontrolere

Memoria program - continuare


Fig. preluată din foile de
catalog ale PIC16F887
Curs 9 – Microprocesoare şi microcontrolere

Memoria de date:
- De tip SRAM, memorie volatilă, 368 octeţi
- conţine 278 registre de uz general (se pot stoca date, variabile etc.)
- conţine 90 registre cu funcţii speciale (folosite pentru configurarea
microcontrolerului şi a modulelor sale specializate integrate precum şi a
modului lor de funcţionare)
- memoria este organizată în patru bancuri
- fiecare banc de registre conţine 127 de locaţii de memorie
- la un moment dat doar un singur banc de registre este activ
- registrul STATUS conţine 2 biţi cu ajutorul cărora se poate selecta
unul din cele 4 bancuri de registre
- registrul STATUS conţine informaţii referitoare la starea unităţii
centrale de prelucrare (biţii C, DC, Z etc.)
- Există o stivă de 8 locaţii (vezi figura anterioară)
Curs 9 – Microprocesoare şi microcontrolere

Fig. preluată din foile de


catalog ale PIC16F887
Curs 10

Registrul STATUS
Setul de instructiuni
Exemple de aplicatii
Curs 10 – Microprocesoare şi microcontrolere

Registrul STATUS

Se găseşte plasat la aceeaşi adresa relativă faţă de începutul fiecărui


banc de registre.
Structura registrului este următoarea:

IRP – folosit la adresarea indirectă (0 – indică bancurile 0 şi 1 iar 1


indică bancurile 2 şi 3)
RP1 şi RP0 – folosit la selectarea unui banc (00 – banc 0 activ, 01 –
banc 1 activ, 10 – banc 2 activ şi 11 banc 3 activ)
Z – indică dacă rezultatul unei operaţii aritmetice este 0
DC şi C indică dacă are loc un transport / împrumut la / de la digitul
superior sau la / de la cel mai semnificativ bit
Curs 10 – Microprocesoare şi microcontrolere
Setul de instrucţiuni
Instrucţiuni orientate pe octet
Instrucţiuni orientate pe bit
Instrucţiuni cu constante
Instrucţiuni de control
Curs 10 – Microprocesoare şi microcontrolere

Instrucţiuni orientate pe octet


Curs 10 – Microprocesoare şi microcontrolere

Instrucţiuni orientate pe bit


Curs 10 – Microprocesoare şi microcontrolere

Instrucţiuni cu constante şi instrucţiuni de control


Curs 10 – Microprocesoare şi microcontrolere

Circuit cu LED

CLK intern cu frecvenţa de 4 MHz


TRISA – banc 1
- Bit în 1 logic – intrare
- Bit în 0 logic – ieşire

PORTA – banc 0
STATUS – identic în fiecare banc
Curs 11

Aplicaţia 1 – Circuit de comandă pt. un LED


Aplicaţia 2 – Circuit cu LED şi întrerupător
Curs 11 – Microprocesoare şi microcontrolere
Aplicaţia 1

• Circuit pt. comanda unui LED


• CLK intern cu frecvenţa de 4 MHz

• Pentru comanda LED-ului se


alege pinul RA0 şi funcţia sa de I/O
• Funcţia pinului RA0: I/O, AN0, …

• Funcţia de I/O a pinului RA0 este selectată prin intermediul registrului


TRISA din bancul 1. Prin intermediul registrului TRISA se poate
programa, simultan sau independent, tipul fiecărui pin al portului
PORTA, astfel:
- Bit în 1 logic în registrul TRISA – intrare
- Bit în 0 logic în registrul TRISA – ieşire
Curs 11 – Microprocesoare şi microcontrolere

• Pentru a avea acces prin program la registrul TRISA aflat în bancul 1


este necesară selectarea prealabilă a bancului 1 cu ajutorul biţilor RP0
şi RP1 din registrului STATUS (registrul STATUS se găseşte în toate
cele 4 bancuri, având acelaşi conţinut), în modul următor:

RP1 RP0 = 00 – banc 0


RP1 RP0 = 01 – banc 1 pentru registrul TRISA
RP1 RP0 = 10 – banc 2
RP1 RP0 = 11 – banc 3

• După programarea registrului TRISA se revine la bancul iniţial 0


pentru a avea acces la registrul PORTA care oferă o interfaţă între
unitatea centrală de prelucrare a microcontrolerului şi diferite circuite
externe.
Curs 11 – Microprocesoare şi microcontrolere

PORTA – banc 0

Datorită faptului că pinul RA0 al microcontrolerului


a fost setat ca pin de ieşire, atunci orice informaţie
este înscrisă în bitul RA0 al portului PORTA se va
reflecta printr-un nivel logic pe pinul RA0.
- Dacă prin program bitul RA0 este setat, atunci pe
pinul RA0 se va înregistra o tensiune de
aproximativ 5V corespunzătoare nivelului logic “1”;
- Dacă prin program bitul RA0 este resetat, atunci
pe pinul RA0 se va înregistra o tensiune de
aproximativ 0V corespunzătoare nivelului logic “0”.
Curs 11 – Microprocesoare şi microcontrolere
• În cazul circuitului propus, dacă bitul RA0 din PORTA este setat, la
pinul 19 cu denumirea RA0 a microcontrolerului tensiunea este de 5V,
valoare la care tranzistorul este adus în saturaţie iar LED-ul se aprinde.
• Dacă bitul RA0 este resetat, tensiunea la pinul 19 este nulă,
tranzistorul este blocat iar LED-ul este stins.
Secvenţa de program care realizează funcţionarea circuitului este
următoarea:
#include <P16F887.INC>
ORG 0
Start :
BSF STATUS, RP0 ; selectează bancul 1 pentru accesul la reg. TRISA
BCF TRISA, 0 ; setează pinul RA0 ca pin de ieşire
BCF STATUS, RP0 ; revenire la bancul 0 pentru a avea acces la PORTA
BCF PORTA, 0 ; se resetează bitul RA0 => LED stins
; … urmează rutina pentru aprinderea şi stingerea periodică a ledudui
END
Curs 11 – Microprocesoare şi microcontrolere
Rutina de comandă periodică a ledului

Loop :
BSF PORTA, 0 ; LED-ul este aprins
; … întârziere ( rutină de menţinere a LED-ului aprins pentru un anumit interval de timp )
BCF PORTA, 0 ; LED-ul este stins
; … întârziere ( rutină de menţinere a LED-ului stins pentru un anumit interval de timp)
GOTO Loop

Metode de realizare a unor întârzieri - software


În exemplul de faţă, frecvenţa oscilatorului intern folosit pentru generarea
semnalului de tact este de 4 MHz, motiv pentru care timpul necesar executării
unei instrucţiuni tCM este de doar 1µs.

 1 
 = 4 ⋅ 
1 
tCM = 4 ⋅  6 
= 1µs
 f OSC   4 ⋅10 
Curs 11 – Microprocesoare şi microcontrolere

• Pentru ca ochiul uman să perceapă ca LED-ul se aprinde şi se stinge


periodic este nevoie ca cele două intervale de timp aferente stării LED-
ului să fie cel puţin egale cu 40 ms.
• Din acest motiv, după comanda de aprindere / stingere a LED-ului
este necesar ca LED-ul să fie menţinut în starea respectivă un interval
de timp de minim 40 ms. Întârzierea de 40 ms se realizează prin
program, ţinându-se cont de timpul necesar pentru efectuarea
instrucţiunilor (majoritatea instrucţiunilor la microcontrolerul PIC16F887
se realizează într-un singur ciclu maşină cu durata tCM – în cazul de
faţă 1µs).
• Astfel, după trecerea LED-ului într-o anumită stare, pentru realizarea
unei întârzieri de minim 40 ms, microcontrolerul trebuie să execute
echivalentul a 40.000 de instrucţiuni (40.000 x 1µs = 0,04 s).
Curs 11 – Microprocesoare şi microcontrolere

• În cazul în care s-ar folosi instrucţiunea NOP, după executarea


acestei instrucţiuni, starea internă a microcontrolerului nu s-ar schimba
dar s-ar înregistra o întârziere de 1µs. Pentru a obţine întârzierea
necesară ar trebui ca programul să conţină 40.000!!! de linii cu
instrucţiunea NOP fapt ce ar duce la ocuparea a 40.000 locaţii !!! din
memoria program integrată.
• Soluţia de mai sus, în cazul de faţă este inacceptabilă. Totuşi, soluţia
este folosită în cazul în care anumite aplicaţii cer timpi de întârziere de
ordinul câtorva cicluri maşină (timpi de stabilizare, timpi morţi de scurtă
durată etc.).
• Pentru realizarea timpilor de întârziere mai mari se folosesc algoritmi
iterativi. Astfel, spaţiul de memorie program ocupat se reduce
semnificativ, după cum se va indica în continuare.
Curs 11 – Microprocesoare şi microcontrolere
Rutină de întârziere folosind un algoritm iterativ

Pentru implementare se folosesc, în funcţie de aplicaţie, unul sau mai


multe registre de uz general cu denumirea dată de utilizator. Utilizarea
acestor registre este condiţionată de declararea lor prealabilă, conform
exemplului următor:
CBLOK 0X20
TEMP1 ; in aplicaţia de faţă se folosesc 2 registre de uz general din memoria RAM
TEMP2 ; internă
ENDC
Registrele TEMP1 şi TEMP2 pot fi apoi iniţializate după caz, conform
următorului exemplu:
MOVLW .0
MOVWF TEMP1 ; registrul TEMP1 este încărcat cu valoarea 0
MOVLW .100
MOVWF TEMP2 ; registrul TEMP2 este încărcat cu valoarea 100 ( în zecimal )
Curs 11 – Microprocesoare şi microcontrolere
Rutina pentru generarea întârzierii este următoarea:
Adr :
DECFSZ TEMP1, 1 ; decrementeaza continutul reg. TEMP1 iar rezultatul
; este depus tot in TEMP1
GOTO Adr ; în urma decrementării, dacă conţinutul este diferit de
; zero se face salt la adresa “Adr”; dacă TEMP1 este
; nul se trece la decrementarea reg. TEMP2
; acest proces iterativ durează 3 x 256 µs = 768 µs
DECFSZ TEMP2, 1 ; decrementeaza continutul reg. TEMP2 iar rezultatul
; este salvat in TEMP2
; pentru fiecare decrementare a reg. TEMP2 se fac
; 256 decrementari ale lui TEMP1
; fiecare decrementare a reg. TEMP2 dureaza 3 µs
GOTO Adr
; rezulta ca intarzierea dorita se obtine cu relatia (768 µs + 3 µs) x 52 µs = 40,092 ms
MOVLW .0
MOVWF TEMP1 ; registrul TEMP1 este încărcat din nou cu valoarea 0
MOVLW .52
MOVWF TEMP2 ; registrul TEMP2 este încărcat din nou cu valoarea 52
Curs 11 – Microprocesoare şi microcontrolere
Fişierul sursă (.asm) pentru aplicaţia dată este următorul:
#include <P16F887.INC>
CBLOK 0X20
TEMP1 ; in aplicaţia de faţă se folosesc 2 registre de uz general din memoria RAM
TEMP2 ; internă
ENDC
ORG 0
Start :
BSF STATUS, RP0 ; selectează bancul 1 pentru accesul la reg. TRISA
BCF TRISA, 0 ; setează pinul RA0 ca pin de ieşire
BCF STATUS, RP0 ; revenire la bancul 0 pentru a avea acces la PORTA
BCF PORTA, 0 ; se resetează bitul RA0 => LED stins
MOVLW .0
MOVWF TEMP1 ; registrul TEMP1 este încărcat cu valoarea 0
MOVLW .100
MOVWF TEMP2 ; registrul TEMP2 este încărcat cu valoarea 100 ( în zecimal )
Loop :
BSF PORTA, 0 ; LED-ul este aprins
CALL Adr
BCF PORTA, 0 ; LED-ul este stins
CALL Adr
GOTO Loop
Adr :
DECFSZ TEMP1, 1
GOTO Adr
DECFSZ TEMP2, 1
GOTO Adr
MOVLW .0
MOVWF TEMP1 ; registrul TEMP1 este încărcat din nou cu valoarea 0
MOVLW .52
MOVWF TEMP2 ; registrul TEMP2 este încărcat din nou cu valoarea 52
RETURN
END
Curs 11 – Microprocesoare şi microcontrolere
Aplicaţia 2 (Circuit cu LED şi întrerupător)

Comutatorul K1 din figură poate fi folosit pentru a condiţiona modul de


funcţionare a aplicaţiei 1. De exemplu, LED-ul să fie comandat ca şi în
aplicaţia anterioară doar atât timp cât întrerupătorul K1 este închis. În acest
caz, codul sursă a noii aplicaţii este următorul:
Curs 11 – Microprocesoare şi microcontrolere
Fişierul sursă (.asm) pentru aplicaţia dată este următorul:
#include <P16F887.INC>
CBLOK 0X20
TEMP1 ; in aplicaţia de faţă se folosesc 2 registre de uz general din memoria RAM
TEMP2 ; internă
ENDC
ORG 0
Start :
BSF STATUS, RP0 ; selectează bancul 1 pentru accesul la reg. TRISA
BCF TRISA, 0 ; setează pinul RA0 ca pin de ieşire
BSF TRISA, 7 ; setează pinul RA7 ca pin de intrare
BCF STATUS, RP0 ; revenire la bancul 0 pentru a avea acces la PORTA
BCF PORTA, 0 ; se resetează bitul RA0 => LED stins
MOVLW .0
MOVWF TEMP1 ; registrul TEMP1 este încărcat cu valoarea 0
MOVLW .100
MOVWF TEMP2 ; registrul TEMP2 este încărcat cu valoarea 100 ( în zecimal )
Loop :
BTFSC PORTA, 7 ; verifică nivelul logic aplicat pe pinul RA7 (pinul 30 al microcontrolerului)
GOTO Loop
BSF PORTA, 0 ; LED-ul este aprins
CALL Adr
BCF PORTA, 0 ; LED-ul este stins
CALL Adr
GOTO Loop
Adr :
DECFSZ TEMP1, 1
GOTO Adr
DECFSZ TEMP2, 1
GOTO Adr
MOVLW .0
MOVWF TEMP1 ; registrul TEMP1 este încărcat din nou cu valoarea 0
MOVLW .52
MOVWF TEMP2 ; registrul TEMP2 este încărcat din nou cu valoarea 52
RETURN
END

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