Sunteți pe pagina 1din 115

CAPITOLUL 1 NOIUNI GENERALE PRIVIND FRECVENMETRELE

1.1 Istoric. Definiii. Clasificari


1.1.1 Istoric
Sistemele de msurare au cunoscut o evoluie semnificativ, de la primele
aparate de msur analogice, la aparate numerice i n final la sisteme de msur
complexe n care se utilizeaz reele de calculatoare, instrumentaie virtual,
transmisii n radiofrecven a datelor msurate sau satelii.
Evoluia industriei electronice a permis miniaturizarea lanurilor de msurare,
lucru cu aparatur de msurare cu viteze de rspuns ridicate, band de frecvene
larg, erori de msur neglijabile etc.
Evoluia aparatelor i sistemelor de msur nu este apreciat numai din punct
de vedere al dimensiunilor i parametrilor funcionali ai acestora, ci i din punct de
vedere al scopului pentru care sunt utilizate aceste aparate i sisteme de msur.
Astfel dac n trecut msurtorile erau concentrate pentru punerea n eviden a
diverselor fenomene n laboratoare i pe standurile de ncercri, n ultimele decenii
msurtorile se efectueaz frecvent n industrie, n meteorologie, hidrologie,
domeniul nuclear, la autovehicule, n medicin etc.
1.1.2 Definiii
Deoarece timpul i frecvena sunt mrimi fizice legate ntre ele printr-o relaie
invers proporional, aparatele digitale destinate msurrii frecvenei permit
msurarea de perioade, de intervale de timp etc.
Frecventa este o marime derivata, asociata fenomenelor (semnalelor) cu
variatie periodica n timp, definita prin intermediul relatiei:
f

1
T

(1.1)

n care T este perioada semnalului.


Perioada T a unui semnal se defineste ca fiind intervalul de timp pentru care
este ndeplinita egalitatea:
u (t ) u (t kT )
(1.2)
unde k este un ntreg, oricare ar fi momentul de timp t, exprimnd faptul ca dupa un
numar ntreg de timp T (oricare ar fi acesta) semnalul are aceeasi valoare ca la
momentul de pornire.
Frecvena se exprim n Hz (hertz); semnalul cu frecventa de 1 Hz avnd
perioada de repetitie de o secunda.

1.1.3 Clasificari
Aparatele destinate indicarii frecventei semnalelor periodice n timp pot fi
clasificate pe baza urmatoarelor criterii:
a) funcie de principiul de prelucrare exist:
- clasa aparatelor analogice,
- clasa aparatelor numerice.
Aparatele analogice de masurat a frecventei semnalelor nu numara nimic
(cu toate ca, uneori, sunt prevazute cu circuite de afisare numerica a valorii
masurate), cel mult integreaza marimea prezenta la intrare. Au la baza fenomene
fizice care sa determine un semnal analogic, care sa poata fi indicat continuu,
proportional cu frecventa semnalului supus masurarii.
Se considera necesar a enuna principalele metode de msurare analogic a
frecvenei din dou motive. Mai nti pentru c s-ar putea ntlni aparate fabricate
acum 20, , 30 de ani care nc s funcioneze i n al doilea rnd pentru c vechile
principii de construire a aparatelor pot constitui sugestii pentru noi aparate, utiliznd
tehnologii electronice actuale, cu performante ridicate.

Metodele de masurare analogica a frecventei pot fi:


directe, caz n care se utilizeaza proprietatea reactantei unui circuit de a se
modifica cu valoarea frecventei semnalului de alimentare, aici ncadrndu-se
metodele de ncarcare / descarcare a condensatoarelor, metoda circuitelor aduse la
rezonanta si metoda puntilor de curent alternativ;
de comparatie, caz n care se recurge la compararea frecventei semnalului
aplicat la intrarea aparatului cu frecventa unui semnal intern, aici ncadrndu-se
metoda figurilor Lissajous, metoda heterodinarii si metoda oscilatorului de transfer.
Masurarea numerica a frecventei consta n numararea, ntr-un interval de
timp precizat, a perioadelor semnalului analogic prezent la intrare. Sunt prevazute,
n acest scop, cu circuite electronice de adaptare a semnalelor analogice n gama
de lucru a blocurilor de prelucrare, circuite de comanda a functiilor si circuite de
interfata cu rolul de conversie a semnalului analogic n semnal numeric.
b) funcie de numrul de mrimi msurate exist:
- sisteme numerice de msurare utilizate pentru msurarea unei mrimi ;
- sisteme numerice de msurare utilizate pentru msurarea a cel puin dou
mrimi (exemplu: frecvenmetru numrtor numeric etc.)

c) funcie de principiul de funcionare exist:


- frecvenmetre numerice cu logic cablat (n structura acestora intr
circuite integrate, iar blocurile logice sunt realizate cu circuite logice
secveniale ) ;
- frecvenmetre numerice cu logic programat (n structura acestora intr
circuitele integrate, ns blocurile logice sunt realizate cu un
microprocesor) ;
- sisteme numerice de msurare computerizate (sisteme de msurare care
conin un calculator).
n anul 1983 a aprut i s-a dezvoltat conceptul de instrumentaie virtual, ce
permite transformarea calculatorului ntr-un instrument de msurare superior din
punct de vedere al parametrilor tehnice oricrui alt sistem de msurare. Prin
intermediul acestuia se poate msura orice mrime fizic, calculatorul nlocuind
orice aparat de msur de laborator.

1.2 Parametrii metrologici ai frecvenmetrelor numerice


Principalele caracteristici metrologice ale frecvenmetrului numrtor sunt:
1.2.1 Exactitatea reprezint proprietatea sistemului numeric de msurare de
a genera valori msurate apropiate de valoarea real. Rezultatul msurrii este
afectat de eroarea de indicaie, care reprezint diferena dintre valoarea indicat i
valoarea adevrat.
1.2.2 Precizia reprezint eroarea minim posibil exprimat n procente din
valoarea citit sau din limita superioar a domeniului de msurare. Principalele erori
sunt generate de: numrul de digii ai display-ului, de etalonul de frecven, de
triggerul de intrare, de sursa de alimentare i factorii de amplificare/divizare.
Este esenial s se respecte condiiile de mediu precizate de productor i s
se efectueza reglajele impuse n cartea tehnic (verificarea frecvenei oscilatorului
bazei de timp, verificarea sursei de alimentare i factorii de amplificare /divizare)
1.2.3 Rezoluia este un indicator ce exprim intervalul maxim de variaie al
mrimii de intrare ce determin apariia unui salt al semnalului de ieire.
Se definete i ca cea mai mic variaie ce se poate sesiza pe domeniul
respectiv.
n cazul sistemelor numerice de msurare, rezoluia este exprimat prin
numrul de bii.
De exemplu, pentru un semnal de ieire n cod binar natural de 10 bii se
deduce ca domeniul de msurat x max - xmin este cuantificat n 210 = 1024 nivele
posibile (inclusiv zero), ceea ce conduce la o rezoluie de aproximativ 0,1 % din
valoarea domeniului.

1.2.4 Viteza de msurare reprezint raportul dintre numrul ordinelor


numerice afiate (n) i timpul de msurare sau de decizie (t d), conform relaiei :
v k

n
td

ordine numerice/secund

(1.3)

unde k este constant de proporionalitate ;


td este intervalul de timp scurs din momentul aplicrii la intrarea
frecvenmetrului a semnalului purttor de informaie pn la afiarea acestuia pe
panoul de afiare.
1.2.5 Numrul domeniilor de msurare
De regul frecvenmetrele pot msura frecvene ntr-o gam larg (de la Hz la
zeci de MHz). Tensiunea de intrare aplicat este nscris n cartea tehnic, valoarea
efectiv putnd fi ncadrat n domenii cum ar fi : 1V10V sau 100mV35V sau
1V100V etc.

1.2.6 Stabilitatea reprezint variaia etalonrii frecvenmetrului numeric


funcie de temperatur, semnale parazite, umiditate etc. De regul frecvenmetrele
lucreaz n domenii de temperatur cuprinse ntre 5 0C400C, fiind prevzute cu un
sistem de termostatare a incintei oscilatorului, n scopul creterii stabilitii frecvenei
generate la modificarea temperaturii mediului ambiant.
1.2.7 Sensibilitatea
Se consider caracteristica static a unui sistem de msurare y = f(x).
Sensibilitatea se definete ca panta dreptei. Se pot defini:
- sensibilitatea absolut, care reprezint raportul dintre variaia absolut a
mrimii de ieire i variaia absolut a mrimii de intrare:
y dy y max y min
S

(1.4)
x dx x max x min
- sensibilitatea relativ, care reprezint raportul dintre variaia relativ a
mrimii y i variaia relativ a mrimii x.
y
dy / y
y
Sr

x dx / x
x

(1.5)

1.2.8 Fineea reprezint proprietatea aparatului de msur de a influena ct


mai puin mrimea fizic ce trebuie determinat.
1.2.9 Fidelitatea reprezint calitatea aparatului de msur de a fi c mai
puin influenat de aciunea factorilor externi i interni, cum ar fi temperatura,
semnale parazite etc.
1.2.10 Pragul de sensibilitate reprezint cea mai mic variaie a mrimii de
intrare x, care poate determina o variaie sesizabil a mrimii de ieire y.
Pragul de sensibilitate depinde de zgomotul din circuitele electrice.
Pragul de sensibilitate nu poate fi cobort sub o anumita limit minim impus
de zgomotul de agitaie termic.

CAPITOLUL 2 MODURI DE REALIZARE A FRECVENMETRELOR

2.1 Msurarea numeric a frecvenei


Masurarea numerica a frecventei const n numararea a N perioade ale
semnalului periodic ntr-un interval de timp t:
f

N
t

(2.1)

Daca t = 1 s, frecventa este numeric egal cu numrul gsit de perioade N.


Fig. 2.1
Schema

bloc

de

principiu

msurarea numeric a

frecvenei

pentru
este

dat n fig.2.1, n care:


o

AF amplificator formator;

CP circuit poart;

ND numrtor decadic;

A afiaj;

OC oscilator cuar;

DF divizor frecven;

CB circuit basculant.

Semnalul a crui frecven se msoar este amplificat i transformat n


impulsuri dreptunghiulare de ctre amplificatorul formator AF. Acestea ajung la
numrtorul decadic ND prin circuitul poart CP i sunt numrate n intervalul n
care la a doua intrare a CP se aplic impulsul produs de circuitul basculant CB.
Acest impuls are o durat etalon (1 s100 s, n decade), stabilit de divizorul de
frecven DF, prin divizarea frecvenei oscilatorului cu cuar OC. Raportul de divizare
poate fi modificat din exterior, n funcie de frecvena semnalului msurat, iar precizia
duratei acestor impulsuri este egal cu precizia oscilatorului cu cuar OC. Rezultatul
numararii este afiat la un dispozitiv de afiaj A, putnd fi valorificat i de alte
dispozitive numerice. Comanda reluarii procesului de msurare se poate da manual
sau automat.
ntruct schema bloc conine aceleai blocuri funcionale care servesc i la
msurarea intervalelor de timp, se construiesc aparate care ndeplinesc ambele
funcii (cronometru i frecvenmetru), denumite numaratoare universale.

2.1.1 Numaratorul universal

Fig. 2.2

n fig. 2.2:
o

AF1,2 amplificatoare formatoare;

CP circuit poarta principala;

BT baza de timp;

DC dispozitiv de comanda;

NBZ numarator binar zecimal;

DA dispozitiv de afisare;

OC oscilator cu cuart;

DF divizor de frecven;

TA timp de afiare;

K1a, K1b comutatorul modului de lucru (CRM).

Dispozitivul de comand DC are rolul de a declana procesul de msurare i


de a asigura reluarea lui automat sau la o comand manual. El furnizeaz la
ieire impulsuri de durat riguros egal cu perioada tensiunii aplicate prin
comutatorul K1b, sectiunile 1 sau 2.
Parametrul msurat cu aparatul la un moment dat este stabilit prin poziiile
comutatoarelor K1a, K1b (CRM), i anume: F- frecvena, T perioada, I numarul de
impulsuri, t intervalul de timp dintre dou impulsuri, R raportul a dou frecvene.
Aparatul are dou borne de intrare, A i B, la care se aplic semnalele necesare la
fiecare msurare, n funcie de parametrul ales.
2.1.2 Msurarea frecvenei
Tensiunea cu frecvena fx se aplic la borna A, este transformat de AF 1 n
impulsuri dreptunghiulare cu perioada riguros egal cu perioada semnalului de
intrare. K1a fiind n poziia 1, aceste impulsuri se aplic la o intrare a circuitului poart
CP. K1b fiind tot n poziia 1, tensiunea cu frecvena etalon dat de BT f e se aplic la
una din intrrile circuitului de comand CD, rezultnd la ieirea circuitului SAU un
impuls cu durata egal cu perioada acestui semnal. Pe durata acestui impuls T e
circuitul poarta CP permite trecerea spre numratorul binar zecimal NBZ a unui
numar de impulsuri:
nx = fxTe
(2.2)
sau:
n
fx x
Te
(2.3)
ntruct Te poate fi reglat n trepte decadice la o valoare n concordan cu
ordinul de mrime al frecvenei f x, continutul dispozitivului de afiaj DA va fi chiar
aceast frecven, exprimat n multipli sau submultipli de Hz.
2.1.3 Msurarea perioadei
n acest caz CP va fi deschis un interval de timp egal cu perioada T x a
semnalului msurat. Acesta se aplic la intrarea B i, prin K 1b = 2 va determina la
ieirea DC un impuls de durat T x, prezent la una din intrrile CP. n acest interval se
vor numra nx impulsuri de durate etalon Te, provenind de la BT, i aplicate la
cealalt intrare a CP. Numrul n x prezent n dispozitivul de afiaj DA va fi dat de
relatia:
Tx = nxTe

(2.4)

Alegnd pe Te ca multiplu sau submultiplu de 10 al secundei, prin acionarea


lui K2 va rezulta Tx n aceleasi unitai de mrime.
2.1.4 Msurarea intervalelor de timp
n aceast situaie, la comutatorul modului de lucru K 1a se realizeaz
conexiunile 2 i 3, iar la K1b 2. Intervalul de timp se consider cuprins ntre un impuls
de START i de unul de STOP. Impulsul de START se aplic la intrarea B i va
determina prin K1b = 2 lansarea de ctre DC a impulsului de validare a portii CP.
Impulsul de Stop va produce prin K 1a = 3 rebascularea DC i deci blocarea CP. n
intervalul t dintre aceste dou semnale numrtorul NBZ va numra n x impulsuri cu
perioade Te ale BT, aplicate la cealalt intrare a CP prin K 1a = 2. Deci, ca i la
msurarea perioadei:
t = nxTe

(2.5)

rezultatul fiind afiat direct.


2.1.5 Msurarea raportului a dou frecvene
Cele dou tensiuni de frecvene diferite, una mai mare f M i alta mai mic fm
se aplic intrarilor A, respectiv B. Rezult c CP va fi deschis o durat T M
corespunznd perioadei tensiunii de frecven mai mic i n acest interval se vor
numra impulsurile de durat mic Tm ale tensiunii de frecven ridicat fM.
Deci:
nx

TM
f
M R
Tm
fm

(2.6)

2.1.6 Masurarea numarului de impulsuri


Impulsurile de numrat se aplic la intrarea A, i , prin K 1a = 1, la o intrare a
CP. Ele vor fi numrate atta timp ct K 3 este deschis, deci prin K 1b = 3 i circuitul
SAU aplic un "1" logic la cealalt intrare a CP.
Reglajul TA (timp de afisare) al dispozitivului de comanda DC permite fixarea
timpului dintre doua masurari succesive si, prin aceasta, durata intervalului de
mentinere la afisaj a rezultatului masurarii precedente. Este un reglaj specific acestui
gen de aparate.

2.2 Msurarea frecvenelor foarte joase cu NU

Frecvenele joase pot fi msurate cu o precizie satisfctoare n urmatoarele


moduri:

masurnd frecvena un timp mai lung (10 s, 100 s);

masurnd perioada n locul frecvenei (folosirea frecvenmetrului


reciproc). Se folosesc aparate care msoar perioada medie a semnalului, dup
care un bloc de calcul intern determin valoarea reciproc a marimii msurate i o
afieaz;

folosind multiplicatoare de frecven: fx este multiplicat de 10, 100,


1000 de ori, cu un oscilator comandat automat n faz i un divizor decadic.
Oscilatorul genereaz un semnal de frecven multiplu de f x, care este divizat i
comparat n faz cu semnalul de msurat. Metoda este avantajoas la msurarea
rapid a frecvenelor foarte joase (sub 1 Hz). Ea nu se poate aplica semnalelor
modulate n frecven i se aplic dificil semnalelor sinusoidale.

2.3 Msurarea frecvenelor foarte nalte cu NU


ntruct la msurarea direct a frecvenelor cu numratoarele universale nu
se pot depi frecvene de ordinul 500 MHz, la frecvene superioare acestei valori se
aplic una din metodele:
1) divizarea de frecven (prescalarea): se divide frecvena semnalului prin
2, 4, 8 sau 10 i apoi se msoara direct cu frecvenmetrul digital. Divizorul trebuie s
foloseasc circuite foarte rapide (ECL, diode tunel). Pentru afiarea direct a
frecvenei msurate, timpul de deschidere a porii este marit cu acelai factor cu
care este divizat frecvena semnalului de intrare. Aceast metod are avantajul c
permite msurari rapide i cu citire direct, frecvena maxim este ns limitat.
2) conversia de frecven cu heterodinare const n coborrea frecvenei
de intrare prin mixarea (amestecul) cu un semnal de frecven uor diferit de
frecvena de msurat i cunoscut cu mare precizie, conform schemei din fig. 2.3.

10

Fig. 2.3
o

NU numarator universal;

GA generator de armonici;

FA filtru acordabil;

AV amplificator de videofrecven (FTJ la frecvena de lucru);

MF multiplicator de frecven;

CH convertor heterodina.

Frecventa de 10 MHz a BT a NU este multiplicat cu 20 n MF; la iesirea GA


se obine un spectru bogat de armonici (fundamentala i primele 60). Se regleaz
FA i se poate selecta oricare din armonici (ordinul m) n scopul mixrii n etajul de
amestec. La ieirea FTJ se selecteaz semnalul cu frecvena cea mai joas, care
poate fi:
fx fs, daca fx> fs = mf0
(2.7)
fs fx, daca fx< fs

(2.8)

Frecvena necunoscut se determin prin calcul:


fx mf0 = fN

(2.9)

fx = fN + mf0

(2.10)

sau fx = mf0 fN (daca fs = mf0 > fx)

(2.11)

unde:
o

m este rangul armonicii selectat cu FA;

f0 frecvena la intrarea GA;

11

fN frecvena indicat de numrtor.

Dezavantajul convertorului heterodin este necesitatea efecturii acestor


calcule pentru stabilirea rezultatului. Pentru a evita acest neajuns cavitatea
acordabil manual a fost inlocuit cu un filtru acordabil electronic.

3) conversia de frecven cu oscilator de transfer (fig.2.4).

Fig. 2.4
Diferena fa de convertorul heterodin este c frecvena cu care se face
amestecul poate fi modificat continuu i reprezint semnalul ce se msoar cu NU.
Modificarea se face n aa fel nct la ieirea AVF (FTJ) sa rezulte bti nule, caz n
care:
fx mf0 = 0

(2.12)

fx = mf0

(2.13)

fX se determin cunoscnd rangul m al armonicii.


Desi simpl, schema se utilizeaz rar datorit erorilor introduse de
instabilitatea pe termen scurt a oscilatorului.
n fig.2.4: - IBN indicator de batai nule (osciloscop, instrument magnetoelectric
etc.)
Precizia poate crete att prin nglobarea oscilatorului ntr-o bucl PLL, cu
posibilitatea reglrii manuale a frecvenei, ct i prin comanda n tensiune a
frecvenei oscilatorului (fig.2.5).

12

Fig. 2.5
n aceasta figur:
- DF discriminator de faza;
- OCT oscilator comandat n tensiune, celelalte blocuri pastrndu-i
aceleai semnificaii ca n figurile anterioare.
Iniial bucla PLL nu este conectat i f 0 este reglat manual pn cnd
diferena fx mf0 se ncadreaz n banda de trecere a AVF. Se conecteaz bucla
PLL, n care DF regleaz automat frecvena f0 pn cnd:
fxmf0=fR
(2.14)
deci: fx=mf0+fR
(2.15)
unde fR este frecventa etalon a NU.
Stabilitatea lui f0 este dat , la fx=ct., de stabilitatea lui fR, care este foarte bun.

