luni, 15 noiembrie 2010

Temele Proiectelor de curs 2011


Teme propuse

Temele propuse pentru proiecte de curs: 
  • Comanda motorului Trifazat
  • Stergerea automata a partbrizului
  • Detectarea calitatii drumului
  • Detectare linii de markaj a drumului
  • Aprinderea automata a luminilor de noapte
  • Climatizator (AC) 
  • Detector de distanta pina la obiecte
  • Vitezo-Metru
  • Incalzirea scaunelor
  • Transferul luminilor la faza scurta
    Nota!  Scrieti un comentariu pentru a alege o tema din cele propuse sau veniţi cu idei proprii  (indicati Numele, Prenumele si grupa)

       
Grupa ISBM 081

  1. Arceanis Serghei - "Calculator aritmetic care îndeplineşte operaţia de adunare a două numere".
  2. Bolea Petru - "Proiectarea unui termostat"
  3. Cravcenco Andrei - "Comanda motorului în curent continuu"
  4. Creiţî Pantelei -"Line following Robot"
  5. Eftodi Vasilii
  6. Grama Igor - "Afisor de imagine 16x12"
  7. Gribincea Vadim - "Detectarea nivelului de masurare a luminozitatii"
  8. Gîncu Ghenadi - "Masurarea frecventai de retea"
  9. Jomir Radu
  10. Meleca Alexandru - "Detector de distanta"
  11. Mocanu Gheorghe - "Elaborarea unui Sistem de monitorizare a temperaturii, cu semnalizare"
  12. Nacov Ghenadi - "Aprindere automata a luminelor de noapte"
  13. Petrachi Nadejda - "Voltmetru digital"
  14. Pintea Igor - "Determinarea maximului intr-un sir de numere din memorie si afisarea lor pe un afisor in forma zecimala"
  15. Pleşcan Vadim
  16. Potlog Radu
  17. Sacali Valentina - "Sortarea descrescator a unui sir de numere existente in memorie"
  18. Serbenco Ion - "Ampermetru digital"
  19. Vasiliţa Stanislav - "Ceas electronic"
           Grupa ME 081
  1. Cvasnisin Ion
  2. Ciupac Elena
  3. Cobileanschi Semion - "Semnalizare"
  4. Crainii Dan - "Proiectarea Sistemului de semnalizare a virajului auto"
  5. Dima Maxim
  6. Dumitraş  Stefan
  7. Fedulaev Serghei - "Park Assitant"
  8. Ghetivu Valentin - "Panou de afisare a locurilor intr-o parcare"
  9. Gordienco Sergiu - "Sistema de control unui conditioner" (panel de control pe nr. limitat de pini max 1 pin/1buton)
  10. Guriţanu Eugen - "Reglarea puterii ventilatoarelor a sistemei  de climatizare"
  11. Iachimovschi Serghei
  12. Iacub Artur - "Aprinderea automata a luminii la zgomot (lovitura din palme)"
  13. Lazer Eugen - "Sintezator"
  14. Luchiţa Mihail
  15. Mardari Vladimir - "Lacăt electronic"
  16. Mereuţa Adrian - "Inchiderea automata a ferestrelor usilor"
  17. Munteanu Alexandru - "Cronometru"
  18. Neaga Valeriu - "Radio transmitator"
  19. Percic Lilian - "Indicator Curent si Tensiune pt  un bloc de alimentare"
  20. Prodius Leonid - "Ohmmetru digital"
  21. Raşcu  Vadim - "Sonerie"
  22. Volosciuc Vlad - "Tic-Tac-Toe" (jocul "0" si "x")
  23. Zaporojan Egor 
  24. Birnaz Eugen
        Grupa ME 082
  1. Angan Alexandr - "Detector de Ploaie"
  2. Belevschii Serghei
  3. Bobrişev Mihail
  4. Bondarev Alexandru
  5. Burunducova Maria
  6. Certan Alexandr
  7. Crainii Anatolii - "Pornirea automata a motorului"
  8. Curtev Victor
  9. Lugovoi Boris
  10. Podlesnii Bogdan -"Analizator de semnale digitale"
  11. Serghei Belevschii
  12. Sirbu Alexandr - Comanda motorului „Pas cu Pas”
  13. Tanasoglo Maxim
  14. Vaseachin Vasea

