Sunteți pe pagina 1din 29

UNIVERSITATEA DIN BACU FACULTATEA DE INGINERIE

PROIECTARE CU MICROPROCESOR
ndrumar de laborator

CUPRINS

1. Studiul modului de programare in mediul EMU8086 3 2. Realizarea unui program simplu pentru microprocesorul 8086 .. 7 3. Realizarea unui program de sortare pentru microprocesorul 8086 .. 9 4. Studiul mediului de programare MPLAB ........11 5. Realizarea unui program de aprinderea dinamic a 8 leduri cu microcontroler PIC 15 6. Studiul sistemului de ntrerupere la un microcontroler PIC .. 21 7. Studiul ntreruperilor. Ceas de timp real cu microcontroler PIC ... 26

Laboratorul nr. 1 Studiul modului de programare in mediul EMU8086


Scopul acestui laborator este de prezentare i de iniiere a studenilor n utilizarea programului EMU8086. EMU8086 este un emulator pentru microprocesoarele 8086 (compatibil Intel i AMD) avnd integrat programul de conversie n cod main, asamblorul. Acest emulatorul ruleaz programele scrise de ctre utilizator exact ca un microprocesor real, n modul pas cu pas pentru observarea efectului fiecrei instruciuni. Acest lucru se este posibil deoarece acest program prezint coninutul regitrilor microprocesorului, a memorie, a stivei, valoarea variabile lor precum i starea fanioanelor. Instruciunile programului pot fi executate pas cu pas n mod normal dar exist posibilitatea de execuie i n sens invers. Pentru a rula n mod real programul realizat, emulatorul poate realiza o dischet bootabil crend un mini sistem de operare necesar rulrii aplicaiei de pe dischet. Acest program include i mai multe dispozitive virtuale externe : robot, motor pas cu pas, afiaj cu leduri etc., ce pot fi utilizate n experimente dar permite i realizarea i utilizarea propriilor dispozitive virtuale. La deschidere programul va ntreba utilizatorul ce format va avea fiierul final executabil realizat n urma emulrii programului: .com, .exe, sau .bin pentru includerea de la nceput a instruciunilor specifice necesare. Interfaa programului este prezentat n imaginea urmtoare:

n fereastra principal (1) se va edita programul utiliznd instruciunile specifice programrii n cod main. Dup terminarea editrii codului surs a programului se va da comanda de compilare (2) pentru verificarea corectitudinii programului. Dac sunt probleme softul va specifica n fereastra de compilare erorile gsite i tipul acestora pentru depanarea lor. n caz de succes se va cere salvarea programului i apoi se poate da n execuie aplicaia de emulare cu ajutorul butonului (3) din fereastra programului sau butonul dreapta jos din fereastra de compilare. La emulare se vor deschide automat dou ferestre: fereastra codului programului i fereastra de emulare a codului, astfel nct s se poat urmrii pas cu pas efectul fiecrei instruciuni. 1

3 5

n fereastra de emulare cu ajutorul butoanelor 1, exist posibilitatea de rulare a programului pas cu pas, se execut numai cte o instruciune, sau rularea tuturor instruciunilor cu un timp de ntrziere ntre ele ce poate fi controlat cu ajutorul cursorului 2. n panoul 3 este prezentat codul main dezasamblat pentru a putea fi urmrit n paralel cu cel asamblat din fereastra de cod. n panoul 6 este prezentat coninutul memorie ncepnd cu adresa fizic i valoarea memorat la aceea locaie exprimat n baz 16, 10 i cos ASCII. n partea stng a ferestrei de emulare 4, 5, se prezint coninutul regitrilor microprocesorului . Dac se d dublu click pe csua fiecrui registru, exist posibilitatea de acces la valorile coninute de acesta, implicit de modificare a lor. Cu ajutorul butoanelor 7 din partea dreapt jos a ferestrei de emulare, se pot afia ferestrele ce afieaz coninutul stivei, a fanioanelor precum i a uniti de calcul aritmetico logic (ALU).

