luni, 15 noiembrie 2010

Operatorii condiţionali

Lucrarea de laborator Nr.2


Tema: Operatorii condiţionali

Scopul lucrării: Studiul principiului de funcţionare şi deprinderea utilizării operatorilor condiţionali.
Expunerea problemei: În cadrul acestui laborator ne propunem sa realizăm un program cu ajutorul AVR Studio care ar permite dirijarea unui led prin intermediul unui buton. Astfel vom conecta un buton la microcontroller dar la ieşire acestuia un LED. La apăsarea butonului LED-ul trebuie sa se aprindă, la deconectarea butonului LED-ul îşi va păstra starea. La următoare apăsarea a butonului LED-ul îşi va schimba starea şi se va stinge. Ciclul se va repeta la fiecare apăsare a butonului.
Consideraţii teoretice:
Sistemul de comenzi ai Assemblerului include comenzile prin intermediul cărora se face posibilă operarea cu regişrii de uz general şi cu cei de intrare/ieşire, iniţializarea şi atribuirea anumitor valori logice pinilor, efectuarea operaţiilor logice şi adresarea spre alte unităţi ale controllerului şi a unităţilor ce sunt verificate de acesta. O comandă Assembler reprezintă o acţiune pe care poate să o îndeplinească un microcontroller. Microcontrollerul AVR are un set de circa 120 comenzi, ce realizează acţiuni diferite, astfel divizându-se în următoarele grupuri:
  • Comenzile cu operaţii logice;
  • Comenzile cu operaţii aritmetice;
  • Comenzile cu biţii şi transferul acestora;
  • Comenzile pentru transfer de date;
  • Comenzile pentru transfer de control;
  • Comenzile pentru controlul sistemului;
Pentru ca un program să fie mult mai eficient şi să aibă proprietatea de a fi utilizat „universal” sau cel puţin să răspundă unor condiţii diferite în mod diferit, se utilizează operatorii condiţionali. Operatorii condiţionali au rolul de a ramifica programul, astfel că dacă sunt satisfăcute anumite condiţii, el să execute sau să nu execute o anumită parte de cod.
Schematic artă aşa:
De asemenea pot fi create cicluri pe baza operatorilor condiţionali, astfel că o parte de cod se execută atîta timp cît este satisfăcută condiţia:
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.
Astfel se execută salturile peste instrucţiunile ce nu trebuiesc îndeplinite în condiţiile anumite sau se mai execută încă odată, astfel obţinînduse ciclurile:

Tab. 1 Operatorii condiţionali













Mersul lucrării:
1)  Pentru început se familiarizează cu scopurile propuse, formulând principiul de funcţionarea ledului şi a butonului la apăsare. Ca urmare creem schema bloc.
2)  Următorul pas este crearea ciruitului în programul de simulare PROTEUS, unde se demonstrează cum funţionează porturile de I/O şi respectiv programul microcontrollerului.
Principiul de lucru a controllerului (programei) va fi următorul: programul va cicla şi  va controla mereu dacă tasta este sau nu apăsată, după care va verifica dacă este sau nu aprins LED-ul şi îl va deconecta sau conecta respectiv, după care va intra în bucla de verificare şi aşteptare ca tasta să nu mai fie apăsată şi iarăşi de la început.
Fig.1. Schema electrică.
3)  Scrierea programului propriu-zis, conform schemei bloc create.
        ...
4) Compilarea programului şi verificarea funcţionării sale (executării) pas cu pas cu scopul de a găsi şi elimina erorile.
5) Ultimul pas e simularea circuitului în PROTEUS, în urma căreia se poate convinge că programul funţionează corect şi că microcontrolerul execută toate comenzile cu exactitate, obţinînd rezultatul dorit.
Descrierea instrucţiunilor utilizate:
SBIC – această instrucţiune testează un singur bit din registrul de intrare/ieşire şi sare peste o comandă dacă bitul nu este setat. Această instrucţiune operează cu primii 32 regiştri din porturile de intrare/ieşire – adresele 0-31. Nu modifică nici un flag.
Sitaxa
Operanzii
Program counter
SBIC A,b
0≤A≤31, 0≤b≤7
PC←PC+1, condiţia e falsă
PC←PC+2, sare o instr. de 1 cuv
PC←PC+3, sare o instr. de 2 cuv
SBIS – această instrucţiune testează un singur bit din registrul de intrare/ieşire şi sare peste o comandă dacă bitul este setat. Această instrucţiune operează cu primii 32 regiştri din porturile de intrare/ieşire – adresele 0-31. Nu modifică nici un flag.

Sitaxa
  Operanzii
   Program counter
SBIS A,b
0≤A≤31, 0≤b≤7
   PC←PC+1, condiţia e falsă
   PC←PC+2, sare o instr. de 1 cuv
   PC←PC+3, sare o instr. de 2 cuv
CPI – această instrucţiune efectuează comparaţia între un registru şi o constantă. Registrul nu suferă modificări. Toate instrucţiunile de ramificări pot fi utilizate după această instrucţiune.
Modifică flagurile: Z, C, N, V, H.

Sitaxa
       Operanzii
   Program counter
CPI Rd, K
      16≤A≤31, 0≤K≤255
        PC←PC+1
 BRNE – Ramificare condiţională relativă. Testează flagul Z (flagul zero) şi dacă nu este setat programul se remifică relativ lui PC în orice direcţie (PC-64≤destinaţia≤PC+63).
Nu modifică nici un flag.
Sitaxa
 Operanzii
                Program counter
BRNE        k
-64≤k≤+63
                 PC←PC+k+1
                 PC←PC+1, dacă condiţia e falsă