USART

Lucrarea de laborator Nr.7


Tema: Interfaţa serială USART

Scopul lucrării: Stabilirea comunicării prin interfaţa USART între două microcontrollere.

Expunerea problemei: Să  se proiecteze un sistem de comunicare între două controllere în aşa mod ca configuraţia unui port de la intrare să fie motorizată la un alt port de la celalalt controller şi invers. Să se elaboreze un program care va asigura comportamentul simetric al MC.

ADC

Lucararea de laborator Nr.6


Tema: Convertorul analogic-digital (ADC)

Scopul lucrării: Obţinerea cunoştinţelor practice şi deprinderilor de a opera cu convertorul analogic - digital într-un microcontreller din familia AVR.

Expunerea problemei: Să se elaboreze un dispozitiv care în dependenţă de valoarea semnalului Analogic la una din intrările analogice a microcontrollerului să indice nivelul semnalului la un set de 8 leduri, nivelul minimal va aprinde un singur led, iar nivelul maxim va aprinde toate ledurile. La un nivel intermediar se va aprinde un set de leduri corespunzător nivelului  aplicat.

Modulul Timer

Lucrarea de laborator Nr. 5

 

Tema: Modulul periferic Timer

Scopul lucrării: Utilizarea TIMERULUI în rezolvarea problemelor ce ţin de măsurarea timpului, executarea unor acţiuni la anumite intervale de timp.

Expunerea problemei: Să se elaboreze un sistem bazat pe microprocesoare care să afişeze conţinutul unui tablou pe un afişor bazat pe un set de opt afişoare cu şapte segmente. Să se utilizeze Timer 0 pentru a genera semnalul de selecţie a afişorului.

Întreruperea externă

Lucrarea de laborator  Nr. 4 

 

Tema: Întreruperea externă

Scopul lucrării: Obţinerea cunoştinţelor practice şi deprinderilor de a opera întreruperile într-un microcontroller din familia AVR.
Expunerea problemei:  In cadrul acestei lucrări se propune drept sarcină elaborarea  unui dispozitiv de dirijare a unui afişaj cu şapte segmente cu ajutorul butoanelor conectate la portul de intrare. În dependenţă de butonul apăsat să se reprezinte cifra corespunzătoare.

Consideraţii teoretice: O întrerupere reprezintă un semnal sincron sau asincron de la un periferic, ce semnalizează apariţia unui eveniment care trebuie tratat de către procesor. Tratarea întreruperii are ca efect suspendarea firului normal de execuţie al unui program şi lansarea în execuţie a unei rutine de tratare a întreruperii (RTI).

Fig 1. Reprezentarea schematică a mecanismului de prelucrare a întreruperii.

Întreruperile hardware au fost introduse pentru a se elimina buclele pe care un procesor ar trebui sa le facă în aşteptarea unui eveniment de la un periferic. Folosind un sistem de întreruperi, perifericele pot atenţiona procesorul în momentul producerii unei întreruperi (RTI), acesta din urma fiind liber să-şi ruleze programul normal în restul timpului şi să îşi întrerupă execuţia doar atunci când este necesar. Înainte de a lansa în execuţie o RTI, procesorul trebuie să aibă la dispoziţie un mecanism prin care să salveze starea în care se află în momentul apariţiei întreruperii. Aceasta se face prin salvarea într-o memorie, de cele mai multe ori organizată sub forma unei stive, a registrului contor de program (Program Counter), a registrelor de stare precum şi a tuturor variabilelor din program care sunt afectate de execuţia RTI. La sfârşitul execuţiei RTI starea anterioară a registrelor este refăcută şi programul principal este reluat din punctul de unde a fost întrerupt. Pentru a asocia o întrerupere cu o anumită rutină din program, procesorul foloseşte tabela vectorilor de întrerupere (TVI). Fiecărei întreruperi îi este asociată o adresă la care programul va face salt în cazul apariţiei acesteia. Aceste adrese sunt predefinite şi sunt mapate în memoria de program într-un spaţiu continuu care alcătuieşte TVI. Adresele întreruperilor în TVI sunt setate în funcţie de prioritatea lor, cu cât adresa este mai mică cu atât prioritatea este mai mare.