Cu ajutorul butonului Load (8), exist posibilitatea de a deschide n fereastra de emulare a unui program executabil fr a avea codul surs a acestuia. n realizarea diferitelor programe ce pot fi experimentate utiliznd emulatorul EMU8086, pot fi utilizate i diferite dispozitive virtuale externe, robot, motor pas cu pas, afiaj cu leduri ce pot fi lansate din meniul programului. Pentru uurarea realizrii diferitelor operaii de calcul necesare editrii codului surs a unui program nou, programul include un calculator i un convertor de numere ntre cele 4 baze de numeraie 10, 2, 8 i 16. n plus acest soft include i cteva programe simple ce pot fi utilizate pentru studiul acestuia.

Laboratorul nr. 2 Realizarea unui program simplu pentru microprocesorul 8086


n cadrul acestui laborator, pe baza cunotinelor cptate n cadrul laboratorului precedent, se va realiza un program simplu utiliznd programul EMU8086, ce va avea ca rezultat adunarea a doua valori numerice cerute de ctre program i introduse de ctre utilizator de la tastatur. Se deschide programul EMU8086 i se scrie urmtorul program prezentat mai jos: #make com# Org 100h Jmp start

;salt necondiionat la eticheta start

a DB ? ;declaratii de variabile: a si b in care se vor salva valorile celor b DB ? ; doi operanzi M1 DB a=, $ ; declaratii de variabile sir de caractare ce vor fi trimise la ecran M2 DB 13,10,b=, $ ;necesare realizarii inerfetei grafice M3 DB 13,10, $ M2 DB +, $ M5 DB =, $ start: lea dx,M1 mov ah,09h int 21h mov ah,01h int 21h sub al,48 mov a,al lea dx,M2 mov ah,09h int 21h mov ah,01h int 21h sub al,48 mov b,al

; generarea intreruperii dos pentru afisarea sirului de caracactere ; pastrate in variabila M1

; generarea intreruperii dos pentru citirea unui caracter cu ecou de ; la tastatura ; efectuarea operatiei de scadere dintre valoarea citita si val 48 ;conversie cod caracter ASCCI valoare numerica si salvare in ;variabila a ; generarea intreruperii dos pentru afisarea sirului de caracactere ; pastrate in variabila M2

; generarea intreruperii dos pentru citirea unui caracter cu ecou de ; la tastatura ; efectuarea operatiei de scadere dintre valoarea citita si val 48 ;conversie cod caracter ASCCI valoare numerica si salvare in ;variabila b

lea dx,M3 ; generarea intreruperii dos pentru trimiterea prompterului pe un mov ah,09h ; rand nou int 21h ;scrierea valorii primei variabile mov dl,a add dl,48 mov ah,02h int 21h lea dx,M4 mov ah,09h int 21h ; afisarea semnului +

;scrierea valorii celei de-a doua variabile mov dl,b add dl,48 mov ah,02h int 21h lea dx,M4 mov ah,09h int 21h ; afisarea semnului =

;adunarea celor doua valori si afisarea rezultatului mov dl,a add dl,b add dl,48 mov ah,02h int 21h mov ah,4Ch int 21h ; generarea intreruperii dos pentru terminarea programului si ; returnarea controlului sistemului de operare

Dup editarea codului surs a programului, se va compila i in caz de erori se vor depana. Se va simula pas cu pas, programul realizat urmrind n fereastra de emulare, valorile regitrilor. n urma execuie programului se va observa c acesta va da un rspuns corect ct timp suma celor dou valori introduse de la tastatur este mai mic sau egal cu valoarea 9. Peste aceast valoare programul va afia un rspuns eronat. Se va discuta aceast problem i se cere s se modifice programul astfel nct acesta s funcioneze corect pentru orice valori date celor doi operanzi. Referatul de laborator trebuie s conin programul studiat ,explicaiile privind modul de funcionare, precum i programul modificat care rezolv problema aprut. Ca tem pentru acas se propune realizarea unui program in limbaj de asamblare care s efectueze produsul a dou valori numerice.

Laboratorul nr. 3 Realizarea unui program de sortare pentru microprocesorul 8086


