Sunteți pe pagina 1din 6

Universitatea Tehnica a Moldovei

Catedra MDS

RAPORT
La lucrarea de laborator nr. 2

La microprocesoare

Tema: Operatori condiţionali

A efectuat: st. gr. ME-071

Branişte Tudor

A verificat: lector superior

Bragarenco Andrei

Chişinău 2009
Scopul: Deprinderea lucrului cu operatorii de decizie (condiţionali).
Sarcina: Să se scrie un program care va reacţiona la apăsarea unui buton schimbînd starea
unui LED în opus (dacă luminează să îl stingă, dacă nu sa îl aprindă).
Noţiuni teoretice:
Pe lîngă instrucţiunile liniare, microcontrlerele permit crearea ramificaţiilor programului cu
ajutorul unor operatori condiţionali.
Ramificarea în assembler presupune schimbarea valorii din Program Counter în dependenţă
de o anumită condiţie (biţii din SREG) astfel că se execută un salt la o altă adresă din Program
Memory şi se îndeplinesc instrucţiunile de la ea.
Sunt operatori de comparaţie, cu ajutorul cărora putem compara doi regiştri (CP) sau un
registru cu o constantă (CPI) sau chiar compararea a doi regiştri luînd în seamă şi bitul de
transport (CPC). În urma acestori operaţii, cît şi a celor aritmetice, sunt setaţi sau „curăţiţi”
anumiţi biţi în registrul de satus SREG, pe care mai apoi îi putem utiliza pentru a crea ramificări.

Schema bloc a algoritmului


Principiul de lucru al programei va fi următorul: programul va cicla şi va controla mereu
dacă tasta (butonul) este sau nu apăsată, după care va verifica starea LED-ului şi la fiecare
apăsare a butonului va schimba starea LED-ului în opus. La prima apăsare a butonului îl va
conecta, iar la următoarea apăsare îl va deconecta.
Dupa operatiile primare de configurare a porturilor microcontrolerul trebuie sa intre intr-un
ciclu infinit in timpul caruia el trebuie sa interogheze intrarea, la care este conectat butonul si in
dependenta in ce stare se afla butonul sa dirijeze ledul.
Operatiile de configurare primara
1. Setarea valorii initiale a stivei de sus a microcontolerului
2. Configurarea portului D pentru iesire
3. Setarea “1” logic la portul B pentru stingerea ledului
4. Configurarea portului B pentru intrare
5. Conectarea rezistoarelor de sarcina interne a portului B
Operatiile componente ale corpului ciclului
1. Citirea ordinului jos a portului PB (PA.3)
2. Daca valoarea acestui ordin este egala cu unitatea atunci trebue să aştepte momentul de
apăsare a butonului, dar dacă este egală cu 0 trebuie să purcedă la comande următoare.
3. Verificarea poziţiei anterioare a portului D şi schimbarea lui în opus.
4. Aşteptarea pînă cînd utilizatorul va lua mina de pe buton. Aceasta se face pentru a
evita licăririle LED în cazul ăn care a fost ţinută apasat butonul o perioadă mai mare.
5. Saltul la inceputul ciclului.
START

Iniţializarea MCU
.cseg
.org 0

setare porturi de
intrare/ieşire

delay

NU Buton =
apăsat

DA

DA LED = NU
aprins
LED=0
(stinge) LED=1
(aprinde)
*stinge

delay

NU Buton
=1

DA

Fig. 1. Schema bloc de realizare a algoritmului

Listingul programului:
;partea de iniţiere
.include"m16def.inc"; se include fisierul de descriere a controlerului
.def temp=R16 ; deffinirea registrului cu care vom lucra
.cseg ; se alege segmentul codului de program
.org 0
reset:

;setam portul a de intrare


ldi r16, 0x00
out ddrb, r16

;activarea rezisten'elor de "pull-up"


ldi r16, 0xff
out portb, r16

;setam portul b de iesire


ldi r16, 0xff
out ddrd, r16

;dezacticarea rezistorilor "pull-up" la iesire


ldi r16, 0x00
out portd, r16