2.4 Proceduri de msurare


a. fx este cunoscut cu aproximaie: se deconecteaz bucla PLL i se
regleaz manual frecvena oscilatorului de la frecvene joase spre nalte, pn cnd
se obin bti nule deci cnd:
m

f x'
f0

(2.16)

'
unde: - f x este valoarea aproximativa a lui fx;

- f0 este valoarea frecventei indicata de NU.


Apoi se stabilete la NU valoarea lui m i se conecteaz bucla PLL. NU va
indica direct valoarea lui f x. Verificarea are loc astfel: se mrete sau se micoreaz
13

f0 pn la o nou btaie nul, cu bucla PLL deconectat. Se stabilete valoarea lui


m, micorat sau mrit cu o unitate fa de valoarea precedent i se efectueaz
msurarea ca mai sus. Rezultatul obinut trebuie s fie acelai.
b. fx este complet necunoscut: cu bucla PLL deconectat, se regleaz
manual f0 pn se obin succesiv bti nule, la f01, f02.
f x mf 01

(2.17)

f x m 1 f 02

(2.18)

f 02
f 01 f 02

(2.19)

Msurarea continu ca n cazul a).


Oscilatorul de transfer de mai sus poate fi automatizat, eliminnd reglarea
manual a lui f0 i calcularea parametrului m (fig.2.6).
o

GTBT - generator de tensiune BT;

DA -detector de armonice.

Fig. 2.6
n lipsa semnalului de msurat, nu exist tensiune nici la ieirea AVF.
Impulsurile n dinte de fierastru ale GTBT vor modifica frecvena OCT periodic,
ntre limita maxim i minim. La aplicarea unui semnal de intrare, apariia unei
tensiuni la iesirea AVF, corespunzator interferenelor nule, va determina blocarea
GTBT i intrarea n funciune a buclei PLL. Funcionarea este aceeai, se exclude
reglarea manual a frecvenei. DA stabilete valoarea lui m i o transfer
numrtorului NU.

14

Avantajele convertoarelor cu oscilator de transfer sunt:


o
o

posibilitatea efecturii de msuratori ntr-un domeniu larg de frecvene;


precizia ridicat.

Cu ajutorul convertoarelor de frecven se pot msura frecvene pna la 40 GHz.

2.5 Erori la folosirea frecventmetrelor numerice


Eroarea de msurare cu frecvenmetrele digitale se poate calcula difereniind
relaia:
f

N
t

(2.20)

Se obine expresia:
f
N t

f
N
t

(2.21)

n care:
o

de 1 digit;
o

N este eroarea de numrare a numratorului decadic i are valoarea


t
este eroarea relativ a oscilatorului cu cuar al frecvenmetrului
t

i este de ordinul 5x10-5 5x10-10, funcie de tipul oscilatorului;


o

N = bf este numrul indicat de frecvenmetru, unde b este intervalul de

timp n secunde n care se face msurarea semnalului de frecven f.


Ecuaia va deveni:
f
1

f
bf

(2.22)

15

Precizia de msurare este mai mare dac:


o
o

la frecvene joase se msoar perioada n locul frecvenei;


la frecvene nalte se micoreaz frecvena.

Aparatele destinate msurarii numerice a frecvenei, a cror schem bloc


este prezentat n fig. 2.7, au n componen un numrator universal NR, un
generator de impulsuri numit baza de timp BT, circuite integrate CI avnd rolul de
adaptare a semnalelor analogice i de conversie n semnale cu dou stari
(numerice), o poart logica P, un circuit CF de selectare a funciilor i un circuit AF
de afisare a rezultatului msurarii. Acelasi aparat (fig. 2.7) poate fi utilizat i la
msurarea intervalelor de timp.

Fig. 2.7
Deoarece fT = 1, atunci att aparatele destinate msurarii frecvenei ct i
aparatele pentru msurarea intervalelor de timp au aceeai schem structural,
motiv pentru care n schema din figura 2.7 este prezent un comutator al funciilor CF,
avnd rolul de a aciona asupra circuitului poart, de a modifica frecvena bazei de
timp i de a comuta circuitele de intrare n funcie de mrimea prezent la intrarea
aparatului.
Aparatul numeric universal poate funciona n urmatoarele regimuri:
- msurarea frecvenei semnalelor periodice n timp;
- indicarea raportului frecvenelor a dou semnale, aplicate la intrarile IN1,
IN2;
- msurarea perioadei unui semnal;
- msurarea duratei de timp a unui impuls;
- indicarea intervalului de timp dintre prezena unui impuls la intrarea IN1 i
apariia unui impuls la intrarea IN2 (decalajul de timp ntre doua semnale);
- indicarea valorii medii a perioadei unui semnal;

16

- furnizarea la iesirea OUT (vezi. fig. 2.7) a semnalului generat de baza de


timp;
- furnizarea la ieire a unui semnal cu frecvena divizat fat de frecvena
semnalului prezent la intrarea aparatului;
- furnizarea la ieire a unui semnal numeric, ntr-un cod oarecare (de cele mai
multe ori se utilizeaz codul binar), a rezultatului msurarii.
De aceea, un astfel de aparat se ntlnete sub numele de numrtor
universal, iar n cazul n care ndeplinete numai funcii referitoare la frecvena
semnalului se numete frecvenmetru.
Circuitele de intrare ale numaratorului universal au ca funcie principal
conversia semnalului analogic, aplicat la intrarea aparatului, n semnal digital care
s poat fi prelucrat de lanul de msurare. n acest scop, au n componen circuite
basculante n regim de trigger, care genereaz semnal unu logic atunci cnd
tensiunea prezent la intrare depaete valoarea pragului superior semnal logic pe
care l pstreaz la iesirea circuitului pna cnd tensiunea coboar sub valoarea
pragului inferior. n cazul n care cele doua praguri de basculare sunt egale, valoarea
comun se numete prag de declanare i pentru modificarea pragului (care, n
fond, este un nivel de tensiune) se utilizeaz un poteniometru.
Aa cum se arat n figura 2.8, circuitul de intrare CI are n principiu
schema: A amplificatoare, LIM limitator de nivel, DEC circuit de modificare n
decade a amplificarii lui A1, TG trigger, Rv poteniometru pentru reglarea
tensiunii de iesire din A2 si P poteniometru pentru reglarea nivelelor impulsurilor N
la nivelele PJ(jos) i PS(sus).

Fig.2.8
n amontele circuitului basculant se gaseste un circuit de amplificare a
semnalului analogic pentru ca valorile de tensiune sa se ncadreze n domeniul
tensiunilor permise de intrarea circuitului de conversie n semnal digital. Factorul de
amplificare poate fi modificat n trepte putnd lua si valori subunitare (functio-nare n
regim de atenuator). Amplificatorul este prevazut cu un circuit de limitare a valorii
semnalului, n scopul protectiei celorlalte circuite.
Pentru exemplificarea modului de actiune a comutatorului de functii, n figura
2.9 este prezentat structura aparatului n cazul utilizaii acestuia n regim de
frecventmetru.
17

Pentru masurarea frecvenei unui semnal comutatorul K1 se stabileste pe


pozitia 1 iar semnalul se aplica la borna I1.
Frecventa furnizata de oscilatorul OSC este divizata de numaratorul DIV, asa
nct la intrarea portii P, n functie de pozitia comutatorului KD (TP = KD T0 , unde
T0 este perioada semnalului furnizat de oscilator), este prezent semnalul de intrare
TP T0 ,

un

TP 10 3 T0 ,

timp

TP 10 6 T0

(2.23)
n intervalul de timp TP, impulsurile generate de CI1, sub comanda
semnalului de la intrarea I1, trec prin poarta i sunt contorizate de numaratorul NR.

Fig. 2.9
Circuitul AF afiseaza numarul de impulsuri provenite de la semnalul supus masurarii,
care au trecut prin poarta n intervalul de timp TP, adica afiseaza numarul:
T
N P TP f K D T0 f
(2.24)
T
f fiind frecventa semnalului.
Presupunnd ca oscilatorul furnizeaza impulsuri cu perioada T 0 = 1 s, la cele trei
iesiri ale circuitului de divizare DIV avem:
TP1 T0 1s
TP 2 1s 10 3 1ms
TP 3 T0 10 6 1s

(2.25)

18

Daca afisarea se face cu trei cifre zecimale, valoarea maxima este N = 1000. Pentru
cele trei intervale de numarare TP1 , TP 2 , TP 3 frecventa semnalului va fi afisat
respectiv n MHz, n kHz i n Hz.
n cazul masurarii raportului frecventelor a doua semnale, semnalul cu
frecvena mai mare se conecteaz la borna I1 iar celalalt la borna I2, ceea ce face ca
numaratorul NR sa numere impulsurile provenite de la semnalul de frecventa mare
T2
f
1
ntr-un interval de timp: N
(2.26)
T1
f2
stabilit de semnalul de frecventa mai mic.
n figura 2.9, pentru claritatea expunerii, s-a considerat comutatorul KD numai
cu 3 pozitii, limitnd afisajul la 3 cifre; n realitate se utilizeaz mai multe poziii
intermediare pentru KD , iar afiarea se face cu mai multe cifre cu punct zecimal.
Schema structural din fig. 2.9 permite pe lng msurarea frecvenei i
msurarea perioadei semnalului aplicat la intrarea I1, dac se stabilete o perioad
a semnalului furnizat de baza de timp mai mic dect perioada semnalului supus
msurarii. n aceste condiii, numaratorul NR contorizeaz de cte ori se cuprinde
cuanta de timp (corespunzatoare pozitiei comutatorului KD) furnizat de baza de
timp n perioada semnalului.
Dac perioada semnalului este mic, comparabil cu cuanta bazei de timp, se
intercaleaz ntre CI1 i poarta P un circuit de divizare, spre exemplu cu 10, ceea ce
determin creterea perioadei semnalului de msurat (n cazul exemplului cresterea
este de 10 ori, iar dac factorul de divizare este k atunci cresterea este de k ori).
Numratorul contorizeaz impulsurile provenite de la baza de timp pe un
interval de k perioade, ceea ce nseamn c se va afisa o valoare medie pentru k
perioade ale semnalului supus msurarii.
Exist situaii n care se impune msurarea intervalului de timp n care
semnalul de la intrarea I1 crete de la valoarea U1 la valoarea U2.

Fig. 2.10
n figura 2.10,a este artat modul de configurare, de ctre comutatorul de
funcii, a circuitului de intrare pentru msurarea intervalului de timp n care tensiunea
de la borna de intrare I1 crete de la valoarea U1 la valoarea U2.

19

Blocurile notate cu TGV sunt circuite basculante n regim de trigger care


efectueaz tranziia ieirii (din nivelul L n nivelul H atunci cnd intrarea atinge
valoarea pragului inferior VPJ = U1 pentru circuitul TGV1 i respectiv VPS = U2
pentru circuitul TGV2). Circuitul basculant bistabil CBB genereaz la ieire un
semnal de forma celui din figura 2.10,b, care constituie semnal de autorizare pentru
poarta P, aceasta permitnd trecerea ctre numrtor a impulsurilor furnizate de
baza de timp BT (numai n intervalul de timp ct tensiunea de la intrarea I1 se afl
ntre limitele U1, , U2).

20

CAP. 3 FRECVENMETRU CU LOGIC CABLAT


3.1 Schema bloc a frecvenmetrului cu logic cablat
Frecvenmetrul conine un generator de baz de timp cu cuar, un bloc de
comand i circuitele de numrare, memorie i afiare.

Fig. 3.1
Explicarea blocurilor din schema bloc a frecvenmetrului numeric cu
logic cablat:

CI. - circuit de intrare, care transform semnalul de frecven


necunoscut fx, n impulsuri dreptunghiulare, de aceeai frecven f x, compatibile
nivelelor logice cu care "lucreaz" celelalte blocuri;
B.T. - baza de timp format n general dintr-un oscilator stabil cu cua i un
divizor de frecven;

B.C.L.- bloc de control logic, care, din semnalul bazei de timp


formeaz i furnizeaz urmtoarele semnale:
-semnalul START/STOP (durata de timp To n care se numr cele N
impulsuri de frecven fx) ctre poarta (P);
-semnalul RESET ctre numrtoare, care,
aduce naintea
deschiderii porii ( nainte de nceperea ciclului de numrare) numrtorul N
n starea "zero";
-semnalul
TRANSFER
ctre
memoria
tampon
M,
care
determin transferul coninutului numrtorului ctre blocul decodificator;

N -numrtor de impulsuri;
M -memorie tampon, care memoreaz i trimite ctre blocul
"Decodificare -Afiare" rezultatul final al numrrii. Uneori aceasta
lipsete, ns n acest caz se afieaz continuu toate strile numrtorului i
va fi

21

necesar un circuit suplimentar de meninere a numrtorului n starea final pentru


citirea acestei stri;
D -blocul decodificator care n funcie de dispozitivul de afiare poate fi:
-decodificator binar-7 segmente (afiaj n 7 segmente),
-decodificator binar-zecimal (afiaj cu tuburi Nixie), etc.
De menionat c n ultimul timp s-au realizat circuite integrate specializate
care cuprind n acelai "chip" decodificatorul i dispozitivul de afiaj, iar altele chiar
blocurile Numrtor-Memorie-Decodificator (de exemplu, circuitul Micro-electronicaMMC 22928).

3.2 Proiectarea schemei electrice


Ne propunem s proiectm un frecvenmetru numeric ce permite msurarea
frecventelor pn la 99KHz.
Generatorul de baz de timp furnizeaz semnalele cu perioada de 0,1s ceea
ce permite msurarea (prin comutarea acestor semnale) a frecvenelor de pn la:
99KHz.
Semnalele bazei de timp sunt obinute din oscilatorul cu cuar, prin divizri
succesive.
Circuitul de intrare este realizat cu o poart din capsula CDB400 conectat ca
amplificator formator. Din poteniometrul de 1k se fixeaz punctul de funcionare pe
caracteristica de transfer, la mijlocul pantei abrupte. Dioda PL AV7Z protejeaz
intrarea mpotriva supratensiunilor sau tensiunilor negative. Pe traseul intrrii se
observ i un atenuator.
Condensatorul de intrare C4 poate fi cu mylar sau hrtie iar C5 ceramic.
Poarta propriu zis a frecvenmetrului este poarta P2.
Intervalul de timp n care se face numrarea impulsurilor de la intrare este
determinat, din baza de timp, de ctre circuitul de comand format din: poarta PI,
numrtorul N, decodificatorul D i circuitul basculant bistabil. Circuitul de comand
mai furnizeaz i semnalul RESET (tergere) i TRANSFER (memorare + afiare).
Funcionarea circuitului de comand este urmtoarea:
-la nceputul ciclului (n repaus) ieirea negat a monostabilului este n stare
"1" logic;
-impulsurile baz de timp trec i se regsesc inversate la ieirea porii P1;
-primul impuls provoac trecerea numrtorului n srarea 0001, stare care
este decodificat de decodificatorul D, deci ieirea "D" a acestuia trece n "0" logic;
-apariia strii "0" logic n punctul "D" provoac trecerea circuitului basculant
bistabil n starea logic Q=1;
-n consecin impulsurile de frecven f x trec prin poarta P2 de le intrarea IN
spre numrtoarele N1N5 (punctul K). Impulsurile sunt numrate i stocate n
aceste numrtoare;
-n acelai timp impulsurile baz de timp sunt stocate n numrtorul N; la al
unsprezecelea impuls numrtorul trece n starea 1110=10112 care este decodificat.
Deci, la al unsprezecelea impuls, ieirea "E" a decodificatorului trece n starea "0"

22

logic "fornd" ieirea circuitului basculant bistabil n starea Q=0. Ca urmare, se


oprete numrarea impulsurilor de la intrare, cu frecvena f x, poarta P2 blocndu-se;
-impulsurile baz de timp trec n continuare prin poarta P1, iar numrtorul N
trece n strile urmtoare, starea 13 fiind aleas pentru a comanda circuitul
basculant monostabil (CBM), n momentul comutrii cruia, poarta PI se blocheaz;
-pe frontul pozitiv al impulsului furnizat la ieirea Q a CBM informaia
nmagazinat n lanul de numrare N1N5 este nscris n lanul de registre de
memorare M1M5 i afiat;
-cnd circuitul CBM revine n starea Q=0 (Q=l) (dup dependent de grupul
RC), impulsurile baz de timp trec din nou prin poarta PI, iar cnd numrtorul N
ajunge n starea "15", n punctul "G" apare un impuls care provoac trecerea
numrtoarelor N1N5 n starea "0" logic;
-din starea 15 numrtorul N trece n starea "0";
-urmtorul impuls baz de timp marcheaz trecerea numrtorului N n starea
1 i nceputul unui nou ciclu de numrare-msurare identic cu cel descris.
Schema electric detaliat a frecvenmetrului este prezentat n figura 3.2.
Amplificatorul de intrare i porile P1,P2,P3 sunt cuprinse ntr-o capsul CDB 400
(patru operatoare I-NU TTL).
Oscilatorul cu cuar, din baza de timp, este realizat cu inversoare TTL i
numrtoarele CDB 492 (configuraie de divizor cu 10) sau CDB 4192.

23

24

Fig. 3.2

3.3 Funcionarea schemei


25

3.3.1 Formarea bazei de timp


La nceputul ciclului intrarea n primul numrtor CDB492 (montat n
configuraie de divizor cu 10) este zero. O dat cu apariia primului impuls de ceas
primul numrtor furnizeaz pe cele patru ieiri ale sale semnalele 0001. O data cu
apariia celorlalte semnale de clock pe intrarea numrtorului acesta i va modifica
ieirea pn se va ajunge la 0101, la urmtorul impuls de ceas ieirea numrtorului
va fi 0000, dar datorit trecerii din 1 n 0 a celei de a treia ieiri intrarea celui de al
doilea numrtor se va activa i ierea lui va ti n consecin 0001, i astfel s-a
realizat prima divizare cu 10 n frecven a semnalului
Aceast operaie se va repeta i la celelalte numrtoare pn frecvena de
ieire a ultimului numrtor va fi de 1Hz.
Aceast frecven de ieire corespunde unei perioade de o secund, care
constituie semnalul de clock pentru bstabiIul JK.

3.3.2 Funcionarea circuitului de comand


Iniial ieirea bistabilului JK este zero ceea ce implic ca ieirea negat s fie
1. Acest semnal de 1 logic va fi aplicat pe una din cele dou intrri ale porii I, care
va avea pe cealalt intrarea aplicat semnalul cules de la ieirea circuitului de intrare.
Ceea ce nseamn ca numrul de impulsuri de la intrare vor putea trece prin poarta
l i vor constitui intrarea n primul numrtor decadic CDB490
O dal cu apariia primului impuls de ceas pe intrarea de clock a bistabilului
acesta va comuta din 0 n 1 implicit pentru ieirea negat din 1 n 0. Aceast
comutare a bistabilului va aciona asupra porii I ducnd la blocarea acesteia.

3.3.3 Funcionarea numrtorului, memoriei, decodificatonilui


i afiajului
Pe perioada de o secund ct poarte I este deschis semnalele primite de
Ia intrare vor aciona asupra numrtorului CDB490, conducnd la modificarea ieirii
acestuia din 0000 pn la 0101 n aceast ultim stare prin aplicarea a nc unui
impuls de ceas numrtorul va trece n starea 0000, ceea ce nseamn trecerea
celei de a doua ieiri din 1 n 0. Aceast trecere va aciona i asupra celuilalt
numrtor determinnd ieirea acestuia din 0000 s devin 0001. Acest proces se
va repeta pentru toate celelalte impulsuri de la intrare.
Aceste semnale de la numrtor vor ti transmise memoriei tampon care le va
memora i le va trimite ctre decodificator Memoria tampon este format dintr-un
registru de memorie 74SL75 care este format din celule de tip D latch. Aceste celule
cnd primesc 1 logic pe intrarea de comand, denumit acum Lateh Sfrobe Imput
(LSI), vor face registru transparent ceea ce nseamn ca ieirea registrului va fi o
copie fidel a intrrii. Atunci cnd semnalul de comand va trece din 1 n 0 celulele
de tip D se vor zvori, iar registru de memorie va pstra pe ieire valoare din acel
moment, atta timp ct intrarea de comand LSI va fi 0.

26

Decodificatoru este de tip CDB447 cu patru intrri i apte ieiri. Pe cele