Fig. 2 Algoritmul unei întreruperi

Tratarea unei întreruperi pentru ATMega16, se face ca in figura de mai sus.
Se presupune că programul nostru primeşte întreruperea externă INT0 în timp ce execută instrucţiunea ldi R16,0xFF. După efectuarea instrucţiunii, registrul contor Program Counter (PC) este automat salvat în stivă şi apoi iniţializat la valoare corespunzătoare adresei lui INT0($002). Acest lucru se traduce prin saltul programului de la adresa curentă ($132) la adresa ($002). Aici, programul găseşte instrucţiunea jmp $2FF care-i permite trecerea la rutina efectivă de tratare a întreruperii. La sfîrşitul oricărei RTI trebuie să existe instrucţiunea reti care reface din stiva registrul PC (programul sare înapoi la adresa de unde rămăsese înainte de întrerupere).
Codul pentru execuţie la apariţia unei întreruperi se grupează într-o subrutină similară cu subrutina normală, diferenţa e că ea se termină cu comanda reti, care concomitent setează bitul I din registrul SREG.
Sistemul este conceput în aşa mod ca să cheme automat subrutina de prelucrare a întreruperii în cazul apariţiei ei. Adresa subrutinei se păstrează în vectorul de întreruperi, care este un segment din memoria de programe, fiecare locaţie din el păstrând adresa subrutinei asociate ei, care este accesată automat la apariţia întreruperii respective.
Pentru ca o subrutină să fie accesată sunt necesare următoarele condiţii:
  • efectul de întrerupere;
  • întreruperea trebuie să fie activă în dependenţă de modulul periferic care generează întreruperea (există biţi specializaţi pentru activarea întreruperii de la acest periferic);
  • întreruperea generală trebuie să fie permisă;
Pentru a configura întreruperile se folosesc următorii regiştri:
GICR – General Interrupt Control Register - registrul care este destinat activării sau dezactivării unei anumite întreruperi externe:


GIFR – General Interrupt Flag register – în acest registru se setează biţii în cazul apariţiei unei întreruperi. Dacă biţii sunt setaţi manual, aceasta va porni mecanismul de prelucrare a întreruperii date:

MCUCR – General Interrupt Control Register – registrul care este destinat setării momentului de reacţionare a intreruperii:



Tab.1 Setările biţilor ragistrului MCUCR

Activarea/Dezactivarea întreruperilor:
Întreruperile pot fi activate sau dezactivate de utilizator în program prin setarea individuală a biţilor de interrupt enable pentru fiecare periferic folosit şi prin setarea flagului de “Global Interrupt Enable” (I) din Status Register (SREG).

Mersul lucrării:
1) Pentru a înţelege mai bine cum funcţionează întreruperile, se pune problema scrierii unui program în baza schemei respective, pentru microcontrollerul Atmega16, care va afişa numărul butonului ce va fi apăsat, iar în restul timpului să execute o funcţie anumită de rutină.
Schema bloc a programului:



2) În baza schemei create, se construieşte schema electrică cu ajutorul programului PROTEUS, care la rândul ei va acţiona în baza programului.

Fig. 3 Schema electrică

