Sunteți pe pagina 1din 45

LUCRAREA NR.

MICROCONTROLERUL PIC 16F84

Scopul lucrarii Lucrarea isi propune familiarizarea studentilor cu microcontrolerul PIC 16F84. Va fi prezentata in cele ce urmeaza structura acestuia si principalele domenii de aplicare.

Descrierea PIC 16F84A


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

Contor liber Memorie De date RAM

Memorie De date RAM

CPU

Memorie program FLASH

PORT A

PORT B

Fig. 1. Structura microcontrolerului PIC 16F84

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

CISC, RISC S-a spus deja c PIC1684 are o arhitectur RISC. Acest termen este adeseori gsit n literatura despre calculatoare, i are nevoie s fie explicat aici mai n detaliu. Arhitectura Harvard este un concept mai nou dect von-Neumann. S-a nscut din nevoia de mrire a vitezei microcontrolerului. n arhitectura Harvard, 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 bineneles, o vitez mai mare de lucru. Separarea programului de memoria de date face posibil ca mai departe instruciunile s nu trebuiasc s fie cuvinte de 8 bii. PIC16F84 folosete 14 bii pentru instruciuni ceea ce permite ca toate instruciunile s fie instruciuni dintr-un singur cuvnt. Este de asemenea tipic pentru arhitectura Harvard s aib mai puine instruciuni dect von-Newmann i s aib instruciuni executate uzual intr-un ciclu.

Microcontrolerele cu arhitectur Harvard sunt de asemenea numite "microcontrolere RISC". RISC nseamn Reduced Instruction Set Computer. Microcontrolerele cu arhitectura vonNewmann sunt numite "microcontrolere CISC". Titlul CISC nseamn Complex Instruction Set Computer. Pentru c PIC16F84 este un microcontroler RISC, aceasta nseamn c are un set redus de instruciuni, mai precis 35 de instruciuni (de ex. microcontrolerele INTEL i Motorola au peste 100 de instruciuni). Toate aceste instruciuni sunt executate ntr-un ciclu cu excepia instruciunilor jump i branch. Conform cu ceea ce spune constructorul, PIC16F84 ajunge la rezultate de 2:1 n compresia cod i 4:1 n vitez n comparaie cu alte microcontrolere de 8 bii din clasa sa. Clock-ul /ciclul instruciune Clock-ul sau ceasul este starter-ul principal al microcontrolerului, i este obinut dintr-o component de memorie extern numit "oscilator". Dac ar fi s comparm un microcontroler cu un ceas de timp, "clock-ul" nostru ar fi un ticit pe care l-am auzi de la ceasul de timp. n acest caz, oscilatorul ar putea fi comparat cu arcul ce este rsucit astfel ca ceasul de timp s mearg. De asemenea, fora folosit pentru a ntoarce ceasul poate fi comparat cu o surs electric. Clock-ul de la oscilator intr ntr-un microcontroler prin pinul OSC1 unde circuitul intern al microcontrolerului divide clock-ul n 4 clock-uri egale Q1, Q2, Q3 i Q4 ce nu se suprapun. Aceste 4 clock-uri constituie un ciclu de o singur instruciune (numit de asemenea ciclu main) n timpul creia instruciunea este executat. Executarea instruciunii ncepe prin apelarea unei instruciuni care este urmtoarea n linie. Instruciunea este apelat din memoria program la fiecare Q1 i este scris n registrul de instruciuni la Q4. Decodarea i executarea instruciunii sunt fcute ntre urmtoarele cicluri Q1 i Q4. n urmtoarea diagram putem vedea relaia dintre ciclul instruciunii i clock-ul oscilatorului (OSC1) ca i aceea a clock-urilor interne Q1-Q4. Contorul de program (PC) reine informaia despre adresa urmtoarei instruciuni.

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

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

Semnificaia pinilor PIC16F84 are un numr total de 18 pini. Cel mai adesea se gsete ntr-o capsul de tip DIP18 dar se poate gsi de asemenea i ntr-o capsul SMD care este mai mic ca cea DIP. DIP este prescurtarea de la Dual In Package. SMD este prescurtarea de la Surface Mount Devices sugernd c gurile pentru pini unde s intre acetia, nu sunt necesare n lipirea acestui tip de component.

Pinii microcontrolerului PIC16F84 au urmtoarea semnificaie: NR. SIMBOLIZARE DESCRIERE FUNCTIE PIN 1 RA2 Al doilea pin la portul A. Nu are funcie adiional. 2 RA3 Al treilea pin la portul A. Nu are funcie adiional. 3 RA4 Al patrulea pin la portul A. TOCK1 care funcioneaz ca timer se gsete la acest pin. 4 MCLR Reseteaz intrarea i tensiunea de programare Vpp a microcontrolerului. 5 VSS Alimentare, mas. 6 RB0 Pin de zero la portul B. Intrarea ntrerupere este o funcie adiional. 7 RB1 Primul pin la portul B. Nu are funcie adiional. 8 RB2 Al doilea pin la portul B Nu are funcie adiional. 9 RB3 Al trteilea pin la portul B Nu are funcie adiional. 10 RB4 Al patrulea pin la portul B. Nu are funcie adiional. 11 RB5 Al cincilea pin la portul B. Nu are funcie adiional. 12 RB6 Al aselea pin la portul B. Linia de 'Clock' n mod programare. 13 14 15 16 17 18 RB7 Vdd OSC2 OSC1 RA2 RA1 Al aptelea pin la portul B Linia 'Data' n mod programare. Polul pozitiv al sursei. Pin desemnat pentru conectarea la un oscilator. Pin desemnat pentru conectarea la un oscilator. Al doilea pin la portul A. Nu are funcie adiional. Primul pin la portul A. Nu are funcie adiional.

Principalele domenii de aplicatie PIC16F84 se potrivete perfect n multe folosine, de la industriile auto i aplicaiile de control casnice la instrumentele industriale, senzori la distan, mnere electrice de ui i dispozitivele de securitate. Este de asemenea ideal pentru cardurile smart ca i pentru aparatele alimentate de baterie din cauza consumului lui mic. Memoria EEPROM face mai uoar aplicarea microcontrolerelor la aparate unde se cere memorarea permanent a diferitor parametri (coduri pentru transmitoare, viteza motorului, frecvenele receptorului, etc.). Costul sczut, consumul sczut, mnuirea uoar i flexibilitatea fac PIC16F84 aplicabil chiar i n domenii unde microcontrolerele nu au fost prevzute nainte (exemple: funcii de timer, nlocuirea interfeei n sistemele mari, aplicaiile coprocesor, etc.). Programabilitatea sistemului acestui cip (mpreun cu folosirea a doar doi pini n transferul de date) face posibil flexibilitatea produsului, dup ce asamblarea i testarea au fost terminate. Aceast capabilitate poate fi folosit pentru a crea producie pe linie de asamblare, de a nmagazina date de calibrare disponibile doar dup testarea final, sau poate fi folosit pentru a mbunti programele la produsele finite.

LUCRAREA NR. 2

INSTRUCTIUNI PENTRU MICROCONTROLERUL PIC 16F84