patru intrri se aplic un cuvnt de cod ce reprezint n binar cifra ce urmeaz s fie
afiat.
Afiorul este de tip ROL77 compus din diode electroluminiscente n
configuraie anod comun. Afiarea cifrei se face prin stingerea elementelor necesare
toate elementele fiind iniial aprinse.
Ansamblul format din numrtor decadic, registru de memorie, decodiftcator
i dispozitiv de afiare, constituie unul din elementele de baz ale oricrui aparat de
msur numeric. Avnd n vedere gama larg de aplicaii n care este nevoie de o
afiare digital, constructorii de circuite integrate au realizat ansamblul de mai sus
ntr-o singur capsul. Un astfel de circuit integra este TIL306.
Circuite integrate folosite

27

3.4 Simulare i forme de und

Formele de und de la ieirea cuarului de 10MHz (linia 1) i pn la frecvena de 100KHz


(linia 3)

Formele de und de la frecvena de 1KHz (linia 1) i pn la frecvena de 1 Hz (linia 4)

28

Formele de und de la clock-ul bistabilului (linia 1), ieirea negat a bistabilului (linia 2),
semnalul de intrare (linia 3), ieirea porii I (linia 4)

Formele de und de la intrarea i ieirea numrtorului pentru cifra unitilor: prima linie
semnalul de intrare, urmtoarele patru linii semnalul de ieire

29

Formele de und de la ieirea decodificatorului unitilor, care indic cifra 6

30

CAP.4 FRECVENMETRU NUMERIC CU MICROPROCESOR


Frecvenmetrele numerice cu microprocesor fac parte din categoria mai nou
de aparate de masur a frecvenei. Frecvenmetrele numerice cu microprocesor
sunt mai uor de construit, costa mai puin (deoarece folosesc piese mai puine), au
un consum de energie mult mai scazut decat frecvenmetrele numerice cu circuite
integrate i sunt mai precise.
n continuare vor fi descrise cele mai inportante componente care intr n
construcia unui frecvenmetru cu microprocesor:

4.1 Microcontrolerul PIC16F628


PIC16F628 aparine unei clase de microcontrolere de 8 bii cu arhitectur
RISC. Structura lui general este artat n schia urmtoare reprezentnd blocurile
de baz.
Memoria program (FLASH)-pentru memorarea unui program scris.
Pentru c memoria ce este fcut n tehnologia FLASH poate fi programat i tears mai
mult dect odat, aceasta face microcontrolerul potrivit pentru dezvoltarea
de component.

EEPROM-memorie de date ce trebuie s fie salvate cnd nu mai este


alimentare.
Este n mod uzual folosit pentru memorarea de date importante ce nu trebuie
pierdute dac sursa de alimentare se ntrerupe dintr-o dat. De exemplu, o astfel de
dat este o temperatur prestabilit n regulatoarele de temperatur. Dac n timpul
ntreruperii alimentrii aceast dat se pierde, va trebui s facem ajustarea nc o
dat la revenirea alimentrii. Astfel componenta noastr pierde n privina automeninerii.
RAM-memorie de date folosit de un program n timpul executrii sale.
n RAM sunt memorate toate rezultatele intermediare sau datele temporare ce nu
sunt cruciale la ntreruperea sursei de alimentare.
PORTUL A i PORTUL B sunt conexiuni fizice ntre microcontroler i lumea
de afar. Portul A are 5 pini, iar portul B are 8 pini.
TIMER-UL LIBER (FREE-RUN) este un registru de 8 bii n interiorul
microcontrolerului ce lucreaz independent de program. La fiecare al patrulea impuls de
ceas al oscilatorului i ncrementeaz valoarea lui pn ce atinge maximul (255), i apoi
ncepe s numere tot din nou de la zero. Dup cum tim timpul exact dintre fiecare dou
incrementri ale coninutului timer-ului, poate fi folosit pentru msurarea timpului ce este
foarte util la unele componente.

31

UNITATEA DE PROCESARE CENTRAL are rolul unui element de


conectivitate ntre celelalte blocuri ale microcontrolerului. Coordoneaz lucrul altor
blocuri i execut programul utilizatorului.

CISC, RISC
S-a spus deja c PIC16F628 are o arhitectur RISC. Acest termen este
adeseori gsit n literatura despre calculatoare, i are nevoie s fie explicat aici mai
n detaliu. Arhitectura Harvard este un concept mai nou dect von-Neumann. S-a
nscut din nevoia de mrire a vitezei microcontrolerului. n arhitectura Harvard, busul de date i bus-ul de adrese sunt separate. Astfel este posibil un mare debit de
date prin unitatea de procesare central, i bineneles, o vitez mai mare de lucru.
Separarea programului de memoria de date face posibil ca mai departe instruciunile
s nu trebuiasc s fie cuvinte de 8 bii. PIC16F84 folosete 14 bii pentru
instruciuni ceea ce permite ca toate instruciunile s fie instruciuni dintr-un singur
cuvnt. Este de asemenea tipic pentru arhitectura Harvard s aib mai puine
instruciuni dect von-Newmann i s aib instruciuni executate uzual intr-un ciclu.
Microcontrolerele cu arhitectur Harvard sunt de asemenea numite
"microcontrolere RISC". RISC nseamn Reduced Instruction Set Computer.
Microcontrolerele cu arhitectura von-Newmann sunt numite "microcontrolere CISC".
Titlul CISC nseamn Complex Instruction Set Computer.
Pentru c PIC16F628 este un microcontroler RISC, aceasta nseamn c are
un set redus de instruciuni, mai precis 35 de instruciuni (de ex. microcontrolerele
INTEL i Motorola au peste 100 de instruciuni). Toate aceste instruciuni sunt
executate ntr-un ciclu cu excepia instruciunilor jump i branch. Conform cu ceea
ce spune constructorul, PIC16F628 ajunge la rezultate de 2:1 n compresia cod i
4:1 n vitez n comparaie cu alte microcontrolere de 8 bii din clasa sa.
Aplicaii

32

PIC16F628 se potrivete perfect n multe folosine, de la industriile auto i


aplicaiile de control casnice la instrumentele industriale, senzori la distan, mnere
electrice de ui i dispozitivele de securitate. Este de asemenea ideal pentru
cardurile smart ca i pentru aparatele alimentate de baterie din cauza consumului lui
mic.
Memoria EEPROM face mai uoar aplicarea microcontrolerelor la aparate
unde se cere memorarea permanent a diferitor parametri (coduri pentru
transmitoare, viteza motorului, frecvenele receptorului, etc.). Costul sczut,
consumul sczut, mnuirea uoar i flexibilitatea fac PIC16F628 aplicabil chiar i n
domenii unde microcontrolerele nu au fost prevzute nainte (exemple: funcii de
timer, nlocuirea interfeei n sistemele mari, aplicaiile coprocesor, etc.).
Programabilitatea sistemului acestui cip (mpreun cu folosirea a doar doi pini
n transferul de date) face posibil flexibilitatea produsului, dup ce asamblarea i
testarea au fost terminate. Aceast capabilitate poate fi folosit pentru a crea
producie pe linie de asamblare, de a nmagazina date de calibrare disponibile doar
dup testarea final, sau poate fi folosit pentru a mbunti programele la produsele
finite.
Clock-ul /ciclul instruciune
Clock-ul sau ceasul este starter-ul principal al microcontrolerului, i este
obinut dintr-o component de memorie extern numit "oscilator". Dac ar fi s
comparm un microcontroler cu un ceas de timp, "clock-ul" nostru ar fi un ticit pe
care l-am auzi de la ceasul de timp. n acest caz, oscilatorul ar putea fi comparat cu
arcul ce este rsucit astfel ca ceasul de timp s mearg. De asemenea, fora folosit
pentru a ntoarce ceasul poate fi comparat cu o surs electric.
Clock-ul de la oscilator intr ntr-un microcontroler prin pinul OSC1 unde
circuitul intern al microcontrolerului divide clock-ul n 4 clock-uri egale Q1, Q2, Q3 i
Q4 ce nu se suprapun. Aceste 4 clock-uri constituie un ciclu de o singur
instruciune (numit de asemenea ciclu main) n timpul creia instruciunea este
executat.
Executarea instruciunii ncepe prin apelarea unei instruciuni care este
urmtoarea n linie. Instruciunea este apelat din memoria program la fiecare Q1 i
este scris n registrul de instruciuni la Q4. Decodarea i executarea instruciunii
sunt fcute ntre urmtoarele cicluri Q1 i Q4. n urmtoarea diagram putem vedea
relaia dintre ciclul instruciunii i clock-ul oscilatorului (OSC1) ca i aceea a clockurilor interne Q1-Q4. Contorul de program (PC) reine informaia despre adresa
urmtoarei instruciuni.

33

Pipelining
Ciclul instruciune const din ciclurile Q1, Q2, Q3 i Q4. Ciclurile de
instruciuni de apelare i executare sunt conectate ntr-un aa fel nct pentru a face
o apelare, este necesar un ciclu cu o instruciune, i mai este nevoie de nc unul
pentru decodare i executare. Totui, datorit pipelining-ului (folosirea unei pipelineconduct, i este aducerea unei instruciuni din memorie n timp ce se execut alta),
fiecare instruciune este executat efectiv ntr-un singur ciclu. Dac instruciunea
cauzeaz o schimbare n contorul programului, i PC-ul nu direcioneaz spre
urmtoarea ci spre alte adrese (poate fi cazul cu subprogramele jumps sau calling),
2 cicluri sunt necesare pentru executarea unei instruciuni. Aceasta este pentru c
instruciunea trebuie procesat din nou, dar de data aceasta de la adresa corect.
Ciclul ncepe cu clock-ul Q1, prin scrierea n registrul instruction register (IR).
Decodarea i executarea ncepe cu clock-urile Q2, Q3 i Q4.

TYC0 citete instruciunea MOVLW 55h (nu are importan pentru noi ce
instruciune a fost executat, ce explic de ce nu este un dreptunghi desenat n
partea de jos).
TCYI execut instruciunea MOVLW 55h i citete MOVWF PORTB.
TCY2 execut MOVWF PORTB i citete CALL SUB_1.
TCY3 execut o apelare a subprogramului CALL SUB_1, i citete instruciunea
BSF PORTA, BIT3. Pentru c instruciunea aceasta nu este aceea de care avem
nevoie, sau nu este prima instruciune a subprogramului SUB_1 a crei execuie
este urmtoarea n ordine, instruciunea trebuie citit din nou. Acesta este un bun
exemplu a unei instruciuni avnd nevoie de mai mult de un ciclu.
TCY4 ciclul instruciunii este total folosit pentru citirea primei instruciuni din
subprogram la adresa SUB_1.

34

TCY5 execut prima instruciune din subprogram SUB_1 i citete urmtoarea.


Semnificaia pinilor
PIC16F628 are un numr total de 18 pini. Cel mai adesea se gsete ntr-o
capsul de tip DIP18 dar se poate gsi de asemenea i ntr-o capsul SMD care
este mai mic ca cea DIP. DIP este prescurtarea de la Dual In Package. SMD este
prescurtarea de la Surface Mount Devices sugernd c gurile pentru pini unde s
intre acetia, nu sunt necesare n lipirea acestui tip de component.
Pinii microcontrolerului PIC16F628
au urmtoarea semnificaie:
Pin nr.1 RA2 Al doilea pin la portul
A. Nu are funcie adiional.
Pin nr.2 RA3 Al treilea pin la portul
A. Nu are funcie adiional.
Pin nr.3 RA4 Al patrulea pin la
portul
A.
TOCK1
care
funcioneaz ca timer se gsete
de asemenea la acest pin.
Pin nr.4 MCLR Reseteaz intrarea
i tensiunea de programare Vpp
a microcontrolerului.
Pin nr.5 VSS Alimentare, mas.
Pin nr.6 RB0 Pin de zero la portul B. Intrarea ntrerupere este o funcie adiional.
Pin nr.7 RB1 Primul pin la portul B. Nu are funcie adiional.
Pin nr.8 RB2 Al doilea pin la portul B. Nu are funcie adiional.
Pin nr.9 RB3 Al treilea pin la portul B. Nu are funcie adiional.
Pin nr.10 RB4 Al patrulea pin la portul B. Nu are funcie adiional.
Pin nr.11 RB5 Al cincilea pin la portul B. Nu are funcie adiional.
Pin nr.12 RB6 Al aselea pin la portul B. Linia de 'Clock' n mod programare.
Pin nr.13 RB7 Al aptelea pin la portul B. Linia 'Data' n mod programare.
Pin nr.14 Vdd Polul pozitiv al sursei.
Pin nr.15 OSC2 Pin desemnat pentru conectarea la un oscilator.
Pin nr.16 OSC1 Pin desemnat pentru conectarea la un oscilator.
Pin nr.17 RA2 Al doilea pin la portul A. Nu are funcie adiional.
Pin nr.18 RA1 Primul pin la portul A. Nu are funcie adiional.
Generator de ceas oscilator
Circuitul oscilator este folosit pentru a da microcontrolerului un ceas-clock.
Ceasul este necesar pentru ca microcontrolerul s execute programul sau
instruciunile din program.
Tipuri de oscilatoare
PIC16F628 poate lucra cu patru configuraii diferite de oscilator. Pentru c
configuraiile cu oscilator cu cristal i rezistor-condensator (RC) sunt cele utilizate cel
mai frecvent, doar pe ele le vom meniona aici. Tipul de microcontroler cu oscilator
cu cristal este desemnat ca XT, iar microcontrolerul cu perechea rezistorcondensator are desemnarea RC. Aceasta este important pentru c trebuie s
numii tipul de oscilator cnd cumprai un microcontroler.

35

Oscilatorul XT
Oscilatorul cu cristal se afl intr-o carcas metalic cu doi pini pe care este
nscris frecvena la care cristalul oscileaz. Mai este necesar cte un condensator
ceramic de 30pF cu cellalt capt la mas de a fi conectai la fiecare pin.
Oscilatorul i condensatorii pot fi ncapsulai mpreun ntr-o carcas cu trei pini. Un
asemenea element se numete rezonator ceramic i este reprezentat n scheme ca
cel de mai jos. Pinii centrali ai elementului sunt masa, iar pinii terminali sunt
conectai la pinii OSC1 i OSC2 ai microcontrolerului. Cnd se proiecteaz un
aparat, regula este s plasai oscilatorul ct mai aproape de microcontroler, pentru a
elimina orice interferen de pe liniile pe care microcontrolerul primete tactul de
ceas.

Oscilatorul RC
n aplicaiile unde nu este nevoie de o mare precizie de timp, oscilatorul RC
permite economii adiionale la cumprare. Fecvena de rezonan a oscilatorului RC
depinde de valoarea tensiunii de alimentare, rezistorul R, condensatorul C i
temperatura de lucru. Trebuie de menionat c frecvena de rezonan este de
asemenea influenat de variaiile normale ale parametrilor de proces, de tolerana
extern a componentelor R i C, etc.

36

Diagrama de mai sus arat cum este conectat oscilatorul RC la PIC16F628.


La valoarea rezistorului mai mic 2.2k, oscilatorul poate deveni instabil, sau oscilaia
se poate chiar opri. La valori mari a lui R (ex.1M) oscilatorul devine foarte sensibil la
zgomot i umezeal. Se recomand ca valoarea rezistorului R s fie ntre 3 i 100k.
Chiar dac oscilatorul va lucra fr un condensator extern (C=0pF), trebuie totui
folosit un condensator de peste 20pF pentru zgomot i stabilitate. Indiferent de ce
oscilator este folosit, pentru a obine un ceas la care s funcioneze microcontrolerul,
ceasul trebuie divizat la 4. Un ceas al oscilatorului divizat cu 4 se poate obine la
pinul OSC2/CLKOUT, i poate fi folosit pentru testarea sau sincronizarea altor
circuite logice.

Dup alimentare, oscilatorul ncepe s oscileze. Oscilaia la nceput are o


perioad i o amplitudine instabile, dar dup un timp devin stabilizate.

Pentru a preveni ca un asemenea ceas inexact s influeneze performanele


microcontrolerului, trebuie s inem microcontrolerul n starea reset pe durata
stabilizrii ceasului oscilatorului. Diagrama de mai sus arat o form tipic de
semnal pe care microcontrolerul o primete de la oscilatorul cu cuar dup
alimentare.

Reset-ul
Resetul este folosit pentru a pune microcontrolerul ntr-o condiie 'cunoscut'.
Aceasta nseamn practic c microcontrolerul poate s se comporte incorect n
unele condiii nedorite. Pentru a continua s funcioneze corect trebuie resetat,
nsemnnd c toi registrii vor fi pui ntr-o stare de start. Resetul nu este folosit
37

numai cnd microcontrolerul nu se comport cum vrem noi, dar poate de asemenea
s fie folosit cnd se ncearc un montaj ca o ntrerupere ntr-un program de
execuie sau cnd se pregtete un microcontroler de a citi un program.
Pentru a preveni ajungerea unui zero logic la pinul MCLR accidental (linia de
deasupra nseamn c resetul este activat de un zero logic), MCLR trebuie s fie
conectat printr-un rezistor la polul pozitiv al sursei de alimentare. Rezistorul trebuie
s fie ntre 5 i 10k. Acest rezistor a crui funcie este de a menine o anumit linie la
starea logic unu ca o prevenire, se numete o scoatere-pull up.

Microcontrolerul
PIC16F628 are cteva
surse de reset:
a) Reset la alimentare, POR
(Power-On Reset)
b) Reset n timpul lucrului
obinuit prin aducerea
unui
zero
logic
la
pinul
MCLR
al
microcontrolerului.
c) Reset n timpul regimului SLEEP
d) Reset la depirea timer-ului watchdog (WDT)
e) Reset n timpul depirii WDT n timpul regimului SLEEP.
Cele mai importante resurse de reset sunt a) i b). Prima are loc de fiecare dat
cnd este alimentat microcontrolerul i servete la aducerea toturor regitrilor la
starea iniial a poziiei de start. A doua este pentru a aduce un zero logic la pinul
MCLR n timpul operaiei normale a microcontrolerului. Este des folosit n
dezvoltarea de programe.
n timpul unui reset, locaiile de memorie RAM nu sunt resetate. Ele sunt
necunoscute la alimentare i nu sunt schimbate la nici un reset. Spre deosebire de
acestea, regitrii SFR sunt resetai la o stare iniial a poziiei de start. Unul din cele
mai importante efecte ale resetului este setarea contorului de program (PC) la zero
(0000h), ceea ce permite programului s nceap executarea de la prima
instruciune scris.

Resetul la scderea tensiunii de alimentare dincolo de limita


permisibil (Brown-out Reset)
Impulsul pentru resetare n timpul creterii tensiunii este generat de
microcontrolerul nsui cnd detecteaz o cretere n tensiunea Vdd (n domeniul de
la 1.2V la 1.8V). Acest impuls dureaz 72 ms ceea ce este un timp suficient pentru
oscilator ca s se stabilizeze. Aceste 72 ms sunt asigurate de un timer intern PWRT
care are oscilatorul lui RC. Microcontrolerul este n modul reset ct timp PWRT este
activ. Totui, cnd montajul funcioneaz, probleme apar cnd sursa nu scade la

38

zero ci cnd scade mai jos de limita ce garanteaz funcionarea corect a


microcontrolerului. Acesta este un caz real din practic, n special n mediile
industriale unde perturbaiile i instabilitile sursei de alimentare sunt ceva foarte
curent. Pentru a rezolva aceast problem trebuie s ne asigurm c
microcontrolerul este ntr-o stare de reset de fiecare dat cnd tensiunea sursei
scade sub limita admis.

Dac, conform cu specificaiile electrice, circuitul intern de resetare a


microcontrolerului nu poate satisface aceste cerine, se pot folosi componente
electronice speciale ce sunt capabile s genereze semnalul de reset dorit. n afar
de aceast funcie, ele pot funciona pentru supravegherea tensiunii de alimentare.
Dac tensiunea scade mai jos de nivelul specificat, un zero logic va apare la pinul
MCLR ce ine microcontrolerul n starea de reset pn ce tensiunea nu este n
limitele ce garanteaz funcionarea corect.

Unitatea de Procesare Central


Unitatea de procesare central (CPU) este creierul microcontrolerului.
Aceast parte este responsabil cu gsirea i aducerea (citirea din memorie)fetching instruciunii corecte ce trebuie executat, cu decodarea acelei instruciuni, i
n final cu executarea ei.
Unitatea
de procesare
central
conecteaz
toate
prile

39

microcontrolerului ntr-un ntreg. Desigur, funcia sa cea mai important este s