n cadrul acestui laborator, pe baza cunotinelor cptate n cadrul laboratorului precedent, se va realiza un program simplu utiliznd programul EMU8086, ce va avea ca rezultat sortarea n ordine descresctoare a 10 numere. Se deschide programul EMU8086 i se scrie urmtorul program prezentat mai jos:
;Program pentru sortarea in ordine descrescatoare a unui sir cu 10 ;numere ;dimensiunea maxima a numerelor de ordonat este un octet. Numarul ;maxim de numere al sirului este de 255. ; ;AH - pastreaza valoararea maxima a numerelor din sir + 1 ;AL - prima valoare din sir de comparat ;BX - contor in sir - BH este nefolosit si este initializat cu zero, ;iar BL arata pozitia in sir cu care se compara AL ;DH - contine numarul maxim de termeni ai sirului de comparat ;DL - contine cea de-a doua valoare din sir cu care se compara AL ;CH - stocheaza temporar valoarea DL ;CL - stocheaza temporar valoarea BL ; dosseg ;directiva de segmentare .model small ;model mic lungime program < 64 Ko si lungime date ;si lungime stiva (impreuna) < 64 Ko. Compilatorul va da ; un mesaj de eroare daca sunt depasite aceste dimensiuni .stack 200 ;pentru stiva sunt rezervati 200 de octeti .data ;zona de date sir_numere db 5,1,7,2,8,0,3,6,4,9 ;sirul de numere ce urmeaza a fi ;ordonat index_sir db 0 ;zona de memorie unde se pastreaza indexul curent nr_max_valori db 10 ;numarul de valori pentru sir_numere .code start: ;inceput program ;Sortarea sirului se face astfel: se citeste primul numar si se ;compara cu urmatoarele. Daca se gaseste un numar mai mic acestea se ;inverseaza. La sfirsit numarul este memorat in sir si se trece la ;urmatorul, si asa mai departe. mov ax,@data ;se initializeaza segmentul de date mov ds,ax mov ah,[nr_max_valori] ;AH va pastra numarul maxim de termeni ai ;sirului mov dh,ah ;La fel si registrul DH inc ah ; Din motive de comparare in AH vom avea numarul ;de termeni +1 mov si,offset sir_numere ;in SI se pune offsetul sirului de numere

valoare_noua: mov bh,0 ;BH este initializat la zero pt. ca este folosit ad ;la resarea sirului mov b,[index_sir] ;BL contine pozitia primului numar din sir mov al,[bx][si] ;AL prima valoare din sir inc bx ;se trece la urmatoarea valoare din sir cmp dh,bl ;se verifica daca nu s-au comparat toate valorile je sfirsit ;s-au comparat toate valorile si s-a terminat ;programul mov [index_sir],bl ;memorez pozitia primei valori de comparat. ;Aceasta va fi comparata succesiv cu valorile ;urmatoare din sir dec bx ;pentru ca urmeaza o bucla se decrementeaza valoarea comparare: ;se trece la urmatoarea valoare din sir inc bx cmp ah,bl ;se verifica daca nu s-au comparat toate valorile ;din sir je valoare_noua ;daca da, se trece la o alta valoare de comparat ;din registrul AL mov dl,[bx][si] ;DL contine valoarea cu care se compara AL, ;valoarea urmatoare din sir cmp al,dl ;se compara cele doua valori din sir jb comparare ;daca in AL este o valoare mai mica decit in DL ;atunci se trece la urmatoarea valoare de comparat mov cl,bl ;daca nu atunci de inverseaza cele doua valori ;in memorie si in registrele AL si DL. Aici se ;stocheaza temporar indexul in sir mov ch,dl ;se stocheaza temporar valoarea din DL mov [bx][si],al ;se memoreaza valoarea mai mare in locul celei ;mai mici mov bl,[index_sir] dec bl mov [bx][si],dl mov, bl,cl mov dl,al mov al,ch jmp comparare sfarsit: mov ax,4Ch int 21h end start