3) Principiile programei vor fi următoarele: la apăsarea unei taste, aceasta va comunica o cădere de nivel pe pinul de intrare asociat acelui buton şi pe cel al întreruperii externe 0, aceasta din urmă va chema subrutina întreruperii în care se va verifica pe ce pin este nivelul de jos a tensiunii şi va afişa la indicatorul cu 7 segmente numărul butonului asociat acelui pin.
În programul principal va fi mereu incrementat un registru şi se va afişa valoarea sa la alt indicator.
   ...

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 este simularea circuitului creat în PROTEUS, corecţia acestuia în caz de necesitate, în urma căreia ne putem convinge că programul funţionează corect şi că microcontrolerul execută toate comenzile cu exactitate, obţinînd rezultatul dorit.

Descrierea instrucţiunilor utilizate:
LD - încarcă indirect,cu sau fără postincrementare/predecrementare un octet din spaţiul de date într-un registru. Nu modifică nici un flag.
Sitaxa
   Operanzii
   Program counter
LD Rd, Y
      0≤d≤31
   PC←PC+1
LDI R1, K - încarcă în registrul R1 o constantă;
IN R1, PINx - citeşte în registrul R1 datele de intrare de la PINx;
OUT PORTx, R1 - încarcă în registrul de ieşire a potului x datele din registrul R1;
BRNE - Ramificare condiţională relativă. Testează flagul Z (flagul zero) şi dacă nu este setat programul se remifică conform 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ă

Memoria externa

Lucrareade loborator Nr. 3


Tema: Utilizarea memoriei externe

Scopul lucrarii:  Deprinderea metodelor de lucru cu memoria RAM. Studiul principiului de conectare a memoriei interne. Studiul şi principiul de conectare a memoriei externe.
Expunerea problemei: În cadrul acestui laborator ne propunem sa realizăm un program cu ajutorul AVR Studio care ar permite testarea volumului de memorie accesibil la sistem.
Consideraţii teoretice:
Organizarea memoriei.
Tmega 16 AVR are două spaţii de memorie principală, spaţiul pentru Memoria de Date şi pentru Memoria de Program. În plus, ATmega16 are şi o memorie nevolatilă EEPROM  ce oferă posibilitate pentru memorarea datelor. Toate cele trei tipuri de memorie sunt cu adresare liniară. ATmega 16 conţine o memorie flash reprogramabilă (In-system On-chip) de 16 Ko pentru programe. Deoarece toate comenzile pentru AVR sunt de 16 şi 32 biţi, Flash-ul este organizat ca 8Kx16. Pentru securitatea software-ului, spaţiul pentru memoria de programe Flash este împărţit în două secţiuni: secţiunea de program boot şi secţiunea pentru programe de aplicaţie. Memoria Flash suportă cel puţin 10000 de cicluri de scriere/ ştergere. Counter-ul programului de la ATmega 16 (PC) are o lungime de 13 biţi, ceea ce permite adresarea unei memorii de 8*1024 locaţii de 16 biţi.
Organizare specifică a memoriei reprezintă:
  • Bloc (fişier) de registre: Registre interne UCP ce pot fi utilizate pentru memorare temporară, sau pentru funcţii de configurare a unităţilor funcţionale.
  • Memorie de date: memorie volatilă internă sau externă. Memoria internă are o capacitate redusă de stocare. Memoria externă cere hardware suplimentar pentru acces şi transfer date.
  • Memorie de program: Memorie ne-volatilă internă sau externă pentru stocarea codului (ROM, PROM, EPROM, EEPROM, FLASH, NV-RAM)
Fig. 1 Organizarea memoriei

Acces la memorie.
Fiecare tip de memorie adresat separat:
  • Domeniul adreselor pentru diferitele tipuri de memorie pot fi suprapuse;
  • Programatorul specifică tipul memoriei la care se face acces prin utilizarea de moduri de adresare diferite.