decodeze instruciunile de program. Cnd programatorul scrie un program,
instruciunile au o form clar ca MOVLW 0x20. Totui, pentru ca microcontrolerul s
neleag aceasta, aceast form de 'scrisoare' a unei instruciuni trebuie tradus
ntr-o serie de zero-uri i unu-uri ce se numete 'opcode'. Aceast tranziie de la o
scrisoare la o form binar este fcut de translatori ca translatorul assembler
(cunoscut ca i assembler sau asamblor). Instruciunea astfel adus-fetched din
memoria programului trebuie s fie decodat de unitatea de procesare central.
Putem apoi selecta din tabela tuturor instruciunilor un set de aciuni ce execut o
sarcin desemnat definit de instruciune. Pentru c instruciunile pot s conin n
ele asignri ce cer diferite transferuri de date dintr-o memorie n alta, din memorie la
porturi, sau alte calcule, CPU trebuie s fie conectat cu toate prile
microcontrolerului. Aceasta este posibil printr-un bus de date i un bus de adrese.

Unitatea de Logic Aritmetic (ALU)


Unitatea de logic aritmetic este responsabil de executarea operaiilor ca
adunarea, scderea, mutarea (la stnga sau la dreapta ntr-un registru) i de
operaiile logice. Mutarea datelor ntr-un registru se mai numete 'shifting'transferare. PIC16F628 conine o unitate logic aritmetic de 8 bii i regitri de lucru
de 8 bii.
n
instruciunile cu
doi operanzi, n
mod obinuit un
operand este n
registrul
de
lucru (registrul
W), iar cellalt
este unul din
regitri sau o
constant. Prin
operand
nelegem
coninutul
asupra
cruia
se fac unele operaii, iar un registru este oricare din regitrii GPR sau SFR. GPR
este o prescurtare de la 'General Purposes Registers'-Regitri cu Scopuri Generale,
iar SFR de la 'Special Function Registers'-Regitri cu Funcie Special. n
instruciunile cu un operand, un operand este fie registrul W fie unul din regitri. Pe
lng operaiile aritmetice i logice, ALU controleaz biii de stare (bii gsii n
registrul STATUS). Executarea unor instruciuni afecteaz biii de stare, de care

40

depinde rezultatul nsui. Depinznd de ce instruciune este executat, ALU poate


afecta valorile biilor Carry (C), Digit Carry (DC), i Zero (Z) n registrul STATUS.

Registru STATUS

bit 0 C (Carry) Transfer


Bit care este afectat de operaiile de adunare, scdere i transfer.
1= transferul produs din bitul cel mai nalt al rezultatului
0= transferul nu s-a produs

41

Bitul C este afectat de instruciunile ADDWF, ADDLW, SUBLW, SUBWF.


bit 1 DC (Digit Carry) DC Transfer
Bit afectat de operaiile de adunare, scdere i transfer. Spre deosebire de
bitul C, acest bit reprezint transferul din al patrulea loc rezultat. Este setat de
adunare cnd se ntmpl un transport de la bitul 3 la bitul 4, sau de scdere cnd
se ntmpl mprumut de la bitul 4 la bitul 3, sau de transfer n ambele direcii.
1= transfer produs la al patrulea bit conform cu ordinea, al rezultatului.
0= transferul nu s-a produs
Bitul DC este afectat de instruciunile ADDWF, ADDLW, SUBLW, SUBWF.
bit 2 Z (Zero bit) Indicarea unui rezultat zero.
Acest bit este setat cnd rezultatul unei operaii aritmetice sau logice
executate este zero.
1= rezultatul egal cu zero
0= rezultatul nu este egal cu zero
bit 3 PD (Power-down bit)
Bit ce este setat cnd microcontrolerul este alimentat atunci cnd ncepe s
funcioneze, dup fiecare reset obinuit i dup executarea instruciunii CLRWDT.
Instruciunea SLEEP l reseteaz cnd microcontrolerul intr n regimul consum/uzaj
redus. Setarea lui repetat este posibil prin reset sau prin pornirea sau oprirea
sursei. Starea poate fi triggerat de asemenea de un semnal la pinul RB0/INT, de o
schimbare la portul RB, de terminarea scrierii n EEPROM-ul de date intern, i de
watchdog de asemenea.
1= dup ce sursa a fost pornit
0= executarea instruciunii SLEEP
bit 4 TO Time-out ; depirea-overflow watchdog-ului.
Bitul este setat dup pornirea sursei i executarea instruciunilor CLRWDT i
SLEEP. Bitul este resetat cnd watchdog-ul ajunge la sfrit semnalnd c ceva nu
este n ordine.
1= depirea-oveflow nu s-a produs
0= depirea-overflow s-a produs
bit6:5 RP1:RP0 (Register Bank Select bits-Bii de Selectare a Bancului de Regitri)
Aceti doi bii sunt partea superioar a adresei la adresarea direct. Pentru
c instruciunile ce adreseaz memoria direct au doar apte bii, ei au nevoie doar
de nc un bit pentru a adresa cei 256 bytes adic ci are PIC16F84. Bitul RP1 nu
este folosit, dar este lsat pentru expansiuni viitoare ale acestui microcntroler.
01= primul banc
00= bancul zero
bit 7 IRP (Register Bank Select bit-Bit de Selectare a Bancului de Regitri)

42

Bit al crui rol este de a fi al optulea bit la adresarea indirect a RAM-ului


intern.
1= bancul 2 i 3
0= bancul 0 i 1 (de la 00h la FFh)
Registrul STATUS conine starea aritmetic ALU (C, DC, Z), starea RESET
(TO, PD) i biii pentru selectarea bancului de memorie (IRP, RP1, RP0).
Considernd c selecia bancului de memorie este controlat prin acest registru, el
trebuie s fie prezent n fiecare banc. Bancul de memorie se va discuta mai n
detaliu n capitolul Organizarea memoriei. Registrul STATUS poate fi o destinaie
pentru orice instruciune, cu oricare alt registru. Dac registrul STATUS este o
destinaie pentru instruciunile ce afecteaz biii Z, DC or C, atunci scrierea n aceti
trei bii nu este posibil.

Registrul OPTION

bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-Bit Selecie Rat Prescaler)
Aceti trei bii definesc bitul de selecie a ratei prescalerului. Ce este un
prescaler i cum pot afecta aceti bii funcionarea unui microcontroler va fi explicat
n seciunea depre TMRO.

bit 3 PSA (Prescaler Assignment bit-Bit de Asignare Prescaler)


Bit ce asigneaz prescalerul ntre TMRO i watchdog.
1= prescalerul este asignat watchdogului
0= prescalerul este asignat timer-ului liber (ree-run) TMRO
bit 4 T0SE (TMR0 Source Edge Select bit-Bit Selecie a Frontului Sursei TMR0)
Dac este permis de a se triggera TMRO prin impulsurile de la pinul
RA4/T0CKI, acest bit determin dac aceasta va fi la frontul descresctor sau
cresctor al unui semnal.
1= front cresctor
0= front descresctor

43

bit 5 TOCS (TMR0 Clock Source Select bit-Bit Selecie Surs Ceas TMR0)
Acest pin permite timerului liber (free-run) s incrementeze starea lui fie de la
oscilatorul intern la fiecare a ceasului oscilatorului, fie prin impulsuri externe la
pinul RA4/T0CKI.
1= impulsuri externe
0= ceas intern
bit 6 INTEDG (Interrupt Edge Select bit-Bit de Selecie a Frontului ntrerupere)
Dac ntreruperea este activat este posibil ca acest bit s determine frontul
la care o ntrerupere va fi activat la pinul RB0/INT.
1= front cresctor
0= front descresctor
bit 7 RBPU (PORTB Pull-up Enable bit-Bit Enable-Activare Pull-up PORTB)
Acest bit pornete i oprete rezistorii interni 'pull-up'-scoatere la portul B.
1= Rezistori oprire "pull-up"
0= Rezistori pornire "pull-up"

Porturi
Portul se refer la un grup de pini ai unui microcontroler ce pot fi accesai
simultan, sau la care putem seta combinaia dorit de zero-uri i unu-uri, sau de la
care putem citi o stare existent. Fizic, portul este un registru n interiorul unui
microcontroler ce este conectat cu fire la pinii microcontrolerului. Porturile reprezint
conexiunea fizic a Unitii de Procesare Central cu lumea exterioar.
Microcontrolerul le folosete pentru a monitoriza sau controla alte
componente sau aparate. Datorit funcionalitii, unii pini au rol dublu ca
RA4/TOCKI de exemplu, care este simultan al patrulea bit la portul A i o intrare
extern pentru contorul liber (free-run). Selecia uneia din aceste dou funcii ale
pinului se face n unul din regitrii configuraionali. O ilustraie a acesteia este al
cincilea bit T0CS n registrul OPTION. Selectnd una din funcii cealalt este
dezactivat.
Toi pinii portului pot fi definii ca intrare sau ieire, conform cu nevoile unui
montaj ce este n dezvoltare. Pentru a defini un pin ca pin de intrare sau ca pin de
ieire, trebuie scris combinaia corect de zero-uri i unu-uri n registrul TRIS. Dac
n locul potrivit este scris "1" logic n registrul TRIS, acel pin este pin de intrare, iar
dac este valabil contrariul, este un pin de ieire. Fiecare port are registrul lui TRIS.
Astfel, portul A are TRISA la adresa 85h, iar portul B are TRISB la adresa 86h.

44

PORTB
PORTB are 8 pini legai la el. Registrul adecvat pentru direcia datelor este
TRISB la adresa 86h. Setarea unui bit n registrul TRISB definete pinul portului
corespunztor ca pin de intrare, i resetarea unui bit n registrul TRISB, definete
pinul portului corespunztor ca pin de ieire. Fiecare pin la PORTB are un rezistor
slab intern pull-up (scoatere) (rezistor care definete o linie la unu logic) care poate fi
activat prin resetarea celui de-al aptelea bit RBPU n registrul OPTION. Aceti
rezistori 'pull-up' se nchid automat cnd pinul portului este configurat ca o ieire.
Cnd pornete microcontrolerul, 'pull-up'-ii sunt dezactivai.
Patru pini ai portului PORTB, RB7:RB4 pot cauza o ntrerupere, care se
ntmpl cnd starea lor se schimb de la unu logic la zero logic i invers. Numai
pinii configurai ca intrare pot cauza aceast ntrerupere s se ntmple (dac
fiecare pin RB7:RB4 este configurat ca o ieire, nu va fi generat o ntrerupere la
schimbarea strii). Aceast opiune de ntrerupere cu rezistorii 'pull-up' fac mai
uoar rezolvarea problemelor din practic, ca de exemplu o tastatur matriceal.
Dac rndurile tastaturii sunt conectate la aceti pini, fiecare apsare a unei clape
va cauza o ntrerupere. Microcontrolerul va determina care clap este apsat n
timp ce se proceseaz o ntrerupere. Nu se recomand s apelai la portul B n timp
ce se proceseaz ntreruperea.

45

Exemplul de mai sus arat cum pinii 0, 1, 2, i 3 sunt declarai ca intrare, i pinii 4, 5,
6 i 7 ca ieire.

PORTA
PORTA are 5 pini legai la el. Registrul corespunztor pentru direcia datelor
este TRISA la adresa 85h. Ca i la portul B, setarea unui bit n registrul TRISA
definete de asemenea pinul portului corespunztor ca un pin de intrare, i
resetarea unui bit n registrul TRISA definete pinul portului corespunztor ca pin de
ieire.
Al cincilea pin al portului A are funcie dual. La acel pin se afl de asemenea
o intrare extern pentru timer-ul TMRO. Una din aceste dou opiuni este aleas
prin setarea sau resetarea bitului TOCS (TMR0 Clock Source Select bit-bit de
Selecie a Sursei Ceasului TMRO). Acest pin permite timer-ului TMRO sa-i creasc
starea fie de la oscilatorul intern fie prin impulsuri externe la pinul RA4/T0CKI.

Exemplul arat cum pinii 0, 1, 2, 3, i 4 sunt declarai ca intrare iar 5, 6 i 7 ca pini


de ieire.

Organizarea memoriei
PIC16F628 are dou blocuri separate de memorie, unul pentru date i cellalt
pentru programe. Memoria EEPROM i regitrii GPR n memoria RAM constituie un
bloc, i memoria FLASH constituie un bloc de programe.
Memoria program
Memoria program a fost realizat n tehnologia FLASH ceea ce face posibil
de a programa un microcontroler de mai multe ori nainte de a fi instalat ntr-un
montaj, i chiar dup instalarea sa dac se ntmpl unele schimbri n program sau
parametri de proces. Mrimea memoriei program este de 1024 locaii cu lime de
14 bii unde locaiile zero i patru sunt rezervate pentru reset i pentru vectorul
ntrerupere.

46

Memoria de date
Memoria de date const din memoriile EEPROM i RAM. Memoria EEPROM
const din 64 de locaii de opt bii a cror coninut nu este pierdut n timpul opririi
sursei de alimentare. EEPROM-ul nu este direct adresabil, dar este accesat indirect
prin regitrii EEADR i EEDATA. Pentru c memoria EEPROM este folosit curent la
memorarea unor parametri importani (de exemplu, o temperatur dat n
regulatoarele de temperatur), exist o procedur strict de scriere n EEPROM ce
trebuie urmat pentru a preveni scrierea accidental. Memoria RAM pentru date
ocup un spaiu ntr-o hart a memoriei de la locaia 0x0C la 0x4F ceea ce
nseamn 68 de locaii. Locaiile memoriei RAM sunt de asemenea denumite regitri
GPR care este o abreviere General Purpose Registers-Regitri cu Scop General.
Regitrii GPR pot fi accesai indiferent de ce banc este selectat la un moment.

Regitri SFR
Regitri ce ocup primele 12 locaii n bancurile 0 i 1 i sunt regitri ai
funciei specializate asignat cu unele blocuri ale microcontrolerului. Acetia sunt
numii Special Function Registers-Regitri ai Funciei Speciale.

47

Bancuri de Memorie
n afar de aceast diviziune n 'lungime' a regitrilor SFR i GPR, harta
memoriei este de asemenea mprit n 'lime' (vezi harta precedent) n dou
zone numite 'bancuri'. Selectarea unuia din bancuri se face de biii RPO i RP1 n
registrul STATUS-stare.

48

Exemplu:
bcf STATUS, RP0
Instruciunea BCF terge bitul RPO (RP0=0) n registrul STATUS i astfel seteaz
bancul 0.
bsf STATUS, RP0
Instruciunea BSF seteaz bitul RPO (RP0=1) n registrul STATUS i astfel seteaz
bancul 1.
Uzual, grupurile de instruciuni care sunt adesea n uz, sunt conectate ntr-o
singur unitate ce poate fi uor apelat ntr-un program, i a crei nume are o
semnificaie clar, aa-numitul Macros-macrocomand. Cu ajutorul lor, selecia
dintre dou bancuri devine mai clar i programul mult mai elegibil.
BANK0 macro
Bcf STATUS, RP0 ;Select memory bank 0
Endm
BANK1 macro
Bsf STATUS, RP0 ;Select memory bank 1
Endm
Locaiile 0Ch - 4Fh sunt regitri cu scop general (GPR) ce sunt folosii ca memorie
RAM. Cnd sunt accesate locaiile 8Ch - CFh n Bancul 1, accesm de fapt exact
aceleai locaii n Bancul 0.
Contorul de Program
Contorul de program (PC) este un registru de 13 bii ce conine adresa
instruciunii ce se execut. Prin incrementarea sau schimbarea sa (ex. n caz de
salturi) microcontrolerul execut instruciunile de program pas-cu-pas.
Stiva
PIC16F628 are o stiv de 13 bii cu 8 nivele, sau cu alte cuvinte, un grup de
8 locaii de memorie de 13 bii lime cu funcii speciale. Rolul su de baz este de a
pstra valoarea contorului de program dup un salt din programul principal la o
adres a unui subprogram. Pentru ca un program s tie cum s se ntoarc la
punctul de unde a pornit, trebuie s napoieze valoarea contorului programului din
stiv. Cnd se mut dintr-un program ntr-un subprogram, contorul programului este
mpins n stiv (un exemplu de acesta este instruciunea CALL). Cnd se execut
instruciuni ca RETURN, RETLW sau RETFIE ce au fost executate la sfritul unui
subprogram, contorul programului a fost luat dintr-o stiv, aa ca programul s poat
continua de unde a fost oprit nainte de a fi ntrerupt. Aceste operaii de plasare ntro i luare dintr-o stiv de contor de program sunt numite PUSH i POP, i sunt
numite conform cu instruciunile similare ale unor microcontrolere mai mari.

49

Programarea n Sistem
Pentru a programa o memorie de program, microcontrolerul trebuie s fie
setat pentru un mod de lucru special prin aducerea pinului MCLR la 13.5V, iar sursa
de tensiune Vdd trebuie s fie stabilizat ntre 4.5V i 5.5V. Memoria program poate
fi programat serial folosind doi pini 'data/clock' ce trebuie s fie mai nti separai
de liniile montajului, aa ca s nu apar erori n timpul programrii.
Moduri de adresare
Locaiile de memorie RAM pot fi accesate direct sau indirect.
Adresarea Direct
Adresarea Direct se face printr-o adres de 9 bii. Aceast adres este
obinut prin conectarea celui de-al aptelea bit al adresei directe a unei instruciuni
cu doi bii (RP1, RP0) din registrul STATUS dup cum se arat n figura urmtoarea.
Orice acces la regitrii SFR poate fi un exemplu de adresare direct.
Bsf STATUS, RP0 ;Bankl
movlw 0xFF
;w=0xFF
movwf TRISA ;address of TRISA register is taken from
;instruction movwf

Adresarea Indirect
Adresarea indirect spre deosebire de cea direct nu ia o adres dintr-o
instruciune ci o creeaz cu ajutorul bitului IRP a regitrilor STATUS i FSR. Locaia
adresat este accesat prin registrul INDF care de fapt ine o adres indicat de un
FSR. Cu alte cuvinte, orice instruciune care folosete INDF ca registrul al ei, n
realitate acceseaz datele indicate de un registru FSR. S spunem, de exemplu, c
un registru cu scop general (GPR) la adresa 0Fh conine o valoarea 20. Prin
50

scrierea unei valori 0Fh n registrul FSR vom obine un registru indicator la adresa
0Fh, iar prin citirea din registrul INDF, vom obine valoarea 20, ceea ce nseamn c
am citit din primul registru valoarea lui fr accesarea lui direct (dar prin FSR i
INDF). Se pare c acest tip de adresare nu are nici un avantaj fa de adresarea
direct, dar exist unele nevoi n timpul programrii ce se pot rezolva mai simplu
doar prin adresarea indirect.

Un asemenea exemplu poate trimite un set de date prin comunicaia serial,


lucrnd cu bufere i indicatoare (ce vor fi discutate n continuare ntr-un capitol cu
exemple), sau s tearg o parte a memoriei RAM (16 locaii) ca n urmtorul
exemplu.

Citind datele din registrul INDF cnd coninutul registrului FSR este egal cu
zero, ntoarce valoarea zero, i scrie n el rezultatul n operaia NOP (no operationnu opereaz).

51

ntreruperi
ntreruperile sunt un mecanism a unui microcontroler ce i permit s rspund
la unele evenimente la momentul cnd se ntmpl, indiferent de ce face atunci
microcontrolerul. Aceasta este o parte foarte important, pentru c permite
conexiunea microcontrolerului cu lumea de afar. n general, fiecare ntrerupere
schimb debitul programului, l ntrerupe i dup executarea unui subprogram (rutine
de

ntrerupere), continu din acelai punct.


Registrul de control al unei ntreruperi se numete INTCON i se gsete la
adresa 0Bh. Rolul lui este de a permite sau interzice cererile de ntreruperi, i n caz
c nu sunt permise, nregistreaz cererile de ntrerupere singulare prin biii lui.
Registru INTCON
bit 0 RBIF
(RB
Port
Change
Interrupt Flag
bit-bit
Stegule de

52

ntrerupere a Schimbrii Portului RB) Bit ce informeaz despre schimbrile de la