Dup editarea codului surs a programului, se va compila i in caz de erori se vor depana. Se va simula pas cu pas, programul realizat urmrind n fereastra de emulare, valorile regitrilor. Se va discuta modul de funcionare al programului i posibiliti de realizare altfel al programului. Referatul de laborator trebuie s conin programul studiat ,explicaiile privind modul de funcionare, precum i alt variant de program care s efectueze sortarea a unui numr de valori numerice.

10

Laboratorul nr. 4 Studiul mediului de programare MPLAB


Scopul acestui laborator este de prezentare i de iniiere a studenilor n utilizarea programului MPLAB. MPLAB IDE este un mediu integrat de dezvoltare (IDE Integrated Development Environment) oferit de firma Microchip pentru familiile de microcontroloare PIC12, PIC 16, PIC18, etc. Include: - manager de proiecte - editor de program sursa - asamblor - editor de legaturi - depanator (debuger) - motor de executie Aplicatia permite integrarea si a altor componente (ex: compilator C, depanator, programator, ICD, ICE) realizate fie de firma Microchip fie de alte firme (ex. CCS). Figura de mai jos indica schema de administrare a unui proiect prin MPLAB:
Fiiere surs Bibliotec de funcii predefinite (fiiere obiect)

Asamblor

Compilat or

Editor de legturi

Fiier de depanare

Fiier executabil

Figura 1. Administrarea unui proiect in MPLAB

Pasii necesari pentru dezvoltarea unei aplicatii: a. Lansarea mediului MPLAB IDE - Start>Programs>Microchip>MPLAB IDE vx.xx>MPLAB IDE

11

b. Selectarea dispozitivului - trebuie s precead crearea unui nou proiect - din meniu se alege: Configure->Select device - se alege tipul circuitului folosit (ex: PIC16F877); mediul va indica tipurile de dispozitive suportate pentru programarea circuitului (ex: MPLAB ICD 2), limbajele acceptate i instrumentele de depanare utilizabile

c. Crearea unui proiect - cu ajutorul project wizard - din meniu se alege: Project>Project Wizard - n pasii urmtori se aleg: tipul de dispozitiv i setul de instrumente de compilare i link-editare; se observ c pe lng instrumentele Microchip pot fi folosite instrumente oferite de ali productori (ex: compilator C al firmei HITECH)

12

- se alege un nume pentru noul proiect (ex: Test_x)

- se adaug fiiere surs; pentru nceput se poate aduga un fiier model (template) care conine elementele iniiale de configurare pentru fiecare circuit n parte (ex: C:\Program Files\Microchip\MPASM Suite\Template\Object\16F877tmpo.asm); se apas litera de la nceputul fiierului pn apare C care va copia fiierul n proiect

13

- se adaug un fiier necesar pentru link-editare (ex: C:\Program Files\Microchip\MPASM Suite\LKR\18F8722.lkr sau .... \18F8722i.lkr dac se folosete ICD 2) - proiectul creeat se poate vizualiza cu: View>Project.; fiierele pot fi selectate pentru editare (dublu-clock pe fiier sau click-dreapta i Edit) - se construieste proiectul (asamblare, link-editare i conversie n format HEX) cu: Project>Build Allsau prin apsarea icoanei corespunztoare la Build All - pentru scriere de program se deschide fiierul model (dublu-click pe 16F877tmpo.asm) i se adaug instruciuni n Main dup comentariul: remaining code goes here ;

14

Laboratorul nr. 5 Realizarea unui program de aprinderea dinamic a 8 leduri cu microcontroler PIC
n cadrul acestui laborator, pe baza cunotinelor cptate n cadrul laboratorului precedent i a cunotinelor acumulate la curs , se va realiza, simula un program n limbaj de asamblare utiliznd MPLAB i prin programarea unui microcontroler PIC16F877A se va testa acest program. Scopul acestui program este de a comanda aprinderea a 8 leduri conectate la portul PORTB al microcontrolerului n 4 moduri diferite, trecerea de la un efect la altul realizndu-se prin apsarea a 4 butoane conectate la pinii 0 3 ai portului PORTA. Se va lansa n execuie programul MPLAB, se va crea un proiect nou editnduse urmtorul program:
list #include p=16f877A ; list directive to define processor <p16f877A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. ;***** VARIABLE DEFINITIONS