Memoria de date SDRAM.
Figura de mai jos arată cum este organizată memoria SDRAM ATmega 16. Primele 96 de locaţii se referă la Fişierul de Registre, şi următoarele 1024 de locaţii sunt dedicate datelor interne SDRAM.
Registrele generale 26, 27, 28, 29, 30, 31 pot fi utilizate cu denumiri specifice:
R26
X octet inferior
R27
X octet superior
R28
Y octet inferior
R29
Y octet superior
R30
Z octet inferior
R31
Z octet superior

Fig.2 Organizarea SDRAM

Memoria de date EEPROM.
ATmega 16 conţine 512 octeţi de memorie de date EEPROM. Este organizată ca spaţiu separat de date, în care pot fi citiţi şi scrişi biţi individuali. EEPROM-ul are o durată de viaţă de cel puţin 10.000 de cicluri scriere/ştergere.
Accesul citire/scriere EEPROM
Regiştrii de acces EEPROM sunt în spaţiul I/O. Biţii 9 – 15 sunt biţi rezervaţi în Atmega 16 şi vor lua întotdeauna valoarea "0". Biţii 0 - 8 sunt biţi de adresa (total 9 biţi, deci se adresează 0.5 KB) Regiştrii de adresă, EEARH şi EEARL – specifică adresa EEPROM pentru cele 512 locaţii ale spaţiului EEPROM.


Fig. 3 Organizarea EEPROM


Locaţiile de memorie se adresează liniar de la 0 la 511. Pentru operaţia de scriere a EEPROM, registrul EEDR conţine date care urmează să fie scrise în EEPROM la adresa dată de registrul EEAR. Pentru operaţia de citire a EEPROM, EEDR conţine date citite de pe EEPROM la adresa data de EEAR. Când se citeşte EEPROM, CPU este oprit timp de patru perioade de ceas înainte ca următoarea comandă să fie executată. Când se scrie EEPROM, CPU este oprit timp de două perioade de ceas înainte ca următoarea comandă sa fie executată.
Utilizarea semnalului ALE.
Principala funcţie a semnalului este de a oferi o informaţie de timp pentru memorarea, într-un latch extern, a octetului inferior de adresă prezent pe port în timpul preluării codului din memoria externă. În acest scop ALE este activat de două ori pe durata fiecărui ciclu de maşină. Activarea are loc chiar şi atunci când ciclul nu presupune preluarea unui cod instrucţiune din memoria de program externă.
Mersul lucrării:
1) Pentru a scrie programul, este nevoie de un algoritm. În cazul dat algoritmul este foarte simplu: Modul de testare a memoriei este bazat pe principiul regăsirii datelor recent înscrise în locaţia dată, efectuând ciclic această operaţie putem detecta volumul de memorie accesibilă. După setările iniţiale ale porturilor şi a bitului SRE din MCUCR, microcontrollerul trebuie ca în ciclul main să verifice toate locaţiile de memorie disponibile. Verificarea se va face în felul următor: se va scrie pe rând în fiecare locaţie „1” şi apoi se va citi informaţia din locaţia respectivă. Dacă ceea ce s-a scris nu va fi egal cu ceea ce s-a citit, se va întrerupe ciclul şi se va începe de la început. Acelaşi lucru se va mai repeta odată, numai că de acum se va scrie „0” în fiecare locaţie şi se va verifica.
Astfel ca urmare a familiarizăii cu scopurile propuse şi formulării unui algoritm de funcţionare, se creează schema bloc a programului:


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 microcontrolerului.


Fig. 4 Schema electrică
3) Scriem programul propriu-zis, conform schemei bloc create.
          ...

4)  Programul se compilează şi se verifică funcţionarea acestuia (executarea) pas cu pas cu scopul de a găsi şi elimina erorile.
5)  Ultimul pas este  simularea circuitul î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:
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ă
LD - încarcă indirect, cu sau fără postincrementare/predecrementare un octet din spaţiul de date într-un registru.
Nu modifică nici un flag.
Sitaxa
  Operanzii
    Program counter
LD Rd, Y
    0≤d≤31
      PC←PC+1
