Documente Academic
Documente Profesional
Documente Cultură
L-metru
Introducere
posibila pentru bobine care au factorul de calitate mare respective rezistenta serie
LCD.
Schimbarea gamei de masura se face cu ajutorul butonului ”selectie gama ”.
Cuprins
Introducere
www.microchip.com
www.electronica.ro
www.elektronikladen.de
Istoria microcontrolelor
Este anul 1969, si o echipa de ingineri japonezi de la compania BUSICOM sosesc in Statele
Unite cu cerer ea ca unele circuite integrate pentru calculatoare sa fie facute folosind proiectele
lor. Propunerea a fost facuta catre INTEL, iar Marcian Hoff a fost desemnat responsabil cu acest
proiect. Pentru ca el era cel ce avea experienta in lucrul cu un calculator ( PC) PDP8, i-a venit sa
sugereze o solutie diferita fundamental in locul constructiei propuse. Aceasta solutie presupunea
ca functionarea circuitului integrat este determinata de un program memorat in el. Aceasta a
insemnat ca configuratia ar fi fost mult mai simpla, dar aceasta ar fi cerut mult mai multa
memorie decat ar fi cerut proiectul propus de inginerii japonezi. Dupa un timp, cu toate ca
inginerii au cautat sa caute o solutie mai simpla, ideea lui Marcian a castigat, si aluat nastere
primul microcontroler. In transformarea unei idei intr-un produs finit, Frederico Faggin a fost de
un ajutor major pentru INTEL. El s-a transferat la INTEL, si doar in 9 luni a reusit sa scoata un
produs din prima sa conceptie. INTEL a obtinut drepturile de a vinde acest bloc integral in 1971.
In primul rand ei au cumparat licenta de la compania BUSICOM care nu au avut idee ce
comoara avusesera. In timpul acelui an a aparut pe piata un microprocesor numit 4004. Acela a
fost primul microprocesor de 4 biti cu viteza 6000 operatii pe secunda. Nu mult dupa aceea,
compania americana CTC a cerut de la INTEL si de la Texas Instruments sa faca un
microprocesor pe 8 biti pentru folosinta in terminale. Cu toate ca CTC a renuntat la aceasta idee
pana la sfarsit, INTEL si Texas Instruments au continuat sa lucreze la microprocesor si in aprilie
1972 a aparut pe piata primul microprocesor de 8 biti sub numele de 8008. Putea sa adreseze
64Kb de memorie si avea 45 de instructiuni si viteza de 300.000 de operatii pe secunda. Acel
microprocesor a fost predecesorul tuturor microprocesoarelor de astazi. INEL au continuat
dezvoltarile lor pana in aprilie 1974 si au lansat pe piata microprocesorul de 8 biti sub numele de
8080 ce putea adresa 64Kb de memorie si avea 75 de instructiuni, iar pretul incepuse de la 360$.
Intr-o alta companie americana Motorola, si-au dat seama repede ce se intampla, asa ca
au lansat pe piata un microprocesor de 8 biti 6800. Costructor sef era Chuck Peddle si pe langa
microprocesorul propriu-zis, Motorola a fost prima companie care sa faca alte periferice ca 6820
si 6850. La acel timp multe companii au recunoscut marea importanta a microprocesoarelor si
au inceput propriile lor dezvoltari. Chuck Peddle paraseste Motorola pentru a se muta la MOS
Technology si continua sa lucreze intensiv la dezvoltarea microprocesoarelor.
La expozitia WESCON din Statele Unite din 1975 a avut loc un eveniment critic in
istoria microprocesoarelor. MOS Technology a anuntat ca produce microprocesoarele 6501 si
6502 la 25$ bucata pe care cumparatorii le puteau cumpara imediat. Aceasta a fost atat de
senzational incat au crezut ca este un fel de inselaciune, gandind ca competitorii vindeau 8080 si
6800 la 179$. Ca un raspuns la competitorii lor atat INTEL cat si Motorola au scazut preturile lor
in prima zi a expozitiei pana la 69.95$ pe microprocesor. Motorola intenteaza repede proces
contra lui MOS Technology si contra lui Chuck Peddle pentru copierea protejatului 6800. MOS
Technology inceteaza de a mai produce 6501 dar continua sa produca 6502. 6502 este un
microcontroler pe 8 biti cu 56 de instructiuni si o capabilitate de adresare directa de 64Kb de
memorie. Datorita costului scazut, 6502 devine foarte popular, asa ca este instalat in computere
ca :KIM-1, Apple I, Apple II, Atari, Comodore, Acorn, Oric, Galeb, Orao, Ultra si multe altele.
Curand apar cativa producatori de 6502 (Rockwell, Sznertek, GTE, NCR, Ricoh si Comodore
preiau MOS Technology) ce era in momentul prosperitatii sale vandut la o rata de 15 milioane de
microprocesoare pe an!
Altii totusi nu au cedat. Federico Faggin paraseste INTEL, si isi porneste propria sa
companie Zilog Inc.
In 1976 Zilog anunta Z80. In timpul crearii acestui microprocesor, Faggin face o decizie
cruciala. Stiind ca un mare numar de programe fusesera dezvoltate pentru 8080, Faggin isi da
seama ca multi vor ramane fideli acelui microprocesor din cauza marii cheltuieli care ar rezula in
urma refacerii tuturor programelor. Astfel el decide ca un nou microprocesor trebuie sa fie
compatibil cu 8080, sau ca trebuie sa fie capabil sa execute toate programele care deja fusese
scrise pentru 8080. Inafara acestor caracteristici, multe altele noi au fost adaugate, asa ca Z80 a
fost un microprocesor foarte puternic la vremea lui. Se putea adresa direct la 64Kb de memorie,
avea 176 instructiuni, o singura sursa,mult mai mare viteza de lucru etc. Z80 a fost un succes
mare si toata lumea a facut conversia de 8080 la Z80. Se poate spune ca Z80 a fost fara nici o
indoiala comercial, cel mai de succes microcontroler de 8 biti a acelui timp. Inafara de Zilog, alti
noi producatori apar de asemenea ca :Mostek, NEC, SHARP si SGS. Z80 a fost inima a multor
computere ca :Spectrum, Partner, TRS703, Z-3 si Galaxi aici acasa.
In 1976, INTEL iese pe piata cu o versiune imbunatatita de microprocesor pe 8 biti numit
8085. Totusi, Z80 era cu mult mai bun incat INTEL a apierdut batalia. Chiar daca inca cateva
microprocesoare au aparut pe piata (6809,2650,SC/MP etc.), totul fusese de fapt deja hotarat. Nu
mai erau de facut imbunatatiri importante ca sa-i faca pe producatori sa se converteasca spre
ceva nou, asa ca 6502 si Z80 impreuna cu 6800 au ramas ca cei mai reprezentativi ai
microprocesoarelor de 8 biti a acelui timp.
Deosebirea dintre microprocesoare si microcontrolere
Microcontrolerul difera de un microprocesor in multe feluri. In primul rand si cel mai important
este functionalitatea sa. Pentru a fi folosit, unui microprocesor trebuie sa i se adauge alte
componente ca memorie, sau componente pentru primirea si trimiterea de date. Pe scurt, aceasta
inseamna ca microprocesorul este inima computerului. Pe de alta parte, microcontrolerul este
proiectat sa fie toate acestea intr-unul singur. Nu sunt necesare alte componente externe pentru
aplicarea sa pentru ca toate perifericele necesare sunt deja incluse in el.
Astfel, economisim timpul si spatiul necesare pentru construirea de aparate. Un
microcontroler este un 'calculator pe un chip'. Cuvantul 'micro' sugereaza marimea redusa a
dispozitivului iar 'controler' ne spune ca dispozitivul poate fi folosit pentru a controla obicte,
procese sau evenimente.
Microcontrolerele pot fi gasite in componenta oricarui tip de aparat. Orice aparat care
masoara, stocheaza, comanda, calculeaza sau afiseaza informatii este o potentiala gazda pentru
un microcontroler.De exemplu orice automobil fabricat astazi este echipat cu cel putin un
microcontroler care comanda motorul masinii si adesea chiar cu mai multe pentru comanda
sistemelor aditionale din automobil. In calculatoare de birou (PC) se pot gasi microcontrolere in
tastatura, modemuri, imprimante si alte periferice. In echipamentele de testare fac posibila
adaugarea unor facilitati ca de exemplu memorarea rezultatelor masurarii, afisarea mesajelor si
formelor de unda. Produsele de larg consum care includ microcontrolere sunt camerele video,
video recorderele, compact-disk (CD) playere si altele. Un microcontroler este similar unui
microprocesor. Ambele contin o unitate centrala de prelucrare sau UCP (cenral processing unit).
CPU executa instructiuni care indeplinesc operatiile de baza logice, matematice si de curgere a
informatiei.
Pentru a construi un calculator complet, microprocesorul necesita memorie pentru
pastrarea datelor si programelor, interfete de intrare-iesire (I/O) pentru conectarea dispozitivelor
externe cum ar fi tastatura sau monitorul. Spre diferenta de microprocesor, microcontrolerul este
un calculator pe un chip deorece el contine si memorie si interfete de intrare-iesire pe langa CPU.
Deoarece memoria si interfetele care incap pe un chip sunt limitate, microcontrolerele tind sa fie
utilizate in sisteme mai mici care necesita doar un microcontroler si cateva elemente aditionale
Blocurile de baza a microcontrolerului
Unitatea de memorie
Memoria este o parte a microcontrolerului a carei functie este de a inmagazina date.
Cel mai usor mod de a explica este de a-l descrie ca un dulap mare cu multe sertare. Daca
presupunem ca am marcat sertarele intr-un asemenea fel incat sa nu fie confundate, oricare din
continuturile lor vor fi atunci usor accesibile. Este suficient sa se stie desemnarea sertarului si
astfel continuturile lui ne vor fi cunoscute in mod sigur.
Fig.1.1.1
Componentele de memorie sunt exact asa. Pentru o anumita intrare obtinem continuturile
unei anumite locatii de memorie adresate si aceasta este totul. Doua noi concepte ne sunt aduse
:adresarea si locatia de memorie. Memoria consta din toate locatiile de memorie, si adresarea nu
este altceva decat selectarea uneia din ele. Aceasta inseamna ca noi trebuie sa selectam locatia de
memorie la un capat, si la celalalt capat trebuie sa asteptam continuturile acelei locatii. In afara
de citirea dintr-o locatie de memorie, memoria trebuie de asemenea sa permita scrierea in ea.
Aceasta se face asigurarea unei linii aditionale numita linie de control. Vom desemna aceasta
linie ca R/W (citeste /scrie). Linia de control este folosita in urmatorul fel : daca r/w=1, se face
citirea, si daca opusul este adevarat atunci se face scrierea in locatia de memorie. Memoria este
primul element, dar avem nevoie si de altele pentru ca microcontrolerul nostru sa functioneze.
Unitatea centrala de procesare
Sa adaugam alte 3 locatii de memorie pentru un bloc specific ce va avea o capabilitate
incorporata de inmultire, impartire, extragere si sa-i mutam continuturile dintr-o locatie de
memorie in alta. Partea pe care tocmai am adaugat-o este numita 'unitatea de procesare centrala'
(CPU). Locatiile ei de memorie sunt numite registri.
Fig.1.1.2
Registrii sunt deci locatii de memorie a caror rol este de a ajuta prin executarea a variate
operatii matematice sau a altor operatii cu date oriunde se vor fi gasit datele. Sa privim la situtia
curenta. Avem doua entitati independente (memoria si CPU) ce sunt interconectate, sI astfel
orice schimb de informatii este ascuns, ca si functionalitatea sa. Daca, de exemplu, dorim sa
adaugam continuturile a doua locatii de memorie si intoarcem rezultatul inapoi in memorie,
vom avea nevoie de o conexiune intre menmorie si CPU. Mai simplu formulat, trebuie sa avem o
anumita 'cale' prin care datele circula de la un bloc la altul.
Bus-ul de date
Calea este numita 'bus'-magistrala. Fizic, el reprezinta un grup de 8, 16, sau mai multe
fire. Sunt doua tipuri de bus-uri : bus de adresa si bus de date. Primul consta din atatea linii cat
este cantitatea de memorie ce dorim sa o adresam, iar celalalt este atat de lat cat sunt datele, in
cazul nostru 8 biti sau linia de conectare. Primul serveste la transmiterea adreselor de la CPU la
memorie, iar cel de al doilea la conectarea tuturor blocurilor din interiorul microcontrolerului.
Fig.1.1.3
In ceea ce priveste functionalitatea, situatia s-a imbunatatit, dar o noua problema a aparut
de asemenea: avem o unitate ce este capabila sa lucreze singura, dar ce nu are nici un contact cu
lumea de afara, sau cu noi ! Pentru a inlatura aceasta deficienta, sa adaugam un bloc ce contine
cateva locatii de memorie a caror singur capat este conectat la busul de date, iar celalat are
conexiune cu liniile de iesire la microcontroler ce pot fi vazute cu ochiul liber ca pini la
componenta electronica.
Unitatea de intrare-iesire
Aceste locatii ce tocmai le-am adaugat sunt numite 'porti'.Sunt diferite tipuri de porti
:intrare, iesire sau porti pe doua-cai. Cand se lucreaza cu porti, mai intai de toate este necesar sa
se aleaga cu ce pot urmeaza sa se lucreze, si apoi sa se trimita date la, sau sa se ia date de la port.
Fig.1.1.4
Cand se lucreaza cu el portul se comporta ca o locatie de memorie. Ceva este pur si
simplu scris in sau citit din el, si este posibil de a remarca usor aceasta la pinii
microcontrolerului.
Porturi de comunicatie
Cu aceasta am adaugat la unitatea deja existenta posibilitatea comunicarii cu lumea de
afara. Totusi, acest mod de comunicare are neajunsurile lui. Unul din neajunsurile de baza este
numarul de linii ce trebuie sa fie folosite pentru a transfera datele. Ce s-ar intampla daca acestea
ar trebui transferate la distanta de cativa kilometri? Numarul de linii si numarul de kilometri nu
promite costuri eficiente pentru proiect. Nu ne ramane decat sa reducem numarul de linii intr-
un asa fel incat sa nu afectam functionalitatea. Sa presupunem ca lucram doar cu 3 linii, si ca o
linie este folosita pentru trimiterea de date, alta pentru receptie si a treia este folosita ca o linie de
referinta atat pentru partea de intrare cat si pentru partea de iesire. Pentru ca aceasta sa
functioneze, trebuie sa stabilim regulile de schimb ale datelor. Aceste reguli sunt numite
protocol. Protocolul este de aceea definit in avans ca sa nu fie nici o neitelegere intre partile ce
comunica una cu alta. De exemplu, daca un om vorbeste in franceza, si altul vorbeste in engleza,
este putin probabil ca ei se vor intelege repede si eficient unul cu altul. Sa presupunem ca avem
urmatorul protocol. Unitatea logica '1' este setata pe linia de transmisie pana ce incepe transferul.
Odata ce incepe transferul, coboram linia de transmisie la '0' logic pentru o perioada de timp (pe
care o vom desemna ca T), asa ca partea receptoare va sti ca sunt date de primit, asa ca va activa
mecanismul ei de receptie. Sa ne intoarcem acum la partea de transmisie si sa incepem sa punem
zero-uri si unu-uri pe linia de transmisie in ordinea de la un bit a celei mai de jos valori la un bit
a celei mai de sus valori. Sa lasam ca fiecare bit sa ramana pe linie pentru o perioada de timp
egala cu T, si la sfarst, sau dupa al 8-lea bit, sa aducem unitatea logica '1' inapoi pe linie ce va
marca sfarsitul transmisiei unei date. Protocolul ce tocmai l-am descris este numit in literatura
profesionala NRZ (Non-Return to Zero).
Fig.1.1.5
Pentru ca aven linii separate de receptie si de transmitere, este posibil sa receptionam si
sa transmitem date (informatii) in acelasi timp. Blocul ce permite acest mod de comunicare este
numit blocul de comunicare seriala. Spre deosebire de transmisia paralela, datele sunt mutate aici
bit cu bit, sau intr-o serie de biti, de unde vine si numele de comunicatie seriala. Dupa receptia de
date trebuie sa le citim din locatia de transmisie si sa le inmagazinam in memorie in mod opus
transmiterii unde procesul este invers. Datele circula din memorie prin bus catre locatia de
trimitere, si de acolo catre unitatea de receptie conform protocolului.
Unitatea de timer
Acum ca avem comunicatia seriala , putem receptiona , trimite si procesa date.
Fig.1.1.6
Watchdog-ul
Inca un lucru ce necesita atentia noastra este functionarea fara defecte a
microcontrolerului in timpul functionarii. Sa presupunem ca urmare a unei anumite interferente
(ce adesea se intampla in industrie) microcontrolerul nostru se opreste din executarea
programului, sau si mai rau, incepe sa functioneze incorect.
Fig.1.1.7
Bineanteles, cand aceasta se intampla cu un computer, il resetam pur si simplu si va
continua sa lucreze. Totusi, nu exista buton de resetare pe care sa apasam in cazul
microcontrolerului care sa rezolve astfel problema noastra. Pentru a depasi acest obstacol, avem
nevoie de a introduce inca un bloc numit watchdog-cainele de paza. Acest bloc este de fapt un alt
contor liber unde programul nostru are nevoie sa scrie un zero ori de cate ori se executa corect.
In caz ca programul se 'intepeneste', nu se va mai scrie zero, iar contorul se va reseta singur pana
la obtinerea valorii sale maxime. Aceasta va duce la rularea programului din nou, si corect de
aceasta data pe toata durata. Acesta este un element important al fiecarui program ce trebuie sa
fie fiabil fara supravegherea omului.
Convertorul Analog-Digital
Pentru ca semnalele de la periferice sunt substantial diferite de cele pe care le poate
intelege (zero si unu), ele trebuie convertite intr-un mod care sa fie inteles de microcontroler.
Aceasta sarcina este indeplinita de un bloc pentru conversia analog-digitala sau de un convertor
AD. Acest bloc este responsabil pentru convertirea unei informatii despre o anumita valoare
analoga intr-un numar binar si pentru a o urmari pe tot parcursul la un bloc CPU asa ca blocul
CPU sa o poata procesa.
Fig.1.1.8
Astfel microcontrolerul este acum terminat, si tot ce mai ramane de facut este de a-l pune
intr-o componenta electronica unde va accesa blocurile interioare prin pinii acestei componente.
Imaginea de mai jos arata cum arata un microcontroler in interior.
Fig.1.1.9.Cofiguratia fizica a interiorului unui microcontroler
Liniile subtiri ce merg din interior catre partile microcontrlerului reprezinta fire
conectand blocurile interioare cu pinii capsulei microcontrolerului. Schema urmatoare reprezinta
sectiunea centrala a microcontrolerului.
Fig.1.1.10
Pentru o aplicatie reala, un microcontroler singur nu este de ajuns. Inafara de
microcontroler, avem nevoie de un program pe care sa-l execute, si alte cateva elemente ce
constituie o interfata logica catre elementele de stabilizare (ce se va discuta in capitolele
urmatoare).
Programul
Scrierea programului este un domeniu special de lucru al microcontolerului si este
denumit 'programare'. Sa incercam sa scriem un mic program ce il vom crea singuri si pe care
oricine va fi in stare sa-l inteleaga.
START
REGISTER1=MEMORY LOCATION_A
REGISTER2=MEMORY LOCATION_B
PORTA=REGISTER1 + REGISTER2
END
Programul adauga continuturile a doua locatii de memorie, si vede totalul lor la portul A.
Prima linie a programului este pentru mutarea continuturilor locatiei de memorie 'A' intr-unul din
registri unitatii centrale de procesare. Pentru ca avem nevoie si de celelalte date de asemenea, le
vom muta de asemenea in celalalt registru al unitatii centrale de procesare. Urmatoarea
instructiune instruieste unitatea centrala de procesare sa adauge continuturile celor doi registri sa
sa trimita un rezultat obtinut la portul A, incat suma acestei adaugari sa fie vizibila pentru toata
lumea de afara. Pentru o problema mai complexa, programul care sa lucreaze la rezolvarea ei va
fi mai mare.
Programarea poate fi facuta in catava limbaje ca Assembler, C si Basic care sunt cele mai
folosite limbaje. Assembler apartine limbajelor de nivel scazut ce sunt programate lent, dar
folosesc cel mai mic spatiu in memorie si da cele mai bune rezultate cand viteza de executie a
programului se are in vedere. Pentru ca este cel mai folosit limbaj in programarea
microcontrolerelor va fi discutat intr-un capitol ulterior. Programele in limbajul C sunt mai usor
de scris, mai usor de inteles, dar sunt mai lente in executare decat programele in Assembler.
Basic este cel mai utor de invatat, si instructiunile sale sunt cele mai aproape de modul de
gandire a omului, dar ca si limbajul de programare C este de asemenea mai lent decat
Assembler-ul. In orice caz, inainte de a va hotari in privinta unuia din aceste limbaje trebuie sa
studiati cu atentie cerintele privind viteza de executie, marimea memoriei si timpul disponibil
pentru asamblarea sa.
Dupa ce este scris programul, trebuie sa instalam microcontrolerul intr-un aparat si sa-l
lasam sa lucreze. Pentru a face aceasta trebuie sa adaugam cateva componente externe necesare
pentru functionarea sa. Mai intai trebuie sa dam viata microcontrolerului prin conectarea sa la o
sursa (tensiune necesara pentru operarea tuturor instrumentelor electronice) si un oscilator a carui
rol este similar inimii din corpul uman. Bazat pe ceasul sau microcontrolerul executa
instructiunile programului. Indata ce este alimentat microcontrolerul va executa un scurt control
asupra sa, se va uita la inceputul programului si va incepe sa-l execute. Cum va lucra aparatul
depinde de multi parametri, cel mai important fiind priceperea dezvoltatorului de hardware, si de
expertiza programatorului in obtinerea maximului din aparat cu programul sau.
Microcontrolerul PIC16F84
Fig.1.1.11
CISC, RISC
S-a spus deja ca PIC1684 are o arhitectura RISC. Acest termen este adeseori gasit in
literatura despre computere, si are nevoie sa fie explicat aici mai in detaliu. Arhitectura Harvard
este un concept mai nou decat von-Neumann`s. S-a nascut din nevoia de marire a vitezei
microcontrolerului. In arhitectura Harvard, bus-ul de date bus-ul de adrese sunt separate. Astfel
un mare debit de date este posibil prin unitatea de procesare centrala, si bineinteles, o viteza mai
mare de lucru. Separand un program de memoria de date face posibil ca mai departe
instructiunile sa nu trebuiasca sa fie cuvinte de 8 biti. PIC16F84 foloseste 14 biti pentru
instructiuni ceea ce permite ca toate instructiunile sa fie instructiuni de un cuvant. Este de
asemenea tipic pentru arhitectura Harvard sa aiba mai putine instructiuni decat von-Newmann si
sa aiba instructiuni executate uzual intr-un ciclu.
Microcontrolerele cu arhitectura Harvard sunt de asemenea numite 'microcontrolere
RISC'. RISC inseamna Reduced Instruction Set Computer. Microcontrolerele cu arhitectura von-
Newmann sunt numite 'microcontrolere CISC'. Titlul CISC inseamna Complex Instruction Set
Computer.
Pentru ca PIC16F84 este un microcontroler RISC, aceasta inseamna ca are un set redus
de instructiuni, mai precis 35 de instructiuni (de ex. microcontrolerele INTEL si Motorola au
peste 100 de instructiuni). Toate aceste instructiuni sunt executate intr-un ciclu cu exceptia
instructiunilor jump si branch. Conform cu ceea ce spune constructorul, PIC16F84 ajunge la
rezultate de 2:1 in compresia cod si 4:1 in viteza in comparatie cu alte microcontrolere de 8 biti
din clasa sa.
Aplicatii :
PIC16F84 se potriveste perfect in multe folosinte, de la industriile auto si aplicatiile de
control casnice la instrumentele industriale, senzori la distanta, manere electrice de usi si
dispozitivele de securitate. Este de asemenea ideal pentru cardurile smart ca si pentru aparatele
alimentate de baterie din cauza consumului lui mic.
Pic16F84, un microcontroller de 8 biti cu un set restrins de vre-o 34 de instructiuni, cu
arhitectura de tip RISC (una, maxim doua instructiuni pe tact ) impreuna cu un programator si
un compilator ( si un simulator ) devine o jucarie extrem de interesanta pentru un electronist
obisnuit cu proiectarea CMOS sau TTL. Memoria EEPROM face mai usoara aplicarea
microcontrolerelor la aparate unde se cere inmagazinarea permanenta a diferitor parametri
(coduri pentru transmitatoare, viteza motorului, frecventele receptorului, etc.). Costul scazut ,
consumul scazut, manuirea usoara si flexibilitatea fac PIC16F84 aplicabil chiar si in domenii
unde microcontrolerele nu au fost prevazute inainte (exemple:functii de timer, inlocuirea
interfetei in sistemele mari, aplicatiile coprocesor, etc.) Programabilitatea sistemului acestui cip
(impreuna cu folosirea a doar doi pini in transferul de date) face posibila flexibilitatea
produsului, dupa ce asamblarea si testarea au fost terminate. Aceasta capabilitate poate fi folosita
pentru a crea productie pe linie de asamblare, de a inmagazina date de calibrare disponibile doar
dupa testarea finala, sau poate fi folosit pentru a imbunatati programele la produse finite.
Ciclul de clock / instructiune : clock-ul este un semnal periodic dreptunghiular generat de
un oscilator cu frecventa stabila. Clock-ul de la oscilator intra intr-un microcontroler prin pinul
OSC1 unde circuitul intern al unui microcontroler divide clock-ul in 4 clock-uri egale Q1,Q2,Q3
si Q4 ce nu se suprapun. Aceste 4 clock-uri constituie un ciclu de o singura instructiune (numit
de asemenea ciclu masina) in timpul careia o instructiune este executata.
Executarea instructiunii incepe prin apelarea unei instructiuni care este urmatoarea in
linie. Instructiunea este apelata din memoria program la fiecare Q1 si este scrisa in registrul de
instructiuni la Q4. Decodarea si executarea instructiunii sunt facute intre urmatoarele cicluri Q1
si Q4. In urmatoarea diagrama putem vedea relatia dintre ciclul instructiunii si clock-ul
oscilatorului (OSC1) ca si aceea a clock-urilor interne Q1-Q4. Contorul de program (PC) retine
informatia despre adresa urmatoarei instructiuni.
Fig.1.1.12
Pipelining
Ciclul de instructiuni consta din ciclurile Q1, Q2, Q3 si Q4. Ciclurile de instructiuni de
apelare si executare sunt conectate intr-un asa fel incat pentru a face o apelare, este necesar un
ciclu cu o instructiune, si este nevoie de inca una pentru decodare si executare. Totusi, datorita
pipeline-ului sau liniei directe, fiecare instructiune este efectiv executata intr-un singur ciclu.
Daca instructiunea cauzeaza o schimbare in contorul programului, si PC-ul nu directioneaza spre
urmatoarea ci spre alte adrese (poate fi cazul cu subprogramele jumps sau de apelare), 2 cicluri
sunt necesare pentru executarea unei instructiuni. Aceasta este pentru ca instructiunea trebuie
procesata din nou, dar de data aceasta din partea adresei corecte. Ciclul incepe cu clock-ul Q1,
prin scrierea intr-un registru (IR). Decodarea si executarea incepe cu clock-urile Q2, Q3 si Q4.
Fig.1.1.13
TYCO citeste instructiunea MOVLW 55h (nu are importanta pentru noi ce instructiune a fost
executata, ce explica de ce nu este un dreptunghi in partea de jos).
TCYI executa instructiunea MOVLW 55h si citeste MOVWF PORTB.
TCY2 executa MOVWF PORT si citeste CALL SUB_1.
TCY3 executa o apelare a unui subprogram CALL SUB_1, si citeste instructiunea BSF PORTA,
BIT3. Pentru ca instructiunea aceasta nu este aceea de care avem nevoie, sau nu este prima
instructiune a unui subprogram SUB_1 a carui executie este urmatoarea in ordine, instructiunea
trebuie citita din nou. Acesta este un bun exemplu a unei instructiuni avand nevoie de mai mult
de un ciclu.
TCY4 ciclul instructiunii este total folosit pentru citirea primei instructiuni dintr-un subprogram
la adresa SUB_1.
TCY5 executa prima instructiune dintr-un subprogram SUB_1 si citeste urmatoarea.
Semnificatia pinilor
PIC16F84 are un numar total de 18 pini. Cel mai adesea se gaseste intr-o capsula de tip
DIP18 dar se poate gasi de asemenea si intr-o capsula SMD care este mai mica ca cea DIP. DIP
este prescurtarea de la Dual In Package. SMD este prescurtarea de la Surface Mount Devices
sugerand ca gaurile pentru pini unde sa intre acestia , nu sunt necesare in lipirea acestui tip de
componenta.
Fig.1.1.14
Pinii microcontrolerului PIC16F84 au urmatoarea semnificatie:
Pin nr.1 RA1 Al doilea pin la portul A. Nu are functie aditionala.
Pin nr.2 RA2 Al treilea pin la portul A. Nu are functi aditionala.
Pin nr.3 RA3 Al patrulea pin la portul A. TOCK1 care functioneaza ca timer se gaseste de
asemenea la acest pin
Pin nr.4 MCLR Reseteaza intrarea si tensiunea de programare Vpp a microcontrolerului.
Pin nr.5 VSS Alimentare, masa.
Pin nr.6 RBO Pin de zero la portul B. Intrarea intrerupta este o functie aditionala.
Pin nr.7 RB1 Primul pin la portul B. Nu are functie aditionala.
Pin nr.8 RB2 Al doilea pin la portul B. Nu are functie aditionala.
Pin nr.9 RB3 Al treilea pin la portul B. Nu are functie aditionala.
Pin nr.10 RB4 Al patrulea pin la portul B.Nu are functie aditionala.
Pin nr.11 RB5 Al cincilea pin la portul B. Nu are functie aditionala.
Pin nr.12 RB6 Al saselea pin la portul B. Linia de 'Clock' in mod programare.
Pin nr.13 RB7 Al saptelea pin la portul B. Linia 'Data' in mod programare.
Pin nr.14 Vdd Polul pozitiv al sursei.
Pin nr.15 OSC2 Pin desemnat pentru conectarea la un oscilator
Pin nr.16 OSC1 Pin desemnat pentru conectarea la un oscilator
Pin nr.17 RA2 Al doilea pin la portul A. Nu are functie aditionala.
Pin nr.18 RA1 Primul pin la portul A. Nu are functie aditionala.
1.2 Bobina. Metode de masurare a bobinei
Calculul inductivitatii:
d este diametrul mediu al bobinei in mm, l este lungimea in mm,iar n numarul de spire.
Miezuri magnetice
Materialele magnetice utilizate pentru miezurile bobinelor sunt neliniare din punctul de vedere al
comportarii in camp magnetic exterior.Neliniaritatea se exprima prin dependenta inductieie
magnetice B de intensitatea campului magnetic H, printr-o functie neliniara.Crescand intensitatea
H a campului magnetic, inductia magnetica B creste, tinzand catre valoarea de saturatie B.
Atomii materialelor magnetice avand moment magnetic propiu, iar momentele atomice vecine
fiind orientate identic, se formeaza domenii cu magnetizare spontana.Pe ansamblu, domeniile
sunt astfel orientate, incat materialul prezinta magnetizare remanenta.La aplicarea unui camp
magnetic exterior apare o deplasare a domeniilor magnetice, ceea ce macroscopic se manifesta
printr-o dependenta de tip histerezis a inductiei magnetice B, de intensitate H a campului
magnetic.Din punct de vedere al orientarii momenteleor magnetice atomice, materialele pot fi
feromagnetice sau ferimagnetice.Feromagneticele au momentele magnetice elementare orientate
toate in acelasi sens.Materialele ferimagnetice au in structura lor doua sau mai multe subretele
magnetice, avand fiecare magnetizare spontana, momentele magnetice fiind orientate in sens
contrar, dar unul dintre momente este mai mare in valoare absoluta.Magnetizarea spontana exista
numai pana la o anumita temperatura T, numita temperatura Curie,a carei valoare depinde de
material.Dupa depasirea temperaturii T energia termica a retelei depaseste energia interactiunii
de schimb, domenile de magnetizare dispar, materialul fiind paramagnetic.Din punct ce vedere al
ciclului de histerezis, materialele magnetice pot fi moi (cu campul coercitiv
H<80A/m,permeabilitate mare, pierderi mici) sau dure (H>80A/m, pierderi mari, dar cu energie
mare in intrefier).
Permeabilitatea magnetica
O bobina ideala, avand in vid inductivitatea L0, in care se introduce un miez magnetic de
permeabilitate relativa complexa μ, pentru flux de scapari nul prezinta la borne impedanta:
Inductivitatea bobinei
L= μ efL0 (1.2.5)
Unde L0 este inductivitatea bobinei fara miez, iar μ este permeabilitatea efectiva a
miezului, dependenta de permeabilitatea relativa, a materialului miezului, de geometrie si pozitia
relativa a miezului fata de bobinaj. Permeabilitatea efectiva se poate calcula numai pentru
anumite geometri, de regula se detremina experimental.
Parametrii bobinei
Fig.1.2.1
Parametrul caracteristic al unei bobine este inductivitatea L, definita ca raportul dintre fluxul
magnetic propriu sigma si curentul I ce strabate bobina:
L=Ф/I (1.2.6)
Valoarea inductivitatii este usor dependenta si de temperatura de lucru atat prin dependenta
inductivitatii relative de temperatura cat si prin modificarea dimensiunilor fizice ale bobinei la
variatii mari de temperatura.
Un alt parametru al bobinei este rezistenta sa de pierderi r.Fiecare spira a bobinei comporta ca o
rezistenta de pierderi in conductor r'e, si o rezistenta de pierderi in materialul magnetic r. Care
inglobeaza atat pierderile datorite curentilor turbionari in miezul magnetic,al caror efect este
proportional cu patratul frecventei de lucru,cat si pierderile prin histerezis al caror efect este
proportional cu f.Pierderile r'c si r'm pot fi echivalate cu o rezitenta in serie cu inductivitatea L' a
spirei.In paralel cu grupul serie apare rezistenta de izolare r'p.
Considerand toate cele n spire identice, se poate considera bobina, intr-o prima aproximatie, ca o
inductivitate L=nL' in serie cu rc=nr'c si rm=nr'm, tot grupul fiind in paralel cu
rp=nr'p.Transpunand efectul rezistentei de izolatie in serie, efectul total de pierderi in bobina este
exprimat prin rezistenta serie a bobinei r.Inductivitatea L caracterizeaza comportarea utila a
bobinei, ca element pur raectiv, in timp ce r caracterizeaza pierderile de putere activa.
La fiecare frecventa de lucru se defineste pentru bobina, factorul sau de calitate, ca fiind
proportional cu raportul dintre energie maxima inmagazinata in campul magnetic al bobinei si
energia disipata sub forma de caldura, intr-o perioada.Ca urmare,factorul de calitate se determina
din relatia:
= = = QL (1.2.7)
Curentul ce strabate o bobina si repectiv tensiunea la bornele sale depind de reactanta bobinei
XL= ωL, deci vor depinde de frecventa.Pentru a evita deteriorarea bobinei ca urmare unor
solicitari electrice, curentul si tensiunea la borne nu trebuie sa depaseasca, in functie de frecventa
de lucru, anumite limite.
-in domeniul frecventelor joase solicitarea bobinei se datoreste in principal curentului care da
nastere unor forte mecanice de respingere intre spire .In acest domeniu tensiunea la borne creste
liniar cu frecventa.Deci pentru a se evita distrugerea bobinei, curentul nu trebuie sa depaseasca
valoarea maxima admisibila Imax.
-de la o anumita frecventa f1, apare pericolul de distrugere termica a bobinei, deci trebuie limitata
puterea maxima pe care o poate disipa bobina :
- pentru o anumita frecventa f2 in domeniul frecventelor inalte depasirea unei tensiuni limitaUmax
este interzisa, pentru strapungerile intre spire, deci curentul va avea alta lege de variatie I= U max/
ωL.
Pmax = (1.2.11)
In functie de frecventa apar deci trei domenii in care se impun succesiv restrictii asupra
curentului in domeniul frecventelor joase, pana la frecventa critica f1, asupra puterii disipate in
domeniul f1- f2 si asupra tensiunii la frecvente mai mari de frecventa critica f2. Frecventele critice
satisfac relatia:
f1 f2= (1.2.12)
Zgomotul bobinelor
Fiabilitatea bobinelor
Bobinele sunt elemente cu siguranta in functionare relativ scazuta, defectiunile lor putand
conduce si la defectarea altor piese cu care sunt conectate sau alaturi de care sunt montate. La
randul lor insa, defectiunile bobinelor pot fi provocate de defectarea altor componente ale
sistemului.Fiabilitatea bobinelor este destul de variata in functie de tipul bobinei, domeniul de
utilizare, conditiile de constructie, modul de intretinere si exploatare, dar, orientativ rata de
defectare poate fi considerata λ=0,01/1000 h.Cele mai frecvente defectiuni sunt intreruperea
conductorului sau scurtcircuitul intre spire, temperaturi inalte ce conduc la strapungerea termica
a izolatiei, temperaturi prea joase care favorizeaza strapungerea deoarece materialele de etansare
pot crapa si astfel este posibila patrunderea umiditatii.Pentru cresterea sigurantei bobinelor se pot
lua masuri inca din fabriactie din etapa de proiectare, alegand tipul de bobinaj si de izolatie
corespunzator frecventelor si tensiunilor de lucru, tipul de conductor corespunzator puterilor
dezvoltate in circuit.
Circuitul scilant serie este un dipol pasiv format ditr-o bobina si un condensator, conectate in
serie.Impedanta acestui circuit depinde mult de frecventa, ceea ce ii confera propietati
selective.Astfel ea atinge un minim la frecventa la care modulul reactantei inductive devine egal
cu modulul reactantei capacitive si tinde spre valori foarte mari in afara acestei frecvente.Ca
urmare,daca circuitul se excita cu un generator ideal de tensiune, curentul din circuit va depinde
mult de frecventa si va atinge maxim pronuntat la freventa de rezonanta, determinand deci o
comportare a circuitului.Daca circuitul s-ar excita cu un generator de curent, curentul prin circuit
va fi practic constant si independent de frecventa deoarece impedanta circuitului va fi practic
constant si independent de frecventa deoarece impedanta circuitului este practic neglijabila, in
raport cu rezistenta interna a generatorului. Deci propietatile selective ale circuitului se pierd.
Fig.1.2.2
UL=jXLI=jωLI (1.2.17)
UC=jXcI=-( )I (1.2.18)
UR=Rs*I (1.2.19)
Rezonanta circuitului serie
f0= (1.2.21)
Deci rezonanta are loc atunci cand frecventa tensiunii de excitatie, produsa de genaerator,
coincide cu frecventa proprie de oscilatie a circuitului.La rezonanta, impedanta circuitului serie
este minima si pur rezistiva:
Zs(ω0)=Rs (1.2.22)
Iar curentul prin circuit este maxim si in faza cu tensiune la bornele circuitului:
I(ω0)= = (1.2.23)
= =ω0L = (1.2.24)
Din propietatile circuitului oscilanta serie aratate rezulta si posibiltatile de utilizare a acestuiu
circuit ca circuit selectiv sau ca circuit de rejectie.
Q= = =QL (1.2.25)
Caracteristicile de frecventa normate.Banda de trecere la 3dB.
P(ω)-puterea la frecventa ω;
K (ω)-marimea la frecventa ω;
K (ω0)-marimea de referinta;
Bobine de audiofrecventa
Se utilizeaza pentru filtru de joasa frecventa (filtre de retea, drosele de alimentare etc. ) Au
inductante ce pot ajunge la zeci de Henry. Se realizeaza in general pe miezuri magnetice inchise,
in forma de tole sau oale. Tolele se realizeaza din materiale cu permeabilitate magnetica cat mai
ridicata (otel cu siliciu, permalloy, ferite, etc.). O particularitate a acestor bobine o constituie
dependenta inductantei fata de nivelul tensiunii alternative si continue aplicate, precum si fata de
frecventa. Bobinajele se executa pe carcase avand forma miezului, folosind conductor de cupru
emailat cu diametru corespunzator curentului care le strabate. In cazul cand sunt strabatute si de
o componenta de c.c. se intrerupe circuitul magnetic printr-un intrefier, care imbunatateste
comportarea miezului, dar reduce permeabilitatea.
Deoarece, asa cum rezulta din relatia pentru ÐxÐ=1 curentul prin circuit se reduce la 1/√2 din
valoarea sa maxima, rezulta ca la frecventele la care ÐxÐ=1, curentul se reduce cu 3dB fata de
valoarea sa maxima posibila.Prin definitie, diferenta acestor frecvente corespunzatoare lui
ÐxÐ=1 se numeste banda de trecere a circuitului la 3dB.Marimea acestei benzi caracterizeaza
propietatile selective ale circutului.Cu cat aceasta banda este mai ingusta,cu atat circuitul este
mai selectiv.
Circuitul oscilant derivatie este un dipol pasiv format din doua componente pasive reale,o bobina
si un condensator,conectate in derivatie.Excitarea sa trebuie facuta cu un generator cu rezistenta
interna mare, deoarece un generator cu rezistenta mica va mentine practic constanta tensiunea la
bornele circuitului, indiferent de frecventa, astfel ca propietatile selective ale circuitului se pierd.
In figura de mai jos se prezinta schema unui circuit derivatie alimentat de un generator pentru a
carui reprezentare s-a utilizat schema echivalenta cu generator de curent.Conductanta de pierderi
derivatie
Fig.1.2.3
Gd=Gg+GL+GC (1.2.28)
Bd (ω0) = ω0 C- =0 (1.2.30)
f0= (1.2.31)
U(ω0)= = (1.2.33)
La rezonanta circuitului derivatie, curentii prin inductanta si capacitate sunt maximi, egali in
modul, in opozitie de faza si de Q ori mai mari decat curentul total debitat de generator, I:
Q= = =ω0Crd= (1.2.35)
x= =( )( - )=βQ (1.2.38)
Linia Enable (E) permite accesul la afisaj prin intermediul liniilor R/W si RS. Cand aceasta linie
este LOW, LCDul este dezactivat si ignora semnalele de la R/W si RS. Cand linia (E) este
HIGH, LCDul verifica starea celor doua linii de control si raspunde corespunzator.
Linia Read/Write (R/W) stabileste directia datelor dintre LCD si microcontroler. Cand linia este
LOW, datele sunt scrise in LCD. Cand este HIGH, datele sunt citite de la LCD.
Cu ajutorul liniei Register select (RS), LCD interpreteaza tipul datelor de pe liniile de date.
Cand este LOW, o instructiune este scrisa in LCD. Cand este HIGH, un caracter este scris in
LCD.
RS: - 0 Instructiuni;
- 1 Caracter;
Citirea datelor de la LCD se realizeaza similar, cu deosebirea ca linia de control R/W trebuie sa
fie HIGH. Cand trimitem un HIGH catre LCD, el se va reseta si va accepta instructiuni.
Instructiunile tipice care sunt transmise catre un afisaj LCD dupa reset sunt: pornirea afisajului,
activarea cursorului si scrierea caracterelor de la stanga spre dreapta. In momentul in care un
LCD este initializat, el este pregatit sa primeasca date sau instructiuni. Daca receptioneaza un
caracter, el il va afisa si va muta cursorul un spatiu la dreapta. Cursorul marcheaza locatia
urmatoare unde un caracter va fi afisat. Cand dorim sa scriem un sir de caractere, mai intai
trebuie sa setam adresa de start, si apoi sa trimitem cate un caracter pe rand. Caracterele care pot
fi afisate pe ecran sunt memorate in memoria video DD RAM (Data Display RAM). Capacitatea
memoriei DD RAM este de 80 bytes.
Afisajul LCD mai contine 64 bytes CG RAM ( Character Generator RAM). Aceasta memorie
este rezervata pentru caracterele definite de utilizator. Datele din CG RAM sunt reprezentate sub
forma de caractere bitmap de 8 biti. Fiecare caracter ocupa maxim 8 bytes in CG RAM, astfel
numarul total de caractere pe care un utilizator poate sa le defineasca este 8. Pentru a afisa
caracterul bitmap pe LCD, trebuie setata adresa CG RAM la punctul de start (de obicei 0) si apoi
sa fie scrise datele in afisaj. Definirea unui caracter ‚special’ este exemplificata in figura.
Fig.1.3.1
Inainte de a accesa DD RAM, dupa definirea unui caracter special, programul trebuie sa seteze
adresa in DD RAM. Orice scriere si citire a datelor din memoria LCD este realizata de la ultima
adresa care a fost setata, folosind instructiunea set-adress. Odata ce adresa DD RAM este setata,
un caracter nou va fi afisat in locul potrivit pe ecran. Pana acum am discutat operatia de scriere si
citire a memoriei unui LCD ca si cum ar fi o memorie obisnuita. Acest lucru nu este adevarat.
Controlerul LCD are nevoie de 40 pana la 120 microsecunde (us) pentru scriere si citire. Alte
operatii pot dura pana la 5 ms. In acest timp microcontrolerul nu poate accesa LCDul, astfel un
program trebuie sa stie cand un LCD este ocupat. Putem rezolva aceasta in doua metode.
Fig.1.3.2
O metoda este verificarea bitului BUSY de pe linia de date D7. Aceasta nu este cea mai buna
metoda pentru ca LCDul se poate bloca si programul va sta intr-o bucla infinita verificand bitul
BUSY. O alta metoda este introducerea unei intarzieri in program. Intarzierea trebuie sa fie
destul de lunga pentru ca LCDul sa termine operatia in desfasurare. Instructiunile pentru scriere
si citire cu memoria LCDului sunt afisate mai sus. La inceput am mentionat ca avem nevoie de
11 linii I/O pentru a comunica cu un LCD. Oricum, putem comunica cu un LCD printr-un bus de
4 linii. Putem reduce numarul total de linii de comunicatie la 7. Schema pentru conectarea printr-
un bus de 4 biti este in imaginea de mai jos. In acest exemplu folosim un afisaj LCD cu 2x16
caractere, denumit LM16x212 fabricat de producatorul japonez Sharp. Mesajul ‚character’ este
scris pe prima linie urmat de doua caractere speciale ‚~’ si ‚}’. Pe a doua linie este scris cuvantul
‚mikroElektronika’.
Fig.1.3.3 Conectarea unui afisaj la un microcontroler
Abilitatea de a comunica este de mare importanta in orice domeniu. Totusi, este posibila numai
daca amandoi partenerii de comunicare cunosc acelasi limbaj, sau urmaresc aceleasi reguli in
timpul comunicarii. Folosind aceste principii ca un punct de plecare, putem de asemenea defini
comunicarea ce are loc intre microcontrolere si om. Limbajul pe care microcontrolerul si omul il
folosesc pentru a comunica este numit 'limbaj de asamblare'. Titlul insusi nu are un inteles
deosebit, si este analog numelor altor limbaje, de ex. engleza si franceza. Mai precis, 'limbajul de
asamblare' este doar o solutie trecatoare. Programele scrise in limbaj de asamblare trebuie
traduse intr-un 'limbaj de zero-uri si unu-uri' pentru ca un microcontroler sa-l inteleaga.
'Limbajul de asamblare' si 'assembler-ul' sau asamblorul sunt doua notiuni diferite. Primul
reprezinta un set de reguli folosite in scrierea unui program pentru un microcontroler, iar celalalt
este un program in computerul personal care traduce limbajul de asamblare intr-un limbaj de
zero-uri si unu-uri. Un program ce este tradus in 'zero-uri' si 'unu-uri' este numit 'limbaj masina'.
Fig.1.3.4
Fizic, 'Program' reprezinta un fisier pe discul computerului (sau in memorie daca este citit intr-
un microcontroler), si este scris conform cu regulile de asamblare sau ale altui limbaj pentru
programarea microcontrolerului. Omul poate intelege pentru ca este constituit din semne si
cuvinte ale alfabetului. Cand se scrie un program, trebuie urmarite unele reguli pentru a se obtine
un efect dorit. Un Translator interpreteaza fiecare instructiune scrisa in limbajul de asamblare
ca o serie de zero-uri si unu-uri ce au o semnificatie pentru logica interna a microcontrolerului.
Cand asamblorul il traduce, obtinem o serie de zero-uri si unu-uri pe care microcontroleul stie
cum sa-l interpreteze.
Limbaj de Asamblare
Instructiuni
Operanzi
Directive
Comentarii
Eticheta
Un Label este o desemnare textuala (in general un cuvant usor de citit) pentru o linie intr-un
program, sau sectiunea unui program unde micro-ul poate sari – sau chiar inceputul unui set de
linii a unui program. Poate fi folosit de asemenea pentru a executa ramificare de program (ca
Goto…….) si programul poate chiar avea o conditie ce trebuie indeplinita pentru ca
instructiunea Goto sa fie executata. Este important pentru un label de a incepe cu o litera a
alfabetului sau cu o subliniere '_'. Lungimea label-ului poate fi de pana la 32 caractere. Este de
asemenea important ca un label sa inceapa de la primul rand.
Fig.1.3.5
Instructiuni
Instructiunile sunt deja definite prin folosirea unui microcontroler specific, asa ca ne ramane doar
sa urmam instructiunile pentru folosirea lor in limbajul de asamblare. Modul in care scriem o
instructiune mai este numit 'sintaxa' instructiunii. In exemplul urmator putem recunoaste o
greseala in scriere pentru ca instructiunile movlp si goto nu exista pentru microcontrolerul
PIC16F84.
Operanzi
Operanzii sunt elemente ale instructiunii pentru instructiunea ce este executata. Ei sunt de obicei
registri sau variabile sau constante. Constantele sunt numite 'literal-e'. Cuvantul literal
inseamna 'numar'.
Comentarii
Comentariul este o serie de cuvinte pe care programatorul le scrie pentru a face programul mai
clar si mai usor de citit. Se plaseaza dupa o instructiune , si trebuie sa inceapa cu punct si
virgula';'.
Directive
O directiva este similara unei instructiuni, dar spre deosebire de o instructiune este independenta
de modelul microcontrolerului, si reprezinta o caracteristica a limbajului de asamblare insusi.
Directivelor le sunt date uzual intelesuri de scop prin variabile si registri. De exemplu, LEVEL
poate fi o desemnatie pentru o variabila in memoria RAM la adresa 0Dh. In felul acesta,
variabila la acea adresa poate fi accesata prin desemnatia LEVEL. Aceasta este mult mai usor
pentru un programator sa inteleaga decat sa incerce sa-si aduca aminte ca adresa 0Dh contine
informatii despre LEVEL.
-un formator de semnal TTL (cu trigher smith) care preia semnalul generat de oscilatorul
OSC2 si genereaza la iesire un semnal de nivel TTL. Pentru OSC1 nu este necesar un oscilator
de semnal intrucat LM339 genereaza direct semnal TTL.
- un multiplexor care selecteaza in functie de semnalul RA1 ,unul din semnalele S1 sau
S2
fx= * (2.2.1)
Valoarea lor trebuie sa suficient de mare pentru a nu amortiza curentul acordat derivatiei.
R5 se alege astfel incat curentul pe iesire sa fie mic.Alegem I0=5mA iar R5= = =1K
Se alege la fel si C2 iar C1=506nF astfel incat oscilatorul sa functioneze stabil in gama
1μH<Lx<250mH.
Fig.2.2.3
Poarta CMOS sa fie polarizata in zona tensiuni de tranzitieVT cu ajutorul unei rezistenta R5care
se determina experimental R5=1.5KΏ
Fig.2.2.7
VGS=-IdxP2 (2.2.6)
Alegand un transistor FET BF256 cu VT=--3V si un curent Id=2mA se obtine P2=500 ohmi.
Si P1=4,7K care se regleaza astfel incat sa se indeplineasca conditia de amplitudine pentru a
exista oscilatii.
Grupul R6siC4 se allege asfel incat impedanta cat mai putin decat a puntii Cmos sa influenteze
cat mai putin Q (factorul de calitate) al circuitului acordat Lx,C5 si oscilatorul sa functioneze
stabil.
Utilizarea divizoarelor de frecventa :IC2 este un divizor cu 4 respectiv IC6 divizor cu 256 sunt
necesare pentru a micsora frecventa semnalului masurat.Durata unei instructiuni este de
0,5μs.Frecventa oscilatorului cu cuart care proiecteaza microcontrolerul este de 8Mhz .
Calculul frecventei de oscilatie
f= ; Kdiv=2 (2.2.7)
f= ; Kdiv=256 (2.2.8)
2.4 Multiplexorul
Un dispozitiv care permite transferul unor fluxuri multiple de date printr-un mediu comun.
Fig.2.4.1
S1 S2 RA1 RB0
0 X 0 0 Selecteaza
semnalul S1
1 X 0 1
X 0 1 0 Selecteaza
semnalul S2
X 1 1 1
0 1
RA1
S1 S2
00 0 0
01 0 1
11 1 1
10 1 0
RB0=S1* +S2*RA1
RB0=
RB0=
Functiile microcontrolerului
K1 neapasat:
Semnalul cu frecvente necunoscute Tx generat de oscilator este preluat la pinul RA0 de catre
microcontrolerul care functioneaza in regim de intreruperi la pinul RB0 si la valori 0xFF a
TMR0. Schema bloc echivalenta a uC este prezentata in figura….
Fig.2.5.1
Calculul inductantei
f0= * = (2.5.1)
daca RL <<1;
RL-rezistenta bobinei;
Q= ; ω0= (2.5.2)
TRef=1μs
Notam cu K
K=200239,4934=2,00239493*105(F-1)
Microcontrolerul calculeaza iar de coeficientul 10-7 se tine cont cand face afisarea.
2.Pentru oscilatorul de joasa frecventa
TRef=1μs
Lx=m*10-12*n2 (2.5.9)
C=3,865*10-9F=3.865 nF
Lx=m*10-2*n2=10-10*n2 (2.5.10)
Lx=10-10*n2 ; (2.5.11)
Microcontrolerul calculeaza n2 iar de coeficientul 10-10 se tine cont cand se face afisarea.
LCD D777
D6666D5 D4 En R/W RS
P2 15 14 13 12 11 10 9 Wait_15ms
0 0 1 1 0 0 0 0x3000
0 0 1 1 0 0 0 Enable
0 0 0 0 0 0 0
wait wait 5ms
0 0 1 1 0 0 0 0x30
0 0 1 1 1 0 0 Enable
wait
0 0 1 1 0 0 0
wait
0 0 1 1 0 0 0 0x30
0 0 1 1 1 0 0 Enable
wait
0 0 1 1 0 0 0
wait
0 0 1 0 0 0 0 0x20
0 0 1 0 1 0 0 Enable
wait
0 0 1 0 0 0 0
wait
0 0 1 0 0 0 0 0x20
0 0 1 0 1 0 0 Enable
wait
0 0 1 0 0 0 0
wait
1 1 0 0 0 0 0 0xC0
wait
1 1 0 0 0 0 0 Enable
1 1 0 0 1 0 0
wait
1 1 0 0 0 0 0
wait
0 0 0 0 0 0 0 0x00
0 0 0 0 1 0 0 Enable
wait
0 0 0 0 0 0 0
wait
1 1 0 1 0 0 0 0xD0
1 1 0 1 1 0 0 Enable
wait
1 1 0 1 0 0 0
0 0 0 0 0 0 0 0x00
0 0 0 0 1 0 0 Enable
wait
0 0 0 0 0 0 0
wait
0 0 0 1 0 0 0 0x40
0 0 0 1 1 0 0 Enable
wait
0 0 0 1 0 0 0
wait
0 0 0 0 0 0 0 0x00
0 0 0 0 1 0 0 Enable
wait
0 0 0 0 0 0 0
wait
0 1 1 0 0 0 0 0X60
0 1 1 0 1 0 0 Enable
wait
0 1 1 0 0 0 0
wait
Fig.2.6.2
Fig.2.7.1
Up=220V
US=9V
IS=1A
PS=US*IS
PP=PS/n
PP=9VA/0.85
PP=10.6VA
IP=PP/UP
IP=10.6/220
IP=50mA
S2=1.22* PP
S2=1.44*10.6
S2=4cm2
a2=4.72*S
a2=22.09*4
a=10mm
h=50*S/a
h=50*4/10
h=20mm
n0=45/S
n0=11.24sp/V
Deci primarul va avea 2473 spire cu sarma de Cu de 0.15mm,iar secundarul va avea 102 spire cu
sarma de Cu de 0.7mm,bobinajul realizaduse pe o carcasa cu sectiunea de 4 cm2.
Redresorul si filtrul
Redresarea tensiunii alternative data de transformator este facuta cu ajutorul puntii redresoare
PR.Filtrul capacitiv realizat cu condensatorul C1,realizeaza aplatizarea riplului dat de PR.Fiultrul
de C2,C3 si R1 este necesar pentru stabilirea functionarii circuitului LM7805.
C2,C3 68μF
R1,R2 100K
R3 100K
R4 47K
LM339
C6 100nF
SN74LS393
R5 1,7K
R6 2,2M
C4 330pF
C5 3,8nF
R7 1M
P1 4,7K
BF256
P2 500
SN74HC14
C7 100nF
R9 1K
LED
R8 1K
R10 10K
C8 100nF
C9 220nF
P4 5K
R12 110
P3 1K
ULN7805
A.3 Cablajul
A.4.Listingul programului in limbaj de asamblare
list p=16F84A
radix hex
#define RS PORTB,1
#define RW PORTB,2
#define EN PORTB,3
org 0x000
goto main
ISR_adr org 0x04
;bcf PORTA,3;-------
;clrf TMR0
btfsc INTCON,7
goto ISR_adr
;call PUSH
btfsc INTCON,1
goto ISR_rb0
btfsc INTCON,2
goto ISR_tmr
main
clrwdt
bsf STATUS,5
movlw b'00000000'
movwf OPTIONS
movwf TRISB
movlw 0x19
movwf TRISA
bcf STATUS,5
clrf PORTA
;clrf PORTB
;--
clrf NUMB1
clrf NUMB2
clrf NUMB3
clrf NUMB4
call init_lcd
call stergere
call scrie_proiect
call stergere
call scrie_mesaj
;bcf INTCON,2
bcf INTCON,1
bsf INTCON,4
bcf INTCON,3
bcf INTCON,5
clrf INDICE
bsf INTCON,7
;call scrie_mesaj
goto loop
;goto main
ISR_rb0
btfsc INDICE,0
goto rb01
clrf TMR0
bcf INTCON,1
bcf INTCON,2
bsf INTCON,5
bsf INDICE,0
retfie
movwf NUMB1
bcf INTCON,7
;movf TMR0,0
;movwf NUMB1
;bcf INTCON,7
call init_lcd
;call scrie_mesaj
call stergere
call poz_cursor
;movf NUMB4,0
;call afis_nibble_sup
;movf NUMB4,0
;call afis_nibble_inf
;movf NUMB3,0
;call afis_nibble_sup
;movf NUMB3,0
;call afis_nibble_inf
;movf NUMB2,0
;call afis_nibble_sup
;movf NUMB2,0
;call afis_nibble_inf
;movf NUMB1,0
;call afis_nibble_sup
;movf NUMB1,0
;call afis_nibble_inf
;call delay_1s
;call delay_1s
;call delay_1s
;call delay_1s
;call delay_1s
;call delay_1s
;call delay_1s
;call delay_1s
;clrf NUMB4
;clrf NUMB3
; calculeaza NxN
movf NUMB2,0
movwf ACCbHI
movf NUMB1,0
movwf ACCbLO
call multiply
call div_cu_doi2
call div_cu_doi2
call div_cu_doi2
call stergere
call poz_cursor
call conbinbcd
movf NUMZ4,0
call afis_nibble_sup
movf NUMZ4,0
call afis_nibble_inf
movf NUMZ3,0
call afis_nibble_sup
movf NUMZ3,0
call afis_nibble_inf
movf NUMZ2,0
call afis_nibble_sup
movf NUMZ2,0
call afis_nibble_inf
movf NUMZ1,0
call afis_nibble_sup
movf NUMZ1,0
call afis_nibble_inf
call delay_1s
call delay_1s
call delay_1s
call delay_1s
;call delay_1s
;call delay_1s
;call delay_1s
;call delay_1s
;goto loop
; afiseaza rezultatul
call stergere
call poz_cursor
movlw 'L'
call afisare
movlw '='
call afisare
movf NUMZ4,0
bcf STATUS,2
andlw 0xF0
btfss STATUS,2
goto eror
movf NUMZ4,0
bcf STATUS,2
andlw 0x0F
btfss STATUS,2
;goto teo1
goto sute_mH
movf NUMZ3,0
bcf STATUS,2
andlw 0xF0
btfss STATUS,2
;goto teo2
goto zeci_mH
movf NUMZ3,0
bcf STATUS,2
andlw 0x0F
btfss STATUS,2
;goto teo3
goto unit_mH
movf NUMZ2,0
bcf STATUS,2
andlw 0xF0
btfss STATUS,2
;goto teo3
goto sute_uH
movf NUMZ2,0
bcf STATUS,2
andlw 0x0F
btfss STATUS,2
;goto teo3
goto zeci_uH
goto unit_uH
eror
call poz_cursor
movlw 'E'
call afisare
movlw 'r'
call afisare
movlw 'o'
call afisare
movlw 'a'
call afisare
movlw 'r'
call afisare
movlw 'e'
call afisare
goto teo
sute_mH
movf NUMZ4,0
call afis_nibble_inf
movf NUMZ3,0
call afis_nibble_sup
movf NUMZ3,0
call afis_nibble_inf
movlw '.'
call afisare
movf NUMZ2,0
call afis_nibble_sup
movlw 'm'
call afisare
movlw 'H'
call afisare
goto teo
zeci_mH
movf NUMZ3,0
call afis_nibble_sup
movf NUMZ3,0
call afis_nibble_inf
movlw '.'
call afisare
movf NUMZ2,0
call afis_nibble_sup
movlw 'm'
call afisare
movlw 'H'
call afisare
goto teo
unit_mH
movf NUMZ3,0
call afis_nibble_inf
movlw '.'
call afisare
movf NUMZ2,0
call afis_nibble_sup
movf NUMZ2,0
call afis_nibble_inf
movlw 'm'
call afisare
movlw 'H'
call afisare
goto teo
sute_uH
movf NUMZ2,0
call afis_nibble_sup
movf NUMZ2,0
call afis_nibble_inf
movf NUMZ1,0
call afis_nibble_sup
movlw '.'
call afisare
movf NUMZ1,0
call afis_nibble_inf
movlw 'u'
call afisare
movlw 'H'
call afisare
goto teo
zeci_uH
movf NUMZ2,0
call afis_nibble_inf
movf NUMZ1,0
call afis_nibble_sup
movlw '.'
call afisare
movf NUMZ1,0
call afis_nibble_inf
movlw 'u'
call afisare
movlw 'H'
call afisare
goto teo
unit_uH
movf NUMZ1,0
call afis_nibble_sup
movlw '.'
call afisare
movf NUMZ1,0
call afis_nibble_inf
movlw 'u'
call afisare
movlw 'H'
call afisare
call delay_1s
call delay_1s
;call delay_1s
;call delay_1s
;call delay_1s
call sterge_reg
call stergere
call scrie_mesaj
bcf INDICE,0
clrf TMR0
bcf INTCON,1
bcf INTCON,5
bsf INTCON,4
;bsf INTCON,7
retfie
;goto loop
incf NUMB2,1
btfss STATUS,2
goto iesire
;bcf STATUS,2
incf NUMB3,1
btfss STATUS,2
goto iesire
;bcf STATUS,2
incf NUMB4,1
;btfss STATUS,2
;goto iesire
;incf NUM5
bsf INTCON,5
;call POP
;bsf PORTA,3;-----
;call POP
retfie
sterge_reg
clrf NUMB1
clrf NUMB2
clrf NUMB3
clrf NUMB4
return
stergere
bcf RS
bcf RW
movlw 0x00
movwf PORTB
call enable
movlw 0x10
movwf PORTB
call enable
call delay_15m
;8Meg
;call delay_15m
return
D_add
bcf STATUS,0
movf ACCaLO,0
addwf ACCbLO,1
btfsc STATUS,0
incf ACCbHI,1
btfsc STATUS,0
bsf STATUS,0
movf ACCaHI,0
addwf ACCbHI,1
btfsc STATUS,0
bsf STATUS,0
retlw 0
multiply
movf NUMB2,0
movwf ACCaHI
movf NUMB1,0
movwf ACCaLO
call setup
mloop rrf ACCdHI,1
rrf ACCdLO,1
btfsc STATUS,0
call D_add
rrf ACCbHI,1
rrf ACCbLO,1
rrf ACCcHI,1
rrf ACCcLO,1
decfsz temp,1
goto mloop
movf ACCbHI,0
movwf NUMB4
movf ACCbLO,0
movwf NUMB3
movf ACCcHI,0
movwf NUMB2
movf ACCcLO,0
movwf NUMB1
return
setup
movlw .16
movwf temp
movf ACCbHI,0
movwf ACCdHI
movf ACCbLO,0
movwf ACCdLO
clrf ACCbHI
clrf ACCbLO
retlw 0
bcf STATUS,0
rlf NUMB1,1
rlf NUMB2,1
rlf NUMB3,1
rlf NUMB4,1
return
bcf STATUS,0
rrf NUMB4,1
rrf NUMB3,1
rrf NUMB2,1
rrf NUMB1,1
return
init_lcd
call delay_1s
bcf RS
bcf RW
movlw 0x30
movwf PORTB
call enable
call delay_15m
;8Meg
;call delay_125m
call enable
;call delay_125m
call delay_1.5m
call enable;
movlw 0x20
movwf PORTB
call enable
call enable;
bcf RS
bcf RW
movlw 0xC0
movwf PORTB
call enable
movlw 0x00
movwf PORTB
call enable
movlw 0xC0
movwf PORTB
call enable
movlw 0x00
movwf PORTB
call enable
movlw 0x10
movwf PORTB
call enable
movlw 0x00
movwf PORTB
call enable
bcf RS
bcf RW
movlw 0x60
movwf PORTB
call enable
movlw 0x00
movwf PORTB
call enable;
bcf RS
bcf RW
movlw 0xF0
movwf PORTB
call enable
call delay_15m
;8Meg
;call delay_125m
return
scrie_proiect
call poz_cursor
movlw 'P'
call afisare
movlw 'r
call afisare
movlw 'o'
call afisare
movlw 'i'
call afisare
movlw 'e'
call afisare
movlw 'c'
call afisare
movlw 't'
call afisare
movlw 'd'
call afisare
movlw 'e'
call afisare
call poz_lin_2
movlw 'd'
call afisare
movlw 'e'
call afisare
call afisare
movlw 's'
call afisare
movlw 't
call afisare
movlw 'a'
call afisare
movlw 't
call afisare
call delay_1s
call delay_1s
call delay_1s
call delay_1s
call delay_1s
return
poz_cursor
bcf RS
bcf RW
movlw 0x00
movwf PORTB
call enable
movlw 0x10
movwf PORTB
call enable
call delay_15m
;8Meg
;call delay_15m
bcf RS
bcf RW
movlw 0x80
movwf PORTB
call enable
movlw 0x30
movwf PORTB
call enable
call delay_15m
;8Meg
;call delay_15m
return
poz_lin_2
movlw 0xC0
movwf PORTB
call enable
movlw 0x30
movwf PORTB
call enable
call delay_15m
return
scrie_mesaj
;scrie M
bcf RS
bcf RW
movlw 0x00
movwf PORTB
call enable
movlw 0x10
movwf PORTB
call enable
call delay_15m
;8Meg
;call delay_15m
bcf RS
bcf RW
movlw 0x80
movwf PORTB
call enable
movlw 0x30
movwf PORTB
call enable
call delay_15m
movlw 'C'
call afisare
movlw 'o'
call afisare
movlw 'n'
call afisare
movlw 'e'
call afisare
movlw 'c'
call afisare
movlw 't'
call afisare
movlw 'a'
call afisare
movlw 't'
call afisare
movlw 'i'
call afisare
call poz_lin_2
movlw 'i'
call afisare
movlw 'n'
call afisare
movlw 'd'
call afisare
movlw 'u'
call afisare
movlw 'c'
call afisare
movlw 't'
call afisare
movlw 'a'
call afisare
movlw 'n'
call afisare
movlw 't'
call afisare
movlw 'a'
call afisare
return
;goto main
afisare
movwf LCD
movlw 0xF0
andwf LCD,0
addlw 0x02
movwf PORTB
call enable
swapf LCD,1
movlw 0xF0
andwf LCD,0
addlw 0x02
movwf PORTB
call enable
call delay_15m
;8Meg
;call delay_15m
return
afis_nibble_inf
;movf NUMB1,0
movwf LCD
movlw 0x0F
andwf LCD,1
movlw 0x30
addwf LCD,0
call afisare
return
afis_nibble_sup
movwf LCD
swapf LCD,1
movlw 0x0F
andwf LCD,1
movlw 0x30
addwf LCD,0
call afisare
return
enable
bsf EN
bcf EN
nop
nop
; nop
; nop
; nop
; nop
;-- 8Mhz
call delay_1125
nop
;nop
; nop
; nop
; nop
; nop
;nop
;nop
; nop
; nop
; nop
; nop
return
movlw 0x04
movwf COUNT
loop15 decfsz COUNT,1
goto loop115
goto exit15
goto loop15
return
; cu call si return
nop
nop
nop
nop
nop
nop
movlw 0xFF
movwf COUNT1
movlw 0xFF
movwf COUNT2
goto loop1.5
return
delay_1s; la 4Mhz
call delay_125m
call delay_125m
call delay_125m
call delay_125m
call delay_125m
call delay_125m
call delay_125m
call delay_125m
return
movlw 0xFA
movwf COUNT
goto loop1125
goto exit125
goto loop125
return
delay_1125
nop
nop
nop;--
nop
nop
nop
nop
nop
nop
movlw 0x51
movwf COUNT1
movlw 0x4F
movwf COUNT2
goto loop11125
goto loop21125
return
conbinbcd
clrf NUMZ1
clrf NUMZ2
clrf NUMZ3
clrf NUMZ4
movlw 0x21
movwf NRBITI
goto bucla2
goto bucla3
call bcd_ori_doi
goto bucla1
bucla3 return
rotleft
bcf STATUS,0
rlf NUMB1,1
rlf NUMB2,1
rlf NUMB3,1
rlf NUMB4,1
movf STATUS,0
movwf CARRY
movlw 0x01
andwf CARRY
return
bcf STATUS,0
bcf STATUS,1
clrf CARRY1
clrf CARRY12
clrf CARRY13
clrf CARRY14
clrf CARRY2
clrf CARRY3
clrf CARRY4
movf NUMZ1,0
addwf NUMZ1,1
btfss STATUS,0
goto doi1
movlw 0x01
movwf CARRY1
goto doi2
bcf STATUS,0
movlw 0x06
addwf NUMZ1,1
goto doi3
bcf STATUS,1
movlw 0x0A
subwf NUMZ1,0
btfss STATUS,1
goto doi3
;goto doi52
movlw 0x06
addwf NUMZ1,1
goto doi5
bcf STATUS,1
movlw 0x60
addwf NUMZ1,1
btfss STATUS,0
goto doi7
bsf CARRY1,0
goto doi7
subwf NUMZ1,0
btfss STATUS,0
goto doi7
goto doi6
addwf NUMZ2,1
btfss STATUS,0
goto doi8
movlw 0x01
movwf CARRY2
goto doi9
bcf STATUS,0
movlw 0x06
addwf NUMZ2,1
goto doi10
bcf STATUS,1
movlw 0x0A
subwf NUMZ2,0
btfss STATUS,1
goto doi10
;goto doi52
movlw 0x06
addwf NUMZ2,1
goto doi11
bcf STATUS,1
movlw 0x60
addwf NUMZ2,1
btfss STATUS,0
goto doi13
bsf CARRY2,0
goto doi13
subwf NUMZ2,0
btfss STATUS,0
goto doi13
goto doi12
addwf NUMZ2,1
btfss STATUS,0
goto doi14
movlw 0x01
movwf CARRY12
goto doi15
bcf STATUS,0
movlw 0x06
addwf NUMZ2,1
goto doi16
movlw 0x0A
subwf NUMZ2,0
btfss STATUS,1
goto doi16
;goto doi52
movlw 0x06
addwf NUMZ2,1
goto doi17
bcf STATUS,1
movlw 0x60
addwf NUMZ2,1
btfss STATUS,0
goto doi19
bsf CARRY12,0
goto doi19
subwf NUMZ2,0
btfss STATUS,0
goto doi19
goto doi18
doi19 movf CARRY12,0
addwf CARRY2,1
movf NUMZ3,0
addwf NUMZ3,1
btfss STATUS,0
goto doi20
movlw 0x01
movwf CARRY3
doi20
btfss STATUS,1
goto doi21
bcf STATUS,0
movlw 0x06
addwf NUMZ3,1
goto doi22
bcf STATUS,1
movlw 0x0A
subwf NUMZ3,0
btfss STATUS,1
goto doi22
;goto doi52
movlw 0x06
addwf NUMZ3,1
goto doi23
bcf STATUS,1
movlw 0x60
addwf NUMZ3,1
btfss STATUS,0
goto doi25
bsf CARRY3,0
goto doi25
subwf NUMZ3,0
btfss STATUS,0
goto doi25
goto doi24
addwf NUMZ3,1
btfss STATUS,0
goto doi26
movlw 0x01
movwf CARRY13
bcf STATUS,0
movlw 0x06
addwf NUMZ3,1
goto doi28
bcf STATUS,1
movlw 0x0A
subwf NUMZ3,0
btfss STATUS,1
goto doi28
;goto doi52
movlw 0x06
addwf NUMZ3,1
goto doi29
bcf STATUS,1
movlw 0x60
addwf NUMZ3,1
btfss STATUS,0
goto doi31
bsf CARRY13,0
goto doi31
subwf NUMZ3,0
btfss STATUS,0
goto doi31
goto doi30
addwf CARRY3,1
movf NUMZ4,0
addwf NUMZ4,1
btfss STATUS,0
goto doi32
movlw 0x01
movwf CARRY4
doi32
btfss STATUS,1
goto doi33
bcf STATUS,0
movlw 0x06
addwf NUMZ4,1
goto doi34
bcf STATUS,1
movlw 0x0A
subwf NUMZ4,0
btfss STATUS,1
goto doi34
;goto doi52
movlw 0x06
addwf NUMZ4,1
goto doi35
bcf STATUS,1
movlw 0x60
addwf NUMZ4,1
btfss STATUS,0
goto doi37
bsf CARRY4,0
goto doi37
subwf NUMZ4,0
btfss STATUS,0
goto doi37
goto doi36
btfss STATUS,0
goto doi38
movlw 0x01
movwf CARRY14
goto doi39
bcf STATUS,0
movlw 0x06
addwf NUMZ4,1
goto doi40
bcf STATUS,1
movlw 0x0A
subwf NUMZ4,0
btfss STATUS,1
goto doi40
;goto doi52
movlw 0x06
addwf NUMZ3,1
goto doi41
movlw 0x60
addwf NUMZ4,1
btfss STATUS,0
goto doi43
bsf CARRY14,0
goto doi43
subwf NUMZ4,0
btfss STATUS,0
goto doi43
goto doi42
addwf CARRY4,1
goto doi46
movlw 0x99
movwf NUMZ1
movwf NUMZ2
movwf NUMZ3
movwf NUMZ4
goto doi47
;return
doi46 btfss CARRY,0
goto doi47
call addbcd_1
doi47 return
bcf STATUS,1
movlw 0x01
addwf NUMZ1,1
movlw 0x0A
subwf NUMZ1,0
btfss STATUS,1
goto star
bcf STATUS,0
bcf STATUS,1
movlw 0x06
addwf NUMZ1,1
;movlw 0x10
;addwf NUMZ1,1
movlw 0xA0
subwf NUMZ1,0
btfss STATUS,0
goto star
bcf STATUS,0
bcf STATUS,1
movlw 0x60
addwf NUMZ1,1
movlw 0x00
subwf NUMZ1,0
btfss STATUS,0
goto star
;;;
movlw 0x01
addwf NUMZ2,1
movlw 0x0A
subwf NUMZ2,0
btfss STATUS,1
goto star
bcf STATUS,0
bcf STATUS,1
movlw 0x06
addwf NUMZ2,1
;movlw 0x10
;addwf NUMZ1,1
movlw 0xA0
subwf NUMZ2,0
btfss STATUS,0
goto star
bcf STATUS,0
bcf STATUS,1
movlw 0x60
addwf NUMZ2,1
movlw 0x00
subwf NUMZ2,0
btfss STATUS,0
goto star
;;
movlw 0x01
addwf NUMZ3,1
movlw 0x0A
subwf NUMZ3,0
btfss STATUS,1
goto star
bcf STATUS,0
bcf STATUS,1
movlw 0x06
addwf NUMZ3,1
;movlw 0x10
;addwf NUMZ1,1
movlw 0xA0
subwf NUMZ3,0
btfss STATUS,0
goto star
bcf STATUS,0
bcf STATUS,1
movlw 0x60
addwf NUMZ3,1
movlw 0x00
subwf NUMZ3,0
btfss STATUS,0
goto star
;;
movlw 0x01
addwf NUMZ4,1
movlw 0x0A
subwf NUMZ4,0
btfss STATUS,1
goto star
bcf STATUS,0
bcf STATUS,1
movlw 0x06
addwf NUMZ4,1
;movlw 0x10
;addwf NUMZ1,1
movlw 0xA0
subwf NUMZ4,0
btfss STATUS,0
goto star
bcf STATUS,0
bcf STATUS,1
movlw 0x60
addwf NUMZ4,1
movlw 0x00
subwf NUMZ4,0
btfss STATUS,0
goto star
movlw 0x99
movwf NUMZ1
movwf NUMZ2
movwf NUMZ3
movwf NUMZ4
star return
end