CBLOCK 0x20 ; declaraia de variabile TIMER x necesare subrutinei ;de ntrziere, RAM starts at address 20h TIMER1 TIMER2 TIMER3 ENDC ;********************************************************************** ORG 0x000 ; processor reset vector main ; Initializarea porturilor microcontrolului movlw b'00000000' movwf PORTA movlw b'00000000' movwf PORTB movlw b'00000000' movwf PORTC ; toti pini porturilor = low

15

movlw b'00000000' movwf PORTD movlw b'00000000' movwf PORTE bsf STATUS,RP0 ; saltul in bankul 1 de memorie RAM, ;necesar setarii registrilor TRISx

movlw b'11111111' movwf TRISA movlw b'00000000' movwf TRISB movlw b'00000000' movwf TRISC movlw b'00000000' movwf TRISD movlw b'00000000' movwf TRISE movlw b'00000110' movwf ADCON1

; toti pinii portului PORTA = de intrare ; toti pinii portului PORTx = de iesire

; prin setarea registrului ADCON1 cu valoarea binara ;se seteaza pinii portului A ca pini I/O digitali

bcf STATUS,RP0 ; saltul in bankul 0 de memorie RAM GOTO EFECT_1 Meniu CLRF PORTB BTFSC PORTA,0 GOTO EFECT_1 BTFSC PORTA,1 GOTO EFECT_2 BTFSC PORTA,2 GOTO EFECT_3 BTFSC PORTA,3 GOTO EFECT_4 GOTO Meniu ;stergerea registrului ;testarea nivelului logic a pinului 0 din PORTA ;daca este 1 se face saltul la eticheta EFECT_1

EFECT_1 E1

BTFSC PORTA,0 GOTO EFECT_1 MOVLW B'10000000' CALL DELAY_ROUTINE MOVWF PORTB MOVLW B'11000000' CALL DELAY_ROUTINE MOVWF PORTB MOVLW B'11100000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11110000'

; ;

16

MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111100' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111110' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111111' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111110' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111100' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11110000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11100000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11000000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'10000000' MOVWF PORTB GOTO E1

EFECT_2 E2

BTFSC PORTA,1 GOTO EFECT_2 MOVLW B'00000001' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00000010' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00000100' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00001000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00010000' MOVWF PORTB

17

CALL DELAY_ROUTINE MOVLW B'00100000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'01000000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'10000000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'01000000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00100000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00010000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00001000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00000100' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00000010' MOVWF PORTB CALL DELAY_ROUTINE GOTO E2 EFECT_3 E3 BTFSC PORTA,2 GOTO EFECT_3 MOVLW B'00000011' MOVWF PORTB CALL DELAY_ROUTINE CALL DELAY_ROUTINE MOVLW B'00001100' MOVWF PORTB CALL DELAY_ROUTINE CALL DELAY_ROUTINE MOVLW B'00110000' MOVWF PORTB CALL DELAY_ROUTINE CALL DELAY_ROUTINE MOVLW B'11000000' MOVWF PORTB CALL DELAY_ROUTINE CALL DELAY_ROUTINE GOTO E3 BTFSC PORTA,3 GOTO EFECT_4 MOVLW B'11111111'

EFECT_4 E4

18

MOVWF PORTB CALL DELAY_ROUTINE CALL DELAY_ROUTINE MOVLW B'00000000' MOVWF PORTB CALL DELAY_ROUTINE CALL DELAY_ROUTINE GOTO E4