Scopul lucrarii Lucrarea isi propune familiarizarea studentilor cu principalele instructiuni folosite pentru programarea microcontrolerului PIC 16F84. Introducere Microcontrolerul nu este ca orice alt circuit integrat. Cnd ies din producie cele mai multe circuite integrate sunt gata de a fi introduse n aparate ceea ce nu este cazul cu microcontrolerele. Pentru a "face" microcontrolerul s ndeplineasc o sarcin, trebuie s-i spunem exact ce s fac, sau cu alte cuvinte trebuie s scriem programul pe care microcontrolerul s-l execute. Vor fi descrise in cele ce urmeaza instruciunile care alctuiesc assembler-ul, sau limbajul de programare cu nivel sczut pentru microcontrolerele PIC. Sumarul setului de instruciuni Setul complet care cuprinde 35 de instruciuni este dat n tabela urmtoare. Un motiv pentru un numr aa de mic de instruciuni st n primul rnd n faptul c discutm despre un microcontroler RISC ale crui instruciuni sunt bine optimizate avnd n vedere viteza de lucru, simplitatea arhitectural i compactitatea codului. Singurul neajuns este c programatorul trebuie s controleze o tehnic "neconfortabil" n a utiliza un set modest de 35 de instruciuni. Fiecare instruciune PIC 16FXX reprezint un cuvnt de 14 bii compus dintr-un cod de instruciune (OPCODE) care specific tipul de instruciune i unul sau mai muli operanzi. Pentru instruciunile orientate pe octet, 'f' reprezint simbolizarea unui registru (a file register) folosit de instruciune iar 'd' este folosit pentru a simboliza destinaia. Simbolurile de registru vor arta care din regitrii sunt folosii de instruciune. Simbolul pentru destinaie arat unde se plaseaz rezultatul operaiei. Dac 'd' este zero atunci rezultatul este plasat n registrul W. Dac 'd' este unu atunci rezultatul este plasat n registrul specificat de instruciune. La instruciunile orientate pe bit, 'b' reprezint simbolul unui bit care indic bitul afectat de operaie pe cnd 'f' simbolizeaz adresa registrului unde este localizat bitul.

Pentru opeaii cu constante (literal = numr) i de control 'k' reprezint o constant sau un numr pe 8 sau 11 bii. Principalele instructiuni folosite pentru programarea microcontrolerului PIC 16F84 sunt date in tabelul 1. Tabelul 1. Instructiune Descriere BYTE-ORIENTED FILE REGISTER OPERATIONS ADDWF f, d ANDWF f, d CLRF f CLRW COMF f, d DECF f, d DECFSZ f, d INCF f, d INCFSZ f, d IORWF f, d MOVF f, d MOVWF f NOP RLF f, d RRF f, d SUBWF f, d SWAPF f, d f, d XORWF BIT-ORIENTED FILE REGISTER OPERATIONS BCF f, b BSF f, b BTFSC f, b BTFSS f, b LITERAL AND CONTROL OPERATIONS ADDLW k ANDLW k CALL k CLRWDT GOTO k IORLW k MOVLW k RETFIE RETLW k RETURN SLEEP SUBLW k XORLW k Add W and f AND W with f Clear f Clear W Complement f Decrement f Decrement f, Skip if 0 Increment f Increment f, Skip if 0 Inclusive OR W with f Move f Move W to f No Operation Rotate Left f through Carry Rotate Right f through Carry Subtract W from f Swap nibbles in f Exclusive OR W with f Bit Clear f Bit Set f Bit Test f, Skip if Clear Bit Test f, Skip if Set Add literal and W AND literal with W Call subroutine Clear Watchdog Timer Go to address Inclusive OR literal with W Move literal to W Return from interrupt Return with literal in W Return from Subroutine Go into standby mode Subtract W from literal Exclusive OR literal with W

Explicarea instructiunilor. ADDLW Add Literal and W Sintaxa: [ etichet] ADDLW k Operand: 0 k 255 Operaia: (W) + k (W) Bistabili de stare modificai: C, DC, Z
Descriere: la coninutul registrului W este adunat valoarea pe opt bii (literalul) *k* iar rezultatul este

plasat n registrul W. ADDWF Add W and f Sintaxa: [ etichet] ADDWF f,d

Operanzi: 0 f 127 d [0,1] Operaia: (W) + (f) (destinaie) Bistabili de stare modificai: C, DC, Z Descriere: se adun coninutul registrului W cu registrul *f*. Dac *d* este *0*, rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*

ANDLW AND Literal with W Sintaxa: [ etichet] ANDLW k Operand: 0 k 255 Operaia: (W) .AND. (k) (W) Bistabili de stare modificai: Z Descriere: se efectueaz operaia I ntre coninutul registrului cu valoarea numeric pe opt bii (literalul) *k*. Rezultatul este plasat n registrul W.

ANDWF AND W with f Sintaxa: [ etichet] ANDWF f,d Operanzi: 0 f 127 d [0,1] Operaia: (W) .AND. (f) (destinaie) Bistabili de stare modificai: Z Descriere: se efectueaz operaia I ntre registrul W i registrul *f*. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. BCF Bit Clear f Sintaxa: [ etichet] BCF f,b Operanzi: 0 f 127 0b7 Operaia: 0 (f<b>) Bistabili de stare modificai: nici unul. Descriere: bitul *b* din registrul *f* este ters. BSF Bit Set f

Sintaxa: [ etichet] BSF f,b Operanzi: 0 f 127 0b7 Operaia: 1 (f<b>) Bistabili de stare modificai: nici unul Descriere: bitul *b* din registrul *f* este setat.

BTFSS Bit Test f, Skip if Set Sintaxa: [ etichet] BTFSS f,b Operanzi: 0 f 127 0b<7 Operaia: sare dac (f<b>) = 1 Bistabili de stare modificai: nici unul. Descriere: dac bitul *b* din registrul *f* este zero, se execut instruciunea urmtoare. Dac bitul *b* din registrul *f* este unu atunci instruciunea urmtoare este srit i se execut o instruciune NOP binnduse o instruciune de doi ciclii (2TCY). BTFSC Bit Test, Skip if Clear Sintaxa: [ etichet] BTFSC f,b Operanzi: 0 f 127 0b7 Operaia: sare dac (f<b>) = 0 Bistabili de stare modificai: nici unul. Descriere: dac bitul *b* din registrul *f* este unu, se execut instruciunea urmtoare. Dac bitul *b* din registrul *f* este zero atunci instruciunea urmtoare este srit i se execut o instruciune NOP binnduse o instruciune de doi ciclii (2TCY). CALL Call Subroutine Sintaxa: [ etichet ] CALL k Operand: 0 k 2047 Operaia: (PC)+ 1 TOS, k PC<10:0>, (PCLATH<4:3>) PC<12:11> Bistabili de stare modificai: nici unul. Descriere: apeleaz o subrutin. Mai nti adresa de rentoarcere (PC+1) este salvat n stiv. Cei unsprezece bii ai adresrii imediate sunt ncrcai n biii PC <10:0>. Biii cei mai semnificativi ai registrului PC sunt ncrcai din PCLATH. Instruciunea CALL este o instruciune de dou cicluri. CLRF Clear f Sintaxa: [ etichet] CLRF f Operand: 0 f 127 Operaia: 00h (f) 1Z Bistabili de stare modificai: Z Descriere: Coninutul registrului *f* este ters iar bistabilul Z este setat. CLRW Clear W Sintaxa: [ etichet ] CLRW Operand: nici unul.

Operaia: 00h (W) 1Z Bistabili de stare modificai: Z Descriere: regitrul W este ters iar bistabilul Z este setat. CLRWDT Clear Watchdog Timer Sintaxa: [ etichet ] CLRWDT Operand: nici unul Operaia: 00h WDT 0 WDT prescaler, 1 TO 1 PD Bistabili de stare modificai: TO, PD Descriere: instruciunea CLRWDT reseteaz Watchdog Timer. De asemenea este resetat prescaler-ul WDT. Bistabilii de stare TO i PD sunt setai. COMF Complement f Sintaxa: [ etichet ] COMF f,d Operanzi: 0 f 127 d [0,1] Operaia: (f) (destinaie) Bistabili de stare modificai: Z Descriere: coninutul registrului *f* este complementat. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. DECF Decrement f Sintaxa: [ etichet] DECF f,d Operanzi: 0 f 127 d [0,1] Operaia: (f) - 1 (destinaie) Bistabili de stare afectai: Z Destinaie: Decrementeaz registrul *f*. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*.

DECFSZ Decrement f, Skip if 0 Sintaxa: [ etichet ] DECFSZ f,d Operanzi: 0 f 127 d [0,1] Operaia: (f) - 1 destinaie); sare dac rezultatul = 0 Bistabili de stare afectai: nici unul Descriere: Coninutul registrului *f* este decrementat. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. Dac rezultatul este *1*, instruciunea urmtoare este executat. Dac rezultatul este *0* atunci se execut o instruciune NOP obindu-se o instruciune de dou cicluri (2TCY). GOTO Unconditional Branch Sintaxa: [ etichet ] GOTO k Operands: 0 k 2047

