Sunteți pe pagina 1din 12

L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si

comutatoare

Lucrarea 2 AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM


(ISIS 7): intrări si ieşiri numerice, LED-uri si comutatoare

1. Introducere

Aceasta lucrare are ca scop familiarizarea in continuare cu Proteus VSM folosind ca


„ţintă” simularea unui circuit si al unei aplicaţii software folosind un microcontroler AVR
ATtiny2313. ATENTIE: tutorialul nu este exhaustiv, lăsându-vă si lucruri (simple) de descoperit
singuri!

Schema care va face obiectul implementării este următoarea:

Alimentare Vcc =5V

Masa (Gnd)

Aplicaţia folosită ca exemplu, utilizează un microcontroler ATTINY2313 si va


aprinde/stinge secvenţial câte un LED dintr-un un grup de 8 LED-uri, funcţie si de starea unui
comutator. Configuraţia circuitului va fi una minimală astfel încât nu se utilizează un circuit de
ceas extern (se foloseşte oscilatorul RC calibrat intern). LED-urile sunt conectate prin rezistente

1
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

de limitare a curentului, către masă, urmând să fie aprinse când pinul din portul respectiv este in
„1”.

Schema este „complicată” intenţionat, de exemplu prin conectarea LED-urilor la pini din
porturi diferite, pentru a ilustra câteva tehnici elementare software de manipulare a „biţilor”.

2. Proiectul Proteus VSM (mod de lucru ), realizarea schemei

Se va lansa aplicaţia ISIS 7 care este de fapt editorul de scheme si mediul integrat de
simulare cu : Start -> All Programs -> Proteus 7 Professional -> ISIS 7 sau prin dublu Click pe
Icon-ul de pe desktop. După lansare răspundeţi cu No la cele 2 ferestre interogative (exemple si
terminarea subscripţiei). In meniul File se alege opţiunea New Design si se alege formatul
Default.

2
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

Pagina de lucru care se deschide va fi:

Fereastra de selecţie a zonei de vizualizare

Lista componente curente (disponibile)

spaţiul de lucru

Toolbar-uri (bare de unelte )

3
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

Alegerea componentelor: avem nevoie de un microcontroler AVR ATTINY2313, 8 LED-uri, 8


rezistente de 220Ω, 1 comutator, o rezistenţa de 10KΩ si conexiuni către sursa de alimentare a
microcontrolerului (borna + si masă).

Pentru a alege/încărca componentele (piesele) de care avem nevoie utilizăm butonul Pick
Component (P) sau alegem din meniul Library-> Pick Device/Symbol

Va apare o lista cu toate bibliotecile cunoscute de Proteus VSM. Microcontrolerele si


microprocesoarele sunt in biblioteca „Microprocessor ICs”, organizate pe familii (Category,
categorii), cum ar fi 8051, ARM, AVR, PIC, etc. Se poate uşura căutarea, in toate bibliotecile,
tastând numele componentei sau un cuvânt cheie care apare in acest nume. In cazul de faţa,
puteţi tasta 2313. Apar 2 componente care se potrivesc. Alegeţi ATTINY2313.

4
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

Alegeţi componenta si selectaţi OK. Se va observa cum componenta este adăugată in lista

curentă de componente:

In acelaşi fel se procedează cu toate celelalte componente. LED-urile le găsiţi in biblioteca


„Optoelectronics”, categoria „LEDs” :

Odată componentele plasate in lista curentă ele pot fi reutilizate (luate direct de aici).

5
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

Atenţie, obiectele plasate pe spaţiul de lucru si selectate (Click, simbolul trece in culoarea roşie)
pot fi editate (rotire, oglindire si multe altele), cu Click Dreapta care va deschide un meniu de
editare (vezi L_1_2..).

Pentru LED-uri este preferabil să alegeţi variantele animate (Animated), de culoarea


dorită. Atenţie, aici catodul trebuie legat către masă !

