luni, 15 noiembrie 2010

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;