Operaia: k PC<10:0> PCLATH<4:3> PC<12:11> Bistabili de stare afectai: nici unul Descriere: instruciunea GOTO este o instruciune de salt necondiionat. Valoarea imediat de unsprezece bii este incrcat n biii PC <10:0>. Cei mai semnificativi bii ai registrului PC sunt ncrcai din PCLATH<4:3>. GOTO este o instruciune de dou cicluri. INCF Increment f Sintaxa: [ etichet ] INCF f,d Operands: 0 f 127 d [0,1] Operaia: (f) + 1 (destinaie) Bistabili de stare afectai: Z Descriere: coninutul registrului *f* este incrementat. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. INCFSZ Increment f, Skip if 0 Sintaxa: [ etichet ] INCFSZ f,d Operands: 0 f 127 d [0,1] Operaia: (f) + 1 (destinaie), sare dac rezultatul = 0 Bistabili de stare afectai: Nici unul Descriere: Coninutul registrului *f* este incrementat. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. Dac rezultatul este *1* atunci se execut instruciunea urmtoare. Dac rezultatul este *0* atunci se execut o instruciune NOP obinnduse o instruciune pe dou cicluri (2TCY). IORLW Inclusive OR Literal with W Sintaxa: [ etichet ] IORLW k Operand: 0 k 255 Operaia: (W) .OR. k (W) Bistabili de stare afectai: Z Descriere: se realizeaz operaia OR ntre coninutul registrului W i valoarea pe opt bii (literalul) *k*. Rezultatul este plasat n registrul W. IORWF Inclusive OR W with f Sintaxa: [ etichet ] IORWF f,d Operands: 0 f 127 d [0,1] Operaia: (W) .OR. (f) (destination) Bistabili de stare afectai: Z Descriere: se realizeaz operaia SAU ntre registrul W cu registrul *f*. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. MOVF Move f Sintaxa: [ etichet ] MOVF f,d Operanzi: 0 f 127 d [0,1] Operaia: (f) (destinaie) Bistabili de stare afectai: Z

Descriere: coninutul registrului *f* este trensferat la destinaie n funcie de valoarea lui *d*. Dac d = 0 atunci destinaia este registrul W iar dac d = 1 atunci destinaia este nsui registrul *f*. Situaia n care d = 1 este util la testarea registrului *f* cnd n urma operaiei se poziioneaz bistabilul Z. MOVLW Move Literal to W Sintaxa: [ etichet ] MOVLW k Operand: 0 k 255 Operaia: k (W) Bistabili de stare afectai: nici unul Descriere: valoarea pe opt bii este ncrcat n registrul *f*. MOVWF Move W to f Sintaxa: [ etichet ] MOVWF f Operand: 0 f 127 Operaia: (W) (f) Bistabili de stare afectai: nici unul Descriere: coninutul registrului W este transferat n registrul *f*. NOP No Operation Sintaxa: [ etichet ] NOP Operand: nici unul Operaia: nici o operaie. Bistabili de stare afectai: nici unul Descriere: nu se efectueaz nici o operaie. RETFIE Return from Interrupt Sintaxa: [ etichet ] RETFIE Operand: Nici unul Operaia: TOS PC, 1 GIE Bistabili de stare afectai: nici unul RETLW Return with Literal in W Sintaxa: [ etichet ] RETLW k Operand: 0 k 255 Operaia: k (W); TOS PC Bistabili de stare afectai: nici unul Descriere: registrul W este ncrcat cu valoarea pe opt bii (literalul) *k*. Contorul de program este ncrcat cu valoarea din vrful stivei (adresa de rentoarcere). Inctruciunea dureaz dou cicluri. RETURN Return from Subroutine Sintaxa: [ etichet ] RETURN Operand: Nici unul Operaia: TOS PC Bistabili de stare afectai: nici unul Descriere: rentoarcere din subprogram. Vrful stivei (TOS Top of Stack) este ncrcat n registrul contor de program PC. Inctruciunea dureaz dou cicluri. RLF Rotate Left f through Carry

Sintaxa: [ etichet ] RLF f,d Operanzi: 0 f 127 d [0,1] Operaia: vezi descrierea. Bistabili de stare afectai: C Descriere: coninutul registrului *f* este rotit spre stnga un bit prin bistabilul Carry. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. RRF Rotate Right f through Carry Sintaxa: [ etichet ] RRF f,d Operands: 0 f 127 d [0,1] Operaia: vezi descrierea. Bistabili de stare afectai: C Descriere: coninutul registrului *f* este rotit spre dreapta un bit prin bistabilul Carry. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. SLEEP Sintaxa: [ etichet ] SLEEP Operand: nici unul Operaia: 00h WDT, 0 WDT prescaler, 1 TO, 0 PD Bistabili de stare afectai: TO, PD Descriere: bitul de stare Power-Down PD este ters. Bitul de stare Time-Out este setat. Watchdog Timer i prescaler-ul sunt teri. Procesorul este pus n modul SLEEP cu oscilatorul oprit. SUBLW Subtract W from Literal Sintaxa: [ etichet ] SUBLW k Operand: 0 k 255 Operaia: k - (W) W) Bistabili de stare afectai: C, DC, Z Descriere: coninutul registrului W este sczut (prin metoda complementului fa de doi) din valoarea de opt bii (literalul) *k*. Rezultatul este pus n registrul W. SUBWF Subtract W from f Sintaxa: [ etichet ] SUBWF f,d Operanzi: 0 f 127 d [0,1] Operaia: (f) - (W) destinaie) Bistabili de stare afectai: C, DC, Z Descriere: coninutul registrului W este sczut (prin metoda complementului fa de doi) din valoarea registrului *f*. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. SWAPF Swap Nibbles in f Sintaxa: [ etichet ] SWAPF f,d Operanzi: 0 f 127 d [0,1] Operaia: (f<3:0>) (destinaie<7:4>),

(f<7:4>) (destinaie<3:0>) Bistabili de stare afectai: nici unul Descriere: cei mai semnificativi patru bii ai registrului *f* sunt schimbai cu cei mai puin semnificativi patru bii (nibble) ai registrului *f*. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*. XORLW Exclusive OR Literal with W Sintaxa: [ etichet] XORLW k Operand: 0 k 255 Operaia: (W) .XOR. k W) Bistabili de stare afectai: Z Descriere: se execut operaia XOR (SAU EXCLUSIV) ntre valoarea registrului W i valoarea pe opt bii (literalul) *k*. Rezultatul este plasat n registrul W. XORWF Exclusive OR W with f Sintaxa: [ etichet] XORWF f,d Operanzi: 0 f 127 d [0,1] Operaia: (W) .XOR. (f) destinaie) Bistabili de stare afectai: Z Descriere: se execut operaia XOR (SAU EXCLUSIV) ntre valoarea registrului W i valoarea registrului *f*. Dac *d* este *0* atunci rezultatul este stocat n registrul W iar dac *d* este *1* rezultatul este stocat n registrul *f*.

Transfer de Date Transferul de date ntr-un microcontroler este fcut ntre registrul de lucru (W) i un registru 'f' ce reprezint orice locaie n RAM-ul intern (indiferent dac acetia sunt regitri speciali sau de scop general). Primele trei instruciuni (a se vedea urmtorul tabel) fac ca o constant s fie nscris n registrul W (MOVLW este prescurtarea pentru MOVe Literal to W), i ca datele s fie copiate din registrul W n RAM i datele din RAM s fie copiate n registrul W (sau n aceeai locaie RAM, la care punct numai starea steguleului Z se schimb). Instruciunea CLRF scrie constanta 0 n registrul 'f ', iar CLRW scrie constanta 0 n registrul W. Instruciunea SWAPF schimb locurile cmpului de nibbles- buci de 4 bii n interiorul unui registru. Aritmetic i logic Din toate operaiile aritmetice, PIC ca majoritatea microcontrolerelor, accept doar scderea i adunarea. Steguleele C, DC i Z sunt setate funcie de rezultatul adunrii sau scderii, dar cu o excepie: pentru c scderea se face ca o adunare a unei valori negative, eticheta C este invers urmnd scderii. Cu alte cuvinte, este setat dac operaia este posibil, i este resetat dac un numr mai mare a fost sczut din unul mai mic. Unitatea logic a PIC-ului are capabilitatea de a face operaiile AND (I), OR (SAU), EX-OR (SAU-EXCLUSIV), complementare (COMF) i rotaie (RLF i RRF).