pinii 4, 5, 6 i 7 ai portului B.
1=cel puin un pin i-a schimbat starea
0=nu s-a ntmplat nici o schimbare la vreun pin
bit 1 INTF (INT External Interrupt Flag bit-bit Stegule de ntrerupere Extern INT) A
avut loc o ntrerupere extern.
1=a avut loc o ntrerupere
0=nu a avut loc o ntrerupere
Dac s-a detectat un front cresctor sau descresctor la pinul RB0/INT, (ce
este definit cu bitul INTEDG n registrul OPTION), bitul INTF este setat. Bitul trebuie
s fie ters n subprogramul ntrerupere pentru a detecta urmtoarea ntrerupere.
bit 2 T0IF (TMR0 Overflow Interrupt Flag bit-bit Stegule Depire ntrerupere
TMRO)
Depirea contorului TMRO.
1=contorul i-a schimbat starea de la FFh la 00h.
0=depirea nu a avut loc
Bitul trebuie s fie ters n program pentru ca o ntrerupere s fie detectat.
bit 3 RBIE (RB port change Interrupt Enable bit-bit Permite ntreruperea schimbrii
portului RB) Permite s aib loc ntreruperi la schimbarea strii pinilor 4, 5, 6, i 7 ai
portului B.
1=permite ntreruperi la schimbarea strii
0=ntreruperi interzise la schimbarea strii
Dac RBIE i RBIF au fost simultan setate, va avea loc o ntrerupere.
bit 4 INTE (INT External Interrupt Enable bit-bit Permite ntrerupere extern INT) Bit
ce permite ntreruperea extern de la pinul RB0/INT.
1=ntrerupere extern permis
0=ntrerupere extern interzis
Dac INTE i INTF au fost setate simultan, va avea loc o ntrerupere.
bit 5 T0IE (TMR0 Overflow Interrupt Enable bit-bit Permite Depire ntrerupere
TMRO) Bit ce permite ntreruperile n timpul depirii contorului TMRO.
1=ntrerupere permis
0=ntrerupere interzis
Dac T0IE i T0IF au fost simultan setate, va avea loc ntreruperea.
bit 6 EEIE (EEPROM Write Complete Interrupt Enable bit-bit Permite ntrerupere
Complet a Scrierii EEPROM) Bit ce permite o ntrerupere la sfritul unei rutine de
scriere n EEPROM
1= ntrerupere permis
0= ntrerupere interzis
Dac EEIE i EEIF (ce este n registrul EECON1) au fost simultan setate, va avea
loc o ntrerupere.

53

bit 7 GIE (Global Interrupt Enable bit-bit Permite ntrerupere Global) Bit ce permite
sau interzice toate ntreruperile.
1=toate ntreruperile sunt permise
0=toate ntreruperile sunt interzise
PIC16F84 are patru surse de ntrerupere:
1. Terminarea scrierii datelor n EEPROM
2. ntrerupere TMR0 cauzat de depirea timer-ului
3. ntrerupere n timpul schimbrii la pinii RB4, RB5, RB6 i RB7 ai portului B.
4. ntrerupere Extern de la pinul RB0/INT al microcontrolerului
n general, fiecare surs de ntrerupere are doi bii legai la ea. Unul permite
ntreruperea, iar cellalt detecteaz cnd au loc ntreruperi. Exist un bit comun
numit GIE ce poate fi folosit pentru a interzice sau permite toate ntreruperile
simultan. Acest bit este foarte folositor cnd se scrie un program pentru c permite
ca toate ntreruperile s fie interzise pentru o perioad de timp, aa ca execuia unei
pri importante a programului s nu fie ntrerupt. Cnd instruciunea ce reseteaz
bitul GIE a fost executat (GIE=0, toate ntreruperile interzise), fiecare ntrerupere ce
rmne nerezolvat trebuie ignorat.

ntreruperile ce rmn nerezolvate i ce au fost ignorate, sunt procesate cnd


bitul GIE (GIE=1, toate ntreruperile sunt permise) va fi ters. Cnd i s-a rspuns
ntreruperii, bitul GIE a fost ters, aa c orice ntreruperi adiionale vor fi interzise,
adresa de ntoarcere a fost trimis n stiv, iar adresa 0004h a fost scris n contorul
programului numai dup aceasta ncepe rspunsul la o ntrerupere! Dup ce este
procesat ntreruperea, bitul a crui setare a cauzat o ntrerupere trebuie ters, sau
rutina de ntrerupere va fi procesat automat tot mereu n timpul ntoarcerii la
programul principal.
Pstrarea coninutului regitrilor importani

54

Doar valoarea de ntoarcere a contorului programului este nmagazinat ntro stiv n timpul unei ntreruperi (prin valoare de ntoarcere a contorului programului
nelegem adresa instruciunii ce trebuie executat, dar nu a fost executat pentru c
a avut loc ntreruperea). Pstrnd doar valoarea contorului programului adesea nu
este suficient. Unii regitri ce sunt n uz n programul principal pot fi de asemenea n
uz n rutina de ntrerupere. Dac ei nu sunt reinui, programul principal va obine
valori complet diferite n acei regitri n timpul ntoarcerii dintr-o rutin de ntrerupere,
ceea ce va cauza erori n program. Un exemplu de asemenea caz este coninutul
registrului de lucru W. Dac presupunem c programul principal a folosit registrul de
lucru W pentru unele din operaiile sale, i c a pstrat n el o valoare ce este
important pentru urmtoarea instruciune, atunci o ntrerupere ce se va ntmpla
nainte de acea instruciune va schimba valoarea registrului de lucru W, ce va
influena direct programul principal.
Procedura de nregistrare de regitri importani nainte de a merge la o rutin
de ntrerupere se numete PUSH, n timp ce procedura ce aduce valorile
nregistrate napoi, se numete POP. PUSH i POP sunt instruciuni ale altor
microcontrolere (Intel), dar sunt att de larg acceptate c o ntreag operaie este
numit dup ele. PIC16F84 nu are instruciuni ca PUSH i POP, i ele trebuie s fie
programate.

55

Datorit simplitii i folosirii frecvente, aceste pri ale programului pot fi


fcute ca macro-uri. Conceptul unui Macro este explicat n "Limbaj de asamblare
program". n urmtorul exemplu, coninuturile regitrilor W i STATUS sunt
memorate n variabilele W_TEMP i STATUS_TEMP nainte de rutina de
ntrerupere. La nceputul rutinei PUSH trebuie s verificm bancul selectat n
prezent pentru c W_TEMP and STATUS_TEMP nu se gsesc n bancul 0. Pentru
schimbul de date ntre aceti regitri, instruciunea SWAPF se folosete n loc de
MOVF pentru c nu afecteaz starea biilor registrului STATUS.
Exemplul este un program asamblor pentru urmtorii pai :
1. Testarea bancului curent
2. Stocarea registrului W indiferent de bancul curent
3. Stocarea registrul STATUS n bancul 0
4. Executarea rutinei de ntrerupere pentru procesul de ntrerupere (ISR)
5. Restaureaz registrul STATUS
6. Restaureaz registrul W
Dac mai sunt i alte variabile sau regitri ce trebuie stocai, atunci ei trebuie s fie
pstrai dup stocarea registrului STATUS (pasul 3), i adui napoi nainte ca
registrul STATUS s fie restaurat (pasul 5).

56

Acelai exemplu se poate realiza utiliznd macro-uri, fcnd astfel programul


mai eligibil. Macro-urile ce sunt deja definite, pot fi folosite pentru scrierea de noi
macro-uri. Macro-urile BANK1 i BANK0 ce sunt explicate n capitolul "Organizarea
memoriei" sunt folosite cu macro-urile 'push' i 'pop'.

ntrerupere extern la pinul RB0/INT al microcontrolerului


ntreruperea extern la pinul RB0/INT este triggerat de frontul cresctor
(dac bitul INTEDG=1 n registrul OPTION<6>), sau de frontul descresctor (dac
INTEDG=0). Cnd apare semnalul corect la pinul INT, bitul INTF este setat la
registrul INTCON. Bitul INTF (INTCON<1>) trebuie resetat n rutina de ntrerupere,
aa ca ntreruperea s nu aib loc din nou n timpul ntoarcerii la programul
principal. Acesta este un pas important al programului pe care programatorul nu
trebuie s-l uite, sau programul va merge constant n rutina de ntrerupere.
ntreruperea poate fi nchis prin resetarea bitului de control INTE (INTCON<4>).
ntreruperea n timpul depirii contorului TMRO
Depirea contorului TMRO (de la FFh la 00h) va seta bitul T0IF
(INTCON<2>). Aceasta este o ntrerupere foarte important pentru c multe
probleme reale se por rezolva folosind aceast ntrerupere. Unul din exemple este
msurarea timpului. Dac tim ct timp are nevoie contorul pentru a completa un
ciclu de la 00h to FFh, atunci numrul de ntreruperi nmulit cu acea durat de timp
va da timpul total scurs. n rutina de ntrerupere unele variabile vor fi incrementate n
memoria RAM, valoarea acelei variabile nmulite cu timpul de care are nevoie

57

contorul pentru a contoriza ntr-un ciclu ntreg, va da timpul total scurs. ntreruperea
poate fi pornit/oprit prin setarea/resetarea bitului T0IE (INTCON<5>).
ntrerupere pe timpul unei schimbri la pinii 4, 5, 6 i 7 ai portului B
Schimbarea semnalului de intrare la PORTB <7:4> seteaz bitul RBIF
(INTCON<0>). Patru pini RB7, RB6, RB5 i RB4 ai portului B, pot triggera o
ntrerupere ce are loc cnd starea la ei se schimb de la unu la zero logic, sau
viceversa. Pentru ca pinii s fie sensibili la aceast schimbare, trebuie definii ca
intrare. Dac oricare din ei este definit ca ieire, ntreruperea nu va fi generat la
schimbarea strii. Dac ei sunt definii ca intrare, starea lor curent este comparat
cu vechea valoare ce a fost stocat la ultima citire de la portul B. ntreruperea poate
fi pornit/oprit prin setarea/resetarea bitului RBIE n registrul INTCON.
ntreruperea la terminarea subrutinei write n EEPROM
Aceast ntrerupere este doar de natur practic. Pentru c scrierea ntr-o
locaie EEPROM dureaz cam 10ms (care este o durat lung n termenii
microcontrolerului), nu este rentabil de a atepta pn la capt scrierea. Este
adugat astfel mecanismul de ntrerupere ceea ce permite microcontrolerului s
continue executarea programului principal, n timp ce scrierea n EEPROM este
fcut n plan secundar. Cnd scrierea este terminat, ntreruperea informeaz
microcontrolerul c scrierea s-a terminat. Bitul EEIF, prin care se face aceast
informare, se gsete n registrul EECON1. Producerea unei ntreruperi poate fi
interzis prin resetarea bitului EEIE n registrul INTCON.
Iniializarea ntreruperii
Pentru a folosi un mecanism de ntrerupere a unui microcontroler, trebuie
fcute unele sarcini pregtitoare. Aceste proceduri sunt pe scurt numite "iniializare".
Prin iniializare definim la ce va rspunde microcontrolerul, i ce va ignora. Dac nu
setm bitul ce permite o anumit ntrerupere, programul nu va executa un
subprogram ntrerupere. Prin aceasta putem obine controlul asupra producerii
ntreruperii, ceea ce este foarte folositor.

Exemplul de mai sus arat iniializarea unei ntreruperi externe la pinul RB0 al
microcontrolerului. Unde se vede unu setat, nseamn c ntreruperea este permis.
Producerea altor ntreruperi nu este permis, i toate ntreruperile mpreun sunt
interzise pn ce bitul GIE este inut n unu.

58

Urmtorul exemplu arat o cale tipic de a dirija ntreruperile. PIC16F628 are


doar o locaie unde adresa unui subprogram ntrerupere este memorat. Aceasta
nseamn c mai nti trebuie s detectm ce ntrerupere este la ndemn (dac
mai mult de o surs de ntreruperi este disponibil), i apoi putem executa acea
parte a programului ce se refer la acea ntrerupere.

Rentoarcerea dintr-o rutin de ntrerupere poate fi fcut cu instruciunile RETURN,


RETLW i RETFIE. Se recomand ca s fie utilizat instruciunea RETFIE pentru c
acea instruciune este singura ce seteaz automat bitul GIE, ceea ce permite s se
produc o nou ntrerupere.
Timer-ul liber TMR0
Timer-ele (temporizatoarele) sunt de obicei cele mai complicate pri ale unui
microcontroler, aa c este necesar s rezervm mai mult timp pentru a le explica.
Odat cu aplicarea lor este posibil s se creeze relaii ntre o dimensiune real ca

59

"timp" i o variabil ce reprezint starea timer-ului ntr-un microcontroler. Fizic, timerul este un registru a crui valoare crete continuu pn la 255, i apoi pornete de la
capt: 0, 1, 2, 3, 4...255....0,1, 2, 3......etc.

Aceast incrementare se face n fundalul a tot ceea ce face un


microcontroler. Depinde de programator "s gseasc o cale" de cum s profite de
aceast caracteristic pentru nevoile lui. Una din ci este s creasc o variabil la
fiecare depire a timer-ului. Dac tim ct timp are nevoie timer-ul s fac o rund
complet, atunci nmulind valoarea variabilei cu acel timp obinem timpul total
scurs.
PIC16F628 are un timer de 8 bii. Numrul de bii determin pn la ce
valoare contorizeaz timer-ul nainte de a ncepe s contorizeze de la zero din nou.
n cazul unui timer de 8 bii, acel numr este 256. O schem simplificat a relaiei
dintre un timer i un prescaler-divizor este reprezentat n diagrama anterioar.
Prescalerul este numele acelei pri din microcontroler ce divide ceasul oscilatorului
nainte de a ajunge la logica ce crete starea timer-ului. Numrul ce divide un ceas
este definit prin trei bii n registrul OPTION. Cel mai mare divizor este 256. Aceasta
nseamn de fapt c doar la al fiecare 256-lea ceas, valoarea timer-ului va crete cu
unu. Aceasta ne d posibilitatea de a msura perioade de timp mai lungi.
60

Dup fiecare numrtoare pn la 255, timer-ul i reseteaz valoarea la zero


i ncepe cu un nou ciclu de contorizare pn la 255. n timpul fiecrei tranziii de la
255 la zero, bitul TOIF n registrul INTCON este setat. Dac se permit ntreruperi, de
aceasta se poate profita n generarea i n procesarea rutinei de ntrerupere.
Depinde de programator s reseteze bitul TOIF n rutina de ntrerupere, aa ca noua
ntrerupere, sau noua depire s fie detectate. n afar de ceasul oscilator intern,
starea timer-ului poate de asemenea s creasc prin ceasul extern la pinul
RA4/TOCKI. Alegerea uneia din aceste dou opiuni se face n registrul OPTION
prin bitul TOCS. Dac a fost aleas aceast opiune de ceas extern, va fi posibil s
se defineasc frontul unui semnal (cresctor sau descresctor), la care timer-ul s-i
creasc valoarea.

61

Folosirea frecventmetrului pentru determinarea numrului de rotaii ale


axei unei maini

n practic, unul din exemplele tipice ce este rezolvat prin ceas extern i unde
timer-ul contorizeaz rotaiile complete ale unui ax al unei maini de producie, ca
bobinatorul de transformator de exemplu. S rotim patru uruburi de metal pe axul
unui bobinator. Aceste patru uruburi vor reprezenta convexitatea metalic. S
plasm acum un senzor inductiv la o distan de 5 mm de captul unui urub.
Senzorul inductiv va genera semnalul descresctor de fiecare dat cnd capul
urubului este paralel cu capul senzorului. Fiecare semnal va reprezenta o ptrime
dintr-o rotaie, i suma tuturor rotaiilor se va gsi n timer-ul TMRO. Programul
poate uor citi aceste date din timer printr-un bus de date.

62

Urmtorul exemplu ilustreaz cum s se iniializeze timer-ul la fronturile


descresctoare ale semnalului din sursa extern cu un prescaler 1:4. Timer-ul
lucreaz n mod "polig-mpingere".

Acelai exemplu poate fi realizat printr-o ntrerupere n modul urmtor:

Prescalerul poate fi asignat fie de timer-ul TMRO fie de watchdog.


Watchdogul este un mecanism pe care microcontrolerul l folosete s se apere
mpotriva blocrii programelor. Ca orice alt circuit electric, la fel i cu
microcontrolerul se pot ntmpla defectri, sau unele stricciuni. Din nefericire
microcontrolerul are de asemenea un program unde se pot ntmpla probleme.
Cnd se ntmpl aceasta, microcontrolerul se va opri din funcionare i va rmne
n acea stare pn ce cineva l reseteaz. Din cauza aceasta, a fost introdus
mecanismul watchdog. Dup o anumit perioad de timp, watchdogul reseteaz

63

microcontrolerul (de fapt microcontrolerul se reseteaz singur). Watchdogul luceaz


pe baza unui principiu simplu: dac se ntmpl depirea timer-ului,
microcontrolerul este resetat, i ncepe executarea programului mereu din nou.
Astfel, se va ntmpla un reset att n cazul unei funcionri corecte ct i incorecte.
Urmtorul pas este prevenirea resetului n cazul unei funcionri corecte, ce se face
prin scrierea unui zero n registrul WDT (instruciunea CLRWDT) de fiecare dat
cnd se apropie de depire. Astfel programul va preveni un reset ct timp este
executat corect. De ndat ce s-a blocat, nu se va scrie zero, va avea loc depirea
timer-ului WDT i un reset ce va duce microcontrolerul napoi la funcionarea corect
din nou.
Prescalerul este acordat cu timer-ul TMRO, sau cu timer-ul watchdogului prin
bitul PSA n registrul OPTION. tergnd bitul PSA, prescalerul va fi acordat cu timerul TMRO. Cnd prescalerul este acordat cu timer-ul TMRO, toate instruciunile de
scriere n registrul TMRO (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vor terge
prescalerul. Cnd prescalerul este asignat timerului watchdog, numai instruciunea
CLRWDT va terge prescalerul i timer-ul watchdog n acelai timp. Schimbarea
prescalerului este complet sub controlul programatorului, i poate fi schimbat n
timp ce se ruleaz programul.
Registrul control OPTION

bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-bit Selectare Rat Prescaler)
Subiectul prescaler, i cum afecteaz aceti bii lucrul unui microcontroler va fi
abordat n seciunea despre TMRO.

bit 3 PSA (Prescaler Assignment bit-bit Asignare Prescaler)


Bit ce asigneaz prescalerul ntre TMRO i timer-ul watchdog).
1=prescalerul este asignat la timer-ul watchdog
0=prescalerul este asignat la timer-ul free-liber
bit 4 T0SE (TMR0 Source Edge Select bit-bit Selectare Front Surs TMRO)
Dac triggerul TMRO a fost activat cu impulsuri de la pinul RA4/T0CKI, acest bit va
determina dac va fi la frontul cresctor sau descresctor al semnalului.
1=front descresctor
0=front cresctor
64

bit 5 T0CS (TMR0 Clock Source Select bit-bit Selectare Surs Ceas TMRO)
Acest bit permite unui timer free-run s-i incrementeze valoarea fie de la oscilatorul
intern, de exemplu din ceasul oscilatorului, sau prin impulsuri externe la pinul
RA4/T0CKI.
1=impulsuri externe
0=1/4 ceas intern
bit 6 INTEDG (Interrupt Edge Select bit-bit Selectare Front ntreruperi)
Dac a fost permis producerea de ntreruperi, acest bit va determina la ce front va
avea loc ntreruperea la pinul RB0/INT.
1=front cresctor
0=front descresctor
bit 7 RBPU (PORTB Pull-up Enable bit-bit Permite Pull-up-tragerea PORTB)
Acest bit deschide sau nchide rezistorii interni la portul B.
1=rezistorii 'pull-up' deschii
0=rezistorii 'pull-up' nchii
Memoria de date EEPROM
PIC16F628 are 64 de bytes de locaii de memorie EEPROM la adresele de la
00h la 63h unde se poate scrie sau de unde se poate citi. Cea mai important
caracteristic a acestei memorii este c nu pierde coninutul n timpul nchideri
sursei de alimentare. Aceasta nseamn practic c ceea ce a fost scris n ea va
rmne chiar i cnd microcontrolerul este nchis. Datele pot fi reinute n EEPROM
fr sursa de alimentare pn la 40 de ani. (dup cum declar productorul lui
PICD16F628), i se pot executa 10000 de cicluri de scriere.
n practic, memoria EEPROM este folosit pentru stocarea unor date
importante sau a unor parametri de proces.
Un asemenea parametru este o temperatur dat, asignat cnd se seteaz
un regulator de temperatur la un proces. Dac nu s-a reinut, va fi nevoie s se
ajusteze temperatura dat dup fiecare ntrerupere a alimentrii. Pentru c aceasta
este foarte nepractic (chiar periculos), productorii de microntrolere au nceput s
instaleze un tip mai mic de memorie
EEPROM
Memoria EEPROM este plasat ntr-un loc special al memoriei i poate fi accesat
prin regitri speciali. Aceti regitri sunt:
EEDATA la adresa 08h, care reine datele de citit sau cele de scris.
EEADR la adresa 09h, ce conine o adres a locaiei EEPROM ce este
accesat.
EECON1 la adresa 88h, ce conine bii de control.

