Sunteți pe pagina 1din 13

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