Instruciunile ce rotesc coninutul registrului mut biii n interiorul registrului prin eticheta C cu un spaiu la stnga (ctre bitul 7), sau la dreapta (ctre bitul 0). Bitul ce "iese" din registru este scris n steguleul C, i valoarea steguleului C este scris ntr-un bit al "prii opuse" a registrului. Operaii cu bii Instruciunile BCF i BSF fac setarea sau tergerea unui singur bit oriunde n memorie. Chiar dac pare o simpl operaie, este executat n aa fel ca CPU citete mai nti ntregul byte, schimb un bit n el i apoi scrie ntregul byte n acelai loc. Direcionarea debitului unui program Instruciunile GOTO, CALL i RETURN sunt executate n acelai fel ca i n celelalte microcontrolere, numai stiva este independent de RAM-ul intern i limitat la opt nivele. Instruciunea 'RETLW k' este identic cu instruciunea RETURN, cu excepia c nainte de a se ntoarce dintr-un subprogram, constanta definit operandul de instruciuni este scris n registrul W. Aceast instruciune ne permite s proiectm uor tabelele (listele) Look-up. Cel mai mult le folosim la determinarea poziiei datelor n tabelul nostru adugnd-o la adresa la care ncep tabelele, i apoi citim datele din acea locaie (care este uzual gsit n memoria program). Tabelul poate fi format ca un subprogram ce const dintr-o serie de instruciuni 'RETLW k', unde constantele 'k' sunt membri ai tabelului.

Scriem poziia unui membru al tabelului nostru n registrul W, i folosind instruciunea CALL apelm un subprogram care creaz tabelul. Prima linie de subprogram ADDWF PCL, f adaug poziia unui membru al registrului W la adresa de start a tabelului nostru, gsit n registrul PCL, i astfel obinem adresa datelor reale n memoria program. Cnd ne ntoarcem dintr-un subprogram vom avea n registrul W coninutul unui membru al tabelului adresat. n exemplul anterior, constanta 'k2' va fi n registrul W urmnd unei ntoarceri dintr-un subprogram. RETFIE (RETurn From Interrupt - Interrupt Enable) este o ntoarcere dintr-o rutin de ntrerupere i difer de o RETURN numai n aceea c seteaz automat bitul GIE (Global Interrupt Enable). La o ntrerupere, acest bit este automat ters. Cnd ncepe ntreruperea, numai valoarea contorului de program este pus n vrful stivei. Nu este prevzut memorarea automat a valorilor i strii registrului. Jump-urile (salturile) condiionale sunt sintetizate n dou instruciuni: BTFSC i BTFSS. Funcie de starea bitului n registrul 'f' ce este testat, instruciunile sar sau nu peste instruciunea de program urmtoare.

Perioada de Execuie a Instruciunii Toate instruciunile sunt executate ntr-un ciclu cu excepia instruciunilor ramur condiionale dac condiia a fost adevrat, sau dac coninutul contorului de program a fost schimbat de o anumit instruciune. n acest caz, execuia cere dou cicluri de instruciuni, iar al doilea ciclu este executat ca NOP (No Operation-Fr operaii). Patru clock-uri oscilator fac un ciclu instruciune. Dac folosim un oscilator cu frecvena de 4 MHz, timpul normal pentru execuia instruciunii este 1 s, i n caz de branching-ramificare condiional, perioada de execuie este 2 s. Desfasurarea lucrarii Sa se scrie un program care sa seteze portul A intrare si portul B iesire. Schema elctrica a montajului este data mai jos.

Atunci cand portul A va fi setat ca intrare, LED-ul de sus se va aprinde.

Sescrierea programului: Se va folosi setarea de registrii pentru port B intrare si port A respective B. Pinul din portul B (RB5) care initial fusese declarat iesire, va fi transformat in intrare la apasarea microintrerupatorului.

LUCRAREA NR.3

INSTRUCTIUNI SI DIRECTIVE FOLOSITE IN PROGRAMAREA PIC 16F84


Scopul lucrarii Lucrarea isi propune insusirea de catre studenti a modului de folosire a instructiunilor si directivelor in programarea a PIC-urilor. Introducere Abilitatea de a comunica este de mare importan n orice domeniu. Totui, este posibil numai dac amndoi partenerii de comunicare cunosc acelai limbaj, sau urmresc aceleai reguli n timpul comunicrii. Folosind aceste principii ca un punct de plecare, putem de asemenea defini comunicarea ce are loc ntre microcontrolere i om. Limbajul pe care microcontrolerul i omul l folosesc pentru a comunica este numit "limbaj de asamblare". Titlul nsui nu are un neles deosebit, i este analog numelor altor limbaje, de ex. engleza i franceza. Mai precis, "limbajul de asamblare" este doar o soluie trectoare. Programele scrise n limbaj de asamblare trebuie traduse ntr-un "limbaj de zero-uri i unu-uri" pentru ca un microcontroler s-l neleag. "Limbajul de asamblare" i "assembler-ul" sau asamblorul sunt dou noiuni diferite. Primul reprezint un set de reguli folosite n scrierea unui program pentru un microcontroler, iar cellalt este un program n computerul personal care traduce limbajul de asamblare ntr-un limbaj de zero-uri i unu-uri. Un program ce este tradus n "zero-uri" i "unu-uri" este numit "limbaj main".

Fizic, "Program" reprezint un fiier pe discul computerului (sau n memorie dac este citit ntrun microcontroler), i este scris conform cu regulile de asamblare sau ale altui limbaj pentru programarea microcontrolerului. Omul poate nelege pentru c este constituit din semne i cuvinte ale alfabetului. Cnd se scrie un program, trebuie urmrite unele reguli pentru a se obine un efect dorit.

Un Translator interpreteaz fiecare instruciune scris n limbajul de asamblare ca o serie de zero-uri i unu-uri ce au o semnificaie pentru logica intern a microcontrolerului. S lum de exemplu instruciunea "RETURN" pe care microcontrolerul o folosete pentru a se ntoarce dintr-un sub-program. Cnd asamblorul l traduce, obinem o serie de zero-uri i unu-uri pe care microcontroleul tie cum s-l interpreteze. Exemplu: RETURN 00 0000 0000 1000 Similar propoziiei de mai sus, fiecare instruciune de asamblare este interpretat ca i corespunznd unei serii de zero-uri i unu-uri. Locul unde aceast traducere a limbajului de asamblare se gsete , se numete un fiier de "execuie". Vom ntlni adesea numele de fiier "HEX". Acest nume vine de la o reprezentare hexazecimal a acelui fiier, ca i de la apendicele "hex" din titlu, de ex. "run through.hex". Odat ce este generat, fiierul de execuie este citit n microcontroler printr-un programator. Un program n Limbaj de Asamblare este scris ntr-un program pentru procesarea textului (editorul) i este capabil de a produce un fiier ASCII pe discul computerului sau n zone specializate ca MPLAB ce se va explica n capitolul urmtor. Limbaj de Asamblare Elementele de baz ale limbajului de asamblare sunt: Label-uri sau Etichete Instruciuni Operanzi Directive Comentarii Label-uri Un Label este o desemnare textual (n general un cuvnt uor de citit) pentru o linie ntr-un program, sau seciunea unui program unde micro-ul poate sri sau chiar nceputul unui set de linii a unui program. Poate fi folosit de asemenea pentru a executa ramificare de program (ca Goto.) i programul poate chiar avea o condiie ce trebuie ndeplinit pentru ca instruciunea Goto s fie executat. Este important pentru un label de a ncepe cu o liter a alfabetului sau cu o subliniere "_". Lungimea label-ului poate fi de pn la 32 caractere. Este de asemenea important ca un label s nceap de la primul rnd.

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

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

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