DELAY_ROUTINE MOVLW 0x0B ;subrutina de intarziere MOVWF TIMER3 DEL_LOOP1 MOVLW 0xE7 MOVWF TIMER2 DEL_LOOP2 MOVLW 0x2D MOVWF TIMER1 DEL_LOOP3 BTFSC PORTA,0 GOTO MENIU BTFSC PORTA,1 GOTO MENIU BTFSC PORTA,2 GOTO MENIU BTFSC PORTA,3 GOTO MENIU DECFSZ TIMER1,F GOTO DEL_LOOP3 DECFSZ TIMER2,F GOTO DEL_LOOP2 DECFSZ TIMER3,F GOTO DEL_LOOP1 RETLW 0 END Dup editarea programului se d comanda de compilarea i n cazul existenei unor erori se vor depana. Se pornete simulatorul integrat: Debugger >>Select Tool>>MPLAB SIM. Din meniu, View>>Watch se va afia o fereastr prin intermediul cruia se poate selecta regitrii i variabilele a cror valori se urmresc odat cu emularea programului.

19

Dup verificarea programului realizat, prin simulare, se va programa un microcontroller de clas PIC 16F877A, utiliznd pupitrul de lucru NX 877 plus i programatorul aferent.

Referatul de laborator trebuie s conin programul studiat ,explicaiile privind modul de funcionare, denumirea i semnificaia biilor regitrilor folosii n program. Se va modifica programul astfel nct sa poat rula 5 programe diferite de aprindere a ledurilor.

20

Laboratorul nr. 6 Studiul sistemului de ntrerupere la un microcontroler PIC


n cadrul acestui laborator, pe baza cunotinelor cptate n cadrul laboratorului precedent i a cunotinelor acumulate la curs , se va realiza, simula un program n limbaj de asamblare utiliznd MPLAB i prin programarea unui microcontroler PIC16F877A se va testa acest program. Scopul acestui program este de a comanda aprinderea a 7 leduri conectate la portul PORTB al microcontrolerului n 3 moduri diferite, trecerea de la un efect la altul realizndu-se prin apsarea unui singur buton conectat la pinul 0 al portului PORTB, ceea ce determin generarea unei ntreruperi spre unitatea central. Acest lucru se va realiza prin programarea, setarea registrului INTCON al microcontrolerului. Se va lansa n execuie programul MPLAB, se va crea un proiect nou editnduse urmtorul program:
list #include p=16f877A ; list directive to define processor <p16f877A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. ;***** VARIABLE DEFINITIONS

CBLOCK 0x20 w_temp ; variabile necesare salvarii registrului acumulator si a registrului STATUS status_temp ; in momentul tratarii unei intreruperi de catre unitatea centrala ST ; variabila necesara contorizarii numarului de apasari pe butonul conectat ;la pinul RB0 TIMER1 ; declaraia de variabile TIMER x necesare subrutinei TIMER2 ;de ntrziere, RAM starts at address 20h TIMER3 ENDC ;********************************************************************** ORG 0x0020 ; processor reset vector goto main ; go to beginning of program

21

ORG movwf movf movwf

0x004 w_temp STATUS,w status_temp

; interrupt vector location ; save off current W register contents ; move status register into W register ; save off contents of STATUS register

BTFSC INTCON,INTF ; se verifica sursa intreruperii, daca a venit CALL CE ; de la pinul RB0 se face saltul la subrutina CE movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie CE INCF ST,1 MOVLW b'10000000' MOVWF OPTION_REG MOVLW b'10010000' MOVWF INTCON MOVLW 2 SUBWF ST,0 BTFSS STATUS,C GOTO AP1 GOTO AP2 RETURN main ; Initializarea porturilor microcontrolului movlw b'00000000' movwf PORTA movlw b'00000000' movwf PORTB movlw b'00000000' movwf PORTC movlw b'00000000' movwf PORTD movlw b'00000000' movwf PORTE bsf STATUS,RP0 ; toti pini porturilor = low

; saltul in bankul 1 de memorie RAM, ;necesar setarii registrilor TRISx

movlw b'00000000' movwf TRISA movlw b'00000001' movwf TRISB movlw b'00000000' movwf TRISC movlw b'00000000'

; toti pinii portului PORTA = de iesire ; pinii 1 7 ai portului PORTx = de iesire

22

movwf TRISD movlw b'00000000' movwf TRISE movlw b'00000110' ; prin setarea registrului ADCON1 cu valoarea binara ;se seteaza pinii portului A ca pini I/O digitali