ST - salvează indirect, cu sau fără postincrementare/predecrementare un octet din registru în spaţiul de date.
Nu modifică nici un flag.
Sitaxa
Operanzii
   Program counter
ST Rd, Y    
0≤d≤31
      PC←PC+1

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ă

Porturi I/O

Lucrarea de laborator Nr. 1


Tema: Iniţierea în programa Assembler, porturi  I/O.

    Scopul lucrării: Studiul instrumentelor de proiectare pentru programarea microcontrollerelor (AVR Studio, Proteus) şi să se creeze deprinderea scrierii programei în assembler. Să se studieze iterfaţa de comunicare cu mediul extern, I/O Port.

  Expunerea problemei:
În cadrul acestui laborator se propune să se realizeze un program cu ajutorul AVR Studio care ar permite dirijarea unui led prin intermediul unui buton. Ledul se va aprinde la apăsarea butonului. Simularea acestei instalaţii va fi realizată cu ajutorul programului Proteus 7.1. În cadrul construcţiei se va folosi controllerul Atmega16, ce lucrează pe 8 biţi, care va dirija procesul de aprindere / stingere a ledului la acţiunea butonului.
Consideraţii teoretice:
Arhitectura ATmega16.
ATmega 16 este un microcontroler CMOS de 8 – biţi de mică putere bazat pe arhitectura RISC AVR imbunătăţită.
Dispune de un set de 131 instrucţiuni şi 32 de registre de uz general. Cele 32 de registre sunt direct adresabile de Unitatea Logică Aritmetică (ALU), permiţînd accesarea a două registre independente într-o singură instrucţiune. Se obţine astfel o eficienţă sporită în execuţie (de pină la zece ori mai rapide decît microcontrorellerele conveţionale CISC).
ATmega16 este un microcontroller RISC pe 8 biţi realizat de firma Atmel. Caracteristicile principale ale acestuia sunt:
  • 16KB de memorie Flash reinscriptibilă pentru stocarea programelor;
  • 1KB de memorie RAM;
  • 512B de memorie EEPROM;
  • două numărătoare/temporizatoare de 8 biţi;
  • un numărător/temporizator de 16 biţi;
  • conţine un convertor analog – digital de 10 biţi, cu intrări multiple;
  • conţine un comparator analogic;
  • conţine un modul USART pentru comunicaţie serială (port serial);
  • dispune de un cronometru cu oscilator intern;
  • oferă 32 de linii I/O organizate în patru porturi (PA, PB, PC, PD).
Structura internă generală a controllerului este prezentată în Figura 1. Se poate observa că există o magistrală generală de date la care sunt conectate mai multe module:
  • unitatea aritmetică şi logică (ALU);
  • registrele generale;
  • memoria RAM şi memoria EEPROM;
  • liniile de intrare (porturile – I/O Lines) şi celelalte blocuri de intrare/ieşire. Aceste ultime module sunt controlate de un set special de registre, fiecare modul având asociat un număr de registre specifice.