pentru un programator s neleag dect s ncerce s-i aduc aminte c adresa 0Dh conine informaii despre LEVEL.

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

Pentru c aceste date nu sunt importante pentru translatorul de asamblare, este scris ca i comentarii. Trebuie remarcat c un comentariu ncepe totdeauna cu punct i virgul i c poate fi plasat ntr-un rnd nou sau poate urma dup instruciune. Este cel mai bine inut n rndul al treilea pentru a face traseul uor de urmrit. Dup deschiderea comentariului ce a fost scris, trebuie inclus directiva. Aceasta este artat n exemplul de mai sus. Pentru a funciona corect, trebuie s definim civa parametri ai microcontrolerului ca: - tipul oscilatorului

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

Descriere: De fiecare dat cnd apare <name> n program , va fi nlocuit cu <text ce schimb numele>.
Exemplu: #define turned on 1 #define turned off 0 Directive similare: #UNDEFINE, IFDEF,IFNDEF INCLUDE (Include un fiier adiional ntr-un program) Sintax: #include <file_name> #include "

Descriere: O aplicaie a acestei directive are efect ca i cum ntregul fiier a fost copiat ntr-un loc unde directiva "include" a fost gsit. Dac numele fiierului este n paranteze ptrate, avem de a face cu un fiier de sistem, i dac este n interiorul ghilimelelor de citare, avem de a face cu fiier de utilizator. Directiva "include" contribuie la un traseu mai bun al programului principal. Exemplu: #include <regs.h> #include "subprog.asm"
CONSTANT (D o valoare numeric constant desemnrii textuale) Sintax: Constant <name>=<value>

Descriere:

De fiecare dat cnd apare <name> n program, va fi nlocuit cu <value>.


Exemplu: Constant MAXIMUM=100 Constant Length=30

Directive similare: SET, VARIABLE VARIABLE( D o valoare numeric variabil desemnrii textuale) Sintax: Variable<name>=<value> Descriere: Folosind aceast directiv, desemnarea textual se nlocuiete cu o valoare particular. Difer de directiva CONSTANT n aceea c dup aplicarea directivei, valoarea desemnrii textuale poate fi nlocuit.
Exemplu: variable level=20 variable time=13

Directive similare: SET, CONSTANT SET( Definirea variabilei asamblorului) Sintax: <name_variable>set<value> Descriere: Variabilei <name_variable> i este adugat expresia <value>. Directiva SET este similar lui EQU, dar cu directiva SET numele variabilei poate fi redefinit urmnd o definiie.
Exemplu: level set 0 length set 12 level set 45

Directive similare: EQU, VARIABLE EQU (Definind constanta asamblorului) Sintax: <name_constant> equ <value> Descriere: To the name of a constant <name_constant> is added value <value>
Exemplu: five equ 5 six equ 6 seven equ 7

Instruciuni similare: SET ORG (Definete o adres de unde programul este nmagazinat n memoria microcontrolerului) Sintax: <label>org<value> Descriere: Aceasta este cea mai frecvent folosit directiv. Cu ajutorul acestei directive definim unde o anumit parte a programului va fi n memoria program.
Exemplu: Start org 000

Movlw Movwf Primele dou instruciuni ce urmeaz dup prima directiv 'org' sunt memorate de la adresa 00, i celelalte dou de la adresa 10.

END (Sfrit de program) Sintax: end Descriere: La sfritul fiecrui program este necesar de a plasa directiva 'end' aa ca translatorul de asamblare s tie c numai sunt instruciuni n program.
Exemplu: movlw 0xFF movwf PORTB end

Instruciuni condiionale IF Ramificare de program condiional Sintax: if<conditional_term> Descriere: Dac condiia n <conditional_term> este ndeplinit, parte a programului ce urmeaz directivei IF va fi executat. i dac nu este, partea ce urmeaz directivei ELSE sau ENDIF va fi executat.
Exemplu: if nivo=100 goto PUNI else goto PRAZNI endif

Directive similare: ELSE, ENDIF ELSE 'IF' alternativ la blocul program cu termeni condiionali Sintax: Else Descriere: Folosit cu directiva IF ca o alterntiv dac termenul condiional este incorect.
Exemplu: If time< 50 goto SPEED UP else goto SLOW DOWN endif

Instruciuni similare: ENDIF, IF ENDIF Sfritul seciunii de program condiionale Sintax: endif Descriere: Directiva este scris la sfritul blocului condiional pentru translatorul de asamblare pentru a ti c este sfritul blocului condiional
Exemplu:

If level=100 goto LOADS else goto UNLOADS endif

Directive similare: ELSE, IF WHILE Execuia seciunii programului ct timp condiia este ndeplinit Sintax: while<condition> endw Descriere: Liniile de program ntre WHILE I ENDW vor fi execuate ct timp condiia este ndeplinit. Dac condiia se oprete din a mai fi valid, programul continu executarea instruciunilor urmnd linia ENDW. Numrul de instruciuni dintre WHILE i ENDW poate fi cel mult 100, i numrul de execuii 256.
Exemplu: While i<10 i=i+1 endw

ENDW Sfritul prii condiionale a programului Sintax:endw Descriere: Instuciunea este scris la sfritul blocului WHILE condiional, aa ca translatorul de asamblare s tie c este sfritul blocului condiional
Exemplu: while i<10 i=i+1 endw

Directive similare: WHILE IFDEF Execuia unei pri de program dac simbolul este definit