movwf ADCON1 MOVLW b'10000000' MOVWF OPTION_REG MOVLW b'10010000'

; activarea sistemului de intreruperi globale si acceptarea ; intreruperii generate in urma modificarii starii logice la pinul ;RB0

MOVWF INTCON bcf STATUS,RP0 ; saltul in bankul 0 de memorie RAM MOVLW 0.1 MOVWF ST

AP1

MOVLW B'10000000' CALL DELAY_ROUTINE MOVWF PORTB MOVLW B'11000000' CALL DELAY_ROUTINE MOVWF PORTB MOVLW B'11100000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11110000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111100' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111110' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111111' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111110' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111100' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11111000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11110000' MOVWF PORTB

; ;

23

CALL DELAY_ROUTINE MOVLW B'11100000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'11000000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'10000000' MOVWF PORTB GOTO AP1

AP2

MOVLW B'00000001' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00000010' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00000100' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00001000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00010000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00100000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'01000000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'10000000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'01000000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00100000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00010000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00001000' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00000100' MOVWF PORTB CALL DELAY_ROUTINE MOVLW B'00000010' MOVWF PORTB

24

CALL DELAY_ROUTINE CLRF ST GOTO AP2 DELAY_ROUTINE MOVLW D'100' ;subrutina de intarziere MOVWF TIMER3 DEL_LOOP1 MOVLW D'200' MOVWF TIMER2 DEL_LOOP2 MOVLW D'255' MOVWF TIMER1 DEL_LOOP3 DECFSZ TIMER1,F GOTO DEL_LOOP3 DECFSZ TIMER2,F GOTO DEL_LOOP2 DECFSZ TIMER1,F GOTO DEL_LOOP1 RETLW 0 END Dup editarea programului se d comanda de compilarea i n cazul existenei unor erori se vor depana. Se pornete simulatorul integrat: Debugger >>Select Tool>>MPLAB SIM. Din meniu, View>>Watch se va afia o fereastr prin intermediul cruia se poate selecta regitrii i variabilele a cror valori se urmresc odat cu emularea programului.

Dup verificarea programului realizat, prin simulare, se va programa un microcontroller de clas PIC 16F877A, utiliznd pupitrul de lucru NX 877 plus i programatorul aferent.

Referatul de laborator trebuie s conin programul studiat ,explicaiile privind modul de funcionare, denumirea i semnificaia biilor regitrilor folosii n program. Se va modifica programul astfel nct sa poat rula 3 programe diferite de aprindere a ledurilor.

25

Laboratorul nr. 7 Studiul ntreruperilor. Ceas de timp real cu microcontroler PIC

n cadrul acestui laborator, pe baza cunotinelor cptate n cadrul laboratorului precedent i a cunotinelor acumulate la curs , se va realiza, simula un program n limbaj de asamblare utiliznd MPLAB i prin programarea unui microcontroler PIC16F877A se va testa acest program. Scopul acestui program este de a comanda aprinderea a 2 leduri conectate la portul PORTB al microcontrolerului la perioade de timp diferite i bine definite, acest lucru realizndu-se prin programarea regitrilor TIMER X ai microcontrolerului. TIMER0 este un numrtor pe 8 bii care are posibilitatea de a genera ntreruperi spre unitatea central n momentul cnd ajunge la valoarea maxim 255 i se reseteaz. Acest lucru se va realiza prin programarea, setarea registrului INTCON al microcontrolerului. Se va lansa n execuie programul MPLAB, se va crea un proiect nou editnduse urmtorul program:
;RB4 clipeste la 10 secunde ;RB1 clipeste la 1 secunda list #include p=16f877A ; list directive to define processor <p16f877A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. ;***** VARIABLE DEFINITIONS

CBLOCK 0x20 w_temp ; variabile necesare salvarii registrului acumulator si a registrului STATUS status_temp ; in momentul tratarii unei intreruperi de catre unitatea centrala timp ; declaraia de variabile timp necesare controlului trecerii perioadei de timp timp1 ;stabilite constanta_timp ; variabila in vare se prescrie perioada de timp la care se aprinde ledul ; conectat la pinul RB4 ENDC ;**********************************************************************