Diagrama bloc:
Fig. 1. Diagrama generală a MCU
ATmega16 conţine 32 de registre de uz general şi 64 de registre speciale pentru modulele I/O. Aceste registre sunt mapate la adrese din memoria RAM cuprinse între 0000h şi 005Fh.
Descrierea pinilor:
VCC – Sursa de curent
GND – Masa
Port A (PA7 .. PA0)
Port-ul A serveşte drept port de intrări analogice pentru Convertorul A/D. Port-ul A serveşte de asemenea şi ca un port bidirecţional I/O de 8 biţi, în cazul în care Convertorul A/D nu este folosit. Pinii de port pot fi conectaţi opţional la VCC prin rezistori interni, (selectaţi pentru fiecare bit). Buffer-ele de ieşire ale Portului A au caracteristici de amplificare.
Port B (PB7.. PB0)
Portul B este un port I/O de 8 biţi, bidirecţional cu rezistori interni (opţionali). Buffer-ele de ieşire ale Port-ului B au caracteristici de amplificare. Port-ul B îndeplineşte de asemenea funcţii speciale ale microcontrolerului ATmega 16.
Port C (PC7…PC0)
Portul C este un port I/O de 8 biţi, bidirecţional cu rezistori interni (opţionali).Buffer-ele de ieşire ale Port-ului C au caracteristici de amplificare. Dacă interfaţa JTAG (de depanare) este activată , rezistorii pinilor PC5(TDI), PC3(TMS) şi PC2(TCK) vor fi activaţi, chiar dacă are loc o resetare. Port-ul C îndeplineşte de asemenea funcţii ale interfeţei JTAG şi alte funcţii speciale ale ATmega 16.
Port D (PD7…PD0)
Portul D este un port I/O de 8 biţi, bidirecţional cu rezistori interni conectaţi opţional la VCC(selectaţi pentru fiecare bit). Buffer-ele de output ale Port-ului D au caracteristici de amplificare. Port-ul D îndeplineşte de asemenea funcţii speciale ale ATmega 16.
Reset
Un nivel scăzut la acest pin mai mare ca durata decât o valoare prestabilită, va genera o iniţializare.
XTAL 1
Intrare pentru amplificatorul inversor al Oscilatorului.
XTAL 2
Ieşire pentru amplificatorul inversor al Oscilatorului.
AVCC
AVCC este pin de alimentare pentru Port-ul A şi Convertorului A/D. Trebuie conectat extern la Vcc, chiar dacă ADC nu este folosit. Dacă ADC este folosit , ar trebui conectat la Vccprintr-un filtru trece - jos.
AREF
AREF este pinul de referinţă analogică pentru Convertorul A/D.
Porturile I/O
ATmega16 dispune de 32 de linii de I/O grupate în patru porturi de 8 biţi. Porturile sunt denumite cu literele A, B, C şi D. Fiecare pin al oricărui port se poate seta individual ca intrare sau ieşire fără să afecteze ceilalţi pini. In plus, anumiţi pini se pot utiliza pentru funcţii speciale ale microcontrollerului. In Figura 2 este prezentată structura generală a unui pin. Toţi cei 32 de pini au fiecare câte o rezistenţă „pull-up” care poate fi activată sau dezactivată.
Fig.2 Structura generală a unui pin
Operaţiile cu porturile se fac prin intermediul unui set de 3 registre alocate fiecărui port: PORTx, PINx şi DDRx; x poate fi A, B, C sau D. Aceşti regiştri fac parte din categoria regiştri de intrare / ieşire de aceea instrucţiunile care pot lucra direct cu ei sunt CBI, SBI, IN şi OUT.
Regiştrii DDRx stabilesc dacă un pin este intrare sau ieşire. Astfel, un bit cu valoarea „1” în registrul DDRx face ca pinul corespunzător să fie considerat ieşire, altfel pinul va fi intrare.
Regiştrii PORTx sunt utilizaţi pentru a scrie o valoare în portul corespunzător iar regiştrii PINx se folosesc pentru a citi valoarea prezentă pe pinii unui port.
Activarea sau dezactivarea rezistenţelor „pull-up” este determinată de bitul PUD din registrul SFIOR şi de valorile regiştrilor PORTx şi DDRx aşa cum se poate observa în tabelul următor.
Tabelul 1
Toate porturile AVR au funcţia Citeşte – Modifică – Scrie atunci când sunt folosite ca porturi I/O digitale generale. Asta înseamnă ca direcţia unui pin port poate fi schimbată fără a schimba în mod intenţionat direcţia oricărui alt pin cu comenzile SBI şi CBI. Aceeaşi regulă se aplică când se schimbă valoarea driverului (dacă este configurat ca output) sau a activării / dezactivării rezistorilor ( dacă sunt configuraţi ca input). Fiecare buffer de input are caracteristici similare de driver atât cu capacitatea sursei cât şi cu sincronizarea. Driver-ul pinului este îndeajuns de puternic ca să activeze displayul LED direct. Toţi pinii port au rezistori care pot fi selectaţi individual cu o sursă suplimentară de tensiune cu rezistentă invariabilă.
Toţi pinii I/O au diode de protecţie atât la Vcc cât şi la împământare aşa cum este indicat in figura 3.
Toţi regşitrii şi referinţele de bit din aceasta secţiune sunt scrişi în formă generală. Un “x” mic reprezintă litera care denumeşte portul şi un “n” mic reprezintă numărul bitului. Când se utilizează registrul sau biţii intr-un program , trebuie sa fie folosită forma exactă. Adică, PORTB3 pentru bitul numărul 3 în Portul B, prezentat general ca PORTxn.
Trei locaţii de adrese de memorie I/O sunt alocate pentru fiecare port:
  • una pentru fiecare registru de date - PORTx,
  • registrul direcţiei datelor – DDRx,
  • port de intrare – PINx.