main:
;functia de intirziere(retinere)
LDI R16, 0X08
L1: Dec R16 ;decrementeaza valuarea din registru R16
CPI R16, 0x00 ;compara valuarea 0 cu valuarea din registru
BRNE L1 ;salt neconditional la L1 daca valuorile comparate nu sunt egale
L2:
SBIC PINB,3 ;omite urmatoarea comanda daca pinul 3 din portul B va avea valuarea 0
rjmp L2 ;revine la executarea comenzii L2

;se verifica starea ledului


SBIC PORTD, 5 ;daca este stins treci peste un rind
rjmp L3 ;treci la comanda L3

;se va aprinde LED-ul daca a fost stins


SBI PORTD,5 ;seteaza bitul 5 din portul B la valuarea 1
rjmp L4;

;se va stinge LED-ul daca a fost aprins


L3: CBI PORTD,5

;delay
L4:LDI R16, 0X08
L5: Dec R16
CPI R16, 0x00
BRNE L5
L6:SBIS PINB,3
rjmp L6
rjmp main

În acest program, pentru programul în assembler am folosit următoarele directive :


.include – alipirea la textul programului a unui alt text care conţine unele particularităţi a
unui microcontroller ca în cazul nostru sau a unei biblioteci ca pentru un limbaj de programare
ca C. În program am inclus fişierul m16def.inc care conţine informaţia despre porturile
controllerului, despre registri, memoria RAM, etc.
.list – începerea generării listingului. În cazul nostru listingul este un fişier în care se reflectă
toţi paşii de executare a programului. În faţa fiecarei comenzi este scrisă cîte un cod-maşină. De
asemenea în faţa fiecărui cod dacă sunt erori ele sunt reflectate în listing.
.def – permite alocarea unor nume diferitor regiştri ale microcontrolerului, astfel uşurîndu-ne
înţelegerea programului.Acest macrou are doi parametri, primul este numele alocat iar al doilea
este registrul care il alocăm.
.cseg – pseudooperator care indică începerea segmentului de cod a programului.Doar în
acest segment se descriu comenzi care apoi vor fi scrise în memoria programului
.org – poziţionarea forţată a indicatorului adresei curente.Uneori este necesar amplasarea
unui anumit fragment de program nu implicit după predecesorul, dar într-un loc concret a
memoriei programului. Acest operator are doar un parametru care indică noua valoare a adresei.
Schema elctrică a circiutului
Programul îl vom testa în softul „Proteus”. Schema electrică a circuitului este reprezentată în
figura 2.

Fig. 2 Schema electrică a circuitului

Descrierea instrucţiunilor utilizate


LDI – (Load Immmediate) încarcarea unei constante în registru (de la R16 la R31). Această
comandă are doi parametri : primul este Rd – registrul în care se încarcă şi al doilea implicit
constanta k care se va încărca.
OUT – (Store Register to I/O port) comanda descarcă valoarea uni registru în porturile de
iesire. La fel ca şi comanda LDI, are doi parametri: primul este portul in care se va scrie datele
iar al doilea este registrul-sursă.
IN - (Load an I/O Port to Register) încărcarea datelor din mediul de intrare/ieşire (port ,
timer, regiştri de configurare ,etc) în registrul Rd. Această comandă conţine doi parametri :
registrul in care urmează să fie scrisă informaţia şi portul de pe care se citeşte ea.
RJMP – (Relative Jump) comanda îndeplineşte un salt relativ la o adresă care se află între
limitele ±4 kB de la valoarea instantanee a contorului. În assembler în loc de operatori relativi se
folosesc semnele care şi reprezintă singurul parametru al funcţiei.
SBRC – (Skip if Bit in Register is Cleared) salt peste următoarea instrucţiune dacă bitul b
din registru este Rd este zero. Funcţia are doi parametri: primul este registrul în care se verifică
iar al doilea este numărul pinului din port.
SBRS – (Skip if Bit in Register is Set) la fel ca şi funcţia SBRC dar cu singura diferenţă că
verifică dacă bitul este setat.
CBI – (Clear Bit in I/O Register) ştergerea unui bit din registrul de intrare-ieşire. Parametrul
acestei comenzi sunt: portul la care are loc ştergerea bitului b şi respectiv b.
SBI – (Set Bit in I/O Register) la fel ca şi comanda CBI dar cu o singură diferenţă că verifică
dacă bitul este setat.

Concluzii:
Operatorii condiţionali şi ramificările de program permit crearea de programe mai
complexe, făcînd dispozitivele mai universale.