26

ORG

0x0020

; processor reset vector ; go to beginning of program ; interrupt vector location movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register ;intreruperea ; daca a aparut intreruperea verific daca aceasta este de la TMR0 btfsc INTCON,T0IF ; se testeaza daca este vorba de o intrerupere de la TIMER0 goto timer_isr ; da, se trateaza intreruperea

goto main ORG 0x004

end_isr movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt timer_isr ; tratarea intreruperii timer TMR0 ; aceasta intrerupere apare la fiecare 100us. La intrerupere se reincarca constanta de divizare ; in TMR0 si se reactiveaza intreruperea. BCF STATUS, RP0 ;se comuta pe bank 0 ; clrf TMR0 incf timp,f bcf INTCON,T0IF ;se reactiveaza intreruperea TMR0 goto end_isr

main ;initializari BCF STATUS, RP0 ;bank0 CLRF PORTA ;sterge registrul PORTA CLRF PORTB ;sterge registrul PORTB BSF STATUS, RP0 ;bank1 MOVLW 0xff ;PORTA = intrari MOVWF TRISA MOVLW b'00000000' ;BORTB<0:7> = iesiri MOVWF TRISB MOVLW B'11010011' ;Se seteaza optiunile ;Disable pull-ups ;INT on rising edge ;TMR0 to CLKOUT ;TMR0 Incr low2high trans. ;Prescaler assign to Timer0 ;Prescaler rate is 1:16 MOVWF OPTION_REG CLRF INTCON ;Write the OPTION register. ;Disable interrupts

27

bcf STATUS,RP0

;se comuta pe bank0

;stabilesc temporizarea la 10 secunde movlw .10 ;temporizare 10 secunde movwf constanta_timp bucla bsf PORTB,4 ;se aprinde LED-ul call TEMPORIZARE bcf PORTB,4 ;se stinge LED-ul call TEMPORIZARE goto bucla ;------------------------------------------------------;SUBPROGRAME ;------------------------------------------------------TEMPORIZARE bcf STATUS,RP0 ;se porneste temporizarea clrf TMR0 clrf timp clrf timp1 movlw B'10100000' TMR0 movwf INTCON temporizare1 ;a trecut o secunda? movf timp,w sublw D'245' btfss STATUS,Z goto temporizare1 ;da, a trecut o secunda clrf timp ;--------------------------btfss PORTB,1 goto LED_stins bcf PORTB,1 temporizare2 ;--------------------------incf timp1,f movfw timp1 subwf constanta_timp,w btfss STATUS,Z goto temporizare1 ;s-a scurs timpul cerut ;reset timer0 CLRF INTCON return ;---------------------------LED_stins bsf PORTB,1 goto temporizare2

;se comuta pe bank0 ;se incarca constanta in TMR0

;se activeaza intreruperile globala si cea a

;nu a trecut o secunda, astept

;incrementez secunda ;timpul cerut ;nu s-a scurs timpul cerut

;Disable interrupts, se opreste Timer0

28

;---------------------------END

; directive 'end of program'

Dup editarea programului se d comanda de compilarea i n cazul existenei unor erori se vor depana. Se pornete simulatorul integrat: Debugger >>Select Tool>>MPLAB SIM. Din meniu, View>>Watch se va afia o fereastr prin intermediul cruia se poate selecta regitrii i variabilele a cror valori se urmresc odat cu emularea programului.

Dup verificarea programului realizat, prin simulare, se va programa un microcontroller de clas PIC 16F877A, utiliznd pupitrul de lucru NX 877 plus i programatorul aferent.

Referatul de laborator trebuie s conin programul studiat ,explicaiile privind modul de funcionare, denumirea i semnificaia biilor regitrilor folosii n program. Se va modifica programul astfel nct s se modifice perioadele de aprindere, stingere ale celor dou leduri precum prin setri diferite ale registrelor OPTION i INTCON.

29