Monday 8 November 2010
Proiecte de an orientate spre Automotive Engineering
Proiecte de an orientate spre Automotive Engineering
Tuesday 13 July 2010
Indrumar MP Laborator
Lucrare de laborator Nr. 1
Tema: Iniţierea în programa Assembler, porturi de I/O.
Scopul lucrării:
Să se studieze instrumentele de proiectare pentru programarea microcontrolerelor (AVR Studio, Proteus) şi să se creeze deprinderea scrierii programei în assembler. Să se studieze iterfeţa de comunicare cu mediul extern, I/O Port.
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. 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 vom 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 imbunatăţită.
Dispune de un set de 131 instructiuni si 32 de registre de uz general. Cele 32 de registre sunt direct adresabile de Unitatea Logica Aritmetica (ALU), permitand accesarea a doua registre independente intr-o singura instructiune. Se obtine astfel o eficienta sporita in executie (de pana la zece ori mai rapide decat microcontrorelerele convetionale CISC).
ATmega16 este un microcontroler 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 biti, 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 controlerului este prezentată în Figura 1. Se poate observa că există o magistrală generală de date la care sunt conectate mai multe module:
- unitatea aritmetică si logică (ALU)
- registrele generale
- memoria RAM si memoria EEPROM
- liniile de intrare (porturile – I/O Lines) si celelalte blocuri de intrare/iesire. Aceste ultime module sunt controlate de un set special de registre, fiecare modul având asociat un număr de registre specifice.
Fig. 1 Diagrama generală a MCU
ATmega16 conţine 32 de registre de uz general si 64 de registre speciale pentru modulele I/O. Aceste registre sunt mapate la adrese din memoria RAM cuprinse între 0000h si 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
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) si 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
Reset
Un nivel scăzut la acest pin mai mare ca durata decât o valoare prestabilita, 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 si Convertorului A/D. Trebuie conectat extern
AREF :AREF este pinul de referinţă analogica 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 si 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 microcontrolerului. In Figura 3 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ă.
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 si de valorile regiştrilor PORTx si DDRx aşa cum se poate observa în tabelul următor.
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 schimbata fără a schimbă în mod intenţionat direcţia oricărui alt pin cu comenzile SBI si CBI. Aceeaşi regula se aplica când se schimba valoarea dive-ului (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 drive atât cu capacitatea sursei cât şi cu sincronizarea. Driver-ul pinului este îndeajuns de puternic ca sa activeze displayul LED direct. Toţi pinii port au rezistori care pot fi selectaţi individual cu o sursa suplimentara de tensiune cu rezistentă invariabilă.
Toţi pinii I/O au diode de protecţie atât
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 folosita forma exacta. 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 si DDR sunt read si 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:1)după lansarea programulu apare o fereastră similară cu cea din figura se va alege opţiunea „New Project” :
În acest moment se va afişa o fereastră asemănătoare cu cea din figura 3. Se bifează opţiunile „Create Initial File” şi „Create Folder”, se completează câmpurile „Project Name” şi „Location” iar apoi se apasă butonul „Next”
Î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 microcontrolerului.
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:
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.
Apăsarea unei taste va duce la aprinderea LED-ului corespunzător tastei.
3) Scrierea programului propriu-zis, conform schemei bloc create.
Listingul Programului:
--------------directive de procesare-------------
.include "m16def.inc" ; accesarea bibliotecii ”m16def.inc”
.cseg ; se alege segmentul codului de program
.org 0 ; se seteaza originea programului la la adresa o
.list ; activarea listingului
-------------- partea de iniaţilizare------------------
; setarea portului A ca port de intrare
LDI R16, 0x00 ; incarca in registrul r16 valoarea 0x00
OUT DDRA, R16 ; incarca in registrul DDRA valoarea
; registrului R16
; activarea rezitenţelor „pull-up”
LDI R16, 0xFF ; incarca in registrul r16 valoarea 0xFF
OUT PORTA, R16 ; incarca in registrul PORTA valoarea
; registrului R16
; setarea portului B ca port de iesire
LDI R16, 0xFF ; incarca in registrul r16 valoarea 0xFF
OUT DDRB, R16 ; incarca in registrul DDRB valoarea
; registrului R16
; dezactivarea rezitenţelor „pull-up”
LDI R16, 0x00 ; incarca in registrul r16 valoarea 0x00
OUT PORTB, R16 ; incarca in registrul PORTB valoarea
; registrului R16
---------------------partea de procesare-------------
main: ; eticheta procedurii principale
IN R16, PINA ; incarca in registrul r16 datele de intrare
; din portul A
OUT PORTB, R16 ; incarca in registrul PORTB datele din
; registrul R16
rjmp main ; setează PC la adresa etichetei „main”
4) Compilarea programului, şi verificarea funcţionării sale (executării) pas cu pas cu scopul de a găsi şi elimina erorile.
6) Prezentarea şi 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
OUT PORTx, R1 – încarcă în registrul de ieşire a potului x datele din registrul R1