65

EECON2 la adresa 89h. Acest registru nu exist fizic i servete la


protejarea EEPROM-ului de scrieri accidentale.
Registrul EECON1 la adresa 88h este un registru de control cu 5 bii
implementai.
Biii 5, 6 i 7 nu sunt folosii, i prin citire sunt totdeauna zero. Interpretarea biilor
registrului EECON1 urmeaz.

Registrul EECON1

bit 0 RD (Read Control bit-bit Control Citire)


Setarea acestui bit iniializeaz transferul de date definit n EEADR la registrul
EEDATA. Pentru c timpul nu este esenial n citirea datelor ca la scriere, datele din
EEDATA pot fi deja folosite n urmtoarea instruciune.
1=initializeaz citirea
0=nu iniializeaz citirea
bit 1 WR (Write Control bit-bit Control Scriere)
Setarea acestui bit iniializeaz scrierea datelor din registrul EEDATA la adresa
specifcat prin registrul EEADR.
1=initializeaz scrierea
0=nu iniializeaz scrierea
bit 2 WREN (EEPROM Write Enable bit-bit Permite Scrierea EEPROM) Permite
scrierea n EEPROM
Dac acest bit nu a fost setat, microcontrolerul nu va permite scrierea n EEPROM.
1=scriere permis
0=scriere interzis
bit 3 WRERR (Write EEPROM Error Flag-Stegule Eroare Scriere EEPROM ) Eroare
n timpul scrierii n EEPROM
Acest bit a fost setat doar n caz c scrierea n EEPROM a fost intrerupt de un
semnal sau prin terminarea timpului din timer-ul watchdog (dac este activat).
1=a avut loc eroare
0=nu a avut loc eroare
bit 4 EEIF (EEPROM Write Operation Interrupt Flag bit-bit Stegule ntrerupere
Operaie Scriere EEPROM) Bit folosit pentru a informa c scrierea datelor s-a
terminat.
66

Cnd s-a terminat scrierea, acest bit va fi setat automat. Programtorul trebuie s
tearg bitul EEIF n programul su pentru a detecta noua terminare a scrierii.
1=scrierea terminat
0=scrierea nc neterminat, sau nc nu a nceput
Citirea din memoria EEPROM
Setarea bitului RD iniializeaz transferul de date de la adresa gsit n EEADR la
registrul EEDATA. Ca i la citirea datelor nu avem nevoie de att de mult timp ca la
scriere, datele luate din registrul EEDATA pot deja fi folosite mai departe n
urmtoarea instruciune.
O mostr a prii programului ce citete datele n EEPROM, ar putea arta ca mai
jos:

Dup ultima instruciune de program, coninutul de la o adres EEPROM zero


poate fi gsit n registrul w.
Scrierea n memoria EEPROM
Pentru a scrie datele n locaia EEPROM, programatorul trebuie mai nti s
scrie adresa n registrul EEADR i datele n registrul EEDATA. Numai atunci este
folositor de a seta bitul WR ce pune totul n micare. Bitul WR va fi resetat, i bitul
EEIF setat urmnd o scriere ce poate fi folosit n procesarea ntreruperilor. Valorile
55h i AAh sunt prima i a doua cheie care interzic ca scrierea accidental n
EEPROM s se ntmple. Aceste dou valori sunt scrise n EECON2 care servete
doar pentru acel scop, de a primi aceste dou valori i de a preveni orice scriere
accidental n memoria EEPROM. Liniile de program marcate ca 1, 2, 3 i 4 trebuie
s fie executate n acea ordine n intervale egale de timp. De aceea este foarte
important, s nchidei ntreruperile ce ar putea schimba timpul necesar pentru
executare instruciunilor. Dup scriere, ntreruperile, pot fi permise din nou.
Exemplu unei pri a programului ce scrie datele 0xEE n prima locaie n memoria
EEPROM ar putea arta ca mai jos:

67

Este recomandat ca WREN s fie nchis tot timpul cu excepia scrierii datelor n
EEPROM, aa c posibilitatea unei scrieri accidentale va fi minim. Scrierea n
EEPROM va fi automat tears!

Set de Instruciuni n Familia Microcontrolerului PIC16Fxx


Setul complet care cuprinde 35 de instruciuni este dat n tabela urmtoare.
Un motiv pentru un numr aa de mic de instruciuni st n primul rnd n faptul c
discutm despre un microcontroler RISC ale crui instruciuni sunt bine optimizate
avnd n vedere viteza de lucru, simplitatea arhitectural i compactitatea codului.
Singurul neajuns este c programatorul trebuie s controleze o tehnic
"neconfortabil" n a utiliza un set modest de 35 de instruciuni.
Transfer de Date
Transferul de date ntr-un microcontroler este fcut ntre registrul de lucru (W)
i un registru 'f' ce reprezint orice locaie n RAM-ul intern (indiferent dac acetia
sunt regitri speciali sau de scop general).
Primele trei instruciuni (a se vedea urmtorul tabel) fac ca o constant s fie
nscris n registrul W (MOVLW este prescurtarea pentru MOVe Literal to W), i ca
datele s fie copiate din registrul W n RAM i datele din RAM s fie copiate n
registrul W (sau n aceeai locaie RAM, la care punct numai starea steguleului Z se
schimb). Instruciunea CLRF scrie constanta 0 n registrul 'f ', iar CLRW scrie
constanta 0 n registrul W. Instruciunea SWAPF schimb locurile cmpului de
nibbles- buci de 4 bii n interiorul unui registru.

68

Aritmetic i logic
Din toate operaiile aritmetice, PIC ca majoritatea microcontrolerelor, accept
doar scderea i adunarea. Steguleele C, DC i Z sunt setate funcie de rezultatul
adunrii sau scderii, dar cu o excepie: pentru c scderea se face ca o adunare a
unei valori negative, eticheta C este invers urmnd scderii. Cu alte cuvinte, este
setat dac operaia este posibil, i este resetat dac un numr mai mare a fost
sczut din unul mai mic.
Unitatea logic a PIC-ului are capabilitatea de a face operaiile AND (I), OR (SAU),
EX-OR (SAU-EXCLUSIV), complementare (COMF) i rotaie (RLF i RRF).
Instruciunile ce rotesc coninutul registrului mut biii n interiorul registrului prin
eticheta C cu un spaiu la stnga (ctre bitul 7), sau la dreapta (ctre bitul 0). Bitul ce
"iese" din registru este scris n steguleul C, i valoarea steguleului C este scris
ntr-un bit al "prii opuse" a registrului.
Operaii cu bii
Instruciunile BCF i BSF fac setarea sau tergerea unui singur bit oriunde n
memorie. Chiar dac pare o simpl operaie, este executat n aa fel ca CPU
citete mai nti ntregul byte, schimb un bit n el i apoi scrie ntregul byte n
acelai loc.
Direcionarea debitului unui program
Instruciunile GOTO, CALL i RETURN sunt executate n acelai fel ca i n
celelalte microcontrolere, numai stiva este independent de RAM-ul intern i limitat
la opt nivele.
Instruciunea 'RETLW k' este identic cu instruciunea RETURN, cu excepia
c nainte de a se ntoarce dintr-un subprogram, constanta definit operandul de
instruciuni este scris n registrul W. Aceast instruciune ne permite s proiectm
uor tabelele (listele) Look-up. Cel mai mult le folosim la determinarea poziiei
datelor n tabelul nostru adugnd-o la adresa la care ncep tabelele, i apoi citim
datele din acea locaie (care este uzual gsit n memoria program).
Tabelul poate fi format ca un subprogram ce const dintr-o serie de instruciuni
'RETLW k', unde constantele 'k' sunt membri ai tabelului.

69

Scriem poziia unui membru al tabelului nostru n registrul W, i folosind


instruciunea CALL apelm un subprogram care creaz tabelul. Prima linie de
subprogram ADDWF PCL, f adaug poziia unui membru al registrului W la adresa
de start a tabelului nostru, gsit n registrul PCL, i astfel obinem adresa datelor
reale n memoria program. Cnd ne ntoarcem dintr-un subprogram vom avea n
registrul W coninutul unui membru al tabelului adresat. n exemplul anterior,
constanta 'k2' va fi n registrul W urmnd unei ntoarceri dintr-un subprogram.
RETFIE (RETurn From Interrupt - Interrupt Enable) este o ntoarcere dintr-o rutin
de ntrerupere i difer de o RETURN numai n aceea c seteaz automat bitul GIE
(Global Interrupt Enable). La o ntrerupere, acest bit este automat ters. Cnd
ncepe ntreruperea, numai valoarea contorului de program este pus n vrful stivei.
Nu este prevzut memorarea automat a valorilor i strii registrului.
Jump-urile (salturile) condiionale sunt sintetizate n dou instruciuni: BTFSC i
BTFSS. Funcie de starea bitului n registrul 'f' ce este testat, instruciunile sar sau
nu peste instruciunea de program urmtoare.
Perioada de Execuie a Instruciunii
Toate instruciunile sunt executate ntr-un ciclu cu excepia instruciunilor
ramur condiionale dac condiia a fost adevrat, sau dac coninutul contorului
de program a fost schimbat de o anumit instruciune. n acest caz, execuia cere
dou cicluri de instruciuni, iar al doilea ciclu este executat ca NOP (No OperationFr operaii). Patru clock-uri oscilator fac un ciclu instruciune. Dac folosim un
oscilator cu frecvena de 4 MHz, timpul normal pentru execuia instruciunii este 1
s, i n caz de branching-ramificare condiional, perioada de execuie este 2 s.
List de cuvinte
f
orice locaie de memorie ntr-un microcontroler
W registru de lucru
b
poziie bit n registru 'f'
d
bit destinaie
label grup de opt caractere ce marcheaz nceputul unei pri de program
TOS vrful stivei
[]
opiune
<> poziie bit n registru

70

*1 Dac portul I/O este operand surs, este citit starea pinilor microcontrolerului
*2 Dac aceast instruciune este executat n registrul TMRO i dac d=1,
prescaler-ul asignat acelui timer va fi automat ters
*3 Dac PC s-a modificat, sau rezultatul testului =1, instruciunea s-a executat n
dou cicluri
Abilitatea de a comunica este de mare importan n orice domeniu. Totui,
este posibil numai dac amndoi partenerii de comunicare cunosc acelai limbaj,
sau urmresc aceleai reguli n timpul comunicrii. Folosind aceste principii ca un
punct de plecare, putem de asemenea defini comunicarea ce are loc ntre
microcontrolere i om. Limbajul pe care microcontrolerul i omul l folosesc pentru a
comunica este numit "limbaj de asamblare". Titlul nsui nu are un neles deosebit,
71

i este analog numelor altor limbaje, de ex. engleza i franceza. Mai precis, "limbajul
de asamblare" este doar o soluie trectoare. Programele scrise n limbaj de
asamblare trebuie traduse ntr-un "limbaj de zero-uri i unu-uri" pentru ca un
microcontroler s-l neleag. "Limbajul de asamblare" i "assembler-ul" sau
asamblorul sunt dou noiuni diferite. Primul reprezint un set de reguli folosite n
scrierea unui program pentru un microcontroler, iar cellalt este un program n
computerul personal care traduce limbajul de asamblare ntr-un limbaj de zero-uri i
unu-uri. Un program ce este tradus n "zero-uri" i "unu-uri" este numit "limbaj
main".

Fizic, "Program" reprezint un fiier pe discul computerului (sau n memorie


dac este citit ntr-un microcontroler), i este scris conform cu regulile de asamblare
sau ale altui limbaj pentru programarea microcontrolerului. Omul poate nelege
pentru c este constituit din semne i cuvinte ale alfabetului. Cnd se scrie un
program, trebuie urmrite unele reguli pentru a se obine un efect dorit.
Un Translator interpreteaz fiecare instruciune scris n limbajul de
asamblare ca o serie de zero-uri i unu-uri ce au o semnificaie pentru logica intern
a microcontrolerului.
S lum de exemplu instruciunea "RETURN" pe care microcontrolerul o folosete
pentru a se ntoarce dintr-un sub-program.
Cnd asamblorul l traduce, obinem o serie de zero-uri i unu-uri pe care
microcontroleul tie cum s-l interpreteze.
Exemplu: RETURN 00 0000 0000 1000
Similar propoziiei de mai sus, fiecare instruciune de asamblare este
interpretat ca i corespunznd unei serii de zero-uri i unu-uri.
Locul unde aceast traducere a limbajului de asamblare se gsete , se numete un
fiier de "execuie". Vom ntlni adesea numele de fiier "HEX". Acest nume vine de
la o reprezentare hexazecimal a acelui fiier, ca i de la apendicele "hex" din titlu,
de ex. "run through.hex". Odat ce este generat, fiierul de execuie este citit n
microcontroler printr-un programator.

72

Un program n Limbaj de Asamblare este scris ntr-un program pentru procesarea


textului (editorul) i este capabil de a produce un fiier ASCII pe discul computerului
sau n zone specializate ca MPLAB ce se va explica n capitolul urmtor.
Limbaj de Asamblare
Elementele de baz ale limbajului de asamblare sunt:
Label-uri sau Etichete
Instruciuni
Operanzi
Directive
Comentarii
Label-uri
Un Label este o desemnare textual (n general un cuvnt uor de citit)
pentru o linie ntr-un program, sau seciunea unui program unde micro-ul poate sri
sau chiar nceputul unui set de linii a unui program. Poate fi folosit de asemenea
pentru a executa ramificare de program (ca Goto.) i programul poate chiar
avea o condiie ce trebuie ndeplinit pentru ca instruciunea Goto s fie executat.
Este important pentru un label de a ncepe cu o liter a alfabetului sau cu o
subliniere "_". Lungimea label-ului poate fi de pn la 32 caractere. Este de
asemenea important ca un label s nceap de la primul rnd.

Instruciuni
Instruciunile sunt deja definite prin folosirea unui microcontroler specific, aa
c ne rmne doar s urmm instruciunile pentru folosirea lor n limbajul de
asamblare. Modul n care scriem o instruciune mai este numit "sintaxa" instruciunii.
n exemplul urmtor putem recunoate o greeal n scriere pentru c instruciunile
movlp i goto nu exist pentru microcontrolerul PIC16F628.

73

Operanzi
Operanzii sunt elemente ale instruciunii pentru instruciunea ce este
executat. Ei sunt de obicei regitri sau variabile sau constante. Constantele sunt
numite "literal-e". Cuvntul literal nseamn "numr".

Comentarii
Comentariul este o serie de cuvinte pe care programatorul le scrie pentru a
face programul mai clar i mai uor de citit. Se plaseaz dup o instruciune , i
trebuie s nceap cu punct i virgul";".
Directive
O directiv este similar unei instruciuni, dar spre deosebire de o
instruciune este independent de modelul microcontrolerului, i reprezint o
caracteristic a limbajului de asamblare nsui. Directivelor le sunt date uzual
nelesuri de scop prin variabile i regitri. De exemplu, LEVEL poate fi o desemnaie
pentru o variabil n memoria RAM la adresa 0Dh. n felul acesta, variabila la acea
adres poate fi accesat prin desemnaia LEVEL. Aceasta este mult mai uor pentru
un programator s neleag dect s ncerce s-i aduc aminte c adresa 0Dh
conine informaii despre LEVEL.

74

Un exemplu de program scris


Urmtorul exemplu ilustreaz un program simplu scris n limbaj de asamblare
respectnd regulile de baz.
Cnd se scrie un program, nafar de regulile obligatorii, sunt de asemenea unele
reguli ce nu sunt scrise dar trebuie urmate. Una din ele s scrii numele programului
la nceput, ce face programul, versiunea lui, date cnd a fost scris, tipul

microcontrolerului pentru care a fost scris, i numele programatorului.


Pentru c aceste date nu sunt importante pentru translatorul de asamblare,
este scris ca i comentarii. Trebuie remarcat c un comentariu ncepe totdeauna cu
punct i virgul i c poate fi plasat ntr-un rnd nou sau poate urma dup
instruciune. Este cel mai bine inut n rndul al treilea pentru a face traseul uor de
urmrit.

75

Dup deschiderea comentariului ce a fost scris, trebuie inclus directiva.


Aceasta este artat n exemplul de mai sus.
Pentru a funciona corect, trebuie s definim civa parametri ai microcontrolerului
ca:
- tipul oscilatorului
- dac timer-ul watchdog este pe deschis, i
- dac circuitul de resetare intern este activ.
Toate acestea sunt definite prin urmtoarea directiv:
_CONFIG _CP_OFF&_WDT_OFF&PWRTE_ON&XT_OSC
Cnd toate elementele necesare au fost definite, putem ncepe scrierea unui
program. n primul rnd, este necesar de a determina adresa de unde ncepe
microcontrolerul, dup pornirea sursei de alimentare. Aceasta este (org 0x00).
Adresa de la care ncepe programul dac are loc o ntrerupere este (org 0x04).
Pentru c acesta este un program simplu, va fi suficient s direcionm
microcontrolerul la nceputul programului cu o instruciune "goto Main".
Instruciunile gsite n Main sub-routine selecteaz bank-ul 1 al memoriei
(BANK1) pentru a accesa registrul TRISIB, aa nct portul B s fie declarat ca o
ieire (movlw 0x00, movwf TRISIB).
Urmtorul pas este de a selecta bank-ul de memorie 0 i de plasa statusul
unu-lui logic la portul B( movlw 0Xff, movwf PORTB ), i astfel programul principal
este terminat. Trebuie s facem o alt bucl unde microcontrolerul s fie inut ca s
nu se "rtceasc" dac se ntmpl o eroare. Pentru acest scop, se face o bucl
infinit unde micro-ul este reinut n timp ce sursa este conectat. Necesarul "sfrit"
de la concluzia fiecrui program informeaz translatorul de asamblare c nu mai
sunt instruciuni n program.
Directive de control
4.1 #DEFINE Schimb o bucat de text pentru o alta
Sintax:
#define<name> [<text ce schimb numele>]
Descriere:
De fiecare dat cnd apare <name> n program , va fi nlocuit cu <text ce schimb
numele>.
Exemplu:
#define turned on 1
#define turned off 0
Directive similare: #UNDEFINE, IFDEF,IFNDEF
4.2 INCLUDE Include un fiier adiional ntr-un program
Sintax:
#include <file_name>

76

#include

"

Descriere:
O aplicaie a acestei directive are efect ca i cum ntregul fiier a fost copiat ntr-un
loc unde directiva "include" a fost gsit. Dac numele fiierului este n paranteze
ptrate, avem de a face cu un fiier de sistem, i dac este n interiorul ghilimelelor
de citare, avem de a face cu fiier de utilizator. Directiva "include" contribuie la un
traseu mai bun al programului principal.
Exemplu:
#include <regs.h>
#include "subprog.asm"
4.3 CONSTANT D o valoare numeric constant desemnrii textuale
Sintax:
Constant <name>=<value>
Descriere:
De fiecare dat cnd apare <name> n program, va fi nlocuit cu <value>.
Exemplu:
Constant MAXIMUM=100
Constant Length=30
Directive similare: SET, VARIABLE
VARIABLE

valoare

numeric

variabil

desemnrii

textuale

Sintax:
Variable<name>=<value>
Descriere:
Folosind aceast directiv, desemnarea textual se nlocuiete cu o valoare
particular. Difer de directiva CONSTANT n aceea c dup aplicarea directivei,
valoarea desemnrii textuale poate fi nlocuit.
Exemplu:
variable level=20
variable time=13
Directive similare: SET, CONSTANT
4.5 SET Definirea variabilei asamblorului
Sintax:
<name_variable>set<value>

77

Descriere:
Variabilei <name_variable> i este adugat expresia <value>. Directiva SET este
similar lui EQU, dar cu directiva SET numele variabilei poate fi redefinit urmnd o
definiie.
Directive de Date
CBLOCK Definind un bloc pentru constantele numite
Sintax:
Cblock
<label>[:<increment>], <label>[:<increment>].....
endc

[<term>]

