. Proiect De Diploma [617374]
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
1 Cuprins
1. Introducere ………………………….. ………………………….. ………………………….. …………………….. 3
1.1 Sintetizoare de frecvență ………………………….. ………………………….. ………………………… 3
1.2 Ce este sinteza directă digitală? ………………………….. ………………………….. ………………. 3
1.3 Ce face dispozitivul? ………………………….. ………………………….. ………………………….. …. 4
1.4 Scopul principal al DDS ………………………….. ………………………….. ………………………… 4
2. Fundamente teoretice ………………………….. ………………………….. ………………………….. ………. 5
2.1 Partea Hardware ………………………….. ………………………….. ………………………….. ……….. 5
2.1.1 Schema bloc ………………………….. ………………………….. ………………………….. ………. 5
2.1.2 Funcționare acumulatorului de fază într -un sintetizator digital direct …………….. 6
2.2 Partea Software (Limbajul de asamblare) ………………………….. ………………………….. …. 7
2.2.1 Ce este limbajul de asamblare ………………………….. ………………………….. ………….. 7
2.2.2 Caracteristici ………………………….. ………………………….. ………………………….. ……… 8
2.2.3 Asamblarea ………………………….. ………………………….. ………………………….. ……….. 8
2.2.4 Avantajele limbajului de asamblare ………………………….. ………………………….. ….. 9
2.3 Sisteme embedded ………………………….. ………………………….. ………………………….. ….. 10
2.3.1 Generalită ți ………………………….. ………………………….. ………………………….. ……… 10
2.3.2 Utilizarea microcontrolerelor ………………………….. ………………………….. …………. 10
3. Echipamente hardware folosite ………………………….. ………………………….. ……………………. 12
3.1 AD9835 ………………………….. ………………………….. ………………………….. …………………. 12
3.1.1 Descriere ge nerală ………………………….. ………………………….. ………………………… 12
3.1.2 Schema bloc de funcționare ………………………….. ………………………….. ……………. 12
3.1.3 Configurarea pinilor ………………………….. ………………………….. ……………………… 13
3.1.4 Descrierea circuitului ………………………….. ………………………….. …………………….. 15
3.1.5 Teoria de operare ………………………….. ………………………….. ………………………….. 16
3.1.6 Aplicații ………………………….. ………………………….. ………………………….. ………….. 18
3.2 Microcontrolerul PIC16F84A ………………………….. ………………………….. ……………….. 19
3.2.1 Descriere generală, schema bloc ………………………….. ………………………….. …….. 19
3.2.2 CISC, RISC ………………………….. ………………………….. ………………………….. …….. 20
3.2.3 Aplicații ………………………….. ………………………….. ………………………….. ………….. 21
3.2.4 Ciclul instrucțiune ………………………….. ………………………….. ………………………… 21
3.2.5 Pipelining ………………………….. ………………………….. ………………………….. ………… 22
3.2.6 Semnificația pinilor ………………………….. ………………………….. ………………………. 22
3.3 Encoder -ul optic ………………………….. ………………………….. ………………………….. ……… 24
3.3.1 Descriere generală ………………………….. ………………………….. ………………………… 24
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
2
3.3.2 Schema generală ………………………….. ………………………….. ………………………….. . 25
3.4 Amplificatorul MAX4012 ………………………….. ………………………….. ……………………. 25
3.4.1 Descriere generală ………………………….. ………………………….. ………………………… 25
3.4.2 Schema bloc ………………………….. ………………………….. ………………………….. …….. 25
3.4.3 Despre MAX4012 ………………………….. ………………………….. ………………………… 27
3.4.4 Configurarea pinilor ………………………….. ………………………….. ……………………… 27
3.5 Display -ul LCD 16×2 ………………………….. ………………………….. ………………………….. . 28
3.5.1 Descriere generală ………………………….. ………………………….. ………………………… 28
3.5.2 Schema LCD ………………………….. ………………………….. ………………………….. …… 29
3.5.3 Configurarea pinilor ………………………….. ………………………….. ……………………… 29
4. Proiectarea sistemului propus ………………………….. ………………………….. ………………………. 31
4.1 Proiectarea Hardware -lui propus ………………………….. ………………………….. …………… 31
4.1.1 Componentele dispozitivului ………………………….. ………………………….. ………….. 36
4.2 Proiectarea Software -lui propus ………………………….. ………………………….. …………….. 38
5. Concluzi și contribuții personale ………………………….. ………………………….. ………………….. 58
5.1 Concluzi ………………………….. ………………………….. ………………………….. ………………… 58
5.2 Contribuții personale ………………………….. ………………………….. ………………………….. .. 58
5.3 Dezvoltări ulterioare ………………………….. ………………………….. ………………………….. .. 58
6. Bibliografie ………………………….. ………………………….. ………………………….. …………………… 59
7. Anexa ………………………….. ………………………….. ………………………….. ………………………….. 61
7.1 Anexa 1 Schema DDS ………………………….. ………………………….. …………………………. 61
7.2 Anexa 2 Cod sursă ………………………….. ………………………….. ………………………….. ….. 62
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
3
1. Introducere
1.1 Sintetizoare de frecvență
Un sintetizor de frecvență este definit ca un sistem care generează una sau mai
multe frecvențe obținute folosind o singură bază de timp (frecvență de referință), astfel
încât raportul dintre frecvența semnalului de ieșire și cea a referinței este un număr
rațional.
Există trei tehnologii convenționale principale care sunt în mod curent utilizate
pentru un mecanism cu reacție negativă ce menține în fază frecvența semnalului de
ieșire cu cea a referinței. Sintetizoarele de frecvență cu buclă PLL s -au impus, atât
datorită simplității, cât și a prețului de cost scăzut.
O altă tehnică de sinteză a frecvenței este cea care folosește metoda directă
analogică (DA) la care un grup de frecvențe de referință este obținut de la o sursă
principală de referință. Aceste f recvențe sunt mixate și filtrate, sumate, scăzute sau
divizate în concordanță cu frecvența dorită la ieșire.
Cea de -a treia tehnică, utilizată pe scară din ce în ce mai largă în ultimii ani, este
cea care folosește metoda directă digitală (DDS). Aceasta es te în fapt o procesare
digitală a semnalului ce utilizează circuite și tehnici digitale pentru a crea, prelucra sau
modula un semnal digital și apoi, eventual, a -l converti într -un semnal analogic cu
ajutorul unui convertor digital -analog (DAC).
Este de re marcat faptul că în multe echipamente, cerințele impuse sintetizoarelor
de frecvență depășesc performanțele optenabile prin utilizarea uneia sau alteia dintre
metodele enumerate mai sus. În aceste cazuri se recurge la soluții hibride ce folosesc
câte două sau chiar toate cele trei metode de bază.[13]
1.2 Ce este sinteza directă digitală?
Sinteza digitală directă este o tehnica folosit ă în domeniul de generare al
semnalelor de frecvență radio utilizate într-o varietate de aplicații de la receptoare de
radio pân ă la semnalele generatoare și multe altele. Tehnica a devenit mult mai
răspândită în ultimii ani, cu progresele făcute în tehnologia de circuit elor integrat e, care
permit viteze mult mai mari. Deși de multe ori este folosit pe cont propriu, este adesea
utilizat în conjuncție indirecte sau în buclă de sintetizator fază blocată. Prin combinarea
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
4
celor două tehnologii se oferă posibilitatea de a combina de cele mai bune aspecte ale
fiecărui a. Având în vedere faptul că circuitele integrate sunt acum disponibil e pe scară
largă, ușurează procurarea și utilizarea acestora.[1]
1.3 Ce face dispozitivul?
Dispozitivul de sintez ă directă digitală adică Direct Digital Synthesis (DDS)
este un dispozitiv care produce o formă de semnal analogic, de obicei un semnal
sinusoidal, dreptunghiular sau triunghiular. Prin generarea unui semnal digital , semnalul
variază în timp în formă digitală și apoi efectuează o conversie digital -analogic.
Deoarece operațiunile în dispozitivul DDS sunt în primul rând d igitale, se poate oferi o
comutare rapidă între frecvențe de ieșire, rezoluția de frecvență fin ă și operarea pe un
spectru larg de frecvențe. Cu progresele înregistrate de tehnologie în momentul actual ,
dispozitive le DDS sunt foarte compacte și puterea pe care folosesc este foarte redusă.
Dispozitivul poate să fie un sintetizator de frecvență care este utilizat pentru crearea de
forme de undă arbitrare dintr -un singur ceas de referință cu frecvență fixă . Sinteza
directă digitală include următoarele aplica ții: generarea de semnal, oscilatoare locale în
sistemele de comunicații, generatoare de funcții, mixere, modulatoare, sintetizatoare de
sunet și pot fi folosite ca parte a unui circuit de sincronizare pe fază digitală.[4]
1.4 Scopul principal al DDS
Dispozitivele, cum ar fi DDS AD9833 , sunt programate cu ajutorul unei interfețe
seriale SPI (Serial Peripheral -Interface SPI) și au nevoie doar de un semnal de ceas
extern pentru a genera valori sinusoidale simple. Dispozitivele DDS ce sunt acum
disponibile, pot genera fre cvențe de la mai puțin de 1 Hz până la 400 MHz bazat pe un
semnal de ceas de 1GHz. Beneficiile dispozitivului constau într -un consum de putere
scăzut, costul redus, design compact , combinat cu performanțele lor excel ente inerente
și capacitatea lor de a fi programa te digital (sau reprogramate ) și diferitele forma de
undă la ieșire disponibile, fac din dispozitivele DDS o soluție extrem de atractiva la
metodele mai puțin flexibile care presupun folosirea de component e discrete.[4]
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
5
2. Fundamente teoretice
După cum sugerează și numele această formă de sinteză generează forma de
undă direct, folosind tehnici digitale. Diferența dintre sintetizatoare directe și indirecte
este că sintetizatorul indirect utilizează o bucl ă de fază închisă ca bază a funcționă rii ei.
Un sintetizator digital direct funcționează prin stocarea în format digital a eșantioanelor
formei de unda și apoi returnarea acestora pentru a genera forma de undă. Rata la care
sintetizatorul generează o formă de semnal reglementează apoi frecvența. Înainte de a
examina detaliile funcționării sintetizatorului, este necesar să se examinăm conceptul
de bază din spatele sistemului .[1]
2.1 Partea Hardware
2.1.1 Schema bloc
Figura 2.1 Componentele unui sintetizator digitală directă.
Sursă www.analog.com
Un DDS produce o undă sinusoidală la o frecvență dată. Frecvența depinde de
două variabile. Prim a este frecvenț a de referință de ceas și al doua este numărul binar
programat în registr ul de frecvență. Numărul binar din registrul frecvență formează
intrarea principală a acumulatorului de fază. Dacă se folosește un tabel de căutare
sinusoidală, acumulatorul de fază calculează o adresă de fază pentru tabelul de căutare,
care emite valoarea digitală a amplitudinii că tre convertorul digital analog. Convertorul
digital analog transformă acest număr într-o valoare corespunzătoare de tensiune
analog ica sau de curent. P entru a genera o frecvență fixă, undei sinusoidale îi este
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
6
adăugată o valoa re constantă la acumulatorul de fază, cu fiecare ciclu de ceas. Dacă
incrementul de fază este mare, procesul acumulat orul de fază se va intensifica acțiunea
de căuta re prin tabel și astfel generând o frecvență înaltă sinusoidală. Dacă incrementul
de fază este mic, acumulatorul de fază va avea mult mai multe etape, generând în
consecință, mai lent, o formă de undă.[4]
2.1.2 Funcționare acumulatorului de fa ză într -un sintetizator digital direct
După cum am zis sintetizatorul funcționează prin stocarea de diferite puncte ale
forma de undă în format digital și apoi le returnează pentru a genera forma de undă.
Funcționarea sa poate f i explicată în mai multe detalii prin luarea în considerare a
avansurilor de fază jurul unui cerc așa cum se arată în figura 2.
Figura 2.2 Funcționarea acumulatorului de fa ză într -un sintetizator digital direct .
Sursă www.radio -electronics.com
Faza avansează în jurul cerculu i care corespunde progreselor formei de undă,
adică cu cât mai mare este n umărul corespunzător fazei, cu atât mai mare este punctul
de-a lungul formei de undă. Prin avansarea succesivă a numărului corespunzător fazei
este posibil să se deplaseze mai departe de -a lungul ci clului de undă. Valoarea digital ă
care reprezintă faza este trimisa la oscilator ul cu comandă numerică. În acest fel se poate
trimite la acumulatorul de fază , care este de fapt o formă de contor. Atunci când este
contorizat se adaugă un număr prestabilit de cel care deja a avut loc. Când acesta se
umple , este resetat și începe numărătoarea de la zero. Cu alte cuvinte, aceasta
corespunde unui cerc complet pe diagrama de fază .
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
7
Următoarea etapă a procesului este cea de conversie a numerelor digitale
provenite din tabelul de căutare sinusoidal ă într-o tensiune analogică. Acest lucru este
realizat cu ajutorul unui convertor digital analog. Acest semnal este filtrat pentru a
elimina orice semnale nedorite și apoi amplificat pentru a oferi nivelul dorit în funcție
de necesități. Reglare a este reali zată prin creșterea sau reducerea numărului de pașilor
sau variația fazei între diferite puncte de eșantionare. O creștere mai mare la fiecare
modificare a acumulatorul de fază va însemna că faza atinge valoarea unui ciclu complet
mai repede ș i frecvența e ste corespunzător mai mare. Pași mai mici de variație a valorii
acumulatorului de fază înseamnă că este nevoie de mai mult timp pentru a atinge
valoarea unui ciclu complet și drept urmare valoare a frecventei este mai scăzută . În
acest fel este posibila controlarea frecvenț ei. De asemenea de poate observa că
schimbările de frecvență se pot face instantaneu prin simpla schimbare a valorii de
incrementare. Nu este nevoie de a seta un tim p ca în cazul sintetizatorul PLL . Urmând
acest fapt se poate observa că e xistă o diferență finită între doua frecvențe consecutive
și că această diferenț ă fața frecvenț a minimă ,sau rezoluția de frecvență , este determinată
de numărul total de puncte disponibile în acumulatorul de fază.[1] [4]
2.2 Partea Software (Limbajul de asamblare)
2.2.1 Ce este limbajul de asamblare
Un limbaj de asamblare este un limbaj de programare a calculatoarelor care,
în locul codului mașină, folosește o desemnare simbolică a elementelor
programului, relativ ușor de citit și interpretat de către om.
Fiecare calculator personal are un microprocesor care gestionează
activitățile aritmetice, logice și de control ale computerului. Fiecare familie de
procesoare are propr iul set de instrucțiuni de manipulare a diverse lor operații cum
ar fi obținerea de date de la tastatură, afișarea informațiilor pe ecran și efectuarea de
diverse alte operații menite să ușureze activitatea factorului uman . Aceste set uri de
instrucți uni sunt denumite "instrucțiuni in limbaj mașină". Procesor ul înțelege doar
instrucțiuni in limbaj mașină, reprezentate de șiruri de 1 ș i 0. Cu toate acestea, limbaj
mașină este prea obscur și complex pentru utilizarea lui în dezvoltarea de software.
Limba jul de asamblare de nivel scăzut este proiectat pentru o anumită familie de
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
8
procesoare, care reprezintă diverse instrucțiuni în cod simbolic cu o formă mai ușor
de înțeles.[11]
2.2.2 Caracteristici
Fiecare tip de procesor deține propriul său limbaj numit "codul mașină", care
reprezintă modul binar de codificare a in strucțiunilor și datelor în memorie , în forma
direct executabilă. Instrucțiunile pot fi în general operații elementare sau/și operații
de comandă și control a procesorului. Codul mașină este, ca orice cod, format din
secvențe binare , fiind greu de reținut pentru un programator.
Pentru a pu tea fi interpretat de procesor, programul scris de om trebuie mai
întâi redus prin compilare la "codul obiect", în acest scop fiind folosite
"compilatoarele", "asambloarele" sau " interpretoare ".
Programarea în limbaj de asamblare presupune o bună cunoașter e a structurii
procesorului și a componentelor sale adiacente. Ea face ca utilizatorul să aibă acces
la toate facilitățile unui calculator; dar programul rezultat va putea funcționa numai
pe acest tip de calculator. Dacă programul trebuie transpus și pe al te tipuri de
calculatoare, atunci se preferă limbajele de programare de nivel mai înalt.
De obicei limbajele de asamblare oferă și posibilitatea alcătuirii de așa
numite macrouri, după necesitățile programului. Un macro este o pseudo –
instrucțiune creată și definită chiar de către programator, care constă într -o grupare
de mai multe instrucțiuni obișnuite și care primește un nume cu care poate apoi fi
chemată în programul propriu -zis. Macrourile măresc eficiența programării,
deoarece prescurtează programarea și o fac m ai facilă. În cursul asamblării,
macrourile sunt înlocuite cu gruparea de instrucțiuni obișnuite, conform definiției
respective, proces care se numește macr o substituție . Datorita acestor facilități de
tip macro , limbajul "assembler" este numit uneori și "macro assembler".
Într-un sens macrourile se aseamănă cu subprogramele / subrutinele.[11]
2.2.3 Asamblarea
Asamblarea este procesul prin care codul sursă, scris în limbaj de asamblare,
este transformat în cod mașină sau cod obiect. Codul sursă poate fi dispus pe mai
multe module. Procesul invers se numește "dezasamblare".
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
9
Etapele asamblării:
1) Mai întâi se generează o tabelă de simboluri, ce conține toate
secvențele digitale din programul sursă, exceptând numele
simbolice externe , instrucțiuni și directive de asamblare.
2) Asamblorul contorizează instrucțiunile și datele
3) Se obține programul obiect, traducând fiecare instrucțiune și
înlocuind numele simbolice cu valoarea sau adresa din tabela
de simboluri.
4) Programul executabil se obține în urma etapei de editare de
legături (link -editare) , care permite legarea mai multor module
relocabile într -un singur fișier executabil, rezolvându -se
referințele încrucișate dintre ele.[11]
2.2.4 Avantajele limbajului de asamblare
O înțelegere a limbajului de asamblare presupune cunoștințe de:
Interfață de programe cu sistem ul de operare, procesor și BIOS;
Reprez entarea datelor în memorie și alte dispozitive externe;
Cum accesează și execută procesor ul instrucțiuni le;
Cum se accesează instrucțiuni le și procesul de date;
Cum se accesează din program dispozitivele externe;
Avantajele ce reies din folosirea acestui limbaj de programare sunt :
Este nevoie de mai puțină memorie și timp de execuție;
Este potrivit pentru rutine ce au constrângeri stricte de timp ;
Este cel mai potrivit pentru a scrie rutine de întrerupere de servicii și
alte programe rezidente în memorie .[3]
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
10
2.3 Sisteme embedded
2.3.1 Generalități
La modul general un controler este, actualmente, o structură electronică
desti nată controlului unui proces sau, mai general, unei interacțiuni caracteristice cu
mediul exterior, fără să fie necesară intervenția operatorului uman. Primele
controlere au fost realizate în tehnologii pur analogice, folosind componente
electronice discre te și/sau componente electromecanice. Cele care fac apel la tehnica
numerică modernă au fost realizate inițial pe baza logicii cablate și a unei electronici
analogice uneori complexe, motiv pentru care "străluceau" prin dimensiuni mari,
consum energetic pe măsură și, nu de puține ori, o fiabilitate care lăsa de dorit.
Apariția și utilizarea microprocesoarelor de uz general a dus la o reducere
consistentă a costurilor, dimensiunilor, consumului și o îmbunătățire a fiabilității.
Există și la ora actuală o ser ie de astfel de controlere de calitate, realizate în jurul
unor microprocesoare de uz general cum ar fi Z80 (Zilog), 8086/8088 (Intel), 6809
(Motorola), etc.
O definiție, cu un sens foarte larg de cuprindere, ar fi aceea că
un microcontroler este un microcircuit care incorporează o unitate centrală și o
memorie împreună cu resurse care -i permit interacțiunea cu mediul exterior.[2] [7] [8]
2.3.2 Utilizarea microcontrolerelor
Toate aplicațiile în care se utilizează microcontrolere fac parte din
categoria așa ziselor sisteme încapsulate -integrate (“embedded systems ”), la
care existența unui sistem de calcul încorporat este transparentă pentru utilizator.
Printre multele domenii unde utilizarea lor este pra ctic un standard
industrial se pot menționa: în industria de automobile (controlul aprinderii
motorului, climatizare, diagnoză, sisteme de alarmă, etc.), în așa zisă electronică
de consum (sisteme audio, televizoare, camere video și videocasetofoane,
telefonie mobilă, GPS -uri, jocuri electronice etc.), în aparatura electrocasnică
(mașini de spălat, frigidere, cuptoare cu microunde, aspiratoare), în c ontrolul
mediului și climatizarii (sere, locuințe, hale industriale), în industria
aerospațială, în mijloacel e moderne de măsurare – instrumentație (aparate de
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
11
măsură, senzori și traductoare inteligente), la realizarea de periferice pentru
calculatoare, în medicină. [2] [7] [8]
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
12
3. Echipamente hardware folosite
3.1 AD9835
3.1.1 Descriere generală
AD9835 este un oscilator controlat numeric care folosește un
acumulator de fază, o tabelă cosinus și un convertor Digital / Analog pe 10 –
bit integrat pe un singur cip CMOS. Aceste implementează dife rite tipuri de
modulație de fază ș i de frecvență . Viteza de ceas este maxima acceptata este
de 50 MHz. Frecventa poate fi controlata cu o precizie de 1 la 4 miliarde
Modularea este realizata prin încărcarea registre lor cu ajutorul interfeței
serial e. Prin intermediul unui bit „power -down” utilizatorul poate sa
oprească funcționarea dispozitivului atunci când acesta nu este utilizat,
puterea consumata reducandu -se la 1.75mW. [14]
3.1.2 Schema bloc de funcționare
Figura 3.1 Schema bloc de funcționare
Sursă www. analog.com , poza preluat din DataSheet AD9835
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
13
3.1.3 Configurarea pinilor
Figura 3.2 Pini DDS
Sursă www.analog.com, poza preluat din DataSheet AD9835
Semnal analogic și de referință:
1 – FS ADJUST – Full-Scale Adjust – Un rezistor (R SET) este conectat
între acest pin și AGND. Aceasta determină magnitudine a convertorul ui digital
analog . Relația dintre R SET și curentul este:
𝐼𝑂𝑈𝑇 𝐹𝑈𝐿𝐿 −𝑆𝐶𝐴𝐿𝐸 =12.5∗𝑉𝑅𝐸𝐹𝐼𝑁
𝑅𝑆𝐸𝑇
𝑉𝑅𝐸𝐹𝐼𝑁 =1.21 𝑉 𝑛𝑜𝑚𝑖𝑛𝑎𝑙
𝑅𝑆𝐸𝑇=3.9𝑘𝛺 𝑡𝑖𝑝𝑖𝑐
2 – REFIN – Voltage Reference Input – AD9835 poate fi folosit fie cu
referința locala , care este disponibil a din pinul REFOUT, sau o referință externă.
Referința ce va fi utilizata se va conecta la pinul REFIN. AD9835 acceptă o
referință de 1.21 V.
3 – REFOUT – Voltage Reference O utput – AD98 35 are o referință
locala de valoare 1.21 V. Referința este pus a la dispoziție pe pinul REFOUT.
Această este utilizată ca referință pentru convertor ul analog digital prin
conectarea REFOUT cu REFIN. REFOUT ar trebui decuplat cu un condensator
de 10 nF la AGND.
14 – IOUT – Current Output – Aceasta este o sursă de curent de înaltă
impedanță. Un rezistor de sa rcină ar trebui să fie conectat între IOUT și AGND.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
14
16 – COMP – Compensation pin – Acesta este un pin de compensare
pentru amplificatorul de referință intern. O condensator ceramic de 10 nF pentru
decuplare trebuie să fie conectat între COMP și AVDD.
Alimentare:
4 – DVDD – Este pinul de conectare al sursei de alimentare pentru
secțiunea digitală. Un condensator 0,1 mF trebuie conectat între DVDD și
DGND. DVDD poate avea o valoare de 5 V ± 5%.
5 – DGND – Masă digitală
13 – AGND – Masă analogică
15 – AVDD – Sursă de alimentare pentru secțiunea analogică. Un
condensator 0,1 mF trebuie conectat între AVDD și AGND. AVDD poate avea
o valoare de 5 V ± 5%.
Interfața digitală și controlul:
6 – MCLK – Digital Clock Input – Frecvențe de ieșire DDS sunt
exprimate ca fracție binară a frecvenței MCLK. Precizia de ieșire de frecvență
și zgomot de fază sunt determinate de acest ceas.
7 – SCLK – Serial Clock, Logic Input – Date este contorizate în AD9835
pe fiecare front descrescător al SCLK.
8 – SDATA – Serial Data In, Logic Input – Cuvânt ul de date de16 biți
este aplicat la această intrare.
9 – FSYNC – Data Synchronization Signal, Logic Input – Atunci când
această intrare este in stare „low” logica internă este informat ă că un nou cuvânt
se încarcă in dispozitiv.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
15
10 – FSELECT – Frequency Select Input – FSELECT controlează
registrul de frecvență, FREQ0 sau FREQ1, este utilizat în acumulator de fază.
Registrele de frecvență care urmează să fie utilizate pot fi selectate cu ajutorul
pinul FSELECT sau bitul FSELECT. Valoarea FSELECT sunt prelevata pe
frontul crescăt or al MCLK. FSELECT trebuie să fie în starea de echilibru atunci
când are loc o creștere a frontului semnalului MCLK. Dacă FSELECT is
modifică valoarea atunci când apare o margine în creștere, există o incertitudine
de un ciclu a MCLK iar controlul este t ransferat la celălalt registru de frecvență.
Pentru a evita orice incertitudine, o schimbare pe FSELECT nu trebuie să
coincidă cu o creștere margine MCLK. Când bitul este utilizat pentru a selecta
registrul de frecven ță, pinul FSELECT trebuie legat la DGND .
11, 12 – PSEL0, PSEL1 – Phase Select Input – AD9835 are patru registre
de fază. Aceste registre pot fi utilizate pentru a modifica valoarea frecventei .
Conținutul registrului de fază se adaugă la acumulatorul de fază la ieșire,
intrările PSEL0 și PSEL1 selectează registrul de fază care va fi utilizat .
Alternativ registr ul de fază ce va fi utilizat poate fi selectat cu ajutorul biți lor
PSEL0 și PSEL1. Aș a cum a fost la intrarea FSELECT, PSEL0 și PSEL1 se
preleveaza de pe fontul crescator al MCLK. Prin urmare, aceste intrări trebuie
să fie în starea de echilibru, atunci când are loc o creștere de front sau există o
incertitudine de un ciclu a MCLK ,iar atunci controlul este transferat în registrul
de selectare de faza . Când registrele de fază sunt controlate de biți PSEL0 și
PSEL1, pinii ar trebui să fie legați la DGND.[14]
3.1.4 Descrierea circuitului
AD9835 oferă un nou nivel de integrare pentru proiectantul sistemului
radio frecvență sau de comunicație. AD9835 combină un oscilator numeric
controlat, o tabela cosinus, modulatoare de frecvență, modulatoare de fază și
converto are digital e analogic e pe un singur circuit integrat. Circuitul intern al
AD9835 este format din trei secțiuni principale. Acestea sunt:
– oscilator numeric controlat + modulator de fază
– COS Look -Up Table
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
16
– convertor digital analogic
AD9835 este un cip de sinteză directă di gitală complet integrat. Cipul
necesită un ceas de referință, un rezistor de precizie și opt condensatori de
decuplare pentru a furniza unde sinusoidale digitale până la 25 MHz. Pe lângă
generarea acest ui semnal RF, acest cip este pe deplin capabil de o g amă largă
de scheme simple și complexe de modulare. Aceste scheme de modulație sunt
puse în aplicare integral în domeniul digital, care perm ite realizarea corectă și
simplă de algoritmi de modulare complecși , utilizând tehnici de DSP.[14]
3.1.5 Teoria de operar e
Undele cosinus sunt de obicei gândit e în termeni de mărime care
formează a(t)= cos(ωt). Adică unghiul de fază se rotește cu un unghi fix pentru
fiecare unitate de timp. Rata unghiulară depinde de frecvența semnalului
ω = 2*pi*f.
Știind că faza a une i unde cosinus este liniară și are ca o referință un
interval, rotația de fază pentru perioada respectivă poate fi determinată.
𝛥𝑃ℎ𝑎𝑠𝑒 = 𝜔𝛿𝑡
Rezolvarea coeficientul 𝜔:
𝜔=𝛥𝑃ℎ𝑎𝑠𝑒
𝛿𝑡= 2∗𝑝𝑖∗𝑓
Rezolvarea pentru F și substituirea frecvența de ceas de referință pentru
perioada de referință (1/f MCLK = 𝛿t)
𝑓= 𝛥𝑃ℎ𝑎𝑠𝑒 ∗ 𝑓𝑀𝐶𝐿𝐾
2∗𝑝𝑖
AD9835 construiește ieșirea bazandu -se pe această ecuație simplă. Un
simplu cip de DDS pot pune în aplicare această ecuație cu trei sub circuite
majore.
1) Oscilator numeric controlat și modulator de fază
Acest sub circuit constă din două registre de frecvență un acumulator de
fază și patru registre de offset de faza . Componenta principală a acestui oscilator
numeric control at este un acumulator de fază de 32 de biți care asamblează
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
17
componenta de fază a semnalului de ieșire. Semnale de timp continuu au o serie
de fază de la 0 pi până la 2pi. În afara acestui interval de numere, funcțiile
sinusoidale se repetă în mod periodic. Implementarea digitală nu este diferită.
Acumulatorul pur și simplu scalează gama de numere într -o fază în multiple
cuvinte digitale. Acumulatorul de fază în AD9835 este implementat cu 32 de
biți. Prin urmare, în AD9835, 2∗𝑝𝑖=232. De asemen ea, termenul ΔPhase este
scalat în acest interval de num ere 0< ΔPhase<232-1. Efectuarea aceste substituții
în ecuația de mai sus :
𝑓=𝛥𝑃ℎ𝑎𝑠𝑒 ∗𝑓𝑀𝐶𝐿𝐾
232 , unde 0 < ΔPhase < 232
Intrarea în acumulatorul de fază poate fi selectată fie din registrul FREQ0
sau din registrul FREQ1 și acest lucru este controla t de către pinul FSELECT
sau de bit-ul FSELECT. Oscilatorul numeric controlat în mod inerent generează
semnale de fază continuă, evitând astfel orice discontinuitate de ieșire atunci
când comută între frecvențe. Ca urmare o fază de compensare po ate fi adăugată
pentru a efectua o modulație de fază, utilizând registrele de fază de 12-bit.
Conținutul ac estui registru se adaugă la cei mai semnificativi biți ai oscilatorului.
AD9835 are patru registre de fază.
2) COS Look -Up Table
Pentru a distribui semnalul la ieșire , acesta trebuie convertit din faza de
informație într -o valoare sinusoidal a. Din moment ce informații le de fază
masează direct în amplitudine, un ROM LUT convertește informațiile de fază în
amplitudine. Pentru a face acest lucru, informa ția de fază digital a este folosit a
pentru a aborda un ROM LUT COS. Deși oscilatorul conține un acumulator de
fază de 32 de biți, ieșirea NCO este trunchiat ă la 12 biți. Utilizând rezoluția
completă a acumulatorul de fază este imposibil a și inutil a deoarece acest lucru
ar necesita un tabel look -up de 232 de intrări. Este necesar doar să aibă rezoluție
suficientă în fază, astfel încât eroarea de curent continuu la ieșire este dominat ă
de eroa rea de cuantizare în convertorul digital analog. Acest lucru necesit ă ca
tabelul de căutare să aibă mai mult de doi biți de rezoluție de fază.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
18
3) Convertor digital analogic
AD9835 presupune o o impedanță mare pentru sursa de curent de 10 -bit,
capabil a de a conduce o gamă largă de sarcini, la viteze diferite. Curent de ieșire
pe scară largă poate fi ajustat, pentru o putere optimă și cerințele de sarcină
externe, prin utilizarea unui singur rezistor extern. Rezistenței de sarcină poate
fi avea orice valoare necesar ă, atât timp cât tensiunea de scară largă dezvoltată
nu depășește intervalul de conformitate de tensiune. Deoarece curent ul pe scară
largă este controlat de R SET, ajustările R SET poat echilibra modificările aduse de
către rezistor ul de sarcină. Cu toate acestea, în cazul în care curentul de ieșire pe
scară largă al convertorului este semnificativ mai mic decât 4 mA, liniaritate
convertorului se poate degrada.[14]
3.1.6 Aplicații
AD9835 conține funcții care face potrivite pentru aplicații de modulație .
Partea poate fi utilizat pentru a efectua modulație simplă, cum ar fi FSK. Scheme
de modulație mai complexe, cum ar fi GMSK și QPSK pot fi de asemenea
implementate folosind AD9835. Într -o aplicație FSK, cele două registre de
frecvență ale AD9835 sunt înc ărcate cu valori diferite; o frecvență va reprezenta
frecvența spațiu în timp, celălalt va reprezenta frecvența de semn. Fluxul de date
digitale este alimentat la pinul FSELECT, ceea ce va determina AD9835 să
moduleze frecvența purtătoare dintre cele două valori.
AD9835 are patru registre de fază; acest lucru permite realizarea
modulației PSK. Cu defazaj de manipulare, frecvența purtătoare este defazat ă,
faza fiind modificat ă printr -o valoare care este legată de fluxul de biți de intrare
al modulatorul ui. P rezența celor patru registre de deplasare ușurează
interacțiunea necesară între DSP și AD9835.
AD9835 este de asemenea potrivit pentru aplicații care generează un
anumite semnal de test . Cu un consum redus de curent, este potrivit pentru
aplicații în ca re este necesară folosirea unui oscilator local. [14]
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
19
3.2 Microcontrolerul PIC16F84A
3.2.1 Descriere generală, schema bloc
PIC16F84 aparține unei clase de microcontrolere de 8 biți cu arhitectura
RISC. Structura lui generală este arătată în schița următoare care descrie
blocurile de baz ă.
Figura 3.3 Schema bloc pentru microcontroler
Sursă www.scritub.com
Memoria program (FLASH) – este pentru memorarea unui program
scris, pentru ca memoria ce este făcută în tehnologia FLASH poate fi programat ă
și ștearsă mai m ulte ori, aceasta lucru face microcontrolerul potrivit pentru
dezvoltarea acestui sistem .
EEPROM – memorie de date in care se salvează informațiile când
alimentarea este întrerupta . Este în mod uzual folosita pentru memorarea de date
importante ce nu treb uie 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 alimentării aceasta data se pierde, va
trebui sa facem ajustarea încă o data la revenirea alimentării. Astfel componenta
noastră pierde în privința auto -menținerii.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
20
RAM -memorie de date folosită de un program în timpul execuției 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 biți în interiorul
microcontrole rului ce lucrează independent de program. La fiecare al patrulea
impuls de ceas al oscilatorului își incrementează valoarea lui până ce atinge
maximul (255), și apoi începe să numere tot din nou de la zero. După cum știm
timpul exact dintre fiecare două in crementări ale conținutului timer -ului, poate
fi folosit pentru măsurarea timpul lui ce este foarte util la unele componente.
UNITATEA DE PROCESARE CENTRALĂ are rolul unui element de
conectivitate între celelalte blocuri ale microcontrolerului. Coordonea ză lucrul
altor blocuri și execută programul utilizatorului.[10]
3.2.2 CISC, RISC
S-a spus deja că PIC1684 are o arhitectură RISC. Acest termen este
adeseori găsit în literatura despre calculatoare și este nevoie să fie explicat aici
mai în detaliu. Arhitectura Harvard este un concept mai nou decât von –
Neumann. S-a născut din nevoia de mărire a vitezei microcontrolerului. În
arhitectura Harvard, bus -ul de date și bus -ul de adrese sunt separate. Astfel este
posibil un mare debit de date prin unitatea de procesare centrală și bineînțeles,
o viteza mai mare de lucru. Separarea programului de memoria de date face
posibil că mai departe instrucțiunile să nu trebuiască să fie cuvinte de 8 biți.
PIC16F84 folosește 14 biți pentru instrucțiuni ceea ce permite ca toate
instrucțiunile să fie instrucțiuni dintr -un singur cuvânt. Este de asemenea tipic
pentru arhitectura Harvard să aibă mai puține instrucțiuni decât von -Neumann
și să aibă instrucțiuni executate uzual în tr-un ciclu.
Microcontrolerele cu arhitectura Harvard sunt de asemenea numite
"microcontrolere RISC". RISC înseamnă Reduced Instruction Set Computer.
Microcontrolerele cu arhitectura von -Neumann sunt numite "microcontrolere
CISC". Titlul CISC înseamnă Comp lex Instruction Set Computer.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
21
Pentru că PIC16F84 este un microcontroler RISC, aceasta înseamnă ca
are un set redus de instrucțiuni, mai precis 35 de instrucțiuni. Toate aceste
instrucțiuni sunt executate într -un ciclu cu excepția instrucțiunilor jump ș i
branch. Conform cu ceea ce spune constructorul, PIC16F84 ajunge la rezultate
de 2:1 în compresia cod și 4:1 în viteza în comparație cu alte microcontrolere de
8 biți din clasa sa.[7][8] [10]
3.2.3 Aplicații
PIC16F84 se potrivește perfect în multe aplicații , de la industriile auto și
aplicațiile de control casnice la instrumentele industriale, senzori la distantă,
mânere electrice de uși ș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 ușoara aplicarea microcontrolerelor la
aparate le unde se cere memorarea permanentă a diferiților parametri. Costul
scăzut, consumul scăzut, mânuirea ușoara și flexibilitatea fac din PIC16F84 un
microcontro ler aplicabil chiar și în domenii unde microcontrolerele nu au fost
prevăzute înainte.
Programabilitatea sistemului acestui cip face posibila flexibilitatea
produsului, după ce asamblarea și testarea au fost terminate. Aceasta capabilitate
poate fi folosit ă pentru a crea producție pe linie de asamblare, de a înmagazina
date de calibrare disponibile doar după testarea finală, sau poate fi folosit pentru
a îmbunătăți programele la produsele finite.[10]
3.2.4 Ciclul instrucțiune
Clock -ul sau ceasul este starter -ul principal al microcontrolerului, și este
obținut dintr -o componentă de memorie externă numită "oscilator". Dacă ar fi
să comparăm un microcontroler cu un ceas de timp, "clock -ul" nostru ar fi un
ticăit pe care l -am auz i de la ceasul de timp. În acest caz, oscilatorul ar putea fi
comparat cu arcul ce este răsucit astfel ca ceasul de timp să meargă. De
asemenea, forța folosita pentru a întoarce ceasul poate fi comparata cu o sursă
electrică.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
22
Clock -ul de la oscilator intr ă într -un microcontroler prin pinul OSC1
unde circuitul intern al microcontrolerului divide clock -ul în 4 clock -uri eg ale
Q1, Q2, Q3 ș i Q4 ce nu se suprapun. Aceste 4 clock -uri constituie un ciclu de o
singură instrucțiune în timpul căreia instrucțiunea es te executată.
Executarea instrucțiunii începe prin apelarea unei instrucțiuni care este
următoarea în linie. Instrucțiunea este apelată din memoria program la fiecare
Q1 și este scrisă în registrul de instrucțiuni la Q4. Decodarea ș i executarea
instrucțiunii sunt făcute între următoarele cicluri Q1 și Q4.[10]
3.2.5 Pipelining
Ciclul instrucțiune constă din ciclurile Q1, Q2, Q3 și Q4. Ciclurile de
instrucțiuni de apelare și executare sunt conectate într -un așa fel încât pentru a
face o apelare, este ne cesar un ciclu cu o instrucțiune și mai este nevoie de încă
unul pentru decodare și executare. Totuși, datorită pipelining -ului (folosirea unei
pipeline -conductă, și este aducerea unei instrucțiuni din memorie în timp ce se
execută alta), fiecare instrucți une este executată efectiv într -un singur ciclu.
Dacă instrucțiunea cauzează o schi mbare în contorul programului, ș i PC-ul nu
direcționează spre următoarea ci spre alte adrese (poate fi cazul cu
subprogramele jumps sau calling), 2 cicluri sunt necesare pen tru executarea unei
instrucțiuni. Aceasta este pentru că instrucțiunea 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 c u clock –
urile Q2, Q3 și Q4. [7][8] [10]
3.2.6 Semnificația pinilor
PIC16F84 are un număr total de 18 pini. Cel mai adesea se găsește într –
o capsula de tip DIP18 dar se poate găsi de asemenea ș i într -o capsula SMD care
este mai mica ca cea DIP. DIP este prescurt area de la Dual In Package. SMD
este prescurtarea de la Surface Mount Devices sugerând ca găurile pentru pini
unde să intre aceștia, nu sunt necesare în lipirea acestui tip de componentă.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
23
Figura 3.4 PIC16F84
Sursă www.scritub.com
Pinii microcontrolerului PIC16F84 au următoarea semnificație:
Pin nr.1 RA2 Al doilea pin la portul A. Nu are funcție adițională.
Pin nr.2 RA3 Al treilea pin la portul A. Nu are funcție adițională.
Pin nr.3 RA4 Al patrulea pin la portul A. TOCK1 care funcționează ca
timer se găsește de asemenea la acest pin.
Pin nr.4 MCLR Resetează intrarea și tensiunea de programare Vpp a
microcontrolerului.
Pin nr.5 VSS Alimentare, masa.
Pin nr.6 RB0 Pin de zero la portul B. Intrarea Întrerupere este o funcție
adițională.
Pin nr .7 RB1 Primul pin la portul B. Nu are funcție adițională.
Pin nr.8 RB2 Al doilea pin la portul B. Nu are funcție adițională.
Pin nr.9 RB3 Al treilea pin la portul B. Nu are funcție adițională.
Pin nr.10 RB4 Al patrulea pin la portul B. Nu are funcție adiți onală.
Pin nr.11 RB5 Al cincilea pin la portul B. Nu are funcție adițională.
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 poziti v al sursei.
Pin nr.15 OSC2 Pin desemnat pentru conectarea la un oscilator.
Pin nr.16 OSC1 Pin desemnat pentru conectarea la un oscilator.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
24
Pin nr.17 RA2 Al doilea pin la portul A. Nu are funcție adițională.
Pin nr.18 RA1 Primul pin la portul A. Nu are fun cție adițională [10]
3.3 Encoder -ul optic
3.3.1 Descriere generală
Codificatoarele furnizează informații despre sisteme de control al
mișcării pe poziție, numărul, viteza, și de direcție. Așa cum arborele
codificatorului se rotește, semnale de ieșire sunt produse, proporțional cu
distanța de rotație. Semnalul poate fi sub forma unui semnal dreptunghiular
sau o măsură absolută a poziției.
Codificatoare le optice incrementale sunt cea mai populara alegere de
senzori în aplicații, unde mișcarea mecanică trebuie să fie t ransformată în
informație digitală. Comparativ cu tehnologii le alternative, codificatoare le
optice reprezintă cea mai bună combinație de precizie, rezoluție, fiabilitate,
robustețe, ușurința de utilizare, valoare și varietate de soluții din industrie.
Din aceste motive, codificatoare optice sunt alegerea cea mai bună în care
viteza, accelerația, distan ța, poziț ie, sau direcți a trebuie să fie măsurat e cu
precizie și economie .
Codificatoare le absolute ș i designul lor simplificat le propun ca soluții
ideale, necostisitoare în multe probleme care se confruntă cu controlul
mișcării și al automatizări i industriale. Acestea sunt potrivite în special
pentru aplicații în cazul în care un dispozit iv este inactiv pentru o perioadă
îndelungat a sau se mișcă într -un ritm lent, cum ar fi controlul porții de
inundații, telescoape, macarale, supape, mașina de scule, imprimare,
fabricarea hârtiei și multe alte industrii. Codificatoare le absolute generează
un "cuvânt” binar unic de ieșire pentru fiecare poziție a arbore lui solubil,
astfel încât fiecare poziție a arborelui este determinat a complet. Aceste
cuvinte de cod pot fi create în cod Gray, în cod binar natural. Prin utilizarea
poziție i absolut e, mai degrabă decât de date conta incrementale, poziția
arborelui este întotdea una cunoscut ă, chiar și după întreruperea curentului.
Proiectarea de sistem poate fi, de asemenea simplificată, deoarece nu este
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
25
nevoie de a efectua un ciclu de referință sau a reveni la funcția inițială pentru
a determina poziția adevărată a mașinii. [6]
3.3.2 Schema generală
Figura 3.5 Schema generală pentru encoder
Sursa www.grayhill.com , poza preluat de la DataSheet Optical Encoder
3.4 Amplificatorul MAX4012
3.4.1 Descriere generală
Amplificatoarele operaționale sunt amplificatoare electronice de curent
continuu, care reprezintă o categorie de circuite integrate analogice
amplificatoare cu performanțe deosebite, cu ajutorul cărora se pot realiza o
diversitate extrem de mare de aplicaț ii liniare și neliniare.
Denumirea de “operaționale” se datorează faptului că primele tipuri de
amplificatoare de acest tip au fost folosite pentru realizarea anumitor operații
matematice simple (adunare, scădere, înmulțire și împărțire cu o constantă).
Primele tipuri de AO aveau componente discrete și performanțe modeste. Odată
cu apariția și dezvoltarea tehnologiei circuitelor integrate performan țele AO au
crescut spectaculos.[12]
3.4.2 Schema bloc
Un amplificator operațional conține trei etaje distincte rea lizate cu
componente integrate și este prevăzut cu: două intrări (o intrare inversoare și o
intrare ne inversoare), o ieșire, terminale de alimentare cu tensiune, terminale
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
26
suplimentare utilizate pentru reglajul componentei continue a ieșirii (offset)
și/sau pentru compensare.[12]
Figura 3.6 Schema bloc pentru amplificator
Sursă cursuri Electronică Aplicată
Elementele schemei bloc:
– IN+ intrarea ne inversoare – semnalul aplicat pe această intrare, la
ieșire este amplificat și este în fază cu semnalul de intrare (semnalul
de ieșire nu este inversat)
– IN- intrarea inversoare – semnalul aplicat pe această intrare, la ieșire
este amplific at și defazat cu 180° față de semnalul de intrare
(semnalul este inversat)
– E ieșirea AO
– V+ , V – – terminale pentru alimentarea cu tensiune a AO.
Alimentarea cu tensiune se poate face de la o sursă de curent continuu
diferențială de tensiune (+V, -V)
– AD amplificator diferențial – este etajul de intrare a AO și amplifică
diferența semnalelor aplicate la intrările AO. Acest bloc, prin
structura sa, amplifică și semnalele de curent continuu.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
27
– AI amplificator intermediar – este un etaj de adaptare care p reia
semnalul de la ieșirea etajului de intrare și îl prelucrează pentru a
corespunde cerințelor etajului de ieșire
– AE amplificator de ieșire – este un etaj de putere care asigură
curentul de ieșire necesar
– offset – terminale utilizate pentru reglarea comp onentei c ontinue a
semnalului de ieșire ș i pentru compensare.[12]
3.4.3 Despre MAX4012
Sunt amplificatoare care folosesc tehnici de curent de feedback pentru a
realiza slew rate de 600V/μs și lățimi de bandă de 200 MHz. Câștigul
excelentă fac din aceste amplific atoare o alegere ideală pentru o mare
varietate de aplicații video și aplicații de procesare a semnalului RF.
Feedback -ul local, în jurul stadiul de ieșire asigură impedanță scăzută de
ieșire în buclă deschisă pentru a reduce sensibilitatea câștig pentru a
încărca variații. Acest feedback produce, de asemenea, prej udecată
curentă bazată pe cerere de tranzistori de ieșire de ±120mA capacitatea
de unitate, în timp ce de constrângere curent total de alimentare este mai
puțin de 7mA. [15]
3.4.4 Configurarea pinilor
Avem două tipuri de configurație la amplificatorul MAX4012;
una in miniatură cu 5 pin -uri SOT23 -5 și avem un tip de capsula, SO,
care folosește 8 pini . În proiect a fost utilizat cel SOT23 -5 cu 5 pin i.
Figura 3.7 Amplificatorul MAX4012
Sursă www.alldatasheet.com , poz a preluat de la DataSheet Max
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
28
Descrierea pinilor:
MAX4012 SOT23 -5
1- Ieșirea amplificatorului
2- Negativ sursă de alimentare sau masă
3- Intrarea neinversoare
4- Intrarea inversor
5- Pozitiv sursă de alimentare
MAX4012 SO
1,5,8 – Nu există conexiune. Nu este conectat
intern
6- Amplificator de ieșire
4- Negativ sursă de alimentare sau masă
3- Intrarea neinversoare
2- Intrarea inversoare
7- Pozitiv sursă de alimentare[15]
3.5 Display -ul LCD 16×2
3.5.1 Descriere generală
LCD (Liquid Crystal Display) este un modul de afișaj electronic
și își găsește locul într -o gama larga de aplicații . Un ecran 16×2 LCD
este un modul de bază și este foarte frecvent utilizat în diverse dispozitive
și circuite. Aceste module sunt de preferat peste afișajele cu șapte
segmente și alte LED -uri cu mai multe segmente. Motivele fiind: LCD –
urile sunt economice; ușor programabile; nu au nici o limitare in a afișa
caractere speciale și chiar personalizate (spre deosebire de șapte
segmente), animații și așa mai departe.
Un LCD 16×2 înseamnă că se pot afișa 16 caractere pe linie și
există două astfel de linii. In acest LCD fiecare caracter este afișat în
matrice 5×7 pixeli. Acest LCD are două registre: comandă și de date.
Registrul de comandă stochează instrucțiunile de comandă date
la LCD. O com andă este o instrucțiune dată către LCD pentru a face o
sarcină predefinită ca inițializare, de compensare ecranul său, stabilind
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
29
poziția cursorului, controlul de afișare. Registrul de date stochează datele
care urmează să fie afișate pe ecranul LCD. Datele reprezintă valoarea
ASCII a caracterului care urmează să fie afișat pe ecranul LCD.[9]
3.5.2 Schema LCD
Figura 3.8 Schema LCD
3.5.3 Configurarea pinilor
1- VSS – Tensiunea negativă
2- VDD – Tensiunea de alimentare 5V
3- VEE – Contrastul de ajustare; printr -un rezistor variabil
4- RS – Register Select – Selectează registrul de comandă atunci când
este scăzut; și înregistrează date atunci când este ridicat
5- RW – Read/write – Scăzut pentru a scrie la registru; Ridicat pentru a
citi de la registru
6- E – Enable – Trimite date către pini de date atunci când un puls ridicat
către scăzut este dat
7- D0 – Pin de date
8- D1 – Pin de date
9- D2 – Pin de date
10- D3 – Pin de date
11- D4 – Pin de date
12- D5 – Pin de date
13- D6 – Pin de date
14- D7 – Pin de date
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
30
15- BL1 – Backlight Power (+5V)
16- BL2 – Backlight Power (0V)
17- GND – Masă (0V) [9]
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
31
4. Proiectarea sistemului propus
4.1 Proiectarea H ardware -lui propus
Ca să înțelegem cum funcționează dispozitivul de sintez ă directă digitală avem
cinci componente necesare care ajută la funcțion area acestui dispozitiv . Această
cinci componente sunt următoarele: cipul DDS (U1), microcontrolerul (U2), un
generator de frecvență 50Mhz (U3), un amplificator (U4) și nu în ultimul rând sursa
de alimentare (U5). Reamintim că dispozitivul de sinteza directă digitală este un
dispozitiv care produce o formă de semnal analogică, de obicei produce un semnal
sinusoidal, dreptunghiular sau triunghiular. Prin generarea unui semnal, acesta
variază în timp în formă digitală și apoi e fectuează o conversie digita l-analogic.
Deoarece operațiile în dispozitivul DDS sunt în primul rând digitale, se poate oferi
comutare a rapidă între frecvențe le de ieșire, rezoluția de frecvență fin ă și operarea
pe un spectru larg de frecvențe.
Luăm fiecare component ă pe rând și explicăm ce funcție are, ce reprezintă și ce
fac alte elemente în jurul componente i curent e.
Figura 4.1 Componenta DDS (U1)
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
32
Începem cu cipul DDS (U1) , care prin pinul 6 (MCLK) primește 50 MHz de la
generator de semnal. Apoi pentru acest semnal a fost folosit o filtru (L1) pentru
filetarea semnalelor de interferență. Ca să ajungem la filtrare ieșim de la pinul 16
(COMP) și ne întâlnim cu un condensator (C8), care are rolul de compensare pentru
amplificatorul de referință in tern, după asta mai găsim niște condensatoare (C4, C5,
C6, C7), care ne ajută la filtrare, adică condensatoarele acestea sunt condensatoare
pentru putere de filtrare. Mai departe este o rezistență pentru DDS la pinul 1
(FS_ADJUST) care determină magnitudin ea de scar ă largă la co nvertorul digital
analog actual . Pinul 14 este ieșirea care merge la filtre le trece jos. Pinii 7,8,9, adică
SCLK, SDATA și FSY NC sunt legați la microcontroler.
Trecem mai departe la cea de -a doua componentă, microcontroler ul (U2).
Figura 4.2 Componenta microcontroler (U2)
Pe pinul 6, 11, 13, adică pe RB0, RB5 respectiv RB7 sunt folosiți in com unicarea
dintre microcontroler ș i cipul DDS. Restul pinilor la poarta B sunt legați la J5 care
este pentru LCD. Display -ul LCD este interconectat cu microcontrolerul PIC prin
intermediul unei interfețe de 8 bit . La poarta A pini RA0, RA1 și RA2 este legat la
codificatorul optic, re spectiv pini acestea sunt legați și la trei rezistențe (R13, R14,
R15). Rezistențele acestea sunt pentru a ridica semnalul primit de la generator ul de
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
33
semnal. Tot la portul A avem 2 pini rămăși legați la J4 care reprezintă partea unde
au fost implementat butoanele de control . Să fiu mai precis , au fost implementate
două butoane , primul buton este folosit pen tru calibrare, adică în timp ce alimentăm
circuitul și butonul este apăsat, circuitul intră în mod de calibrare. Butonul celălalt
este utilizat pentru frecvențe de radioamator, adică când apăsăm butonul atunci pe
display apare domeniul de frecvență pe car e il folosesc radioamatorii. La pinul
MCLR este legat ă o rezistență (R1) și un condensator (C3). Rezistența este folosit ă
pentru ridicarea semnalului cu care lucrează, iar condensatorul este folosit pentru
resetarea circuitul de sincronizare. La ultimii doi pini care a u rămas, pinul 15
(OSC2/CLKOUT) și pinul 16 (OSC1CLKIN) este legat un semnal de ceas de
10MHz care provine de la un generator de tact cuarț extern .
Urmează generatorul de frecvență 50MHz (U3). Așa cum a fost menționat ,
generatorul de frecvență este legat la cipul DDS, la microcontroler prin niște
rezistențe care au ca scop ridicarea semnalului pe care îl folosește dispozitivul.
Trecem la amplificator (U4).
Figura 4.3 Amplificatorul (U4)
La amplificator mai întâi ave m J3 care este ieșirea dispozitivului respectiv, aici
se află două rezistențe (R11, R12) care au rolul de divizor al nivelului de ieșire al
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
34
amplificatorului, avem un condensator (C14 ) care este un condensator tampon.
Rezistențele R9 și R10 sunt folosite pentru stabilirea amplificării. In p artea de sus
a amplificatorului găsim trei rezistențe și două condensatoare. Rezistența R6 este o
rezistență pentru potențial atenuator care transmite mai departe către intrare. Iar R7
și R8 sunt puncte de operare. Cond ensatorul C15 și C16 este pentru filtrare de
putere a amplificatorului.
Următorul pas este surs a de alimentare. Aici J2 reprezintă intrarea și cele patru
condensatoare . Condensatoarele C17 și C18 sunt condensatoare ceramic e, iar
condensatoarele C19 și C20 sunt folosite pentru netezirea caracteristicii de ieșire a
sursei .
Figura 4.4 Sursă de alimentare (U5)
După prezentarea componente lor importante trebuie să menționam ș i sub
circuitul următor care reprezintă filtrarea, mai bine zis filtrarea trece jos. Avem
două rezistențe (R4, R5) și patru condensatoare (C9, C10, C11, C12) care ne ajută
să setăm filtrarea. Pentru fiecare filtre sunt prezentate următoarele caracteristicele.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
35
Figura 4.5 Filtru trece jos
Figura 4.6 După prima filtrare
Figura 4.7 După al doilea filtrare
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
36
Figura 4.8 După al treilea filtrare
Figura 4.9 La ieșire
Și în ultimul rând menținem LCD -ul care este interconectat cu J5, și J5 la
microcontroler. Rezistenta R2 care este folosita pentru setarea contrastului display –
ul LCD.
4.1.1 Componentele dispozitivului
U1 – cipul DDS -ul
U2 – microcontrolerul PIC16F84A
U3 – generator ul de frecvență 50 MHz
U4 – amplificatorul MAX4012
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
37
U5 – sursa de alimentare
LCD – Liquid Crystal Display
X1 – generator de tact
R1 – rezistență ridicare de semnal
R2 – rezistență pentru setare contrast LCD
R3 – rezistență pentru DDS (FS_ADJUST)
R4, R5 – rezistență pentru setarea filtrului de impedanță
R6 – rezistență pentru potențial atenua tor care transmite mai departe
către intrare
R7, R8 – este puncte de operare
R9, R10 – este folosit ca amplificator
R11, R12 – ieșirea 50MHz
R13, R14, R15 – rezistență ridicare de semnal
C1, C2 – condensator pentru funcționarea generator
C3 – condensator pentru resetarea circuitul de sincronizare
C4, C5, C6, C7 – condensator pentru filtrarea puterii
C8 – condensator pentru compensare FRCK
C9, C10, C11, C12 – condensator pentru setarea filtrelor
C13, C14 – condensator tampon
C15, C16 – condensator pentru filtrarea puterii pentru amplificator
C17, C18 – condensator ceramică
C19, C20 – condensator pentru input/output
C21, C22, C23, C24 – condensator pentru filtrarea puterii
J1 – Codificator ul optic
J2 – Input (S ursa de alimentare )
J3 – Output
J4 – pentru butoane
J5 – pentru LCD
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
38
L1 – filtrează semnalele de interferență
L2 ,L3 ,L4 – filtre trece jos
4.2 Proiectarea Software -lui propus
Software -ul propus a fost realizat folosind limbajul de asamblare . Programul de
control este creat pentru un generator de semnal prin sintez ă directă digitală construit
cu un cip AD9850 DDS, un codificator optic , un comutator buton și un afișaj cu
cristale lichide (LCD).
Prin întregul program a fost realizat trei caracteristici pentr u software -ul propus.
A fost aplicate următoarele caracteristicile : reglaj de rată variabilă, memorii de
bandă și modul de calibrare.
Reglajul de rată variabilă este bazat pe viteza cu care codificatorul este rotit.
Codificatorul are de asemenea construit în el un comutator, care va schimba
dimensiunea de pas de la 1Hz la 1kHz dacă arborele codificatorului este apăsat în
timp ce pornește.
La memorie de bandă s -a realizat un comutator buton extern , care permite
frecvența să fie reciclate în jurul benzile de radioamatori de înaltă frecvență.
Se introduce modul de calibrare dacă butonul extern este apasă în timp ce
circuitul este alimentat. Display -ul este setat la 10,000.000 CAL și rămâne fix , chiar
dacă ajustările sunt făcute. În cazul în care butonul est e ținut apăsat, rotirea arborelui
codificatorului duce la creșterea sau la descreșterea valoarea "OSC", care este folosit
pentru a calcula cuvântul de control a sintezei directe digital e. Rata de ajustare
calibrării de bază este foarte scăzut a. O viteză de ajustare ceva mai mare este
disponibil ă prin apăsarea arborelui codificatorului jos în timp ce codificatorul este
rotit. Pentru a ieși din modul de calibrare, trebuie eliberat butonul extern care a fost
apăsat și trebuie rotite arborelui codificatorului mai multe ori, așa iese programul
din modul de calibrare. După calibrare valoarea calibrată ".osc" este stocat ă în
memoria EEPROM.
Pentru o mai buna înțele gere a software -ului proiectat și implementat, voi
explica î n cele ce urmează, câteva di ntre secvențele de program mai importante.
Secvența de cod cu care începem prezintă tipul de dispozitiv și opțiuni le pe care
le avem la dispoziție:
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
39
processor PIC16F84
radix dec
errorlevel -220
errorlevel -305
După secvența care detectează tipul de dispozitiv și opțiunile pe care le oferă
dispozitivul , urmează secvența cu i nformațiile despre configurarea siguranțelor
(fuse -bits):
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
_config _CP_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC
În continuare este necesar să introducem ecuați a generală pe care o folosim în
stabilirea frecventei de ceas . Acest a ecuați e poate fi modificat ă pentru a potrivi
frecvența de ceas de referință, adică limita superioară de frecvență dorit ă și frecvența
de pornire obișnuită.
ref_osc reprezintă schimbarea în cuvântul de control de frecvență, care rezultă
într-o schimbare de 1 Hz la frecvența de ieșire. Acesta este interpretat ă ca un punct
fix în întreg ul format <ref_osc_3>. <ref_osc_2> <ref_osc_1> <ref_osc_0> .
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
40
Valorile pentru frecvențe de oscilator comune sunt următoarele:
Frecvență ref_osc_3 ref_osc_2 ref_osc_1 ref_osc_0
120.00 MHz 0x23 0xCA 0x98 0xCE
100.00 MHz 0x2A 0xF3 0x1D 0xC4
90.70 MHz 0x2F 0x5A 0x82 0x7A
66.66 MHz 0x40 0x6E 0x52 0xE7
66.00 MHz 0x41 0x13 0x44 0x5F
50.00 MHz 0x55 0xE6 0x3B 0x88
Pentru a calcula alte valori:
ref_osc_3 = (232/ frecvențe oscilator în Hertz );
ref_osc_2, ref_osc_1 și ref_osc_0 sunt parte fracționată a (232 / frecvențe
oscilator în Hertz) ori 224;
Notă: 232 = 4294967296 și 224 = 16777216
De exemplu, pentru un ceas 120 MHz:
ref_osc_3 este (232 / 120 x 106) = 35.791394133 rotunjit la 35 are
valoarea (0x23)
ref_osc_2 este bitul mai mare (.791394133 x 2^24) = 13277390.32
13277390.32 = 0xCA98CE, deci bitul mare este CA.
ref_osc_1 este următorul bit pentru 0xCA98CE sau 98
ref_osc_0 este ultimul bit pentru 0xCA98CE sau CE
Momentan oscilatorul este setat la 100 de MHz care înseamnă că ref_osc_3 este
cel mai semnificativ bit, după care urmează ref_osc_2 următorul bit, după care vine
ref_osc_1 care este la fel următorul bit și la sfârșit vine ref_osc_0 care este cel mai puțin
semnificativ bit .
ref_osc_ 3 equ 0x2A
ref_osc_2 e qu 0xF3
ref_osc_1 e qu 0x1D
ref_osc_0 equ 0xC4
Urmează limita care conține frecvența limită superioară, un întreg pe 32 biți.
Aceasta nu ar trebui să fie setat la mai mult de o treime din frecvența oscilatorului de
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
41
referință. Filtrul de ieșire a plăcii de sintez ă direct di gitală trebuie să fie proiectat în așa
fel încât să permită trecerea frecventei pana la Fmax.
limit_3 equ 0x01 ; Cel mai semnificativ bit pentru 30 MHz
limit_2 equ 0xC9 ; Bitul următor
limit_1 equ 0xC3 ; Bitul următor
limit_0 equ 0x80 ; Cel mai puțin semnificativ bit
Secvența Default conține frecvența de pornire implicit 32 de biți.
default_3 e qu 0x00 ; Cel mai semnificativ bit pentru 14.025 MHz
default_2 equ 0xD6 ; Bitul următor
default_1 equ 0x01 ; Bitul următor
default_0 equ 0x28 ; Cel mai puțin semnificativ bit
band_end equ 0x28 ; Diferența față de ultima intrare la tabel
; de bandă
După ce am discutat despre ecuațiile generale pe car e folosește programul
trecem la porturi și la constantele EEPROM. Const antele sunt implementate cu
următoarea secvență de cod.
PortA equ 0x05
PortB equ 0x06
TRISA equ 0x05
TRISB equ 0x06
EEdata equ 0x08
EEadr equ 0x09
WREN equ 0x02
WR equ 0x01
RD equ 0x00
Ca să știm ce, unde și cum, în microcontroler trebuie să denumim pi ni de intrare
și de ieșire. Acest lucru a fost realizat pentru registru A și B cu următorul secvență de
cod.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
42
; Biți registru B :
DDS_load equ 0x00 ; Actualizarea PIN -ul pe AD9850
LCD_rs equ 0x01 ; 0=instrucțiune, 1=data
LCD_rw equ 0x02 ; 0=scriere, 1=citire
LCD_e equ 0x03 ; 0=inactivare, 1=activare
DDS_clk equ 0x05 ; AD9850 scrie ceasul
DDS_dat equ 0x07 ; AD9850 introducere datelor de serie
; Biți registru A:
pb_switch equ 0x03 ; Calibrarea Push Button -lui
După ce se alocă variabilele în scop ge neral, în spațiu de registru, la sfârșit
microcontrolerul este resetat la 0, adică la 0x00 și vectorul de întrerupere este setat la
0x04.
Programul folosește așa numit a tabelă de bandă la care fiecare intrare este
alcătuit ă din patru instrucțiuni lungi; fiecare grup de patru litere reprezintă frecvența ca
un întreg pe 32 de biți. Noile mențiuni pot fi adăugate la sfârșitul tabelului sau între
intrările existente. Constantă band_end trebuie incrementată cu 4 pentru fiecare in trare
adăugat ă. Acest tabel este plasat în partea de sus a prog ramului, pentru a permite o tabelă
cât mai mare posibil pentru a fi indexat cu valoarea opt biți în W.
După resetarea microcontrolerului secvența următoare Sare în jurul tabelului
de bandă la programul principal.
ORG 0x0000
reset_entry
goto start
După care vine tabelă de bandă cu 4 instrucțiuni .
band_table
addwf PCL,f ;
retlw 0x00 ; 0 Hz
retlw 0x00 ;
retlw 0x00 ;
retlw 0x00 ;
retlw 0x00 ; 160 meters
retlw 0x1B ;
retlw 0x77 ;
retlw 0x40 ;
retlw 0x00 ; 80 meters
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
43
retlw 0x35 ;
retlw 0x67 ;
retlw 0xE0 ;
retlw 0x00 ; 40 meters
retlw 0x6A ;
retlw 0xCF ;
retlw 0xC0 ;
retlw 0x00 ; 30 meters
retlw 0x9A ;
retlw 0x1D ;
retlw 0x20 ;
retlw 0x00 ; 20 meters
retlw 0xD5 ;
retlw 0x9F ;
retlw 0x80 ;
retlw 0x01 ; 17 meters
retlw 0x13 ;
retlw 0xB2 ;
retlw 0x20 ;
retlw 0x01 ; 15 meters
retlw 0x40 ;
retlw 0x6F ;
retlw 0x40 ;
retlw 0x01 ; 12 me ters
retlw 0x7B ;
retlw 0xCA ;
retlw 0x90 ;
retlw 0x01 ; 10 meters
retlw 0xAB ;
retlw 0x3F ;
retlw 0x00 ;
retlw 0x01 ; 30 MHz
retlw 0xC9 ;
retlw 0xC3 ;
retlw 0x80 ;
Până acum a fost vorba despre tipul de dispozitiv pe care îl folosim, configurarea
fuse-bits-ilor, ecuații le pe care folosește programul, porturi, constanta EEPROM și așa
mai departe. Acuma urmează codul principa l, adică putem să spunem că aici începe
programul. Programul principal inițializează displayul LCD și de tectează necesitatea de
intrare în modul de calibrare. Dacă se detectează , intră în rutina de calibrare. În caz
contrar, se stabilește frecvența de pornire și intră în bucla de sondaj a codificatorului.
Din aceasta rezultă ca intrarea, adică inputul est e frecvența de pornire care este definit ă
în default 3. Definițiile de mai sus, se bazează pe oscilatorul de referință și constanta
este definită în ref_osc_3, ref_osc_2, ref_osc_1, ref_osc_0. Ca rezultat , la ieșire, adică
la output primim funcționarea nor mală a generatorului de semnal.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
44
start
clrf INTCON ; Nu sunt întreruperi
bsf STATUS,B_RP0 ; Comută la banca 1
bsf 0x01,7 ; Dezactivarea tracțiuni slabe
movlw 0xFF ; Port tri state A
movwf TRISA ;
clrf TRISB ; Setează portul B la toate ieșirile
bcf STATUS,B_RP0 ; Comută înapoi la bancă 0
call init_LCD ; Inițializează LCD
Întră în modul d e calibrare în cazul în care buton ul este apăsat în timp ce este
pornit ă alimentarea.
btfsc PortA,pb_switch ; Este apăsat comutatorul?
goto read_EEocs ; Nu, obține ceas de frecvențe de la
; EEPROM
call calibrate ; Da, atunci calibrează
Ia constanta oscilator ului de referință de la EEPROM.
read_EEocs
clrf EEadr ; Resetă adresa de citire EEPROM
call read_EEPROM ; Citește EEPROM
movf EEdata,w ; Ia primul bit OSC
movwf osc_0 ; Salvează frecvență OSC
call read_EEPROM ; Ia următorul bit
movf EEdata,w ;
movwf osc_1 ; Salvează
call read_EEPROM ; Ia al treilea bit
movf EEdata,w ;
movwf osc_2 ; Salvează
call read_EEPROM ; Ia al patrulea bit
movf EEdata,w ;
movwf osc_3 ; Salvează
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
45
Setează frecvenț a la valoarea definită.
movlw default_0 ; Ia cel mai puțin semnificativ bit
movwf freq_0 ; Salvează
movlw default_1 ; Ia următorul bit
movwf freq_1 ; Salvează
movlw default_2 ; Și următorul
movwf freq_2 ; Salvează
movlw default_3 ; Obține cel mai semnificativ bit
movwf freq_3 ; Salvează
Afișarea puterii pe frecvență.
call bin2BCD ; Îl transformă în BCD
call show_freq ; Afișare
Trimite puterea de frecvență la cip ul DDS.
call calc_dds_word ; Conversia în valoare delta
call send_dds_word ; Trimite frecvența de pornire a
; AD9850 în modul de serie
Ia puterea de la valoarea codificatorului .
movf PortA,w ; Citește portul A
movwf ren_read ; Salvează în ren_read
movlw 0x03 ; Ia masca encoder
andwf ren_read,w ; Ia biți encoder
movwf ren_old ; Salvează în ren_old
Inițializa variabile.
clrf ren_timer_1 ; Inițializa cronometrul viteză encoder
movlw 0x40 ; la
movwf ren_timer_0 ; 0x0040
clrf last_dir ; Șterge indicatorul de direcție
clrf band ; Șterge indicatorul de bandă
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
46
După inițializarea LCD -ul și detectarea de intrare în modul de calibrare, se
execută mai departe codul spre bucl a principală a acestuia . Când arborele codificatorului
se schimbă direcția în care se mută , aceasta este determinată și stocată în last_dir.
Subrutina apoi revine la programul principal.
În cazul în care comutatorul nu a fost apăsat , atunci variabila fstep este calculată
pe baza de întârziere între modificarea arborelui codificatorului. ren_timer conține
valoarea de întârziere determinată de subrutina poll_encoder. Se adaugă fstep variabil
sau scade de la frecvența VFO. Conținutul de frecvențe este apoi convertit la un număr
BCD în subrutina bi n2BCD. Subrutină show_freq este apoi apelat ă pentru a a fișa
rezultatul pe Display -ul LC D. Apoi, subrutina calc_dds_word , este folosit ă pentru a
calcula cuvântul de control al frecvenței de la valorile de frecvențe și OSC. Rezultatul
este stocat in AD9850 prin apelul subrutinei send_dds_word.
Aceste date sunt transferate la cipul AD9850 DDS. Dacă butonul este apăsat în timp
ce pornește codificatorul atunci frecvența este încărcat cu o constantă stocat ă în
band_table. Banda variabilă este folosit ă ca index în tabela. Banda este incrementat ă
sau decrementat ă în funcție de direcția codificatorului.
main
call poll_encoder ; Verificarea dacă butonul este în
; mișcare
btfss ren_read,3 ; Schimbă banda?
goto change_band ; Da, atunci schimbă banda
Determină dimensiunea pasul ui pentru a folosi (1 Hz sau 1 kHz).
clrf fstep_3 ; Dorește 1Hz pentru stabilirea fstep la
; unu.
clrf fstep_2 ;
clrf fstep_1 ;
movlw 0x01 ;
movwf fstep_0 ;
btfsc ren_read,2 ; Este apăsat butonul codificatorului?
goto go_step ; Nu, utilizează pasul 1 Hz
movlw 0xE8 ; Da, setați valoarea pasului de 1 kHz
movwf fstep_0 ; prin stabilirea fstep_0 la 0xE8 și
movlw 0x03 ; fstep_1 la 0x03
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
47
movwf fstep_1 ;
goto go_step ; Utilizează pasul 1 kHz
Reglarea pasului de tuning se bazează pe ren_timer. ren_timer este incrementat
cu 8 de la valoarea inițială de 0x0040 de fiecare dată când poll_encoder nu găsește nici o
schimbare la intrarea codificatorului până când bitul ridicat de ren_timer_1 devine unu.
Implicit fstep de 1 Hz este înmulțit cu doi pentru fiecare zero la ren_timer, până la un
maxim 9 ori. Cu cât mai repede butonul este rotit, cu atât scade numărul la ren_timer și
va fi valoare de pas mai mare.
bump_step
bcf STATUS,B_C ;
rlf fstep_0,f ; Multiplicarea pasul cu 2 prin rotirea
; la stânga
rlf fstep_1,f ;
rlf fstep_2,f ;
rlf fstep_3,f ;
go_step
rlf ren_timer_0,f ; Multiplică cronometrul codificatorului
; cu 2
rlf ren_timer_1,f ;
btfss STATUS,B_C ;
goto bump_step ;
În funcție de direcția butonului, se crește sau se scade increment ul, actualizarea
fiind văzută pe LCD și DDS .
btfsc last_dir,1 ; Crește?
goto up ; Da, atunci se adaugă incrementul
down
call sub_step ; Scade fstep de la frecvența
goto write ; Actualizarea LCD și DDS
up
call add_step ; Adaugă fstep la frecvența
call check_add ; Asigurarea că nu este depăși valoarea
; maximă
goto write ; Actualizarea LCD și DDS
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
48
Următorul s egment de incrementare prin tabel de bandă, de fiecare dată când
butonul se mută o poziție se actualizează LCD -ul și DDS -ul, până când butonul de bandă
nu mai este apăsat.
change_band
btfsc last_dir,1 ; Merge sus în lista de bandă?
goto band_up ; Da, adresa bandă creștere
movlw 0x04 ; Nu, primește 4 biți pentru scădere
subwf band,f ; Deplasarea jos în lista de bandă
movlw 0xFF -band_end ; Verificați pentru a vedea dacă am căzut
addwf band,w ; de pe partea de jos a tabelului.
btfss STATUS,B_C ; Pe partea de jos?
goto valid ; Nu, continua
movlw band_end ; Da, du-te la cel mai înalt intrare
movwf band ;
valid
call get_band ; Ia noua banda de frecvență
goto write ; Setează frecvența și continuă
band_up
movlw 0x04 ; Intrări de tabel sunt 4 biți distanță
addwf band,f ; Incrementarea indicat orul de bandă
movlw 0xFF -band_end ; Verificarea pentru a vedea dacă am
addwf band,w ; trecut peste partea de sus a tabelului.
btfsc STATUS,B_C ; Am trecut peste partea de sus a
; tabelului?
clrf band ; Da, du-te la intrarea de jos
call get_band ; Ia noua banda de frecvență
write
call bin2BCD ; Convertă frecvența la BCD
call show_freq ; Afișarea frecvența pe ecranul LCD
call calc_dds_word ; Găsește cuvântul de control pentru cip
; DDS
call send_dds_word ; Trimite cuvântul de control pentru
; cip DDS
goto main ; Continua interogarea codificatorului
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
49
Următoarea rutin ă citește valoarea de frecvență de la o intrare din tabel ul de
bandă și returnează aceasta în freq_3 … freq_0. După care trece la inițializare a ecranul
LCD . Ecranul LCD trebuie să fie echivalent cu un Hitachi 44780 .Se presupune că ecran
LCD este dimensiunea de 16 X 2. Tot procesul de inițializare al LCD -ului are loc in
subrutina init_LCD.
Rutina următoare adaugă la valoarea de 32 biți al fstep valoarea de 32 biți a
frecvențe i. Când se incrementează, valoarea fstep este un număr întreg pozitiv. Când
este decrementat, fstep are valoarea scăzut ă a complementului.
add_step
movf fstep_0,w ; Ia bitul scăzută a incrementului
addwf freq_0,f ; Adaugă la bitul scăzut de frecvențe
btfss STATUS,B_C ; Orice transfer ?
goto add1 ; Nu, se adaugă la bitul următor
incfsz freq_1,f ; Pulsația transportă până la următorul
; bit
goto add1 ; Nu transportă nou, se adaugă următorul
; bit
incfsz freq_2,f ; Pulsația transportă până la următorul
; bit
goto add1 ; Nu transporta nou, se adaugă următorul
; bit
incf freq_3,f ; Pulsația transportă până la cel mai
; înalt bit
add1
movf fstep_1,w ; Ia următorul bit de incrementare
addwf freq_1,f ; Adaugă la următoarea bit superior
btfss STATUS, B_C ; Orice transport?
goto add2 ; Nu, se adaugă la bitul următor
incfsz freq_2,f ; Pulsația transporta până la următorul
; bit
goto add2 ; Nu transporta nou, se adaugă următorul
; bit
incf freq_3,f ; Pulsația transporta până la cel mai
; înalt octet
add2
movf fstep_2,w ; Ia următorul cea mai semnificativă
; increment
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
50
addwf freq_2,f ; Adaugă la bitul de frecvențe
btfss STATUS,B_C ; Orice transport?
goto add3 ; Nu, se adaugă ultimul bit
incf freq_3,f ; Pulsația transpo rtă până la cel mai
; înalt bit
add3
movf fstep_3,w ; Obține cel mai semnificativ bit de
; incrementare
addwf freq_3,f ; Adaugă la cea mai semnificativă
; frecvențe
return ; Revenim la apelant
In următorul pas se verifica dacă frecvența depășește limita superioară. În care
se verifică cel mai semnificativ bit, după care se verifică al doilea cel mai semnificativa
bit, al treilea cel mai semnificativ bit și verifică în ultimul rând cel mai puțin
semnificativ bit , după care revine la apelant.
Se scade pasul de incrementare al frecvențe i și se impune condiția ca acesta să
fie pozitiv.
sub_step
comf fstep_0,f ; Scăderea fstep de la
comf fstep_1,f ; frecvențe se face prin adăugarea
comf fstep_2,f ; compliment câte două de la fstep
comf fstep_3,f ; frecvențe.
incfsz fstep_0,f ; Incrementare ultimul bit
goto comp_done ; Diferită de zero, continuă
incfsz fstep_1,f ; Incrementare următorul bit
goto comp_done ; Diferită de zero, continuă
incfsz fstep_2,f ; Incrementare următorul bit
goto comp_done ; Diferită de zero, continuă
incf fstep_3,f ; Increment are bitul înaltă
comp_done
call add_step ; Adaugă compliment pentru a face
; scăderea
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
51
În cazul în care frecve nța este negativ ă, se reinițializează cu 0.
btfss freq_3,7 ; Este frecvența înaltă bit "negativ"?
goto exit2 ; Nu, merge mai departe
set_min
clrf freq_0 ; Da, setează frecvența la zero
clrf freq_1 ;
clrf freq_2 ;
clrf freq_3 ;
exit2
return ; Revenim la apelant
Secvența care urmează înregistrează timpul scurs pentru ca butonul să se mute
o poziție în ren_timer. Șterge timer -ul watchdog. Și citește biții codificatorului până
când este detectată o schimbare. Când es te detectată o schimbare, atunci determină
direcția la care a fost mutat butonul.
După secvența anterioară programul avansează la rutina unde programul intră în
mod de calibrare. După c um a fost menționat aceast ă rutin ă intră în mod de calibrare
numai dacă este apăsat butonul la pornirea sistemului. "10,000.00 CAL" este afișat pe
ecranul LCD, iar cipul DDS este programat pentru a produce 10 MHz, în funcție de
valoarea OSC stocat ă în EEPROM. Atâta timp cât este apăsat but onul, valoarea OSC
este modifica tă lent pentru a permite ieșirii să fie tăiată la exact 10 MHz. Odată ce
codificatorul este rotit după ce butonul este eliberat, noua valoare OSC este stocată în
EEPROM și începe funcționarea normală.
calibrate
movlw 0x80 ; Setează frecvența de 10MHz de
movwf freq_0 ; setarea de frecvențe la echivalentul
; binar
movlw 0x96 ; de 10.000.000.
movwf freq_1 ; .
movlw 0x98 ; .
movwf freq_2 ; .
movlw 0x00 ; .
movwf freq_3 ; .
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
52
După care se citește valorarea de referință a oscilator ului de la EEPROM.
Urmează rutina, unde se trimite cuvântul de control către AD9850 folosind un
transfer de date serial . Acest lucru se întâmpla rutina send_dds_word.
send_dds_word
movlw AD9850_0 ; Punct FSR la AD9850
movwf FSR ;
next_byte
movf INDF,w ;
movwf byte2send ;
movlw 0x08 ; Setează contorul la 8
movwf bit_count ;
next_bit
rrf byte2send,f ; Testarea în cazul în care următorul bit
; este 1 sau 0
btfss STATUS,B_C ; A fost zero?
goto send0 ; Da, trimite la zero
bsf PortB,7 ; Nu, trimite unu
bsf PortB,5 ; Comutare ceas de scriere
bcf PortB,5 ;
goto break ;
send0
bcf PortB,7 ; Trimite la zero
bsf PortB,5 ; Comutare ceas de scriere
bcf PortB,5 ;
break
decfsz bit_count,f ; A fost trimis to ate biți?
goto next_bit ; Nu, merge mai departe.
incf FSR,f ; Începe următorul bit dacă nu e terminat
movlw AD9850_4+1 ; Următorul bit
subwf FSR,w ;
btfss STATUS,B_C ;
goto next_byte ;
bsf PortB,0 ; Trimite semnal de sarcină la AD9850
bcf PortB,0 ;
return ;
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
53
Subrutina următoare convertește un număr de 32 de biți într-un cod BCD 10 de
cifre. Valoarea de intrare luată de la freq(0 la 3) este păstrată. Ieșirea este în BCD (0 la 4) și
păstrează fiecare bit (hi_digit,lo_digit) cele mai semnificative cifre se afle în BCD_4.
bin2BCD
movlw 0x20 ; Setează contorul de buclă
movwf BCD_count ; la 32
clrf BCD_0 ; Șterge ieșirea
clrf BCD_1 ; " "
clrf BCD_2 ; " "
clrf BCD_3 ; " "
clrf BCD_4 ; " "
bin_loop
bcf STATUS,B_C ; Șterge bitul de transport în STATUS
Construiește codul BCD. Mut a din LS bit în BCD bit (LS de BCD_0) de la MS
bit de freq_3 prin bit Carry.
rlf BCD_0,f ; Rotire la stânga , Carry->LS bit, MS
; bit->Carry
rlf BCD_1,f ; Rotire la stânga , Carry->LS bit, MS
; bit->Carry
rlf BCD_2,f ; Rotire la stânga , Carry->LS bit, MS
; bit->Carry
rlf BCD_3,f ; Rotire la stânga , Carry->LS bit, MS
; bit->Carry
rlf BCD_4,f ; Rotire la stânga , Carry->LS bit, MS
; bit->Carry
decf BCD_count,f ; Decrementează numărul de buclă
btfss STATUS,B_Z ; Este, acuma contorul de buclă zero?
goto adjust ; Nu, merge să face reglare
return ; Da, iese
Subrutina adjust este o s ubrutină intern ă, la care bin2BCD apelează numai in bucla
principal ă. Codul BCD este construit de așa natura încă nu poate avea valori mai mari de 9 . În
cazul în care devine mai mare decât 9, incrementează următorul.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
54
adjust
movlw BCD_0 ; Ia pointerul de la BCD_0
movwf FSR ; Pune pointerul în FSR pentru abordarea
; indirectă
call adj_BCD ;
incf FSR,f ; Mută indicatorul de adresare indirectă
; la BCD_1
call adj_BCD ;
incf FSR,f ; Mută indicatorul de adresare indirectă
; la BCD_2
call adj_BC D ;
incf FSR,f ; Mută indicatorul de adresare indirectă
; la BCD_3
call adj_BCD ;
incf FSR,f ; Mută indicatorul de adresare indirectă
; la BCD_4
call adj_BCD ;
goto bin_loop ; Trece înapoi la bucla principală
Subrutină intern ă, apelează numai adjust
adj_BCD
movlw 3 ; Adaugă 3
addwf INDF,w ; la cel mai puțin semnificativ bit
movwf BCD_temp ; Salvează în temp
btfsc BCD_temp,3 ; Este cel mai puțin semnificativ bit + 3
; > 7
movwf INDF ; Da, salvează valoare incrementat ca cel
; mai puțin semnificat bit
movlw 0x30 ; A daugă 3
addwf INDF,w ; la cel mai semnificativ bit
movwf BCD_temp ; Salvează în temp
btfsc BCD_temp,7 ; Este cel mia semnificati v bit +3 > 7
movwf INDF ; Da, salvați valoare incrementat ca cel
; mai semnificativ bit
return ; Revine la subrutina adjust
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
55
Subrutina următoare este pentru a determina dacă LCD -ul a realizat ultima operație.
busy_check
clrf PortB ; Șterge toate ieșirile pe PortB
bsf STATUS,B_RP0 ; Comută cu bancă 1 pentru operarea
; Trista te
movlw b'11110000' ; Setează RB7, RB6, RB5, RB4 ca intrări
; și RB3, RB2, RB1, RB0 ca ieșiri
movwf TRISB ; prin Tristate
bcf STATUS,B_RP0 ; Comuta înapoi la bancă 0
bcf Por tB,LCD_rs ; Configură LCD pentru Read Busy Flag
bsf PortB,LCD_rw ; Configură LCD pentru Read
movlw 0xFF ; Configură constant a 255
movwf timer1 ; pentru cronometru buclă contor
LCD_is_busy
bsf PortB,LCD_e ; Set E înalt
movf PortB,w ; Citește PortB în W
movwf LCD_read ; Salvează W pentru testarea mai târziu
bcf PortB,LCD_e ; Aruncă din nou E
nop ; Așteaptă
nop ; puțin timp
bsf PortB,LCD_e ; Puls E înalt
nop ; așteaptă ,
bcf PortB,LCD_e ; și aruncă E iarăși
decf timer1,f ; Decrementează bucla de contor
btfsc STATUS,B_Z ; Este bucla de contor la zero?
goto not_busy ; Dacă da, întoarce indiferent
btfsc LCD_read,7 ; Este bitul Busy Flag (RB7) salvat?
goto LCD_is_busy ; Dacă nu, este ocupat și sare înapoi
not_busy
return
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
56
Secvența de cod care urmează s e referă la EEPROM. Scrie bitul de date la EEdata la
EEPROM la adresa EEadr.
write_EEPROM
bsf STATUS,B_RP0 ; Comută la bancă 1
bsf EEdata,WREN ; Setează EEPROM la bit write enable
movlw 0x55 ; Scrie 0x55 și 0xAA la EEPROM
movwf EEadr ; registru de control, după cum este
; necesar
movlw 0xAA ; pentru scriere
movwf EEadr ;
bsf EEdata,WR ; Setează WR să inițieze scriere
bit_check
btfsc EEdata,WR ; A finalizat scrierea?
goto bit_check ; Nu, păstreze verificarea
bcf EEdata,WREN ; Golește la EEPROM bitul write enable
bcf STATUS,B_RP0 ; Comuta la bancă 0
incf EEadr,f ; Incrementează adresa de scriere EE
return ; Revine la apelant
Citește un bit de date EEPROM la adresa EEADR în EEDATA.
read_EEPROM
bsf STATUS,B_RP0 ; Comuta la bancă 1
bsf EEdata,RD ; Cerere de citire
bcf STATUS,B_RP0 ; Comuta la bancă 0
incf EEadr,f ; Incrementează adresa de citire
return ; Revine la apelant
După citirea din EEPROM, ultima secvență este pentru așteptarea un ui anumit număr
de milisecunde. În care avem
Punct de intrare wait_128ms: Așteaptă 128 ms
Punct de intrare wait_64ms: Așteaptă 64 ms
Punct de intrare wait_32ms: Așteaptă 32 ms
Punct de intrare wait_16ms: Așteaptă 16 ms
Punct de intrare wait_8ms: Așteaptă 8 ms
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
57
wait_128ms
movlw 0xFF ; Configurarea buclei exterioară
movwf timer1 ; contorul la 255
goto outer_loop ; Merge la bucle de așteptare
wait_64ms
movlw 0x80 ; Configurarea buclei exterioară
movwf timer1 ; contorul la 12 8
goto outer_loop ; Merge la bucle de așteptare
wait_32ms
movlw 0x40 ; Configurarea buclei exterioară
movwf timer1 ; contorul la 64
goto outer_loop ; Merge la bucle de așteptare
wait_16ms
movlw 0x20 ; Configurarea buclei exterioară
movwf timer1 ; contorul la 32
goto outer_loop ; Merge la bucle de așteptare
wait_8ms
movlw 0x10 ; Configurarea buclei exterioară
movwf timer1 ; contorul la 16
outer_loop
movlw 0xFF ; Configura rea contorul buclă interioară
movwf timer2 ; la 255
inner_loop
decfsz timer2,f ; Decrementează contorul de buclă
; interioară
goto inner_loop ; Dacă contor buclă interior nu este la
; zero, apoi merge înapoi la bucla
; interioară din nou
decfsz timer1,f ; Da, Decrementează contorul buclă
; exterioară
goto outer_loop ; Dacă contor buclă exterioară nu este la
; zero, apoi merge înapoi la bucla
; exterioară din nou
return ; Da, revine la apelant
După aceasta iese din buclă și execuția programului se termină.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
58
5. Concluzi și contribuții personale
5.1 Concluzi
În concluzie putem afirma că dispozitivele DDS sunt dispozitive capabile sa
genereze forme de unda și au nevoie doar un semnal de ceas extern pentru a genera
valori sinusoidale simple.
Beneficiile dispozitivului se refer a la: putere scăzut ă, cost redus, are un design
compact ș i poate fi implementat foarte simplu, combinat cu performanțele lor excelente
inerente și capacitatea s -a de a programa digital.
Dispozitivele DDS sunt o soluție extrem de atractiv ă, de preferat in locul altor
soluții clasice, mai puțin flexibile care necesita agregări de elemente discrete.
5.2 Contribuții personale
Sintetizând cele expuse în decursul prezentei lucrări de diplomă, enumăr
principalele contribuții personale aduse:
– Studierea informațiilor despre cipul DDS și funcționarea lui
– Studierea modului de funcționare al microcontroler -ului
– Proiectarea schemei electrice
– Realizarea practică dispozitivului
– Realizarea programului pentru microcontroler
5.3 Dezvoltări ulterioare
Realizarea unei interfețe g rafice intuitive, afișarea acesteia prin intermediul
ecranului LCD ș i controlarea ei cu ajutorul butoanelor implementate . Intefata
grafica propusa va oferi utilizatorului posibilitatea sa aleagă tipul de modulație
dorit și forma de undă a semnalului: drept unghiular, sinusoidal sau triunghiular.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
59
6. Bibliografie
[1] Ian Poole , DDS basics , website accesat la 2014 Martie la adresa
http://www.radio -electronics.com/info/rf -technology -design/pll -synthesizers/direct –
digital -synthesizer -dds-tutorial.php
[2] Nebojsa Matic, PIC microcontrollers for beginners, too!, May 2000, http://elektra –
ku.lt/attachments/File/Studentams/PIC_Microcontrollers_for_Beginners.pdf
[3] ***, Assembly – Introduction , Tutorialspoint , website accesat la 2014 Aprilie la adresa
http://www.tutorialspoint.com/assembly_programming/assembly_introduction.htm
[4] Eva Murphy, Colm Slattery, Ask The Application Engineer —33: All About Direct
Digital Synthesis (Analog Dialogue , Vol. 38, A 2004) ,
http://www.analog.com/library/analogdialogue/archives/38 -08/dds.html
[5] Osicom Technologies, website accesat la 2014 Martie la adresa
http://web.itu.edu.tr/~pazarci/ddstutor.html
[6] ***, Optica l Encoder Guide, Encoder Product Company , website accesat la 2014
Martie la adresa http://www.encoder.com/literature/optical -encoder -guide.pdf
[7] Romanca, Mihai , Sisteme cu calculator integrat , Notițe de curs, Universitatea
Transilvania Brașov, 2013 .
[8] Romanca , Mihai, Microprocesoare Notițe de curs, Universitatea Transilvania Brașov,
2012 .
[9]* **, LCD , Engineers Garage , website accesat la 2014 Mai la adresa
http://www.engineersgarage.com/electronic -components/16×2 -lcd-module -datasheet
[10] ***, Microcontrolerul PIC16F84, Scritub , website accesat la 2014 Mai la adresa
http://www.scritub.com/stiinta/informatica/Microcontrolerul -PICF44210218.php
[11] Vasile Lungu, Procesoare Intel. Programare în limbaj de asamblare. Ediția II,
Editura Teora , București, 2004.
[12] Pană , Gheorghe, Electronică Analogică , Notițe de curs, Universitatea Transilvania
Brașov, 2012 .
[13] ***, Sintetizoare de frecvență , Digital UBM , website accesat la 2014 Mai la adresa
http://www.digital .ubm.ro/?download=Radio12.pdf
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
60
[14] ***, AD9835: 50MHz Direct Digital Synthesizer, Waveform Generator, Datasheet,
Analog Devices, Norwood, MA, 2011, http://www.analog.com/static/imported –
files/data_sheets/AD9835.pdf
[15***, Low-Cost, High -Speed, Single -Supply Op Amps with Rail -to-Rail Outputs ,
DataSheet, Electronic Components, website accesat la 2014 Aprilie la adresa
http://www.alldatasheet.com/datasheet -pdf/pdf/73266/MAXIM/MAX4012.html
[16] *** , Signal Generator (VFO) with Direct Digital Synthesis , QSL, websit e accesat la
2014 Mai la adresa
http://www.qsl.net/yo5ofh/projects/dds_vfo_by_n2apb/ver2%2030%20mhz/
siggen3a.asm
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
61 7. Anexa
7.1 Anexa 1 Schema DDS
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
62 7.2 Anexa 2 Cod sursă
Software -ul a fost modificat după sursa de la www.qsl.net[16]
; ****************************************************************************
; * Tip de dispozitiv și opțiuni *
; ****************************************************************************
processor PIC16F84
radix dec
errorlevel -220
errorlevel -305
; ****************************************************************************
; * Informațiile de configurare al siguranței *
; ****************************************************************************
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
__config _CP_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC
;Stabilit pentru 100 MHz.
ref_osc_3 equ 0x2A ; Cel mai semnificativ bit la oscilator
ref_osc_2 equ 0xF3 ; Bitul următoare
ref_osc_1 equ 0x1D ; Bitul următoare
ref_osc_0 equ 0xC4 ; Cel mai puțin semnificativ bit
; Limita conține frecvența limită superioară prec um un număr întreg de 32 de
; biț.
limit_3 equ 0x01 ; Cel mai semnificativ bit pentru 30 MHz
limit_2 equ 0xC9 ; Bitul următoare
limit_1 equ 0xC3 ; Bitul următoare
limit_0 equ 0x80 ; Cel mai puțin semnificativ bit
; Implicit conține frecvența de pornire imp licit ca un întreg pe 3 2 de biț .
default_3 equ 0x00 ; Cel mai semnificativ bit pentru 14.025 MHz
default_2 equ 0xD6 ; Bitul următoare
default_1 equ 0x01 ; Bitul următoare
default_0 equ 0x28 ; Cel mai puțin semnificativ bit
band_end equ 0x28 ; Diferența față de ultima intrare tabel
; de bandă
; ****************************************************************************
; * Port și EEPROM Constantă *
; ****************************************************************************
PortA equ 0x05
PortB equ 0x06
TRISA equ 0x05
TRISB equ 0x06
EEdata equ 0x08
EEadr equ 0x09
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
63
WREN equ 0x02
WR equ 0x01
RD equ 0x00
; ****************************************************************************
; * Informații despre locație ID *
; **************************************** ************************************
ORG 0x2000
DATA 0x007F
DATA 0x007F
DATA 0x007F
DATA 0x007F
; ****************************************************************************
; * Configurare constan ta inițială, în funcție de frecvența oscilatorului *
; * de referință. Acest lucru poate fi optimizat cu funcția de calibrare. *
; ****************************************************************************
ORG 0x2100
DATA r ef_osc_0
DATA ref_osc_1
DATA ref_osc_2
DATA ref_osc_3
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
; ****************************************************************************
; * Pagina RAM registre de fișiere independente: *
; ****************************************************************************
INDF EQU 0x00
PCL EQU 0x02
STATUS EQU 0x03
FSR EQU 0x04
PCLATH EQU 0x0A
INTCON EQU 0x0B
; *****************************************************************************
; * Numere de biți pentru registrul STATUS: *
; *****************************************************************************
B_RP0 EQU 5
B_NTO EQU 4
B_NPD EQU 3
B_Z EQU 2
B_DC EQU 1
B_C EQU 0
; ***************************************************** ***********************
; * Atribuirea numele de pini IO. *
; ****************************************************************************
; Biți registru B:
DDS_load equ 0x00 ; Actualizarea PIN-ul pe AD9850
LCD_rs equ 0x01 ; 0=instrucțiune, 1=data
LCD_rw equ 0x02 ; 0=scriere, 1=citire
LCD_e equ 0x03 ; 0=inactivare, 1=activare
DDS_clk equ 0x05 ; AD9850 scrie ceasul
DDS_dat equ 0x07 ; AD9850 introducere datelor de serie
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
64
; Biți registru A:
pb_switch equ 0x03 ; Calibrarea Push Button -lui, (activ scăzut)
; ****************************************************************************
; * Alocă variabile în scop general, spațiu registru *
; ****************************************************************************
CBLOCK 0x0c ; Start date Block
freq_0 ; Frecvență de afi șare (hex)
freq_1 ; (4 biți)
freq_2
freq_3
BCD_0 ; Frecvență de afișare (BCD)
BCD_1 ; (5 biți)
BCD_2
BCD_3
BCD_4
AD9850_0 ; AD9850 cuvânt de control
AD9850_1 ; (5 biți)
AD9850_2
AD9850_3
AD9850_4
fstep_0 ; Frecvență inc/dec
fstep_1 ; (4 biți)
fstep_2
fstep_3
BCD_count ; Folosit în rutina bin2BCD
BCD_temp ; "
mult_count ; Folosit în calc_dds_word
bit_count ; "
byte2send ;
osc_0 ; Oscilator actuală
osc_1 ; (4 biți)
osc_2
osc_3
osc_temp_0 ; Frecvență de oscilație
osc_temp_1 ; (4 biți)
osc_temp_2
osc_temp_3
LCD_char ; Caracter fiind trimis la LCD
LCD_read ; Caracter citit de pe ecranul LCD
timer1 ; Utilizat în rutine de întârziere
timer2 ; "
ren_timer_0 ; Pentru acordare rată variabilă
ren_timer_1 ; (2 biți)
ren_new ; Nou valoare a encoderului pini A și B
ren_old ; Vechea valoare a encoderului pini A și B
ren_read ; Pini encoder A și B și comutator pini
last_dir ; Indică ultima direcție de encoder
next_dir ; Indică direcția așteptată
count ; contor buclă
band ; Utilizat pentru a indexa un tabel de
; frecvențe
rs_value ; Valoarea LCD rs
ENDC ; Sfârșitul blocul de date
; ****************************************************************************
; * 16F84 resetează la 0x00. *
; * Vectorul de întrerupere este la 0x04. (Nefolosit) *
; ****************************************************************************
ORG 0x0000
reset_entry
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
65
goto start ; Sare în jurul tabela de bandă
; la programul principal
band_table
addwf PCL,f ;
retlw 0x00 ; 0 Hz
retlw 0x00 ;
retlw 0x00 ;
retlw 0x00 ;
retlw 0x00 ; 160 metri
retlw 0x1B ;
retlw 0x77 ;
retlw 0x40 ;
retlw 0x00 ; 80 metri
retlw 0x35 ;
retlw 0x67 ;
retlw 0xE0 ;
retlw 0x00 ; 40 metri
retlw 0x6A ;
retlw 0xCF ;
retlw 0xC0 ;
retlw 0x00 ; 30 metri
retlw 0x9A ;
retlw 0x1D ;
retlw 0x20 ;
retlw 0x00 ; 20 metri
retlw 0xD5 ;
retlw 0x9F ;
retlw 0x80 ;
retlw 0x01 ; 17 metri
retlw 0x13 ;
retlw 0xB2 ;
retlw 0x20 ;
retlw 0x01 ; 15 metri
retlw 0x40 ;
retlw 0x6 F ;
retlw 0x40 ;
retlw 0x01 ; 12 metri
retlw 0x7B ;
retlw 0xCA ;
retlw 0x90 ;
retlw 0x01 ; 10 metri
retlw 0xAB ;
retlw 0x3F ;
retlw 0x00 ;
retlw 0x01 ; 30 MHz
retlw 0xC9 ;
retlw 0xC3 ;
retlw 0x80 ;
; *****************************************************************************
; * Acesta este începutul programului. *
; *****************************************************************************
start
clrf INTCON ; Nu sunt întreruperi de acum
bsf STATUS,B_RP0 ; Comută la banca 1
bsf 0x01,7 ; Dezactivarea tracțiuni slabe
movlw 0xFF ; Port tri state A
movwf TRISA ;
clrf TRISB ; Setează portul B la toate ieșirile
bcf STATUS,B_RP0 ; Comuta înapoi la bancă 0
call init_LCD ; Inițializă LCD
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
66
; Întră în modul de calibrare în cazul în care buton este apăsat în timp ce
; porniți alimentarea.
btfsc PortA,pb_switch ; Este apăsat comutatorul?
goto read_EEocs ; Nu, obține ceas de frecvențe de la EEPROM
call calibrate ; Da, calibră
; Ia constanta oscilator de referință de la EEPROM.
read_EEocs
clrf EEadr ; Resetă adresa de citire EEPROM
call read_EEPROM ; Citește EEPROM
movf EEdata,w ; Ia primul bit OSC
movwf osc_0 ; Salvează frecvență OSC
call read_EEPROM ; Ia următorul bit
movf EEdata,w ;
movwf osc_1 ; Salvați -l
call read_EEPROM ; Ia al treilea bit
movf EEdata,w ;
movwf osc_2 ; Salvați -l
call read_EEPROM ; Ia al patrulea bit
movf EEdata,w ;
movwf osc_3 ; Salvați -l
; Setează puterea de la frecvență la valoarea definită.
movlw default_0 ; Ia cel mai puțin semnificativ bit
movwf freq_0 ; Salvați -l
movlw default_1 ; Ia următorul bit
movwf freq_1 ; Salvați -l
movlw default_2 ; Și următorul
movwf freq_2 ; Salvați -l
movlw default_3 ; Obține cel mai semnificativ bit
movwf freq_3 ; Salvați -l
; Afișarea puterea pe frecvență.
call bin2BCD ; Îl transformă în BCD
call show_freq ; Afișă
; Trimite puterea de frecvență la cip DDS.
call calc_dds_word ; Conversia în valoare delta
call send_dds_word ; Trimite frecvența de pornire a
; AD9850 în modul de serie
; Ia puterea de la valoarea encoder.
movf PortA,w ; Citesc portul A
movwf ren_read ; Salvați -l în ren_read
movlw 0x03 ; Ia masca encoder
andwf ren_read,w ; Ia biți encoder
movwf ren_old ; Salvați în ren_old
; Inițializa variabile.
clrf ren_timer_1 ; Inițializa cronometrul viteză encoder
movlw 0x40 ; la
movwf ren_timer_0 ; 0x0040
clrf last_dir ; Șterge indicatorul de direcție
clrf band ; Șterge indicatorul de bandă
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
67
; Se încadrează în programul principal de bu clă
main
call poll_encoder ; Verificați mișcarea butonului
btfss ren_read,3 ; Schimba banda?
goto change_band ; Da, schimba banda
; Determina dimensiunea pas de a utiliza (1 Hz sau 1 kHz).
clrf fstep_3 ; Ne dorim 1 Hz prin stabilirea fstep la 1.
clrf fstep_2 ;
clrf fstep_1 ;
movlw 0x01 ;
movwf fstep_0 ;
btfsc ren_read,2 ; Este apăsat butonul encoder?
goto go_step ; Nu, utilizează pasul 1 Hz
movlw 0xE8 ; Da, setați valoarea pasului de 1 kHz
movwf fstep_0 ; prin stabilirea fs tep_0 la 0xE8 și
movlw 0x03 ; fstep_1 la 0x03
movwf fstep_1 ;
goto go_step ; Utilizați pasul 1 kHz
bump_step
bcf STATUS,B_C ; Șterge carry flag -ul
rlf fstep_0,f ; Multiplică pasul cu 2 pentru rotirea la
stânga
rlf fstep_1,f ;
rlf fstep_2,f ;
rlf fstep_3,f ;
go_step
rlf ren_timer_0,f ; Multiplică cronome trul encoder cu 2
rlf ren_timer_1,f ;
btfss STATUS,B_C ;
goto bump_step ;
; În funcție de direcția butonul, fie pentru a adăuga sau scade increment,
; apoi actualizează LCD și DDS.
btfsc las t_dir,1 ; Butonul merge în sus?
goto up ; Da, apoi se adaugă increment
down
call sub_step ; Scade fstep de frecvențe
goto write ; Actualizare LCD și DDS
up
call add_step ; Adaugă fstep la frecvențe
call check_add ; Asigură că nu am depăși valoarea maximă
goto write ; Actualizarea LCD și DDS
change_band
btfsc last_dir,1 ; Mergem sus în lista de bandă?
goto band_up ; Da, incrementează adresa de bandă
movlw 0x04 ; Nu, primește 4 biți pentru a scădea
subwf band,f ; Mutare în jos în lista de bandă
movlw 0xFF -band_end ; Verificare a pentru a vedea dacă am
addwf band,w ; căzut de pe partea de jos a tabelului.
btfss STATUS,B_C ; Căzut de pe tabel?
goto valid ; Nu, continuă
movlw band_end ; Da, merge la c el mai înalt intrare
movwf band ;
valid
call get_band ; Ia noua banda de frecvență
goto write ; Setează frecvența și continua
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
68
band_up
movlw 0x04 ; Intrări de tabel sunt 4 biți de distanță
addwf band,f ; Incrementarea indicatorul benzii
movlw 0xFF -band_end ; Verificarea pentru a vedea dacă am trecut
; de-a lungul
addwf band,w ; partea de sus a tabelului.
btfsc STATUS,B_C ; Am trece peste partea de sus a tabelului?
clrf band ; Da, du -te la intrarea de jos
call get_band ; Ia noua banda de frec vență
write
call bin2BCD ; Convertesc frecvența la BCD
call show_freq ; Afișarea frecvenței pe ecranul LCD
call calc_dds_word ; Găsește cuvântul de control pentru cip DDS
call send_dds_word ; Trimite cuvântul de control pentru cipul
DDS
goto main ; Continua interogarea codificatorului
get_band
movf band,w ; Ia indicele octetul
call band_table ; Ia valoarea în W
movwf freq_3 ; Salvează în freq_3
incf band,f ; Incrementarea indicelui pentru următorul
; octet
movf band,w ; Ia indicele din următorul octet
call band_table ; Ia valoarea în W
movwf freq_2 ; Salvează în freq_2
incf band,f ; Incrementarea indicele pentru următorul
; octet
movf band,w ; Ia indicele pent ru următorul octet
call band_table ; Ia valoarea în W
movwf freq_1 ; Salvează în freq_1
incf band,f ; Incrementarea indicele de octet scăzut
movf band,w ; Ia indicele de oct et scăzut
call band_table ; Ia valoarea în W
movwf freq_0 ; Salvează în freq_0
movlw 0x03 ; Obține o constantă trei
subwf band,f ; Restabili valoarea inițială din benzii
return ; Revine la apelant
init_LCD
call wait_64ms ; Așteaptă LCD -ul pentru a porni
movlw 0x30 ; Inițializarea instrucțiunile LCD
movwf PortB ; Trimite la LCD prin RB7 .. RB0
bsf PortB,LCD_e ; Setați E linia de LCD ridicat,
call wait_64ms ; aștepte un timp "lung",
bcf PortB,LCD_e ; și apoi Clear E
movlw 0x30 ; Inițializarea instrucțiunile LCD
movwf PortB ; Trimite la LCD prin RB7 .. RB0
bsf PortB,LCD_e ; Set E ridicat,
call wait_32ms ; așteptați puțin,
bcf PortB,LCD_e ; și apoi Clear E
movlw 0x30 ; Inițializarea instrucțiunile LCD
movwf PortB ; Trimite la LCD prin RB7 .. RB0
bsf PortB,LCD_e ; Set E ridicat,
call wait_32ms ; așteptați puțin,
bcf PortB,LCD_e ; și apoi Clear E
movlw 0x20 ; Instrucțiuni modului 4 bit
movwf PortB ; Trimite la LCD prin RB7 .. RB0
bsf PortB,LCD_e ; Set E rid icat,
call wait_16ms ; așteptați puțin,
bcf PortB,LCD_e ; și apoi Clear E
movlw 0x28 ; 1/16 ciclu, matrice 5×8
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
69
call cmnd2LCD ; Trimite comanda în w la LCD
movlw 0x08 ; Afișarea oprit, cursorul oprit
call cmnd2LCD ; Trimite comanda la LCD
movlw 0x01 ; Ștergerea și resetarea cursorului
call cmnd2LCD ; Trimite comanda în w la LCD
movlw 0x06 ; Setează cursorul pentru a muta dreapta
call cmnd2LCD ; Trimite comanda în w la LCD
movlw 0x0C ; Afișare pornit, cursorul oprit
call cmnd2LCD ; Trimite co manda în w la LCD
return ;
add_step
movf fstep_0,w ; Ia octetul scăzut a incrementului
addwf freq_0,f ; Adaugă la octet scăzut din frecvența
btfss STATUS,B_C ; Orice purtătoare?
goto add1 ; Nu, se adaugă următorul octet
incfsz freq_1,f ; Pulsația transportă până la următorul octet
goto add1 ; Nu transportă nou, s e adaugă următorul
; octet
incfsz freq_2,f ; Pulsația transportă până la următorul octet
goto add1 ; Nu transportă nou, se adaugă următorul
; octet
incf freq_3,f ; Pulsația tr ansportă până la cel mai mare
; octet
add1
movf fstep_1,w ; Ia următorul octet incrementat
addwf freq_1,f ; Adaugă la următoarea octet superior
btfss STATUS,B_C ; Orice purtătoare?
goto add2 ; Nu, se adaugă următorul octet
incfsz freq_2,f ; Pulsația transportă până la următorul octet
goto add2 ; Nu transportă nou, se adaugă următorul
; octet
incf fr eq_3,f ; Pulsația transportă până la cel mai înalt
; octet
add2
movf fstep_2,w ; Ia cea mai semnificativă octet incrementat
addwf freq_2,f ; Adaugă la octetul de frecventă
btfss STATUS,B_C ; Orice purtătoare?
goto add3 ; Nu, se adaugă ultimul octet
incf freq_3,f ; Pulsația transportă până la cel mai mare
; octet
add3
movf fstep_3,w ; Obține cel mai semnificativ incre ment octet
addwf freq_3,f ; Adaugă la cea mai semnificativă frecvență
return ; Revine la apelant
check_add
;
; Verifică cel mai semnificativ octet.
;
movlw 0xFF -limit_3 ; Get
addwf freq_3,w ; Adaugă la octetul de curent mare
btfsc STATUS,B_C ; A fost ridicat octetul prea mare?
goto set_max ; Da, se aplică limita
movlw limit_3 ; Ia valoare limită ridicată
subwf freq_3,w ; Se scade valoarea limitată
btfss STATUS,B_C ; Suntem la limita octetului?
goto exit1 ; Nu, mai jos. Verificările sunt efectuate.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
70
;
; Verifică al doilea cel mai important octet.
;
movlw 0xFF -limit_2 ; Get
addwf freq_2,w ; Adaugă la octetul de curent mare
btfsc STATUS,B_C ; A fost ridicat octetul prea mare?
goto set_max ; Da, se aplică limita
movlw limit_2 ; Al doilea octetul de limită
subwf freq_2,w ; Se scade valoarea limitată
btfss STATUS,B_C ; Suntem la limita octetului?
goto exit1 ; Nu, mai jos. Verificările sunt efectuate.
;
; Verifică al treilea cel mai important octet.
;
movlw 0xFF -limit_1 ; Get
addwf freq_1,w ; Adaugă la octetul de curent mare
btfsc STATUS,B_C ; A fost ridicat octetul prea mare?
goto set_max ; Da, se aplică limita
movlw limit_1 ; Al treilea octetul de limită
subwf freq_1,w ; Se scade valoarea limitată
btfss STATUS,B_C ; Suntem la limita octetului?
goto exit1 ; Nu, mai jos. Verificările sunt efectuate.
;
; Verificarea cel mai puțin semnificativ octet.
;
movlw limit_0 ; Al patrulea octetul de limită
subwf freq_0,w ; Valoarea limită de scădere
btfss STATUS,B_C ; Suntem la limita de octet?
goto exit1 ; Nu, mai jos. Verificările sunt efectuate.
set_max
movlw limit_0 ; Ia limita cel mai puțin semnificativ
movwf freq_0 ; Pune în frecvențe
movlw limit_1 ; Ia următorul octet de limită
movwf freq_1 ; Pune în freq_1
movlw limit_2 ; Ia următorul octet de limită
movwf freq_2 ; Pune în freq_2
movlw limit_3 ; Ia limita cea mai semnificativă
movwf freq_3 ; Pune în freq_3
exit1
return ; Revine la apelant
sub_step
comf fstep_0,f ; Scăderea fstep de la
comf fstep_1,f ; freq se face prin adăugarea
comf fstep_2,f ; câte două compliment de la fstep
comf fstep_3,f ; la frecvență.
incfsz fstep_0,f ; Incrementare ultimul octet
goto comp_done ; Diferită de zero, continua
incfsz fstep_1,f ; Incrementarea următorul octet
goto comp_done ; Diferită de zero, continua
incfsz fstep_2,f ; Incrementarea următorul octet
goto comp_done ; Diferită de zero, continua
incf fstep_3,f ; Incrementarea octetul cel mai semnificativ
comp_done
call add_step ; Adaugă compl iment pentru a face scăderea
;
; În cazul în care frecvența a plecat negativ, se șterge la zero.
;
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
71
btfss freq_3,7 ; Frecventa cel mai semnificativ bit este
; "negativ"?
goto exit2 ; Nu, mergi mai departe
set_min
clrf freq_0 ; Da, setează frecvența la zero
clrf freq_1 ;
clrf freq_2 ;
clrf freq_3 ;
exit2
return ; Revine la apelant
poll_encoder
clrf ren_timer_1 ; Pune valorile de pornire în ren_timer
movlw 0x40 ; Începe cu bitul cel mai semnificativ
stabilit în ren_timer
movwf ren_timer_0 ;
read_encoder
clrwdt ; Resetarea cronometrul watchdog
btfsc ren_timer_1,7 ; Are bitul plutit până jos în ren_timer?
goto no_inc ; Da, nu -l muta mai departe
movlw 0x08 ;
addwf ren_timer_0,f ;
btfsc STATUS,B_C ;
incf ren_timer_1,f ;
no_inc ;
movf PortA,w ; Ia valoarea codificatorul curent
movwf ren_read ; Salvează
movlw 0x03 ; Ia masca codificator
andwf ren_read,w ; Izolă octetul codificator
movwf ren_new ; Salvează noua valoare
xorwf ren_old,w ; Le-a schimbat?
btfsc STATUS,B_Z ;
goto read_encoder ; Nu, sa mai caut până când se modifică
;
; Determină în ce direcție este rotit codificatorul.
;
bcf STATUS,B_C ; Șterge bitul de transport
rlf ren_old,f ;
movf ren_new,w ;
xorwf ren_old,f ;
movf ren_old,w ;
andlw 0x02 ;
movwf next_dir ;
xorwf last_dir,w ;
;
; Împiedica alunecarea codificatorului de la a da o schimbare fals în
; direcție.
;
btfsc STATUS,B_Z ; Zero?
goto pe_continue ; Nici o alunecare; continuă
movf next_dir,w ; Da, actualizarea direcției
movwf last_dir ;
movf ren_new,w ; Salvează bitul actual pentru data viitoare
movwf ren_old ;
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
72
goto read_encoder ; Încercarea din nou
pe_continue
btfsc ren_old,1 ; Vom merge jos?
goto up2 ; Nu, indica ca mergem sus
clrf last_dir ; Da, curăță last_dir
goto exit 3 ; Terminarea și returnarea
up2
movlw 0x02 ; Configurarea valoare în last_dir
movwf last_dir ;
exit3
movf ren_new,w ; Ia biți codificatorului actuale
movwf ren_old ; Salvează în ren_old pentru data viitoare
return ; Revine la apelant
calibrate
movlw 0x80 ; Setarea frecvența pe 10MHz de
movwf freq_0 ; setarea de frecvențe la echivalentul
binar
movlw 0x96 ; de 10.000.000.
movwf freq_1 ; .
movlw 0x98 ; .
movwf freq_2 ; .
movlw 0x00 ; .
movwf freq_3 ; .
;
; Citește valorarea de referință a oscilatorului de la EEPROM
;
clrf EEadr ; Resetează adresa de citire EEPROM
call read_EEPROM ; Citește EEPROM
movf EEdata,w ; Ia primul octet OSC
movwf osc_0 ; Salvează frecvență OSC
call read_EEPROM ; Ia următorul octet
movf EEdata,w ;
movwf osc_1 ; Salvează
call read_EEPROM ; Ia al treilea octet
movf EEdata,w ;
movwf osc_2 ; Salvează
call read_EEPROM ; Ia al patrulea octet
movf EEdata,w ;
movwf osc_3 ; Salvează
call bin2BCD ; Se calculează versiune BCD de 10.000,00
call show_freq ; Afișarea frecvența pe ecranul LCD
movlw 0xC4 ; Punct LCD la 14 cifre
movwf LCD_char ;
call cmnd2LCD ;
movlw 'C' ; Trimite un C
movwf LCD_char ;
call data2LCD ;
movlw 'A' ; Trimite un A
movwf LCD_char ;
call data2LCD ;
movlw 'L' ; Trimite un L
movwf LCD_char ;
call data2LCD ;
cal_loop
call calc_dds_word ; Calcularea valorii DDS bazat pe OSC curent
call send_dds_word ; Actualiza cip DDS
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
73
call poll_encoder ; Așteptarea până când codificatorul este
; mutat.
clrf fstep_3 ; Șterge cele mai importante trei
clrf fstep_2 ; biți de f step
clrf fstep_1 ;
movlw 0x10 ; Să presupunem că suntem de adaptare lent
movwf fstep_0 ; Utilizează increment mică
btfsc ren_read,2 ; Codificatorul schimbă încet?
goto update_osc ; Da, atunci continuă cu increment mic
movlw 0x80 ; Nu, atunci utilizează increment mare
movwf fstep_0 ;
update_osc
nop ; Așteaptă un ciclu
btfsc last_dir,1 ; Ne mutăm jos?
goto faster ; Nu, crește valoarea OSC
comf fstep_0,f ; Scăderea fstep se face prin
comf fstep_1,f ; adăugând complimentul câte doi de fset
comf fstep_2,f ; la osc
comf fstep_3,f ;
incfsz fstep_0,f ; Incrementarea ultimul octet
goto faster ; Diferită de zero, continua
incfsz fstep_1,f ; Incrementar ea următorul octet
goto faster ; Diferită de zero, continua
incfsz fstep_2,f ; Incrementarea următorul octet
goto faster ; Diferită de zero, continua
incf fstep_3,f ; Increment area cel mai semnificativ octet
faster
movf fstep_0,w ; Ia incrementul octet scăzut
addwf osc_0,f ; Adaugă la octetul OSC scăzut
btfss STATUS,B_C ; A existat un transport?
goto add4 ; Nu, se adaugă următoarele octeți
incfsz osc_1,f ; Pulsația transportă până la următorul octet
goto add4 ; Nu transportă nou, se adaugă următoarele
; octeți
incfsz osc_2,f ; Pulsația transportă până la următorul octet
goto add4 ; Nu transportă nou, se adaugă următoarele
; octeți
incf osc_3,f ; Pulsația transportă până la cel mai
; semnificativ octet
add4
movf fstep_1,w ; Ia de -al doilea octet incrementat
addwf osc_1,f ; Adaugă la al doilea octet OSC
btfss STATUS,B_C ; A existat un transport?
goto add5 ; Nu, se adaugă al treilea octet
incfsz osc_2,f ; Pulsația transportă până la următorul octet
goto add5 ; Nu transportă nou, se adaugă al treilea
; octet
incf osc_3,f ; Pulsația transportă până la cel mai
; semnificativ octet
add5
movf fstep_2,w ; Ia de -al treilea octet incrementat
addwf osc_2,f ; Adaugă la al treilea octet OSC
btfss STATUS,B_C ; A existat un transport?
goto add6 ; Nu, se adaugă al patrulea octet
incf osc_3,f ; Pulsația transportă până la cel mai
; semnificativ octet
add6
movf fstep_3,w ; Ia de-al patrulea octetul incrementat
addwf osc_3,f ; Adăugă la al patrulea octet
btfss ren_read,3 ; Este butonul apăsat încă?
goto cal_loop ; Da, rămâne în mod calibrare
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
74
clrf EEadr ; Scrie valoarea finală în EEPROM
movf osc_0,w ; Înregistrează primul
movwf EEdata ; osc
call write_EEPROM ; octet
movf osc_1,w ; Înregist rează al doilea
movwf EEdata ; osc
call write_EEPROM ; octet
movf osc_2,w ; Înregistrează al treilea
movwf EEdata ; osc
call write_EEPROM ; octet
movf osc_3,w ; Înregistrează al patrulea
movwf EEdata ; osc
call write_EEPROM ; octet
return ; Revine la apelant
calc_dds_word
clrf AD9850_0 ; Șterge octetul cuvântul de control al
AD9850
clrf AD9850_1 ;
clrf AD9850_2 ;
clrf AD9850_3 ;
clrf AD9850_4 ;
movlw 0x20 ; Setarea numărătorului la 32
movwf mult_count ; Continua să numără
movf osc_0,w ; Mută patru octet de OSC
movwf osc_temp_0 ; pentru depozitare temporară pentru acest
; multiplicări
movf osc_1,w ;
movwf osc_temp_1 ;
movf osc_2,w ;
movwf osc_temp_2 ;
movf osc_3,w ;
movwf osc_temp_3 ;
mult_loop
bcf STATUS,B _C ; Începe cu golirea Carry
btfss osc_temp_0,0 ; Octetul este 0?
goto noAdd ; Nu, nu trebuie să adăugăm termen de
; frecvențe totală
movf freq_0,w ; Da, obține termenul freq_0
addwf AD9850_1,f ; si adaugă total
btfss STATUS,B_C ; Are ca rezultat acest plus într -o
; purtătoare
goto add7 ; Nu, continuă cu următorul termen de
; frecvență
incfsz AD985 0_2,f ; Da, se adaugă unu și verifică pentru un alt
; carry
goto add7 ; Nu, continuă cu următorul termen de
; frecvență
incfsz AD9850_3,f ; Da, se adaugă unu și verifică pentru un alt
; carry
goto add7 ; Nu, continuă cu următorul termen de
; frecvență
incf AD9850_4,f ; Da, adaugă unu și continuă
add7
movf freq_1,w ; Folosește termenul freq_1
addwf AD9850_2,f ; Adaugă termen de frecvențe totalul în
; poziție corectă
btfss STATUS,B_C ; Are ca rezultat acest plus într -o purtare?
goto add8 ; Nu, continuă cu următorul termen de
; frecvență
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
75
incfsz AD9850_3,f ; Da, se adaugă unu și verifică pentru un alt
; carry
goto add8 ; Nu, continuă cu următorul termen de
; frecvență
incf AD9850_4,f ; Da, adaugă un u și continuă
add8
movf freq_2,w ; Folosește termenul freq_2
addwf AD9850_3,f ; Adaugă termen de frecvențe totalul în
; poziție corectă
btfss STATUS,B_C ; Are ca rezultat acest plus într -o purtare?
goto add9 ; Nu, continuă cu următorul termen de
; frecvență
incf AD9850_4,f ; Da, adaugă unu și continuă
add9
movf freq_3,w ; Folosește termenul freq_3
addwf AD9850_4,f ; Adaugă termen de frecvențe totalul în
; poziție corectă
noAdd
rrf AD9850_4,f ; Trecerea următoare multiplicare bit pe
; poziția
rrf AD9850_3,f ; Rotirea biții la dreapta de la octet la
; octet
rrf AD9850_2,f ;
rrf AD9850_1,f ;
rrf AD9850_0,f ;
rrf osc_temp_3,f ; Trecerea următoare multiplicare bit pe
; poziția
rrf osc_temp_2,f ; Rotirea biții la dreapta de la octet la
; octet
rrf osc_temp_1,f ;
rrf osc_temp_0,f ;
decfsz mult_count,f ; Încă un bit a fost făcut. Am terminat?
goto mult_loop ; Nu, du -te înapoi pentru a utiliza acest bit
clrf AD9850_4 ; Da, clear _4. Rezultatul este în bytes _3
; .. _0
return ;
send_dds_word
movlw AD9850_0 ; Punct FSR la AD9850
movwf FSR ;
next_byte
movf INDF,w ;
movwf byte2send ;
movlw 0x08 ; Setează contorul la 8
movwf bit_count ;
next_bit
rrf byte2send,f ; Testarea bitul următor dacă este 1 sau 0
btfss STATUS,B_C ; A fost zer o?
goto send0 ; Da, trimite la zero
bsf PortB,7 ; Nu, trimite unu
bsf PortB,5 ; Ceas de scriere comutare
bcf PortB,5 ;
goto break ;
send0
bcf PortB,7 ; Trimite la zero
bsf PortB,5 ; Ceas de scriere comutare
bcf PortB,5 ;
break
decfsz bit_count,f ; A fost trimis toate biți?
goto next_bit ; Nu, merge mai departe.
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
76
incf FSR,f ; Începe următorul bit dacă nu e terminat
movlw AD9850_4+1 ; Următorul bit
subwf FSR,w ;
btfss STATUS,B_C ;
goto next_byte ;
bsf PortB,0 ; Trimite semnal de sarcină la AD9850
bcf PortB,0 ;
return ;
bin2BCD
movlw 0x20 ; Setează contorul de buclă
movwf BCD_count ; l a 32
clrf BCD_0 ; Șterge ieșirea
clrf BCD_1 ; " "
clrf BCD_2 ; " "
clrf BCD_3 ; " "
clrf BCD_4 ; " "
bin_loop
bcf STATUS,B_C ; Șterge bitul de transport în STATUS
rlf freq_0,f ; Rotire la stânga, 0 ->LS bit, MS bit -> Carry
rlf freq_1,f ; Rotire la stânga, Carry ->LS bit, MS bit
; -> Carry
rlf freq_2,f ; Rotire l a stânga, Carry ->LS bit, MS bit
; ->Carry
rlf freq_3,f ; Rotire l a stânga, Carry ->LS bit, MS bit
; ->Carry
btfsc STATUS,B_C ; Transportul este clar? Dacă da, sare
; instrucțiunea următoare
bsf freq_0,0 ; Transportul este setat la bitul 0 în freq_0
rlf BCD_0,f ; Rotire la stânga, Carry ->LS bit, MS bit –
; ->Carry
rlf BCD_1,f ; Rotire la stânga, Carry ->LS bit, MS bit –
; ->Carry
rlf BCD_2,f ; Rotire la stânga, Carry ->LS bit, MS bit –
; ->Carry
rlf BCD_3,f ; Rotire la stânga, Carry ->LS bit, MS bit-
; ->Carry
rlf BCD_4,f ; Rotire la stânga, Carry ->LS bit, MS bit –
;->Carry
decf BCD_count,f ; Decrementează numărul de buclă
btfss STATUS,B_Z ; Este, acuma contorul de buclă zero ?
goto adjust ; Nu, merge să face reglare
return ; Da, iese
adjust
movlw BCD_0 ; Ia pointerul de la BCD_0
movwf FSR ; Pune pointerul în FSR pentru abordarea
; indirectă
call adj_BCD ;
incf FSR,f ; Mută indicatorul de adresare indirectă la
; BCD_1
call adj_BCD ;
incf FSR,f ; Mută indicatorul de adresare indir ectă la
; BCD_2
call adj_BCD ;
incf FSR,f ; Mută indicatorul de adresare indirectă la
; BCD_3
call adj_BCD ;
incf FSR,f ; Mută indicatorul de adresare indirectă la
; BCD_4
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
77
call adj_BCD ;
goto bin_loop ; Trece înapoi la bucla principală
adj_BCD
movlw 3 ; Adaugă 3
addwf INDF,w ; la cel mai puțin semnificativ bit
movwf BCD_temp ; Salvează în temp
btfsc BCD_temp,3 ; Este cel mai puțin semnificativ bit + 3 > 7
movwf INDF ; Da, salvează va loare incrementat ca cel mai
; puțin semnificat bit
movlw 0x30 ; Adaugă 3
addwf INDF,w ; la cel mai semnificatic bit
movwf BCD_temp ; Salvează în temp
btfsc BCD_temp,7 ; Este cel mia semnificativ bit +3 > 7
movwf INDF ; Da, salvați valoare incrementat ca cel mai
; semnificativ bit
return ; Revine la subrutina adjust
show_freq
movlw 0x81 ; Punctul LCD pentru prima cifră
call cmnd2LCD ; Trimite punctul de plecare
swapf BCD_3,w ; Schimbă 10MHz în BCD cifre pentru W
andlw 0x0F ;
addlw 0x30 ; Adaugă compensa pentru setul ASCII caracter
call data2LCD ; Trimite octetul în W pentru LCD
movf BCD_3,w ; Schimbă 1MHz în BCD cifre pentru W
andlw 0x0F ; Masca
addlw 0x30 ; Adaugă compensa pentru setul ASCII caracter
call data2LCD ; Trimite octetul în W pentru LCD
movlw ',' ; Ia -o virgulă
call data2LCD ; Trimite octetul în W pentru LCD
swapf BCD_2,w ; Schimbă 10MHz în BCD cifre pentru W
andlw 0x0F ; Masca
addlw 0x30 ; Adaugă compensa pentru setul ASCII caracter
call data2LCD ; Trimite octetul în W pentru LCD
movf BCD_2,w ; Schimbă 10KHz în BCD cifre pentru W
andlw 0x0F ; Masca
addlw 0x30 ; Adaugă compensa pentru setul ASCII caracter
call data2LCD ; Trimite octetul în W pentru LCD
swapf B CD_1,w ; Schimbă 1KHz în BCD cifre pentru W
andlw 0x0F ; Masca
addlw 0x30 ; Adaugă compensa pentru setul ASCII caracter
call data2LCD ; Trimite octetul în W pentru LCD
movlw '.' ; Configurarea W cu perioada ASCII
call data2LCD ; Trimite octet de date în W pentru LCD
movlw 0xC0 ; Numărul de cifre 9
call cmnd2LCD ; Trimite octet de comandă în W pe ntru LCD
movf BCD_1,w ; Schimbă 100Hz în BCD cifre pentru W
andlw 0x0F ; Masca
addlw 0x30 ; Adaugă compensa pentru setul ASCII caracter
call data2LCD ; Trimite octetul în W pentru LCD
swapf BCD_0,w ; Schimbă 10Hz în BCD cifre pentru W
andlw 0x0F ; Masca
addlw 0x30 ; Adaugă compensa pentru setul ASCII car acter
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
78
call data2LCD ; Trimite octetul în W pentru LCD
movf BCD_0,w ; Schimbă 1Hz în BCD cifre pentru W
andlw 0x0F ; Masca
addlw 0x30 ; Adaugă compensa pentru setul ASCI I caracter
call data2LCD ; Trimite octetul în W pentru LCD
movlw ' ' ; Trimite un spațiu
call data2LCD ; pentru LCD
movlw 'k' ; Trimite un 'k'
call data 2LCD ; pentru LCD
movlw 'H' ; Trimite un "H"
call data2LCD ; pentru LCD
movlw 'z' ; Trimite un 'z'
call data2LCD ; pentru LCD
return ;
busy_check
clrf PortB ; Șterge toate ieșirile pe PortB
bsf STATUS,B_RP0 ; Comută cu bancă 1 pentru operarea Tristate
movlw b'11110000' ; Setează RB7, RB6, RB5, RB 4 ca intrări
; și RB3, RB2, RB1, RB0 ca ieșiri
movwf TRISB ; prin Tristate
bcf STATUS,B_RP0 ; Comuta înapoi la bancă 0
bcf PortB,LCD_rs ; Configură LCD pentru Read Busy Flag
bsf PortB,LCD_rw ; Configură LCD pentru Read
movlw 0xFF ; Configură constanta 255
movwf timer1 ; pentru cronometru buclă contor
LCD_is_busy
bsf PortB,LCD_e ; Set E înalt
movf PortB,w ; Citește PortB în W
movwf LCD_read ; Salvează W pentru testarea mai târziu
bcf PortB,LCD_e ; Aruncă din nou E
nop ; Așteaptă
nop ; puțin timp
bsf PortB,LCD_e ; Puls E înalt
nop ; așteaptă,
bcf PortB,LCD_e ; și aruncă E iarăși
decf timer1,f ; Decrementează bucla de contor
btfsc STATUS,B _Z ; Este bucla de contor la zero?
goto not_busy ; Dacă da, întoarce indiferent
btfsc LCD_read,7 ; Este bitul Busy Flag (RB7) salvat?
goto LCD_is_busy ; Dacă nu, este ocupat și sare înapoi
not_busy
return ;
cmnd2LCD
movwf LCD_char ; Salvează octetul pentru a scrie la LCD
clrf rs_value ; Amintește pentru a seta RS
bcf PortB,LCD_rs ; Setarea RS de comandă pentru LCD
goto write2LCD ; Du -te la cod comun
data2LCD
movwf LCD_char ; Salvează octetul pentru a scrie la LCD
bsf rs_value,0 ; Amintește pentru a seta RS
bsf PortB,LCD_rs ; Setarea RS de comandă pentru LCD
write2LCD
call busy_check ; Verificați pentru a vedea dacă LCD este
; gata pentru noi date
clrf PortB ; Șterge toate Port B
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
79
bsf STATUS,B_RP0 ; Comutare la bancă 1 pentru operarea
; Tristate
movlw 0x00 ; Configurarea pentru a permite pini de date
PORTB
movwf TRISB ; Toate pini (RB7.. RB0) sunt ieșiri
bcf STATUS,B_RP0 ; Comuta la bancă 0
bcf PortB,LCD_rw ; Setează LCD înapoi la modul de a scrie
bcf PortB,LCD_rs ; RS ar trebui să fie gol
btfsc rs_value,0 ; Rs tr ebuie să fie gol?
bsf PortB,LCD_rs ; Nu, setează RS
movlw 0x0F ; Configurarea masca
andwf PortB,f ; Șterge vechea RB7..RB4
movf LCD_char,w ; Pune octetul de date în W
andlw 0xF0 ; Masca pentru XXXX0000 în W
iorwf PortB,f ; Trimite RB7..RB4 fără să schimbe RB 3..RB0
bsf PortB,LCD_e ; Puls linia E mare,
nop ; așteptă,
bcf PortB,LCD_e ; și aruncă din nou
movlw 0x0F ; Configurarea masca
andwf PortB,f ; Șterge vechea RB7..RB4
swapf LCD_char,w ; Pune octetul de date în W
andlw 0xF0 ; Masca pentru XXXX0000 în WW
iorwf PortB ; Trimite RB7..RB4 fără să schimbe RB3..RB0
bsf PortB,LCD_e ; Puls linia E mare,
nop ; așteptă,
bcf PortB,LCD_e ; și aruncă din nou
return
write_EEPROM
bsf STATUS,B_RP0 ; Comută la bancă 1
bsf EEdata,WREN ; Setează EEPROM la bit write enable
movlw 0x55 ; Scrie 0x55 și 0xAA la EEPROM
movwf EEadr ; registru de control, după cum este
movlw 0xAA ; necesar pentr u scriere
movwf EEadr ;
bsf EEdata,WR ; Setează WR să inițieze scriere
bit_check
btfsc EEdata,WR ; A finalizat scrierea?
goto bit_check ; Nu, păstreze verificarea
bcf EEdata,WREN ; Golește la EEPROM bitul write enable
bcf STATUS,B_RP0 ; Comuta la bancă 0
incf EEadr,f ; Incrementează adresa de scriere EE
return ; Revine la apelant
read_EEPROM
bsf STATUS,B_RP0 ; Comuta la bancă 1
bsf EEdata,RD ; Cerere de citire
bcf STATUS,B_RP0 ; Comuta la bancă 0
incf EEadr,f ; Incrementează adresa de citire
return ; Revine la apelant
wait_128ms ; ****** Entry point ******
movlw 0xFF ; Configurarea buclei exterioară
movwf timer1 ; contorul la 255
goto outer_loop ; Merge la bucle de așteptare
wait_64ms ; ****** Entry point ******
movlw 0x80 ; Configurarea buclei exterioară
movwf timer1 ; contorul la 128
goto outer_loop ; Merge la bucle de așteptar e
Universitatea Transilvania din Brașov TEHNOLOGII ȘI SISTEME DE TELECOMUNICAȚII
Facultatea de Inginerie Electrică și Știința Calculatoarelor 2014
80
wait_32ms ; ****** Entry point ******
movlw 0x40 ; Configurarea buclei exterioară
movwf timer1 ; contorul la 64
goto outer_loop ; Merge la bucle de așteptare
wait_16ms ; ****** Entry point ******
movlw 0x20 ; Configurarea buclei exterioară
movwf timer1 ; contorul la 32
goto outer_loop ; Merge la bucle de așteptare
wait_8ms ; ****** Ent ry point ******
movlw 0x10 ; Configurarea buclei exterioară
movwf timer1 ; contorul la 16
outer_loop
movlw 0xFF ; Configurarea contorul buclă interioară
movwf timer2 ; la 255
inner_loop
decfsz timer2,f ; Decrementează contorul de buclă interioară
goto inner_loop ; Dacă contor buclă interior nu este la zero,
; apoi merge înapoi la bucla interioară
; din nou
decfsz timer1,f ; Da, Decrementează contorul buclă exterioară
goto outer_loop ; Dacă contor buclă exterioară nu este la
; zero, apoi merge înapoi la bucla
; exterioară din nou
return ; Da, revine la apelant
END
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: . Proiect De Diploma [617374] (ID: 617374)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