Urmează să alegeţi si sa plasaţi rezistenţele de 220 Ohmi, in manieră similară celei


descrise mai sus. Cel mai simplu in acest caz este sa utilizaţi rezistoare generice: biblioteca
„Resistors”, categoria „Generic”. Valoarea implicită este de 10k si va fi eventual modificată
conform cerinţelor cu un dublu Click pe valoare.

Avem nevoie si conexiuni/terminale către/la borna + a sursei care alimentează si


microcontrolerul si respectiv borna de masă. Pentru a plasa acest tip de conexiune selectaţi
butonul Terminals Mode din toolbar-ul cu unelte din stânga. Alegeţi opţiunea Power.
Similar se procedează dacă avem nevoie de o conexiune către masă. Găsiţi voi opţiunea Ground,
si mai găsiţi cum se pot face vizibile pentru aceste terminale etichete cum ar fi : +5V, POWER,
Ground, etc. De exemplu, după ce aţi selectat opţiunea Power, cu un Click in spaţiul de lucru se
plasează conexiunea către borna + a sursei de tensiune. Atenţie, simbolul este destul de derutant,
seamănă puţin cu unul de masă.

Atenţie: implicit sursa de alimentare a microcontrolerului este una de +5V si ea nu este


vizibilă, la fel ca si bornele de alimentare Vcc –pin20 si GND- pin 10 ale microcontrolerului.

Comutatorul SW1 îl alegeţi din biblioteca „Switches & Relays”, categoria „Switches” si
tipul „SW-SPST-MOM”; este un comutator interactiv, monopolar, cu acţiune momentană (gen
tastă sau push - buton) .

In general pentru a plasa o componentă selectăm butonul Component Mode din


toolbar si apoi o plasăm in spaţiul de lucru cu un singur Click stânga.

După ce aţi plasat si orientat corespunzător piesele in spaţiul de lucru, urmează legarea
lor. Ducând pointerul mouse-ului pe un terminal de componenta, pointer-ul (indicatorul) se
transformă intr-un creion. Asta înseamnă că am trecut in modul de trasare legături (fire intre
componente). Se poate trece in acest mod si folosind din Toolbar (Junction Mode Dot)

ATENTIE: Dacă aţi făcut vreo greşeală de editare dramatică, gen şters 3 componente si 7
fire cu un singur Click, nu uitaţi că puteţi reveni la starea anterioară, dacă apăsaţi imediat
CTRL-Z !

6
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

3. Proiectul AVR Studio/ Win AVR

Urmează “programarea” microcontrolerului.

Se presupune cunoscută utilizarea mediului de programare Avr Studio 4 si a


compilatorului Win AVR pentru a realiza măcar o aplicaţie minimală (vezi L1!).

Deschideţi AVR STUDIO 4 si creaţi un proiect de tip Win AVR (AVR GCC). Atenţie la
setările proiectului!

Se va crea un proiect de tip WinAVR, numit de exemplu blinkyX. Alegeţi platforma de


depanare Debug Platform: „Proteus VSM Viewer” sau AVR Simulator si Device:
ATTiny2313.

Dacă vi se deschide automat sub-fereastra Proteus VSM, închideţi-o cu Click pe x. O să folosim


cu altă ocazie această platformă de depanare.

7
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

Codul C prezentat ca exemplu, unul elementar, va „plimba” un LED aprins sau stins
(funcţie de starea lui SW1), de la L1 către L8 si apoi invers, procesul reluându-se intr-o buclă
infinită. Introduceţi (editaţi) codul sursa următor:

/*------------------------------------------------------------------------
;configuratie hard sistem (conexiuni)
;------------------------------------------------------------------------
;Intrari:
;SW1 - PD2
;Iesiri:
;LED1 - PD4 LED2 - PD5 LED3 - PD6
;LED4 - PB0 LED5 - PB1 LED6 - PB2 LED7 - PB3 LED8 - PB4
*/
// Un blinky mai complicat...
//plimba un LED stanga/dreapta!!
//LED plimbat este aprins/stins, functie de starea lui SW1!!
#include <avr/io.h>
//o functie de intarziere software, care executa doar un NOP
//3.5usec la fosc=4mhz
void wait (void)
{
asm volatile ("nop"::); //volatile pt a nu fi eliminata de compilator!
}

//progr. principal
int main (void)
{
unsigned char i;
unsigned long j;
// initializare porturi
// PD4, PD5, PD6 definiti ca iesiri
DDRD |= ( 1 << DDD4 | 1 << DDD5 | 1 << DDD6);
//pini PB0, PB1,PB2,PB3,PB4 definiti ca iesiri
DDRB |= (1 << DDB0 | 1 << DDB1 | 1 << DDB2 | 1 << DDB3 | 1 << DDB4);
/* iesiri in 1 LED-uri initial aprinse */

8
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

PORTD |= ( 1<<PD4 | 1<<PD5 | 1<<PD6 );


PORTB |= ( 1<<PB0 | 1<<PB1 | 1<<PB2 | 1<<PB3 | 1<<PB4);

//PD2 poate ramane in starea de dupa reset adica definit ca intrare!!

// o bucla fara sfarsit


for(;;)
{
// intai direct, ne plimbam de la L1 la L8
for (i=0x01; i<0x80; i<<=1) // o bucla mai interesanta!
// 8 iteratii la fiecare are loc o deplasare la dreapta a lui i
{ //i contorul de bucla, va plimba LEDul de fapt
asm volatile("nop");
if((PIND & (1 << PD2))) // asa testez daca pinul e in "1"
{ // daca pinul e in "1", adica SW1 ne apasat (deschis, off)
PORTD = ~i<<4; //actualizam stare LED-uri din portul D: 1..3
PORTB = ~i>>3; // actualizam stare LED-uri din portul B: 4..8
}
else // pinul e in "0" deci SW1 apasat (inchis, on)
{
PORTD = i<<4;
PORTB = i>>3;
}
//intarzierea intre 2 deplasari L1->L8
for (j=0; j<30000; j++) wait();
}

//apoi invers de la L8 la L1
for (i=0x80; i>0x01; i>>=1)
{
asm volatile("nop");
if((PIND & (1 << PD2))) // asa testam daca pinul e in "1"
{ //pinul e in "1" SW1 ne apasat (deschis)
PORTD = ~i<<4;
PORTB = ~i>>3;
}
else //pinul e in "0" , SW1 apasat
{
PORTD = i<<4;
PORTB = i>>3;
}
//intarziere intre 2 deplasari L8 ->L1
for (j=0; j<30000; j++) wait();
}
}
}

9
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

Atenţie, in urma compilării si link- editării cu succes a codului sursa (Build, Build sau
Rebuild All) ne va interesa fişierul rezultat de tip (cu extensia) .elf , executable and linkable
file, nu fişierul .hex. In exemplul nostru el se va numi blinkyX.elf si se va găsi in acelaşi
subdirector al proiectului AVR Studio/WinAVR: .../default.

4. Simularea propriu-zisă

Urmează să „încărcăm” programul in simulatorul Proteus VSM (de fapt in memoria de


program a modelului microcontrolerului AVR ATTINY2313): daţi un dublu Click pe
microcontroler si ne apare fereastra de editare componentă pentru el. In fereastra „Edit
Component” a obiectului microcontroler ATTINY2313 avem :

In primul rând mergem la butonul de Browse corespunzător câmpului Program