Descriere:
Directiva este folosit pentru a da valori constantelor numite. Fiecare termen ce
urmeaz primete o valoare mai mare cu unu dect precursorul lui. Dac parametrul
<increment> este de asemenea dat, atunci valoarea dat n parametrul <increment>
este adugat constantei urmtoare. Valoarea parametrului <term> este valoarea de
pornire. Dac nu este dat, este considerat a fi zero.
Configurnd o directiv
CONFIG Setarea biilor configuraionali
Sintax:
-config<term> or__config<address>,<term>
Descriere:
Sunt definite oscilatorul, aplicaia timer watchdog i circuitul intern de reset. nainte
de folosirea acestei directive, procesorul trebuie definit folosind directiva
PROCESSOR.
Fiiere create ca rezultat al translrii programului
Ca un rezultat al procesului translrii unui program scris n limbaj de asamblare
obinem fiiere ca:
Fiier de executare (Program_Name.HEX)
Fiier de erori program (Program_Name.ERR)
Fiier list (Program_Name.LST)
Primul fiier conine programul translat ce este citit n microcontroler prin
programareare. Coninutul lui nu poate da orice informaie programatorului, aa c
nu ne vom mai referi la ele n continuare.
Al doilea fiier conine posibile erorile ce au fost fcute n procesul scrierii, i
ca au fost observate de translatorul de asamblare n timpul procesului de translare.
Erorile pot fi descoperite de asemenea ntr-un fiier "list". Acest fiier este mai
potrivit dei cnd programul este mare i vederea fiierului "list" dureaz mai mult.
Al treilea fiier este cel mai folositor programatorului. n el sunt coninute multe

78

informaii, ca informaii despre instruciunile de poziionare i variabilele din


memorie, sau semnalizarea erorii.
Exemplu unui fiier "list" pentru program urmeaz n acest capitol. n captul
fiecrei pagini se gsesc informaii despre numele fiierului, data cnd a fost translat
i numrul paginii. Prima coloan conine o adres din memoria programului unde
este plasat o instruciune din acel rnd. A doua coloan conine o valoare a oricrei
variabile definit de una din directive: SET, EQU, VARIABLE, CONSTANT or
CBLOCK. A treia coloan este rezervat pentru forma unei instruciuni translate pe
care PIC-ul o execut. A patra coloan conine instruciunile asamblorului i
comentariile programatorului. Posibile erori vor apare ntre rnduri urmnd o linie n
care s-a produs eroarea.

79

80

La sfritul fiierului "list" este un tabel cu simboluri folosite n program. Un


element folositor al fiierului "list" este un grafic de utilizare a memoriei. La sfrit
de tot, este o statistic de erori ca i cantitatea de program rmas.
Macro-uri
Macros-urile sunt elemente foarte folositoare n limbajul de asamblare. Ei ar
putea fi pe scurt descrii ca "grup definit al utilizatorului de instruciuni ce vor intra n
programul de asamblare unde a fost apelat macro-ul". Este posibil de a scrie un
program chiar fr folosirea macro-urilor. Dar cu folosirea lor programul scris este
mult mai uor de neles, n special dac mai muli programatori lucreaz la acelai
program. Macro-urile au acelai scop ca funcii ale limbajelor de programare
complexe.
Cum s le scriem:
<label> macro [<argument1>,<argument2>,......<argumentN>]
........
.......
endm
Din modul n care sunt scrise, vedem c macro-urile pot accepta argumente, ceea
ce este foarte folositor n programare. Cnd apare argumentul n corpul macro-ului,
va fi nlocuit cu valoarea <argumentN>.
Exemplu:

Exemplu de mai sus arat un macro a crui scop este de a nlocui la portul B
argumentul ARG1 ce a fost definit n timp ce a fost apelat macro-ul. Folosirea lui n
program ar fi limitat la scrierea unei linii: ON_PORTB 0xFF , i astfel am plasa
valoarea 0xFF la PORTB. Pentru a folosi un macro n program, este necesar de a
include fiierul macro n programul principal cu instruciunea include
"macro_name.inc". Coninutul unui program este copiat automat ntr-un loc unde
instruciunea este scris. Aceasta poate fi cel mai bine vzut ntr-un fiier list
anteriror unde fiierul cu macro-uri este copiat mai jos de linia #include"bank.inc".

81

4.2 Proiectarea hardware


Functionarea frecventmetrului se bazeaza pe microprocesorul PIC16F628,
programat in configuratie de numarator. Impulsurile de numarat se aplica la
conectorul J3 de unde ajung pe intrarea neinversoare a comparatorului LM393.
Comparatorul LM393 este utilizat pe post de detector de nivel de semnal, in sensul
ca el va furniza la iesirea de la pinul 1 impulsuri doar daca impulsurile aplicate la
intrarea de la pinul 3 sunt mai mari decat tensiunea continua aplicata la pinul 2,
stabilita din potentiometrul R10. Datorita faptului ca circuitul integrat LM393 este
alimentat la 5Vcc, impulsurile care se aplica pe intrarea de la pinul 3 nu trebuie sa
depaseasca aceasta tensiune, in acest sens prevazandu-se dioda zener D3.
Rezistorul R7 are rolul de a limita curentul maxim prin dioda D3 in cazul aplicarii
unor impulsuri de o amplitudine mai mare de 5Vcc. Rezistorul R8 tine potentialul de
la intrarea pinului 3 al CI LM393 la valoarea de 0Vcc in cazul in care nu exista
impulsuri aplicate la intrarea J3. R9 este cerut de LM393 deoarece iesirea CI este in
open colector. C7 are rol de decuplare a alimentarii CI LM393 la inalta frecventa.
LCD-ul se conecteaza la conectorul J1 dupa cum urmeaza: pinii 1 la 6 se
conecteaza la pinii 1 la 6 ai LCD-ului, iar pinii 7-10 se conecteaza la pinii 11-14 ai
LCD-ului. Metoda de conectare a LCD-ului la microcontroller este ceruta de driverul
software pentru LCD folosit, si anume lcd.c. In acest fisier, in partea de inceput, este
explicat in detaliu modul de conectare al LCD-ului la microcontroller. Pe pinul 3 al
LCD-ului se aplica o tensiune continua variabila, reglabila din semireglabilul R4,
pentru reglajul contrastului la LCD. R1 are rolul de a limita tensiunea maxima care
se aplica pe pinul 3 al LCD. C3 realizeaza o filtrare in inalta frecventa a alimentarii
LCD-ului.
Microcontrollerul va functiona la o frecventa de 20MHz (frecventa maxima),
ceea ce inseamna frecventa de instructiuni 20MHz/4 = 5MHz (200ns/instructiune).
R5, respectiv R3, tin potentialul in 5Vcc (1 logic) pe pinii RA5 respectivRA0 ai
microcontrollerului. Condensatoarele C4 respectiv C2 au rolul de a elimina spikurile
de tensiune care apar in momentul actionarii comutatoarelor SW2 respectiv SW1.
C1 are rolul de a filtra alimentarea microcontrollerului la inalta frecventa.

4.2.1 Alimentarea microcontrolerului


n general, alimentarea corect este de o importan maxim pentru
funcionarea corect a sistemului cu microcontroler. Poate fi uor comparat cu
respiraia unui om n aer. Este mai probabil ca un om care respir n aer curat va tri
mai mult dect un om care locuiete ntrun mediu poluat. Pentru o funcionare
corect a oricrui microcontroler, este necesar s oferim o surs stabil de
alimentare, un reset sigur n momentul n care l pornii i un oscilator. Conform
specificaiilor tehnice oferite de productorul microcontrolerului PIC, tensiunea de
alimentare ar trebui s se ncadreze ntre 2.0V i 6.0V pentru toate versiunile. Cea
mai simpl soluie este folosirea stabilizatorului de tensiune LM7805 care ofer
tensiune stabil de +5V la ieire. O astfel de surs este ilustrat n figura de mai jos.

82

Pentru
a
funciona
corect sau
pentru
a
avea
o
tensiune
stabilizat
la 5V la
ieire (pinul
3),
tensiunea
de intrare pe pinul 1 la LM7805 ar trebui s fie ntre 7V i 24V. n funcie de curentul
consumat de montaj vom folosi tipul corespunztor de stabilizator de tensiune
LM7805. Sunt diferite versiuni de LM7805. Pentru consum de curent de pn la un
1A ar trebui s folosim versiunea n capsul TO-220 cu posibilitatea de rcire
adiional. Dac consumul total este de 50mA, putem s folosim 78L05 (versiune de
stabilizator n capsul mic TO-92 pentru curent de pn la 100mA).

4.2.2 Tastatura
astaturile sunt dispozitive mecanice utilizate pentru a executa o ntrerupere sau
pentru a realiza o conexiune ntre dou puncte. Ele au diferite mrimi i au diferite
scopuri. Tastele care sunt utilizate aici sunt denumite taste dip. Ele sunt lipite direct
pe o plac de circuit i sunt deseori ntlnite n electronic. Au patru pini (doi pentru
fiecare contact), ceea ce le ofer stabilitate mecanic.

83

Exemplu pentru conectarea tastelor la pinii microcontrolerului


Funcia tastei este simpl. n momentul n care apsm o tast, dou
contacte sunt unite i se realizeaz o conexiune. Totui, nu toate lucrurile sunt
simple. Problema const n natura tensiunii ca valoare, i n imperfeciunea
contactelor mecanice. nainte ca un contact s fie realizat sau decuplat, exist o
perioad scurt de timp cnd pot aprea vibraii (oscilaii) ca rezultat al imperfeciunii
contactelor mecanice, sau din cauza vitezei diferite de apsare (acest lucru depinde
de persoana care apas tasta). Termenul atribuit acestui fenomen este denumit
switch (contact) debounce.
Dac acest lucru nu este prevzut n momentul n care un program este
conceput, poate aprea o eroare sau programul poate produce mai mult dect un
singur impuls la ieire pentru o singur apsare de tast. Pentru a evita acest lucru,
putem introduce o mic ntrziere cnd detectm nchiderea unui contact.
Aceasta va asigura faptul c apsarea unei taste este interpretat ca un
singur impuls. ntrzierea de debounce este produs n software i durata ntrzierii
depinde de buton i de scopul butonului. Problema poate fi parial rezolvat prin
adugarea unui condensator n paralel la tast, dar un program bine realizat ofer
rezultate mai bune. Programul poate fi ajustat pn cnd detecia fals este complet
eliminat.
n anumite cazuri o simpl ntrziere poate fi suficient dar dac vrei ca
programul s se ocupe de mai multe lucruri n acelai timp, o simpl ntrziere va
nsemna c procesorul nu va face nimic pe o lung perioad de timp i poate rata
alte intrri sau poate decupla portul de ieire ctre un afior. Soluia este s avem un
program care s urmreasc apsarea unei taste ct i decuplarea unei taste.
Macroul de mai jos poate fi folosit pentru keypress debounce.

84

Macroul precedent are mai multe argumente care trebuiesc explicate:


BUTTON macro HiLo, Port, Bit, Delay, Address
HiLo poate fi 0 sau 1 care reprezint frontul cresctor sau cztor unde
subrutinele pot fi executate n momentul n care apsai o tast.
Port este un port al microcontrolerului la care trebuie conectat tasta. n cazul
microcontrolerului PIC16F84, el poate fi PORT A sau PORT B.
Bit este un pin al portului la care tasta este conectat.
Delay este un numr de la 0 la 255, folosit pentru a atribui timpul necesar pentru a
detecta key debounce contact oscillation to stop. El este calculat astfel: TIME
= Delay x 1ms.
Adress este adresa la care microcontrolerul se duce dup ce este detectat un
eveniment provenit de la tastatur. Subrutina de la aceast adres execut
instruciunile necesare pentru apsarea unei taste.
Exemplu 1 BUTTON 0, PORTA, 3, .100, Tester1_above
Tasta-1 este conectat la RA0 (prima ieire a portului A) cu o ntrziere de 100
milisecunde i cu o reacie la zero logic. Subrutina care proceseaz tasta este
localizat la adresa etichetei Tester1_above.
Exemplu 2 BUTTON 1, PORTA, 2, .200, Tester1_below
Tasta-2 este conectat la RA1 (a doua ieire a portului A) cu 200ms ntrziere i cu
reacie la unu logic.
Exemplul urmtor arat modul de folosire ntr-un program. BUTTON.ASM
aprinde i stinge LEDul. LEDul este conectat la cea de-a aptea ieire a portului B.
Tasta-1 este folosit pentru a aprinde LEDul. Tasta-2 stinge LEDul.

85

86

4.2.3 Afiaj LCD (A 16x2 line Hitachi HD44780 display)


Multe dispozitive cu microcontroler
folosesc LCDuri inteligente pentru a afia
informaia vizual. Urmtorul material se ocup
de conectarea unui afiaj LDC Hitachi la un
microcontroler PIC. Afiajele LCD proiectate cu
HD44780, modulul pentru LCD fabricat de
Hitachi, nu sunt scumpe i sunt uor de folosit, i chiar posibil s produc verificarea
datelor afiate folosind cei 8x80 pixeli ai afiajului. Afiajele LCD Hitachi conin un
set de caractere ASCII plus simboluri japoneze, greceti i matematice.
Fiecare dintre cei 640 de pixeli ai afiajului trebuie s poat fi accesat
individual i aceasta se poate realiza cu un numr de integrate SMD pentru control
montate pe spatele afiajului. Aceasta ne salveaz de o cantitate enorm de fire i
de un control adecvat astfel nct sunt necesare doar cteva linii pentru a accesa
afiajul. Putem comunica cu afiajul prin intermediul unui bus de date pe 8 bii sau
de 4 biti. Pentru un bus de 8 biti, afiajul are nevoie de o tensiune de alimentare de
+5v i 11 linii I/O. Pentru un bus de 4 bii sunt necesare doar liniile de alimentare i 7
linii. Cnd afiajul LCD nu este pornit liniile de date sunt TRI-STATE, ceea ce
nseamn c ele sunt n stare de nalt impedan (ca i cum ar fi deconectate) i
astfel nu interfereaz cu funcionabilitatea microcontrolerului cnd afiajul nu este
adresat.
LCDul necesit de altfel 3 linii de control de la microcontroler:
-Linia Enable (E) permite accesul la afiaj prin intermediul liniilor R/W i RS.
Cnd aceast linie este LOW, LCDul este dezactivat i ignor semnalele de la R/W
i RS. Cnd linia (E) este HIGH, LCDul verific starea celor dou linii de control i
rspunde corespunztor.
-Linia Read/Write (R/W) stabilete direcia datelor dintre LCD i
microcontroler. Cnd linia este LOW, datele sunt scrise n LCD. Cnd este HIGH,
datele sunt citite de la LCD.
-Cu ajutorul liniei Register select (RS), LCD interpreteaz tipul datelor de pe
liniile de date. Cnd este LOW, o instruciune este scris n LCD. Cnd este HIGH,
un caracter este scris n LCD.
Starea logic a liniilor de control:
E 0 Accesul la LCD dezactivat
1 Accesul la LCD activat
R/W 0 Scrie date n LCD
1 Citete date din LCD
RS 0 Instruciuni
1 Caracter
Scrierea datelor n LCD se realizeaz n civa pai:
se seteaz bitul R/W LOW
87

se seteaz bitul RS n 0 sau 1 logic (instruciune sau caracter)


se trimit datele ctre liniile de date (dac se execut o scriere)
se seteaz linia E HIGH
se citesc datele de la liniile de date (dac se execut o citire)

Citirea datelor de la LCD se realizeaz similar, cu deosebirea c linia de


control R/W trebuie s fie HIGH. Cnd trimitem un HIGH ctre LCD, el se va reseta
i va accepta instruciuni. Instruciunile tipice care sunt transmise ctre un afiaj LCD
dup reset sunt: pornirea afiajului, activarea cursorului i scrierea caracterelor de la
stnga spre dreapta. n momentul n care un LCD este iniializat, el este pregtit sa
primeasc date sau instruciuni. Dac recepioneaz un caracter, el l va afia i va
muta cursorul un spaiu la dreapta. Cursorul marcheaz locaia urmtoare unde un
caracter va fi afiat. Cnd dorim s scriem un ir de caractere, mai nti trebuie s
setm adresa de start, i apoi s trimitem cte un caracter pe rnd. Caracterele care
pot fi afiate pe ecran sunt memorate n memoria video DD RAM (Data Display
RAM). Capacitatea memoriei DD RAM este de 80 bytes.
Afiajul LCD mai conine 64 bytes CG RAM ( Character Generator RAM).
Aceast memorie este rezervat pentru caracterele definite de utilizator. Datele din
CG RAM sunt reprezentate sub form de caractere bitmap de 8 biti. Fiecare caracter
ocup maxim 8 bytes n CG RAM, astfel numrul total de caractere pe care un
utilizator poate s le defineasc este 8. Pentru a afia caracterul bitmap pe LCD,
trebuie setat adresa CG RAM la punctul de start (de obicei 0) i apoi s fie scrise
datele n afiaj. Definirea unui caracter special este exemplificat n figur.
nainte de a
accesa DD RAM, dup
definirea unui caracter
special,
programul
trebuie s seteze adresa
n DD RAM. Orice scriere
i citire a datelor din
memoria
LCD
este
realizat de la ultima
adres care a fost setat,
folosind instruciunea set-adress. Odat ce adresa DD RAM este setat, un caracter
nou va fi afiat n locul potrivit pe ecran. Pn acum am discutat operaia de scriere
i citire a memoriei unui LCD ca i cum ar fi o memorie obinuit. Acest lucru nu
este adevrat. Controlerul LCD are nevoie de 40 pn la 120 microsecunde (us)
pentru scriere i citire. Alte operaii pot dura pn la 5 ms. n acest timp
microcontrolerul nu poate accesa LCDul, astfel un program trebuie s tie cnd un
LCD este ocupat. Putem rezolva aceasta n dou metode.

88

O metod este verificarea bitului BUSY de pe linia de date D7. Aceasta nu este cea
mai bun metod pentru c LCDul se poate bloca i programul va sta ntr-o bucl
infinit verificnd bitul BUSY. O alt metod este introducerea unei ntrzieri n

program. ntrzierea trebuie s fie destul de lung pentru ca LCDul s termine


operaia n desfurare. Instruciunile pentru scriere i citire cu memoria LCDului
sunt afiate mai sus. La nceput am menionat c avem nevoie de 11 linii I/O pentru
a comunica cu un LCD. Oricum, putem comunica cu un LCD printr-un bus de 4 linii.
Putem reduce numrul total de linii de comunicaie la 7. Schema pentru conectarea
printr-un bus de 4 biti este n imaginea de mai jos. n acest exemplu folosim un afiaj
LCD cu 2x16 caractere, denumit LM16x212 fabricat de productorul japonez Sharp.
Mesajul character este scris pe prima linie urmat de dou caractere speciale ~ i
}. Pe a doua linie este scris cuvntul mikroElektronika.
89

Conectarea unui afiaj la un microcontroler


Simulare in Proteus

Fiierul
LCD.inc
conine un
de
macrouri
pentru
lucrul
cu
afiajele
LCD.

grup

90

Macro pentru lucrul cu LCD


Macroul LCDinit este utilizat pentru a iniializa portul conectat la LCD. LCDul
este configurat s mearg n modul de 4 bii.

91

Exemplu: LCDinit
LCDchar LCDarg scrie un caracter ASCII. Argumentul este caracterul ASCII.
Exemplu: LCDchar d
LCDw scrie caracterul din registul W.
Exemplu: movlw p
LCDw
LCDcmd LCDcommand trimite comenzi.
Exemplu: LCDline 2
Cnd lucrm cu microcontrolere numerele sunt reprezentate n form binar. Din
aceast cauz ele nu pot fi afiate. Pentru aceasta este necesar s schimbm
numerele dintr-un sistem binar ntr-un sistem zecimal pentru ca ele s fie uor de
neles. Sursele celor dou macrouri LCDval_08 i LCDval_16 sunt prezentate mai
jos.
Macroul LCDval_08 realizeaz conversia unui numr binar de 8 bii ntr-un numr
zecimal de la 0 la 255 i l afieaz. Este necesar s declarm urmtoarele variabile
n programul principal: TEMP1, TEMP2, LO, LO_TEMP, Bcheck. Numrul binar de 8
bii este n variabila LO. Cnd macroul este executat, echivalentul zecimal al acestui
numr este afiat. Zerourile precedente numrului nu sunt afiate.
Macroul LCDval_16 realizeaz conversia unui numr binar de 16 bii ntr-un numr
zecimal de la 0 la 65535 i l afieaz. Urmtoarele variabile trebuie declarate n
programul pricipal: TEMP1, TEMP2, TEMP3, LO, HI, LO_TEMP. HI_TEMP, Bcheck.
Numrul binar de 16 bii este n variabilele LO i HI. Cnd macroul este executat,
echivalentul zecimal al acestui numr este afiat. Zerourile precedente numrului nu
sunt afiate.