Locaţia pinilor port intrare este read only, in timp ce Registru de Date şi DDR sunt read şi write. In plus, bitul PUD (dezactivare pull-up) din SFIOR dezactivează funcţia pull-up pentru toţi pinii din toate porturile când este setat.
Majoritatea pinilor au funcţii alternative pentru caracteristicile periferice ale dispozitivului.
Este de remarcat faptul ca activarea funcţiilor alternante ale unor pini port nu afectează utilizarea altor pini din port ca I/O general digital.
Iniţializarea în AVRStudio:
AVRStudio este un mediu de software dezvoltat de Atmel pentru înscrierea în limbaj de asamblare, compilarea şi simularea de programe destinate microcontrolerelor produse de această companie. Orice program scris în AVRStudio este conţinut într-o structură de tip proiect. Paşii care trebuie urmaţi pentru a crea un proiect nou sunt:
După lansarea programulu apare o fereastră similară cu cea din figură se va alege opţiunea „New Project”:
Figura 3
Figura 4
În acest moment se va afişa o fereastră asemănătoare cu cea din figura 4.  Se bifează opţiunile „Create Initial File” şi „Create Folder”, se completează câmpurile „Project Name” şi „Location” iar apoi se apasă butonul „Next” ;
În fereastra care apare se selectează „AVR Simulator” ca „Debug Platform” , apoi se selectează din listă microcontrolerul „ATMega16” şi în final se apasă butonul „Finish”:
Figura 5. Alegerea tipului de microcontroler
Înainte de a scrie programul propriu-zis, se introduce următoarea linie: .include”m16def.inc”.
Această linie este o directivă de compilare care indică numele fişierului ce conţine descrierea regiştrilor şi caracteristicilor microcontrollerului.
După scrierea programului, se aleg opţiunile „Save Project” şi „Built” din meniul „Project”. Orice erori de sintaxă vor fi semnalate de compilator .Pentru a scrie un nou program, din meniul „Project” se va alege opţiunea „Project Wizard”. După ce se apasă butonul „OK” din fereastra de dialog apărută, se vor repeta paşii prezentaţi mai sus.
Mersul lucrării:
1) Pentru început se pune problema familiarizării cu scopurile propuse, formulând principiul de funcţionarea ledului şi a butonului la apăsare. Ca urmare se creează 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. Apăsarea unei taste va duce la aprinderea LED-ului corespunzător tastei.
Fig. 6 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 ne putem convinge că programul funţionează corect şi că microcontrolerul execută toate comenzile cu exactitate, obţinînd rezultatul dorit.
Descrierea instrucţiunilor utilizate:
  • LD R1, R2 – încarcă datele din registrul R2 în registrul R1;
  • LDI R1, K - încarcă în registrul R1 o constantă;
  • IN R1, PINx – citeşte în registrul R1 datele de intrare de la PIN;
  • OUT PORTx, R1 – încarcă în registrul de ieşire a potului x datele din registrul R1;