File, alegem locaţia (directorul) unde AVR Studio a salvat proiectul Win AVR creat anterior si
vom alege fişierul *.elf corespunzător programului nostru (atenţie deci la locaţia unde in AVR
Studio 4 v-aţi salvat proiectul si unde se găsesc fişierele .hex si .elf !!) . Astfel codul maşină dorit
este „programat” in memoria de program a microcontrolerului AVR.
Urmează eventual să configurăm cele câteva fuzibile ale microcontrolerului
corespunzătoare ceasului.
Fuzibilele sunt prezentate de o manieră sintetică: CKSEL (configurarea ceasului sistem)
sunt de fapt 4 fuzibile, iar SUT (timpul de start al oscilatorului) sunt 2 fuzibile.

10
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

Atenţie, CLKDIV8 trebuie să fie neprogramat (Unprogrammed), altfel frecvenţa ceasului


(presupusă de 4 MHz) va fi divizată intern la 8, deci execuţia unei bucle sau secvenţe de
instrucţiuni va dura de 8 ori mai mult.
Fuzibilele CKSEL vor fi configurate pentru (0010) Int RC Osc. 4MHz adică oscilator
RC intern calibrat la 4 MHz. In câmpul al doilea de la Advanced Properties, completaţi
eventual proprietatea Clock Frequency cu 4MHz (nu este obligatoriu pentru aceasta simulare).
Aceasta fiind făcută, validaţi modificările cu OK, iar circuitul este gata pentru simulare.
Desfăşurarea simulării (Pornire-Play, execuţie pas cu pas -Step, pauza -Pause, oprire/
întrerupere -Stop) se controlează cu butoanele situate intr-un toolbar
sub spaţiul de lucru, in partea stânga jos.
In principiu este suficient să apăsaţi pe Play pentru pornirea simulării si să opriţi
simularea cu Stop.
Pe durata simulării in partea de jos a ecranului avem si informaţia de timp propriu
simulării si încărcarea CPU pentru calculatorul gazdă. Atenţie si la eventualele mesaje, utile
când aveţi probleme cu simularea (vizibile cu un Click pe i-ul cu fondul verde).

Comutatorul SW1 se acţionează ca un comutator momentan cu un Click chiar pe


simbolul lui; dacă dorim să-l acţionam ca un comutator permanent facem Click pe simbolul roşu
din dreapta jos . In urma acţionării trebuie să vedem schimbarea stării LED-ului „plimbat”.

11
L 2 - AVR Studio, WinAVR, AVR ATiny 2313, Proteus VSM (ISIS 7): intrări si ieşiri numerice, LED-uri si
comutatoare

Markerii pătraţi indică starea logică (nivelul logic) pentru terminalele respective:
albastru („0”, L) si roşu („1”, H), fie că este vorba de pini ai microcontrolerului sau borne
dispozitive, fiind utili pentru depanarea simulării. De exemplu, putem avea situaţia in care
observăm că starea logică a pinului evoluează corect dar LED-ul nu se aprinde, dacă in loc de o
rezistenţă de 220 Ohmi am pus una de 220KOhmi !
In final, încercaţi să puneţi in evidenţă efectul modificării întârzierii intre două deplasări
succesive ale LED-ului.
Opriţi simularea.
In codul C sursă (proiectul AVR Studio/WinAVR), pentru cele 2 linii:
for (j=0; j<20000; j++) wait(); modificaţi valoarea de 20000 in 100000, si apoi
reconstruiţi aplicaţia (Build, Re Build All)
Porniţi din nou simularea, observând creşterea de 5 ori a întârzierii.

TEMA L2 Modificaţi ambele proiecte (AVR Studio/WinAVR si Proteus VSM) astfel încât să
fiţi capabili să repetaţi o simulare in Proteus VSM in care:
- Cele 8 LED-uri să fie conectate pe pinii microcontrolerului astfel: D1-PB0, D2-PB1, …,
D7-PB6, D8- PB7
- Comutatorul SW1 să fie conectat pe PD0
- Când SW1 este închis (acţionat/apăsat) „plimbă” un LED stins, când SW este deschis (nu
este acţionat/apăsat) „plimbă” un LED aprins

12

S-ar putea să vă placă și