92

Programul principal este o demontraie pentru utilizarea afiajelor LCD i


desenarea de noi caractere. La nceputul programului, trebuie s declarm
variabilele LCDbuf i LCDtemp folosite n subrutinele pentru LCD, ct i portul

93

microcontrolerului conectat la LCD. Programul scrie mesajul characters: pe prima


linie urmat de dou caractere speciale ~ i }. Pe cea de-a doua linie este afiat
mikroElektronika.

4.2.4 Proiectarea cablajului i asezarea componentelor

94

95

4.2.5 Componentele folosite


C1,C2,C3,C4,C7
C5,C6 15pF
C8
100uF
D2
1N4001
D3
DZ5V1
J1
Con LCD
J2
Power
J3
Input 1
R1
22k
R4
2k
R8
100k
R9
4k7
R10
10k
SW1
Mod
SW2
Reset
U1
PIC16F628
U2
LM7805
U3
LM393
Y1
20MHz

100nF

4.2.6 Schema electric

96

Captur a ecranului cu schema1 folosit pentru simulare

97

Captur a ecranului cu schema2 folosit pentru simulare

4.3 Proiectarea software


4.3.1 Organigrama programului principal

98

4.3.2 Programul n C
Programul a fost facut in C i a fost implementat n microprocesor cu ajutorul
unui programator numit IC-Prog. Acest programator a transformat programul din C n
limbaj de asamblare.
#include "F:\wrk\frecventmetru\Soft\frecv.h"
#include <F:\wrk\frecventmetru\Soft\LCD.C>
//declaratii constante

99

#define BUTON_RESET PIN_A5


#define BUTON_MOD PIN_A0
//declaratii variabile
unsigned int8 BUFTMR0, OLD_TMR0, NEW_TMR0;
unsigned int16 NCOUNTER;
unsigned int8 TMASURA;
unsigned int32 NCOUNTER1;
int32 frecventa;
int1 mod_frecventmetru=1,Semafor_BUTON_RESET;
int1 Semafor_BUTON_MOD, Semafor_Schimbare_Mod_Frecventa;
//declaratii functii
void initializare_variabile(void);
#int_TIMER1
TIMER1_isr()
{
output_high (PIN_A1);
BUFTMR0=get_timer0();
if(mod_frecventmetru)
{//mod frecventmetru
NCOUNTER1=(int32)(((NCOUNTER)*256)+BUFTMR0);
if(NCOUNTER1 <= 10)
{
TMASURA++;
if(TMASURA==100)
{
set_timer0(11);
NCOUNTER=0;
}
}
else
{
frecventa=(19*NCOUNTER1)/(TMASURA+1);
//
lcd_gotoxy(1,1);
//
printf (LCD_PUTC,"NC1=%ld TM=%d
",NCOUNTER1,TMASURA);
//
//

lcd_gotoxy(1,2);
printf (LCD_PUTC,"NT=%d OT=%d
",NEW_TMR0,OLD_TMR0);
delay_ms(30);
printf (LCD_PUTC,"F=%luHz
",frecventa);
NCOUNTER=0;
TMASURA=0;
set_timer0(0);
}

100

}//sfarsit mod frecventmetru


else
{//mod numarator
if(input(BUTON_RESET))
{//buton reset ridicat (=1) conform schemei electronice
Semafor_BUTON_RESET=0;
}
else
{//buton reset apasat (=0) conform schemei electronice
if(Semafor_BUTON_RESET)
{//=1
NCOUNTER=0;
BUFTMR0=0;
set_timer0(0);
}
else
{//=0
Semafor_BUTON_RESET=1;
}
}
NCOUNTER1=(int32)((NCOUNTER*256)+BUFTMR0);
lcd_gotoxy(1,2);
printf (LCD_PUTC,"N=%lu
",NCOUNTER1);
}//sfarsit mod numarator
if(input(BUTON_MOD))
{//buton mod ridicat (=1) conform schemei electronice
Semafor_BUTON_MOD=0;
Semafor_Schimbare_Mod_Frecventa=0;
}
else
{//buton mod apasat (=0) conform schemei electronice
if(Semafor_BUTON_MOD)
{//=1
if(!Semafor_Schimbare_Mod_Frecventa)
{//=0
Semafor_Schimbare_Mod_Frecventa=1;
if(mod_frecventmetru)
{//=1
mod_frecventmetru=0;
}
else
{//=0
mod_frecventmetru=1;
}
}
}

101

else
{//=0
Semafor_BUTON_MOD=1;
}
}
output_low (PIN_A1);
}
void main() {
setup_counters(RTCC_EXT_L_TO_H,WDT_18MS);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
delay_ms(500);
enable_interrupts(INT_TIMER1);
enable_interrupts(global);
initializare_variabile();
lcd_gotoxy(1,1);
printf (LCD_PUTC,"Frecventmetru
NCOUNTER=0;
while(1)
{
NEW_TMR0=get_timer0();
if(NEW_TMR0<OLD_TMR0)
{
NCOUNTER++;
}
// delay_ms(1);
OLD_TMR0=NEW_TMR0;
}
}

");

void initializare_variabile(void)
{
NCOUNTER=0;
set_timer0(0);
OLD_TMR0=get_timer0();
mod_frecventmetru=1;
}

102

Declaratii de variabile specifice microcontrollerului PIC16F628


//////// Standard Header file for the PIC16F628 device ////////////////
#device PIC16F628
#nolist
//////// Program memory: 2048x14 Data RAM: 223 Stack: 8
//////// I/O: 16 Analog Pins: 0
//////// Data EEPROM: 112
//////// C Scratch area: 20 ID Location: 2000
//////// Fuses: LP,XT,HS,EC,NOWDT,WDT,NOPUT,PUT,PROTECT,PROTECT_50%
//////// Fuses:
PROTECT_75%,NOPROTECT,NOBROWNOUT,BROWNOUT,MCLR,NOMCLR,LVP
//////// Fuses: NOLVP,ER_IO,INTRC_IO,ER,INTRC,CPD,NOCPD
////////
////////////////////////////////////////////////////////////////// I/O
// Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),
//
PORT_B_PULLUPS(), INPUT(),
//
OUTPUT_LOW(), OUTPUT_HIGH(),
//
OUTPUT_FLOAT(), OUTPUT_BIT()
// Constants used to identify pins in the above are:
#define PIN_A0
#define PIN_A1
#define PIN_A2
#define PIN_A3
#define PIN_A4
#define PIN_A5
#define PIN_A6
#define PIN_A7

40
41
42
43
44
45
46
47

#define PIN_B0
#define PIN_B1
#define PIN_B2
#define PIN_B3
#define PIN_B4
#define PIN_B5
#define PIN_B6
#define PIN_B7

48
49
50
51
52
53
54
55

////////////////////////////////////////////////////////////////// Useful defines


#define FALSE 0
#define TRUE 1
#define BYTE int

103

#define BOOLEAN short int


#define getc getch
#define fgetc getch
#define getchar getch
#define putc putchar
#define fputc putchar
#define fgets gets
#define fputs puts
////////////////////////////////////////////////////////////////// Control
// Control Functions: RESET_CPU(), SLEEP(), RESTART_CAUSE()
// Constants returned from RESTART_CAUSE() are:
#define WDT_FROM_SLEEP 0
#define WDT_TIMEOUT 8
#define MCLR_FROM_SLEEP 16
#define NORMAL_POWER_UP 24
////////////////////////////////////////////////////////////////// Timer 0
// Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER0(),
//
SET_TIMER0() or SET_RTCC(),
//
GET_TIMER0() or GET_RTCC()
// Constants used for SETUP_TIMER0() are:
#define RTCC_INTERNAL 0
#define RTCC_EXT_L_TO_H 32
#define RTCC_EXT_H_TO_L 48
#define RTCC_DIV_1
#define RTCC_DIV_2
#define RTCC_DIV_4
#define RTCC_DIV_8
#define RTCC_DIV_16
#define RTCC_DIV_32
#define RTCC_DIV_64
#define RTCC_DIV_128
#define RTCC_DIV_256

8
0
1
2
3
4
5
6
7

#define RTCC_8_BIT

// Constants used for SETUP_COUNTERS() are the above


// constants for the 1st param and the following for
// the 2nd param:
////////////////////////////////////////////////////////////////// WDT

104

// Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above)


//
RESTART_WDT()
//
#define WDT_18MS
8
#define WDT_36MS
9
#define WDT_72MS
10
#define WDT_144MS
11
#define WDT_288MS
12
#define WDT_576MS
13
#define WDT_1152MS 14
#define WDT_2304MS 15
////////////////////////////////////////////////////////////////// Timer 1
// Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1
// Constants used for SETUP_TIMER_1() are:
//
(or (via |) together constants from each group)
#define T1_DISABLED
0
#define T1_INTERNAL
0x85
#define T1_EXTERNAL
0x87
#define T1_EXTERNAL_SYNC 0x83
#define T1_CLK_OUT

#define T1_DIV_BY_1
#define T1_DIV_BY_2
#define T1_DIV_BY_4
#define T1_DIV_BY_8

0
0x10
0x20
0x30

////////////////////////////////////////////////////////////////// Timer 2
// Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2
// Constants used for SETUP_TIMER_2() are:
#define T2_DISABLED
0
#define T2_DIV_BY_1
4
#define T2_DIV_BY_4
5
#define T2_DIV_BY_16
6
////////////////////////////////////////////////////////////////// CCP
// CCP Functions: SETUP_CCPx, SET_PWMx_DUTY
// CCP Variables: CCP_x, CCP_x_LOW, CCP_x_HIGH
// Constants used for SETUP_CCPx() are:
#define CCP_OFF
0
#define CCP_CAPTURE_FE
4
#define CCP_CAPTURE_RE
5
#define CCP_CAPTURE_DIV_4
6
#define CCP_CAPTURE_DIV_16
7
#define CCP_COMPARE_SET_ON_MATCH
8

105

#define CCP_COMPARE_CLR_ON_MATCH
9
#define CCP_COMPARE_INT
0xA
#define CCP_COMPARE_RESET_TIMER
0xB
#define CCP_PWM
0xC
#define CCP_PWM_PLUS_1
0x1c
#define CCP_PWM_PLUS_2
0x2c
#define CCP_PWM_PLUS_3
0x3c
long CCP_1;
#byte CCP_1 =
0x15
#byte CCP_1_LOW=
0x15
#byte CCP_1_HIGH=
0x16
////////////////////////////////////////////////////////////////// COMP
// Comparator Variables: C1OUT, C2OUT
// Constants used in setup_comparators() are:
#define A0_A3_A1_A2 0xfff04
#define A0_A2_A1_A2 0x7ff03
#define NC_NC_A1_A2 0x6ff05
#define NC_NC_NC_NC 0x0ff07
#define A0_VR_A1_VR 0x3ff02
#define A3_VR_A2_VR 0xcff0A
#define A0_A2_A1_A2_OUT_ON_A3_A4 0x7e706
#define A3_A2_A1_A2 0xeff09
#bit C1OUT = 0x1f.6
#bit C2OUT = 0x1f.7
////////////////////////////////////////////////////////////////// INT
// Interrupt Functions: ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(),
//
EXT_INT_EDGE()
//
// Constants used in EXT_INT_EDGE() are:
#define L_TO_H
0x40
#define H_TO_L
0
// Constants used in ENABLE/DISABLE_INTERRUPTS() are:
#define GLOBAL
0x0BC0
#define INT_RTCC
0x0B20
#define INT_RB
0x0B08
#define INT_EXT
0x0B10
#define INT_TBE
0x8C10
#define INT_RDA
0x8C20
#define INT_TIMER1
0x8C01
#define INT_TIMER2
0x8C02
#define INT_CCP1
0x8C04
#define INT_LCD
0x8C80
#define INT_COMP
0x8C40
#define INT_EEPROM
0x0B40

106

#define INT_TIMER0

0x0B20

#list

Functiile necesare pentru accesul LCD-ului


#define use_portb_lcd TRUE
struct lcd_pin_map {
boolean enable;
boolean rs;
boolean rw;
boolean unused;
int data : 4;
} lcd;

// This structure is overlayed


// on to an I/O port to gain
// access to the LCD pins.
// The bits are allocated from
// low order up. ENABLE will
// be pin B0.

#if defined(__PCH__)
#if defined use_portb_lcd
#byte lcd = 0xF81
// This puts the entire structure
#else
#byte lcd = 0xF83
// This puts the entire structure
#endif
#else
#if defined use_portb_lcd
#byte lcd = 6
// on to port B (at address 6)
#else
#byte lcd = 8
// on to port D (at address 8)
#endif
#endif
#if defined use_portb_lcd
#define set_tris_lcd(x) set_tris_b(x)
#else
#define set_tris_lcd(x) set_tris_d(x)
#endif

#define lcd_type 2
// 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line

107

byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};


// These bytes need to be sent to the LCD
// to start it up.
// The following are used for setting
// the I/O port direction register.
STRUCT lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
STRUCT lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in

byte lcd_read_byte() {
byte low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}
void lcd_send_nibble( byte n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}
void lcd_send_byte( byte address, byte n ) {
lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;

108

lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init() {
byte i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( byte x, byte y) {
byte address;
if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2);
break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;

109

}
}
char lcd_getc( byte x, byte y) {
char value;
lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}

Captura ecranului cu programul IC-Prog cu fisierul frecvtest

110

Schema electric a programatorului

4.4 Functionarea frecvenmetrului


111

Functionarea frecvenmetrului se bazeaz pe urmatoarea teorie: Exist 3


procese software care se desfasoar n funcie de evenimentul care apare, i
anume:
- subrutina de la TIMER0;
- subrutina de la TIMER1;
- bucla principal.
Subrutina de la TIMER0 se execut de fiecare dat cnd TIMER0
genereaz o intrerupere software, adic atunci cnd registrul TMR0 al
microcontrollerului trece de la FFh la 00h. Registrul TMR0 se incrementeaz la
fiecare tranziie pe front crescator al semnalului de msurat (aplicat pe intrarea
RA4/T0CKI). Principalul rol al subrutinei este acela de a incrementa valoarea
variabilei NCOUNTER.
Subrutina de la TIMER1 apare o dat la 104,8ms (este setat software
pentru aceast valoare folosind instructiunea setup_timer_1()). TIMER1 este un
registru al microcontrollerului pe 16 biti. Frecvena de intrare pe care o numr
TIMER1 este setat pentru intern, folosind aceeai instructiune. Principalele sarcini
ale subrutinei de intrerupere sunt urmtoarele:
- pentru mod frecvenmetru: la aproximativ fiecare secund realizeaz
salvarea n variabila BUFTMR0 a numrului de impulsuri care se afl n registrul
TMR0 precum i a variabilei NCOUNTER n variabila BUFNCOUNTER (care arat
practic de cte ori s-a resetat TMR0) (numrul total de impulsuri care au aprut n
unitatea de timp ar fi BUFNCOUNTER*256+BUFTMR0, iar unitatea de timp este
104,8ms*TMASURA (TMASURA maxim este 10) deci unitatea de timp este de
1048ms); resetarea celor dou variabile care se ocup cu inumrarea impulsurilor n
unitatea de timp (TMASURA, NCOUNTER, TMR0)
- pentru modul numrtor: resetare variabila care msoar unitatea de
timp (TMASURA) i salvarea n variabila BUFTMR0 a numrului de impulsuri care
se afl n registrul TMR0 precum i a variabilei NCOUNTER n variabila
BUFNCOUNTER (care arat practic de cte ori s-a resetat TMR0) (numrul total de
impulsuri care au aprut n total ar fi BUFNCOUNTER*256+BUFTMR0;
- testeaz starea butonului MOD i i cazul n care butonul s-a apsat
schimb starea semaforului mod_frecventmetru (daca era 1 -logic devine 0 logic i
invers)
- doar pentru modul numrator testeaz i dac butonul RESET a fost
apsat. Pentru cazul n care a fost apsat, se reseteaz cele 2 variabile care
memoreaz numrul total de impulsuri: TMR0 si NCOUNTER.
Bucla principal
Principala sarcin a buclei principale const n a afia pe displayul LCD
informaiile corespunztoare modului n care se afl montajul:
- dac este n modul numrtor: calculeaz numrul de impulsuri
acumulate
pn
n
momentul
respectiv,
dup
formula

112

impulsuri=BUFNCOUNTER*256+BUFTMR0; dup care afieaz variabila


respectiv pe display;
- dac este n modul frecvenmetru: calculeaz numrul de impulsuri
acumulate n timpul respectiv, dup formula:
frecventa=(BUFNCOUNTER*256+BUFTMR0)*1000/1048; dup care
afieaz variabila respectiv pe display; corectarea valorii cu constanta 1000/1048
este necesar deoarece intreruperea de la TIMER1 apare la 104,8ms i n timp de
10 intreruperi, unitatea de timp devine 1048ms, iar frecvena trebuie calculat ca
fiind numarul de impulsuri aprute ntr-o secund.

4.4.1 Date tehnice despre frecvenmetru


- Frecvena maxim a impulsurilor de la intrare = 770kHz (frecvena maxim
de lucru pentru LM393 = 1/1,3us=769,23KHz)
- Tensiunea maxim de alimentare a frecvenmetrului = 35Vcc (tensiunea
maxim de alimentare pentru LM7805)
- Amplitudinea maxim a impulsurilor de la intrare: = +/-75Vcc
(Pdioda = 0,4W = Udiod x Idiod = 5Vcc x Idiod => Idiod max = 80mA pentru a
nu se arde dioda zener; dar la un astfel de curent, puterea care ar cdea pe
rezistena R7 de 1k ar fi P1k=idiod x Idiod * R1 = 80mA 8 80mA * 1k = 6,4W, cu
mult mai mare dect puterea maxim disipat de rezistena R1, care este de 0,5W,
ceea ce nseamn c valoarea maxim a tensiunii de intrare este practic dat de
puterea maxim pe care o poate disipa R7, adic Pr7=Ur7 * Ur7 / R7 <=> 0,5W =
Ur7 * Ur7 / 1000 => Ur7 = 70,7Vcc. Deci tensiunea maxim de intrare va fi de Ud3 +
Ur7 = 5V + 70V = 75Vcc)

4.4.2 Mod de utilizare


Se alimenteaz montajul la o tensiune mai mare de +7,5Vcc, se aplic
impulsuri la intrarea montajului, moment n care pe ecranul LCD-ului va aprea
frecvena n Hz. Dac se dorete ca montajul s funcioneze ca numrator, se apas
o data butonul MOD, caz n care valoarea afiat pe ecran va reprezenta numrul
total de impulsuri acumulate de aparat. Resetarea valorii numrului de impulsuri se
face prin apsarea butonului RESET. Butonul RESET este activ doar n modul
numrator, n modul frecvenmetru neavnd rol functional. Daca montajul nu numr
impulsurile aplicate la intrare, inseamna c amplitudinea acestora este mai mic
dect valoarea setat din poteniometrul R10, i se umbl la valoarea acestuia, n
sensul scaderii tensiunii cu care se face compararea.

113

Cap. 5 ANALIZA COMPARATIV A FRECVENMETRULUI


NUMERIC
5.1 Msuratori

frecvena
Hz
generator
2
frecvenmetru 2

Hz
20
20

Hz
200
200

114

Hz
2000
2006

Hz
Hz
20.000 770.000
20.068 772.643

Bibliografie:
l. A. Silard, .a Aparate electronice de msur i control - ndrumar de laborator,
Facultatea de Electronic i Telecomunicaii, Bucureti, 1989;
2. A. Silard, .a Aparate electronice de msur i control - Curs pentru uzul
studenilor, Facultatea de Electronic i Telecomunicaii, Bucureti,
1990;
3. M.Antoniu, .a Msurri electronice - partea a doua, Editura SATYA,
Iai, 1997;
4. Eugen Pop, .a Principii i metode de msurare numeric, Editura Facla,
Timioara, 1977;
5.N Coanis Msurri electrice i electronice-probleme, Litografie Institut de
Subingineri Piteti, 1990;
6. PROTEL.
7. DataBook, TTL, voi. 1, 1996, Texas Instruments;
8. Data Book, Mos Integrated Circuits, Second Edition, Microelectronica, 1989;
9. Documentaie:

OrCAD

CAPTURE,

115

SPICE