Sintax:ifdef<designation> Descriere: Dac desemnarea <designation> este definit anterior (cel mai adesea prin instruciunea#DEFINE), instruciunile ce urmeaz sunt executate pn ce nu se ajunge la directivele ELSE i ENDIF.
Exemplu: #define test ifdef test ;how the test is defined ......; instructions from these lines will execute Endif

Directive similare: #DEFINE, ELSE, ENDIF, IFNDEF, #UNDEFINE IFNDEF Execuia unei pri de program dac simbolul este definit Sintax:

ifndef<designation> Descriere: Dac desemnarea <designation> nu a fost definit anterior, sau dac definiia ei a fost tears cu directiva directive #UNDEFINE, instruciunile ce urmeaz sunt executate pn ce nu se ajunge la directivele ELSE i ENDIF.
Exemplu: #define test .......... #undefine test .......... ifndef test ;how the test is undefined ..... .; instructions from these lines will execute Endif

Directive similare: #DEFINE, ELSE, ENDIF, IFDEF, #UNDEFINE Directive de Date CBLOCK Definind un bloc pentru constantele numite Sintax: Cblock [<term>] <label>[:<increment>], <label>[:<increment>]...... Endc Descriere: Directiva este folosit pentru a da valori constantelor numite. Fiecare termen ce urmeaz primete o valoare mai mare cu unu dect precursorul lui. Dac parametrul <increment> este de asemenea dat, atunci valoarea dat n parametrul <increment> este adugat constantei urmtoare. Valoarea parametrului <term> este valoarea de pornire. Dac nu este dat, este considerat a fi zero. Exemplu: Cblock 0x02 First, second, third ;first=0x02, second=0x03, third=0x04 Endc cblock 0x02 first : 4, second : 2, third ;first=0x06, second=0x08, third=0x09 endc Directive similare: ENDC ENDC Sfritul definiiei blocului constante Sintax: endc Descriere: Directiva este folosit la sfritul definiiei unui bloc de constante ca translatorul de asamblare s tie c nu mai sunt constante. Directive similare: CBLOCK DB Definind date de un byte Sintax:[<term>]db <term> [, <term>,.....,<term>]

Descriere: Directiva rezerv un byte n memoria de program. Cnd sunt mai muli termeni ce au nevoie s li se desemneze un byte de fiecare, ei vor fi desemnai unul dup altul. Exemplu: db 't', 00f, 'e', 's', 012 Instruciuni similare: DE, DT DE Definind Byte-ul de memorie EEPROM Sintax:[<term>] de <term> [, <term>,....., <term>] Descriere:Directiva este folosit pentru definirea byte-ului de memorie EEPROM. Chiar dac a fost iniial intenionat doar pentru memoria EEPROM, poate fi folosit pentru oricare alt locaie de memorie. Exemplu: org H'2100' de "Version 1.0" , 0 Instruciuni similare: DB, DT DT Definin tabelul de date Sintax:[<term>] dt <term> [, <term>,........., <term> Descriere:Directiva genereaz seria RETLW de instruciuni, o instruciune de fiecare termen. Exemplu: dt "Message", 0 dt first, second, third Directive similare: DB, DE Configurnd o directiv CONFIG Setarea the biilor configuraionali Sintax: -config<term> or__config<address>,<term> Descriere: Sunt definite oscilatorul, aplicaia timer watchdog i circuitul intern de reset. nainte de folosirea acestei directive, procesorul trebuie definit folosind directiva PROCESSOR. Exemplu: _CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC Directive similare: _IDLOCS, PROCESSOR PROCESSOR Definind modeul microcontrolerului Sintax:Processor <microcontroller_type> Descriere: Instruciunea seteaz tipul microcontrolerului unde programarea este fcut. Exemplu: processor 16F84 Fiiere create ca rezultat al translrii programului

Ca un rezultat al procesului translrii unui program scris n limbaj de asamblare obinem fiiere ca: Fiier de executare (Program_Name.HEX) Fiier de erori program (Program_Name.ERR) Fiier list (Program_Name.LST) Primul fiier conine programul translat ce este citit n microcontroler prin programareare. Coninutul lui nu poate da orice informaie programatorului, aa c nu ne vom mai referi la ele n continuare. Al doilea fiier conine posibile erorile ce au fost fcute n procesul scrierii, i ca au fost observate de translatorul de asamblare n timpul procesului de translare. Erorile pot fi descoperite de asemenea ntr-un fiier "list". Acest fiier este mai potrivit dei cnd programul este mare i vederea fiierului "list" dureaz mai mult. Al treilea fiier este cel mai folositor programatorului. n el sunt coninute multe informaii, ca informaii despre instruciunile de poziionare i variabilele din memorie, sau semnalizarea erorii. Exemplu unui fiier "list" pentru program urmeaz n acest capitol. n captul fiecrei pagini se gsesc informaii despre numele fiierului, data cnd a fost translat i numrul paginii. Prima coloan conine o adres din memoria programului unde este plasat o instruciune din acel rnd. A doua coloan conine o valoare a oricrei variabile definit de una din directive: SET, EQU, VARIABLE, CONSTANT or CBLOCK. A treia coloan este rezervat pentru forma unei instruciuni translate pe care PIC-ul o execut. A patra coloan conine instruciunile asamblorului i comentariile programatorului. Posibile erori vor apare ntre rnduri urmnd o linie n care s-a produs eroarea. La sfritul fiierului "list" este un tabel cu simboluri folosite n program. Un element folositor al fiierului "list" este un grafic de utilizare a memoriei. La sfrit de tot, este o statistic de erori ca i cantitatea de program rmas.

Desfasurarea lucrarii Sa se scrie un program care care sa faca conversia unui semnal anlogic obtinut de la un sensor intr-un semnal digital. Se va seta portul A intrare, iar RA0, intrare analogica. Se va conecta senzorul la RA0. PIC-ul cityeste valoarea semnalului analogica de la intrare, o conerteste in semnal digital si o salveaza intr-un registru dedicate convrrsiei. Pentru transferul valorii spre exterior se foloseste instructiunea movwf PORTB Se va transmite rezultatul conversiei pe portul B. Schema electrica este data in figura de mai jos.

LUCRAREA NR.4

MACROURI FOLOSITE N PROGRAME UTILIZAREA SUBRUTINELOR DE PROGRAM

Scopul lucrarii Lucrarae isi propune sa insuseasca studentilor doua macrouri folosite in programarea PIC-urilor WAIT si WAITx Macrourile WAIT, WAITx Exemplele din seciunile urmtoare uilizeaz deseori WAIT, WAITx i PRINT, care vor fi explicate n detaliu. Fiierul Wait.inc conine dou macrouri: WAIT i WAITx. Prin intermediul acestor macrouri este posibil s repartizm ntrzieri de timp n intervale variate. Amndou macrouri folosesc depirea contorului TMR0 ca un interval de timp de baz. Prin schimbarea prescaler-ului putem schimba lungimea intervalului depirii contorului TMR0.

Dac folosim un oscilator (rezonator) de 4MHz, pentru valorile prescaler-ului 0,1 i 7 care divid ceasul de baz al oscilatorului, intervalul urmat de o depire a contorului TMR0 va fi 0.512, 1.02 i 65.3ms. Practic, aceasta nseamn c cea mai mare ntrziere va fi 256x65.3ms care este egal cu 16.72 secunde.

Pentru a utiliza macrouri n programul principal este necesar s declarm variabilele wcycle i prescWAIT dup cum vom vedea n exemplele ce vor urma acestui capitol. Macroul WAIT are un singur argument. Valoarea standard atribuit prescaler-ului acestui macro este 1 (1.02ms), i nu poate fi schimbat. WAIT timeconst_1

timeconst_1 este un numr de la 0 la 255. Prin multiplicarea acestui numr cu perioada de timp de depire (overflow) vom obine durata total a ntrzierii: TIME = timeconst_1 x 1.02ms. Exemplu: WAIT .100 Exemplul arat cum s obinem o ntrziere de 100x1.02ms, sau durata total de 102ms. Spre deosebire de macroul WAIT, macroul WAITX mai are un argument care poate atribui o valoare prescaler-ului. Macroul WAITX are dou argumente: timeconst_2 este un numr de la 0 la 255. Prin multiplicarea acestui numr cu perioada de timp de depire (overflow) vom obine durata total a ntrzierii: TIME = timeconst_1 x 1.02ms x PRESCext. PRESCext este un numr de la 0 la 7 care seteaz relaia dintre tact i timer-ul TMR0. Exemplu: WAITX .100,7 Exemplul arat cum s obinem o ntrziere de 100x65.3ms, sau durata total de 653ms. Macroul PRINT Macroul PRINT este localizat n fiierul Print.inc. El uureaz lucrul pentru trimiterea unui ir de date la unul dintre dispozitivele de ieire, cum ar fi: LCD, RS232, imprimant matricial...etc. Cea mai uoar cale pentru a forma o serie este prin folosirea unei directive dt (define table). Aceast instruciune memoreaz o serie de date n cadrul memoriei programului ca un grup de instruciuni retlw al crui operand este data din ir.

Modalitatea prin care o astfel de secven este format folosind instruciunea dt este artat n urmtorul exemplu: org 0x00 goto Main String movwf PCL String1 dt "acesta este un sir ASCII" String2 dt "al doilea sir" End Main movlw .5 call String : Prima instruciune dup eticheta Main scrie poziia unui membru al irului n registrul W. Executm un salt cu instruciunea call la eticheta irului unde poziia membrului irului este adunat la valoarea PC (Program Counter): PCL = PCL + W. n continuare avem n program counter o adres a instruciunii retlw cu membrul dorit al irului. n momentul n care aceast instruciune este executat, membrul irului va fi n registrul W, i adresa instruciunii care va fi executat dup instruciunea call va fi n program counter. Eticheta end este o metod elegant de a marca adresa la care irul se termin.

Macroul PRINT are cinci argumente: PRINT macro Addr, Start, End, Var, Out Addr este o adres unde unul sau mai multe iruri (situate unul dup altul) ncep. Start este o adres a primului membru al irului. End este o adres unde irul se termin. Out este un argument pe care l folosim pentru a trimite adresa rutinelor existente atribuite dispozitivelor de ieire cum ar fi: LCD, RS-232, etc.

Macroul PRINT scrie la ieire un ir mikroElektronika format din caractere ASCII la un dispozitiv de afiare LCD. irul takes one part of program memory ncepnd cu adresa 0x03. Desfasurarea lucrarii Se va realizeze un generator de 500 Hz, folosind subrutine. Se va seta PORT A iesire. Se va face o bucla de intarziere de 1 ms. Se apeleaza bucla, iar dupa efectuarea temporizarii se seteza PORT A ca 1 logic. Dupa setarea PORTULUI A se cheama din nou subrutina. La sfarsit se reia ciclul.

PORT A iesire

Temporizare 1ms

PORT A intrare

Schema electrica a montajului este data mai jos

LUCRAREA NR. 5

CIRCUIT DE AVERTIZARE LA CADEREA TENSIUNII IN RETEA

Scopul lucrarii

Lucrarea isi propune realizarea unui circuit de comanda pe releu la caderea tensiunii de alimentare in retea.

Descrierea functionarii

Circuitul de mai jos da un impuls de 5 secunde pe un releu la caderea tensiunii in retea, iar la revenirea tensiunii in retea da alt impuls de 5 secunde pe alt releu. Schema este data in figura 1.

CONN1 este un conector pentru programarea microcontrolerului. ICSP eset circuitul serial de programare. Practic de la programator vin 5 fire care audenumirea scrisa in chenar. Releele au bobina alimentata la 12V iar contactele suporta sarcina pe care o vom comanda (220V) Descrierea programului: PIC16F684 - Circuit avertizare cadere tensiune retea : PROCESSOR 16F684; se declara tipul procesorului INCLUDE <P16F684.INC>; se incarca in compilator numele si adresele registrilor de functii speciale SFR __CONFIG _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_ON & _FCMEN_ON & _HS_OSC; directiva pentru definirea configuratiei de pornire: watchdo=off, reset extern=off, code protect=off, oscilatorul=cristal quatz. #define in PORTA,2; pinul 10, R0, adica bitul 0 al portului C va mai avea si numele led1 #define out1 PORTC, 0 #define out2 PORTC, 1 UDATA; aceasta directiva declara inceputul de memorie RAM nefolosita LOCNT RES 1 ; se rezerva un octet(byte) pentru variabila LOCNT HICNT RES 1 LOOPCNT RES 1 MEM res 1 #define memin MEM, 0 ORG 0; vectorul reset, de aici incepe executia programului GOTO main001; instructiunea de salt neconditionat la adresa etichetei main001 ORG 4; vectorul intrerupere. Cand are loc o intrerupere, aici sare si incepe executia rutinei de intrerupere CODE ; se defineste inceputul programului propriuzis, pentru cod relocabil main 001; eticheta main001, se scrie din coloana 0, ;restul codului poate fi scris din urmatoarele coloane (se lasa un spatiu inainte) In continuare se vor configura porturile A si C BCF STATUS, RP0; se selecteaza primul banc de registry MOVLW 0x00; se incarca in acumulator cifra zero MOVWF PORTC; se copiaza continutul acumulatorului in registru portC MOVWF PORTA; se copiaza continutul acumulatorului in registru portA MOVLW 0X07 ; se incarca in acumulator 7 hexa = 00000111 in binary MOVWF CMCON0 ; se copiaza continutul acumulatorului in CMCON0 ;BIT 210=111 COMPARATORS OFF, CXIN PINS = DIGITAL I/O BSF STATUS, RP0 ; se selecteaza bancul al doilea de registry MOVLW b'00000001' ; se copiaza in acumulator numarul 1 in binary MOVWF ANSEL; BIT 7-0 intrare analogica sau I/O digitala 1=ANALOG INPUT 0=DIGITAL I/O
38

MOVLW B'00100100' MOVWF TRISA ; configuratia portului A, 1=intrare, 0=iesire MOVLW B'00000000' MOVWF TRISC ; configuratia portului C, 1=intrare, 0=iesire BCF STATUS, RP0 ; se selecteaza bancul 1 cu registry ; sfarsitul configurarii porturilor A si C goto main002 ;GENERATING PAUSE IN MILISECONDS (1~65535MS) ;PURPOSE OF THIS MACRO IS TO PROVIDE EXACT TIME DELAYS IN PROGRAM. PAUSEMS MACRO PAR1 ; Se defineste un macro. De fiecare daca cand apare in program "pausems" ca functie, la compilare "pausems" este inlocuit cu urmatoarele cinci instructiuni de mai jos MOVLW HIGH PAR1 ; HIGHER BYTE OF PARAMETER 1 GOES TO HICNT MOVWF HICNT MOVLW LOW PAR1 ; LOWER BYTE OF PARAMETER 1 GOES TO LOCNT MOVWF LOCNT ; compilatorul imparte numarul respectiv in 2 octeti si nu microcontrolerul CALL PAUSEMS1 ENDM ;sfarsit macro PAUSEMS1 LOOP1 MOVF LOCNT, F ; DECREASE HICNT AND LOCNT NECESSARY BTFSC STATUS, Z ; NUMBER OF TIMES AND CALL SUBPROGRAM DELAY1MS GOTO DECHI CALL DELAY1MS DECF LOCNT, F GOTO LOOP1 DECHI MOVF HICNT, F BTFSC STATUS, Z GOTO END1 CALL DELAY1MS DECF HICNT, F DECF LOCNT, F GOTO LOOP1 DELAY1MS: ; DELAY1MS PRODUCES A ONE MILISECOND DELAY MOVLW .100 ; 100*10us=1ms@4MHZ; MOVLW .200 ; 200*5us=1us@8MHZ MOVWF LOOPCNT ; LOOPCNT<-100 LOOP2: NOP NOP NOP NOP NOP CLRWDT DECFSZ LOOPCNT, F GOTO LOOP2 ; TIME PERIOD NECESSARY TO EXECUTE LOOP LOOP2
39

RETURN END1 RETURN

; EQUALS 10US

main002 pausems .3000 bsf memin

; eticheta main002

; se seteaza memoria initiala ca fiind 1

testend1 pausems .100 btfss in goto ina0 ina1 btfss memin goto memin0 memin1 goto testend1 memin0 bsf memin bsf out1 pausems .5000 bcf out1 goto testend1 ina0 btfss memin goto memim0 memim1 bcf memin bsf out2 pausems .5000 bcf out2 goto testend1 memim0 goto testend1

; se verifica starea tensiunii ; pauza 100ms ;verifica tensiunea ; tensiunea = 1 ;verifica memoria ;memoria initiala = 1 ;sare la inceput ;memoria initiala = 0 ;se seteaza memoria ; se activeaza iesirea 1 ; pauza 5 secunde ; se dezactiveaza iesirea 1 ; sare la inceput ; tensiunea = 0 ; verifica memoria ;memoria initiala = 1 ; se sterge memoria ;se activeaza iesirea 1 ; pauza 5 secunde ; se dezactiveaza iesirea 1 ; sare la inceput ;memoria initiala = 0 ; sare la inceput

end; indica sfarsitul programului. Ce urmeaza dupa nu va fi luat in considerare de compilator.

Se va scrie programul in MP LAB, se va compila si se va transfera pe controller. Se va verifica functionarea circuitului. Se va incerca modificarea programului astfel incat intarzierea sa fie de 10 secunde.
40

LUCRAREA NR. 6

STUDIUL IN LABVIEW A CICLURILOR CU PRIORITATI SI DURATE DIFERITE.

Descrierea lucrarii Se va utiliza un VI care ruleaza cicluri cu durate si prioritati diferite. Programul vizualizeaz pe un dispozitiv numeric de tip rezervor rularea ciclului cu prioritate redusa si vizualizeaza prin aprinderea unui LED de mari dimensiuni rularea ciclului de prioritate ridicata. Pe doua indicatoare numerice sunt vizualizate numarul de iteratii pentru fiecare dintre cele doua cicluri. n acest VI sunt rulate n paralel dou cicluri temporizate cu prioriti diferite. n interiorul fiecrui ciclu este realizat funcia ocupat. Trebuie remarcat c ciclul cu prioritatea mai mare este plotat mai des dect cel cu prioritate mai redus i prin urmare se termin mai repede De notat c perioada unui ciclu exterior este dubl fa de a altui ciclu

Ca element principal, se remarc n componena ferestrei diagrama elementul Timed Loop (Windows) Ciclu temporizat a crei iconic este prezentat n figura de mai jos.

Acesta execut fiecare iteraie a ciclului cu o perioad specificat. Se utilizeazcnd este necesar s se dezvolte VI-uri cu capabiliti multi-rat, temporizare precis, feedback n execuia n ciclu, modificarea dinamic a caracteristicilor de timp, sau execuie cu mai multe nivele de prioritate. Pentru includerea n fereastra diagram se insereaz un ciclu while normal, dup care se poziioneaz mouse-ul pe ciclu respectiv i cu click dreapta se selecteaz ciclu temporizat (Replace withTimed loop) Pentru definirea setrilor se poate da dublu click suprafaa destinat setrilor (zona din stnga a ciclului) sau se poate da click dreapta cu mose-ul poziionat pe conturul ciclului. Valoarea care este introdus apare ca opiune n nodul de intrare. Cu click dreapta pe Input node se poate
41

selecta afiarea (sau inhibarea afirii) numelui intrrilor. Vor fi active (vor primi valori din exterior) numai acele opiuni ale intrrilor care au fost selectate ca terminale utilizate (Use terminal). n fereastra de dialog de configurare a ciclului. Un alt element important in structura ferestrei diagrama este Structur de secvene liniare

Const din una sau mai multe subdiagrame sau chenare care se execut secvenial. Poziionnd mouse-ul pe structur cu click dreapta se pot aduga sau terge secven. Se utilizeaz aceast funcie pentru a fi siguri c o subdiagram se exect dup o alt subdiagram. Fluxul de date pentru o astfel de structur difer de la o structur la alt structur. Secvenele se execut n ordine i cnd toate datele din secvena respectiv sunt disponibile. Datele ies din fiecare secven atunci cand se termin execuia secvenei. Se utilizeaz aceast funcie pentru a evita utilizarea secvenelor locale i pentru o mai bun vizualizare n diagrama bloc.

Modul de lucru Se va deschide VI ul cu titlul Lab1 cicluri temporizate prioritare. Se va studia fereastra diagrama n scopul nelegerii funcionrii acestui VI In acest VI sunt rulate dou cicluri temporizate (Timed Loop), unul cu prioritate redus iar cellalt cu prioritate ridicat. Perioada ciclului cu prioritate ridicat este dubl fa de cea a ciclului cu prioritate redus Indicaii: Apsai sgeata Run Observai c rezervorul corespunztor ciclului de prioritate redus se modific cnd se realizeaz iteraii corespunztoare ciclului de prioritate redus. Cnd se execut ciclul de prioritate ridicat, se aprinde LED-ul verde de mari dimensiuni; acest ciclul are oprioritate fa de ciclul cu priritate redus. Prin urmare rularea ciclului de prioritate redus (modificarea nivelului n rezervor) se oprete pn cnd se termin ciclul cu prioritate ridicat. Imediat ce este terminat ciclul cu prioritate ridicat se reia rularea ciclului cu prioritate redus. Se vor modifica constantele i controalele pentru a observa diferite caracteristici de temporizare i prioritate.

42

LUCRAREA NR. 7

REAL TIME PROCES

Obiectivul lucrarii Aceast aplicaie demonstreaz utilizarea opiunilor axelor de timp relativ mpreun cu funii de timp i proprietile nodurilor pentru a produce o diagram avnd ca ax X timpul curent. n aceasta aplicatie funciile de temporizare (Ateapt pn la urmtorul multiplu n milisecunde) sunt utilizate pentru a determina un ciclu temporizat precum i intervale de timp pentru puncte aflate pe diagram. Acest exemplu poate fi utilizat ca proptotip pentru aplicaii care achiziioneaz cu o vitez constant, cunoscut, n mod particular cnd rata este destul de redus (10Hz sau mai mic). Viteza maxim este determinat de ctre rezoluia temporizatorului i viteza de lucru a programului (corelat cu frecvena de ceas a calculatorului). Observaie. Este preferat utilizarea unor variabile de tip nestructurat (unbundle) pentru a extrage informaia referitoare la timpul curent precum i a utilizarea Proprietatilor diagramei(Chart property node) pentru a seta proprietile axelor. n aplicaia noastr sunt afiate datele corespunztoare pentru 10 secunde indiferent de rata eantioanelor determinat prin ntrziere. Modul de lucru Se studiaza fereastra panou a aplicatiei diagrama de timp real.vi urmarindu-se intelegerea rolului fiecarui element. Se lanseaz rularea programului. Se modific viteza de eantionare prin modificarea ntrzierii cu ajutorul controlului corespunztor poziionat pe fereastra panou. Se las programul s ruleze cel puin 30 secunde. Se oprete i se citesc valorile datelor la diferite momente de timp indicate pe axa x a diagramei. Principalele elemente prezente n fereastra panou:

Funie de conversie a unei mrci de timp sau a unei valori numerice ntr-un numr de secunde care au trecut de la miezul nopii (Vezi i help interactiv).

43

LUCRAREA NR. 8

SPECTRUL DE TIMP REAL AL AMPLITUDINII

Consideraii generale Se va studia o aplicaie care calculeaz spectrul de timp real al ampitudinii. Eantioanele noi care apar influeneaz spectrul. Datele de intrare sunt simulate printr-un semnal sinusoidal peste care este suprapus un zgomot Gaussian. n aplicaie este prezentat modul diferit n care se realizeaz calculul spectrului punct cu punct i calculul orientat pe bloc al spectrului, cele dou moduri de calcul fiind rulate alturat. Cnd este rulat aplicaia trebuie observat c graficul punct cu punct (stnga) este actualizat dup fiecare nou eantion, iar graficul din dreapta, corespunztor calcului orientat pe bloc va fi actualizat numai dup prelucrarea unui numr de eantioane egal cu lungimea blocului.Diferena dintre cel dou moduri de calcul este determinat de modul diferit n care lucreaz funciile Spectru amplitudine, faz punct cu punct (Amplitude and Phase Spectrum PtByPt ) a crei iconic este i Spectru amplitudine faz (Amplitude and Phase Spectrum) cu iconica .

Prima din cele dou funcii recalculeaz spectrul la fiecare nou punct generat, n timp ce cea de a doua funcie poate opera numai dup ce este furnizat ntreg blocul de date ce reprezeint semnalul de analizat. De notat c dei este disponibil un rezultat la fiecare punct de intrare, este necesar s fie furnizate un numr de puncte care depete lungimea blocului nainte ca ultima funcie s furnizeze spectrul de aplitudine. Mod de lucru Se deschide aplicatia Spectru de amplitudine real-time Se va lansa rularea programului si se va observa modul in care este calculat si afisat spectrul de amplitudine puct cu punct si cel pe bloc. Se vizualizeaz fereastra diagrama a aplicaiei i se studiaz modul de funcionare a acesteia. Se va utiliza opiunea Show context help din meniul Help pentru a intelege semnificaiile funciilor necunoscute. Observaii: 1. Se vor studia ambele obiuni pentru structura case. 2. Pentru nelegerea n detaliu a funciilor de analiz a spectrului se vor deschide viurile ataate acestor funcii i se va analiza fereastra diagrama a acestora. Se va identifica poziia i rolul mrimilor de intrare accesibile prin intermediul controlaleor de pe placa frontasl Se vor face predicii referitoare la modul n care modificarea acestor valori va
44

influena rezultatele afiate pe indicatoarele grafice de fereastra panou i se vor verifica aceste predicii prin rularea aplicaiei. Se va modifica aplicaia pentru a afia pe un indicator numeric valoarea amplitudinii componentei furndamentalei.

45

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