Sunteți pe pagina 1din 20

Laborator Sisteme cu Microprocesoare Integrate

Departamentul de Automatic i Informatic Industrial

Lucrare 3 Utilizarea pinilor I/O

Coninutul lucrrii pe scurt:


Prezentarea componentelor software de comand a pinilor I/O
Prezentarea modulului de interconectarea a unui led la placa
Arduino Uno
Exemplu de joc de lumini

Echipamente necesare lucrrii:


Plac de dezvoltare Arduino Uno sau compatibil
Cablu de conectare USB
Breadboard + fire de interconectare
8 leduri + 8 rezistori 220ohm
1 shift-register pe 8 bii (74HC595 sau TPIC6B595)

Seciuni lucrare:
Configuraia intern a pinilor I/O
Utilizarea software a pinilor I/O
Conectarea unu led la un pin I/O
Proiect joc de lumini (conectare individual)
Proiect joc de lumini (shift-register)
Utilizarea pinilor I/O pentru comand analogic
Proiect joc de lumini (comand analogic)
Referine online

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Configuraia intern a pinilor I/O


Caracteristicile electrice i logice ale pinilor plcii de dezvoltare Arduino Uno sunt preluate de la
microcontrolerul ATmega 328P cu care este echipat placa. Pinii microcontrolerului sunt
conectai direct la conectorii plcii fr alte circuite auxiliare intercalate. Diagrama de mai jos
prezint corespondena ntre pinii microcontrolerului i pinii conectorilor de placa de
dezvoltare.

Pinii plcii de dezvoltare Arduino pot fi configurai sau ca intrri sau ca ieiri. Mai jos este
prezentat structura intern electric a unui pin a microcontrolerului ATmega328P. Implicit
pinii sunt configurai ca intrri deci doar n momentul n care sunt folosii ca ieiri trebui
configurai n mod expres. Din punct de vedere extern pinii se afl implicit ntr-o stare de
impedan mare nefiind vizibili ca ieiri.

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Utilizarea software a pinilor I/O


Mediul Arduino IDE pune la dispoziie trei funcii pentru manipularea pinilor I/O generici:
pinMode(pin, mode) seteaz comportamentul unui anumit pin. Argumentul pin
specific numrul pinului care se configureaz iar argumentul mode poate avea valorile INPUT,
OUTPUT sau INPUT_PULLUP. Valoarea INPUT_PULLUP specific faptul c se activeaz o
rezisten intern de pull-up cu toate c pinul este de intrare pinul nu va fi vizibil ca 1 logic
extern. Aceast funcie mpreun cu funcia digitalWrite() au fost folosite n lucrarea 1 n
exemplul de program Blink pentru a aprinde led-ul aflat pe placa de dezvoltare conectat la pinul
13.
digitalWrite(pin, valoare) seteaz pinul pin pe nivel logic 0 sau 1 n funcie
de parametrul valoare (HIGH sau LOW).
digitalRead (pin) returneaz starea pinului pin: LOW sau HIGH.
Pinii digitali ai plcii de dezvoltare pot fi utilizai i pentru a genera forme de und:
tone(pin, frequency, duration) este o funcie care genereaz pe pinul pin o
form de und dreptunghiular de frecven frequency i de durat duration. Este util n
cazul n care se dorete comanda unui buzzer pentru generarea de frecvene sonore diverse.
Aceast funcie va fi folosit n lucrrile viitoare. Poate fi utilizat doar pe cte un pin.
notone(pin) oprete generarea formei de und dreptunghiulare pe pinul pin.
Mediul de programare IDE Arduino mai pune la dispoziie i alte funcii avansate I/O printre
care i funcii de transmisie serial sincron:
shiftOut(dataPin, clockPin, bitOrder, value) transmite cte un bit din
numrul value pe pinul dataPin sincronizat cu pinul clockPin n ordinea bitOrder
(MSBFIRST sau LSBFIRST). Aceast funcie este o implementare software de transmisie
serial sincron. Funcia transmite doar un octet la fiecare apel. Pentru a transmite structuri de
date mai mari se apeleaz n mod repetat n conjuncie cu deplasri adecvate. Aceast funcie
va fi folosit n lucrare curent pentru ncrcarea strii ledurilor ntr-un registru cu shiftare (al
doilea exemplu al lucrrii).
byte incoming = shiftIn(dataPin, clockPin, bitOrder) ncarc n
variabila pe 8 bii incoming un octet primit serial.
3

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

pulseIn(pin, value, timeout) returneaz durat n microsecunde a unui puls


primit pe pinul pin avnd valoare value (HIGH sau LOW). Variabila timeout este opional
(implicit o secund) i indic timpul de ateptare pentru nceperea pulsului n microsecunde.

Conectarea unui led la un pin I/O

Una dintre cele mai simple modaliti


de utilizare a unui pin I/O este
comanda unui element de tip LED.
Comanda de aprindere se poate da
att pe LOW ct i pe HIGH. Pinul
microcontrolerului va suplini sursa sau
masa n funcie de comanda aleas.
Pentru a putea aprinde un led este
necesar inserarea unui rezistor
pentru limitarea curentului.
n ambele cazuri de comand nu exist probleme la resetul hardware deoarece starea iniial a
pinilor este de impedan mrit. Dac se alege comanda pe HIGH (a unui led sau a unui alt
consumator) trebuie avut n vedere faptul c pinii microcontrolerului ATmega 328P (i implicit
ai plcii Arduino) pot debita un curent de maxim 40mA dar nu mai mult de 200mA per
ansamblu (nu putei utiliza toi pinii la un curent debitat de 40mA simultan). Depirea
curentului maxim debitat va conduce la arderea pinilor I/O ai microcontrolerului.
Calculularea valorii rezistorului se face n funcie de parametrii electrici ai ledului: curentul de
aprindere i tensiunea de alimentare. Inserarea unui rezistor mai mare va scdea intensitatea
de aprindere a ledului, inserarea unui rezistor mai mic va fora ledul la intensitate maxim
sczndu-i durata de via. Un calculator automat pentru alimentarea unui led sau a unei
matrice de leduri se gsete la adresa [1].
Citirea valorii unui rezistor se face pe baza codului de bare colorate nscrise pe rezistor. Benzile
1, 2 i 3 (numai n cazul codului cu 5 bare) reprezint cele mai reprezentative cifre ale valorii,
banda 3 multiplicatorul valorii i banda 4 tolerana. Mai jos avem un tabel cu codul culorilor
pentru rezistori.

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Culoare
Negru
Maro
Rou
Portocaliu
Galben
Verde
Albastru
Violet
Gri
Alb
Auriu
Argintiu
Fr culoare

Banda 1

Banda 2

0
1
2
3
4
5
6
7
8
9

0
1
2
3
4
5
6
7
8
9

Banda 3
X1
X 10
X 100
X 1,000
X 10,000
X 100,000
X 10^6
X 10^7
X 10^8
X 10^9
X 0.1
X 0.01

Banda 4
(toleran)

5%
10%
20%

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Proiect joc de lumini (conectare individual)


Presupunem urmtoarea schem de interconectare a 8 leduri cu placa de dezvoltare Arduino
Uno n mod individual fiecare led este comandat n mod direct de cte un pin al plcii de
dezvoltare (led 1 pin 2, led 2 pin 3. led 8 pin 9):

Dorim s implementm un joc de


lumini cu patru tipare de aprindere.
Selectarea tiparului de aprindere se va
face de ctre utilizator prin intermediul
unui meniu implementat peste
comunicaie serial. Jocul 1 va aprinde
cele opt leduri n mod intermitent
intercalat patru cte patru.
6

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Jocul 2 va aprinde ledurile pe rnd i apoi le va stinge pe rnd (ca un efect de umplere i golire).
Jocul 3 va muta un led aprins de pe poziia 1 pn pe poziia a 8-a iar jocul 4 va aprinde i va
stinge ledurile n mod aleatoriu.
Funcia setup() a programului va trebui s configureze toi cei opt pini utilizai ca fiind pini de
ieire i s seteze viteza de comunicaie serial.
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
Serial.begin(9600);
}

Funcia principal loop() va prelua prin comunicaie serial selecia efectuat de utilizator
(un ntreg ntre 1 i 4) i va rula la infinit jocul de lumini ales prin apelarea funciei
corespondente. Reluarea alegerii jocului de lumini se poate face doar prin resetare hardware a
plcii care va conduce la reiniializarea programului.
void loop() {
int alege = 0;
Serial.println("Joc de lumini");
Serial.println("Alegeti varianta de joc (1-4)");
while (alege<'1' || alege>'4') {
alege = Serial.read();
delay(1000);
}
alege = alege - 48;
Serial.print("Ati ales jocul: ");
Serial.print(alege,DEC);
Serial.println();
Serial.println("Pentru reinitializare apasati
placii");
switch (alege) {
case 1:
joc1();
case 2:
joc2();

butonul

Reset

al

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

case 3:
joc3();
case 4:
joc4();
}
}

Jocul 1 de lumini va aprinde alternativ la un interval de 1 secund ledurile de rang impar i


ledurile de rang par (led 1, led 3, led 5, led 7 led 2, led 4, led 6, led 8).
void joc1() {
while (1) {
for (int i=2; i<10; i++) {
if ((i%2)==0) digitalWrite(i,HIGH);
else digitalWrite(i,LOW);
}
delay(1000);
for (int i=2; i<10; i++) {
if ((i%2)==0) digitalWrite(i,LOW);
else digitalWrite(i,HIGH);
}
delay(1000);
}
}

Jocul 2 de lumini va aprinde unul cte unul (pornind de la led-ul 1 pn la led-ul 8) toate ledurile i apoi le va stinge n mod similar (n ordine invers). Operaia de aprindere sau stingere a
unui led se va efectua la un interval de 500 milisecunde.
void joc2() {
while (1) {
for (int i=2;i<10;i++) {
digitalWrite(i,HIGH);
delay(500); }
for (int i=9;i>1;i--) {
digitalWrite(i,LOW);
delay(500);
}
}
}

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Jocul 3 de lumini va aprinde cte un led pornind de la poziia 1 pn la poziia 8. Mutarea ledului aprins de pe o poziie pe alta se va face la un interval de 100 milisecunde.
void joc3() {
while (1) {
for (int i=2;i<10;i++) {
for (int j=2;j<10;j++) {
if (j==i) {
digitalWrite(i,HIGH);
}
else {
digitalWrite(j,LOW);
}
delay(100);
}
delay(100);
}
}
}

Jocul 4 de lumini va aprinde sau va stinge total aleatoriu cte un led la un interval de 100
milisecunde.
void joc4() {
int pozitie;
int aprins;
while (1) {
pozitie = random(2,10);
aprins = random(0,2);
digitalWrite(pozitie,aprins);
delay(100);
}
}

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Proiect joc de lumini (conectare prin intermediul shift-register)


Cel de al doilea exemplu de interconectare utilizeaz un registru de shiftare pe 8 bii care va fi
utilizat ca un registru cu ncrcare serial. Astfel liniile de comand a ansamblului de 8 leduri va
fi redus de la 8 la 3. Comanda de aprindere a ledurilor nu va mai fi dat de pinii plcii de
dezvoltare ci de liniile de ieire a registrului de shiftare.
Ca registru de shiftare vom utiliza un circuit
74HC595. Liniile de ieire a circuitului care vor
comanda cele 8 leduri sunt prezente pe pinii
15, 1, 2, 3, 4, 5, 6 i 7 ai circuitului (Q0-Q7).
Pinii 8 i 16 ai circuitului vor trebui conectai la
+5V li la mas (Vcc i GND). Pinul 9 este
semnalul de transport utilizat n cazul unei
ncascadri i nu va fi conectat n cazul
montajului nostru. Pinul 14 (DS serial data
input) este linia de ncrcare a registrului i n
cazul nostru va fi conectat la pinul 2 al plcii
de dezvoltare (dataPin). Pinul 13 (/OE
Output Enable) va fi conetat la mas (activat
ntotdeauna). Pinii 11 i 12 (SHCP shift register
clock input, STCP storage register clock input)
vor fi conectai la pinii 3 i 4 ai plcii Arduino
74HC595 [3]
pentru generarea semnalului de ceas (clockPin) i a comenzii de ncrcare (latchPin). Pinul 10
(/MR Master Reset) va fi conectat la Vcc (inactiv). [2]
Un circuit echivalent este circuitul TPIC6B595.
Echivalenele de pini se observ imediat:
DRAINx Qx (linii de comand pentru leduri),
SER IN DS (dataPin), SER OUT Q7S
(neconectat), , SRCK SHCP (clockPin), RCK
STCP (latchPin) /SRCLR - /MR (inactiv
conectat la Vcc), /G - /OE (activat ntotdeana
la mas). Pinii NC ai acestui circuit nu sunt
conectai intern.
Exist dou diferene majore ntre 74HC595 i
TPIC6B595: comanda de aprindere la 74HC595
se d pe 1 logic iar la TPIC6B595 pe 0 logic
(n schema cu TPIC6B595 se va conecta
catodul ledului la pinul de comand); circuitul
TPIC6B595 are o putere mai mare de comand
(150mA/pin) fa de 74HC595 (35mA/pin).

TPIC6B595 [4]

10

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Schem de interconectare bazat pe 74HC595

11

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Schem de interconectare bazat pe TPIC6B595

12

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Programul va conine definirea celor trei pini de comand i comunicaie pentru registrul de
shiftare:
const int latchPin = 4;
const int clockPin = 3;
const int dataPin = 2;

Funcia de iniializare va configura cei trei pini ca ieiri, va seta viteza de comunicaie serial i
va iniializa coninutul registrului cu 0.
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Serial.begin(9600);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 0);
digitalWrite(latchPin, HIGH);
}

Funcia principal nu trebuie modificat fa de exemplul precedent (conectare individual) dar


partea de comand efectiv a ledurilor trebuie adaptat transmiterii prin registrul de shiftare.
Funcia pentru joc 1 de lumini va arta n felul urmtor:
void joc1() {
while (1) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 170);
digitalWrite(latchPin, HIGH);
delay(1000);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 85);
digitalWrite(latchPin, HIGH);
delay(1000);
}
}

Valorile transmise ctre registru sunt echivalente cu starea dorit a celor 8 leduri (170 n binar
10101010 aprins/stins/aprins/stins/aprins/stins/aprins/stins iar 85 n binar 01010101). Pentru
ncrcarea n registru a valorilor se dezactiveaz semnalul de latchPin dup care se utilizeaz
funcia shiftOut pentru a transmite valoarea dorit. Activarea semnalului de latchPin

13

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

conduce la memorarea i transmiterea la ieiri a valorii transmise serial. n mod similar se pot
rescrie i celelalte trei funcii (joc2, joc3, joc4):
void joc2() {
int afisare = 0;
while (1) {
for (int i=0;i<9;i++) {
afisare = afisare + (1<<i);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, afisare);
digitalWrite(latchPin, HIGH);
delay(500);
}
for (int i=8;i>-1;i--) {
afisare = afisare - (1<<i);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, afisare);
digitalWrite(latchPin, HIGH);
delay(500);
}
}
}
void joc3() {
int afisare = 1;
while (1) {
for (int i=0;i<8;i++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, afisare << i);
digitalWrite(latchPin, HIGH);
delay(500);
}
}
}
void joc4() {
int configuratie;
while (1) {
configuratie = random(0,256);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, configuratie);
digitalWrite(latchPin, HIGH);
delay(100);
}
}
14

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Utilizarea pinilor I/O pentru comand analogic


Placa Arduino Uno (versiunea R3, dar si cele precedente) nu detine ca i component
hardware intern un convertor digital analogic (CNA) astfel nu este posibil transformarea unei
valori digitale ntr-o valoare analogic nu putem comanda, de exemplu, intensitatea de
aprindere a unui led din program. Alte modele, Arduino Mega sau Arduino Due, dein CNA
integrat i permit comanda analogic direct pe anumii pini ai plcii de dezvoltare.
Una din posibilitile de a mima o comand analogic utiliznd placa de dezvoltare Arduino
Uno este utilizarea pinilor care permit generarea semnalelor PWM (mai multe despre comanda
de tip PWM se regsesc n lucrarea 10): pinii 3, 5, 6, 9, 10 i 11 ai plcii. Semnalul PWM permite
generarea unui tren de impulsuri 0 / 1 logic care prin variaia factorului de umplere (duty cycle
durata semnalului de 1 logic) conduce la generarea unui semnal similar cu cel analogic din
punct de vedere al consumatorului (genereaz o cantitate de energie electric echivalent cu
semnalul analogic dorit o exemplificare a echivalenei semnal PWM semnal analogic se
poate vedea n imaginea urmtoare). O detaliere a utilizrii semnalului PWM la placa de
dezvoltare Arduino este disponibil la adresa [5].

15

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Pentru generarea unui semnal de tip PWM pe pinii plcii de dezvoltare Arduino se poate utiliza
comanda analogWrite(pin, valoare) unde pin poate lua valoarea 3, 5, 6, 9, 10 sau
11 iar valoare este un ntreg ntre 0 i 255 (0 corespunde unei tensiuni echivalente de 0V iar
255 unei tensiuni echivalente de 5V rezoluia de variaie este de aproximativ 0.0196 V).
Pentru folosirea acestei funcii pinul utilizat trebuie configurat ca pin de ieire
pinMode(pin, OUTPUT).

Generarea semnalului PWM se bazeaz pe utilizarea timer-elor interne ale plcii Arduino
(instrumente care permit msurarea intervalelor de timp), din acest motiv utilizarea simultan a
timer-elor (sau a altor instrumente care i bazeaz funcionarea pe timer-e) i a comenzii PWM
nu este ntotdeauna posibil. Legtura dintre cei ase pini generatori de semnal PWM i cele
trei timer-e interne este urmtoarea: pinii 5 i 6 genereaz semnal PWM bazndu-se pe timerul 0, pinii 9 i 10 pe timer-ul 1 i pinii 11 i 3 pe timer-ul 2. De exemplu, instruciunile delay i
milis (funcii care permit introducerea de ntrzieri n mediul IDE Arduino) utilizeaz timer-ul
intern 0 nu pot fi utilizate dac dorim s generm comand de tip PWM pe pinii 5 sau 6.

Proiect joc de lumini (comand analogic)


Putem utiliza comanda de tip PWM pentru a crea un joc de lumini n care s implicm i efecte
de aprindere / stingere treptat a ledurilor (fade in / fade aut). Din cauza limitrii numrului de
pini pe care putem genera comanda PWM nu putem utiliza opt leduri, ca n exemplele
precedente, ci doar ase. Ledurile vor fi conectate la pinii care permit generarea comenzii
PWM: 3, 5, 6, 9, 10 i 11 (schem de interconectare prezentat mai jos). Interconectarea
ledurilor cu placa de dezvoltare Arduino se va face n mod direct, nu mai exist posibilitatea
utilizrii unui shift-register care ar altera comanda de tip PWM transmis de placa de
dezvoltare.
Vom modifica cele patru jocuri de lumini prezentate anterior astfel nct toate operaiile de
aprindere / stingere a ledurilor s se fac n mod treptat (fade in / fade out). Cele patru funcii
definite anterior vor suferi urmtoarele modificri:

Avnd n vedere faptul c pinii utilizai nu au identificatori la rnd se va utiliza un


vector care va stoca numrul pinilor care sunt utilizai n program permind astfel o
accesare facil:
int leds [] = {3, 5, 6, 9, 10, 11};

astfel iniializarea pinilor va avea forma:


16

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

pinMode(leds[0],
pinMode(leds[1],
pinMode(leds[2],
pinMode(leds[3],
pinMode(leds[4],
pinMode(leds[5],

OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);

Funcia
delay(milisecunde)
va
fi
nlocuit
cu
funcia
_delay_ms(milisecunde) pentru a evita blocarea programului (funcia delay nu
poate fi folosit mpreun cu generarea de semnal PWM pe pinii 5 sau 6). Funcia
_delay_ms necesit includerea header-ului <util/delay.h>.

Comanda de aprindere / stingere a unui led: digitalWrite(pin, LOW / HIGH) va fi nlocuit


de o construcie care s implementeze efectele de fade in / fade out:
o fade in:
for (int j=0; j<250; j+=20)
{ analogWrite(leds[i],j); _delay_ms(50); }

o fade out:
for (int j=240; j>-1; j-=20)
{ analogWrite(leds[i],j); _delay_ms(50); }

Forma final a celor patru funcii de jocuri de lumini va fi urmtoarea:


void joc1() {
while (1) {
for (int i=0; i<6; i+=2)
for (int j=0; j<250; j+=20)
{ analogWrite(leds[i],j); _delay_ms(50); }
_delay_ms(1000);
for (int i=0; i<6; i+=2)
for (int j=240; j>-1; j-=20)
{ analogWrite(leds[i],j); _delay_ms(50); }
_delay_ms(1000);
for (int i=1; i<6; i+=2)
for (int j=0; j<250; j+=20)
{ analogWrite(leds[i],j); _delay_ms(50); }
_delay_ms(1000);
for (int i=1; i<6; i+=2)
17

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

for (int j=240; j>-1; j-=20)


{ analogWrite(leds[i],j); _delay_ms(50); }
_delay_ms(1000);
}
}
void joc2() {
while (1) {
for (int i=0;i<6;i++) {
for (int j=0; j<250; j+=20)
{ analogWrite(leds[i],j); _delay_ms(50); }
_delay_ms(500);
}
for (int i=5;i>-1;i--) {
for (int j=240; j>-1; j-=20)
{ analogWrite(leds[i],j); _delay_ms(50); }
_delay_ms(500);
}
}
}
void joc3() {
while (1) {
for (int i=0;i<6;i++) {
for (int j=0; j<250; j+=20)
{ analogWrite(leds[i],j); _delay_ms(50);};
for (int j=240; j>-1; j-=20)
{ analogWrite(leds[i],j); _delay_ms(50); };
}
_delay_ms(100);
}
}
void joc4() {
int pozitie;
int aprins;
while (1) {
pozitie = random(0,6);
aprins = random(0,2);
if (aprins==0)
{ for (int j=0; j<250; j+=20)
{ analogWrite(leds[pozitie],j); _delay_ms(50); }; }
else
{ for (int j=240; j>-1; j-=20)
{ analogWrite(leds[pozitie],j); _delay_ms(50); }; }
_delay_ms(100);
}
}

18

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Schem de interconectare individual pe pinii PWM

19

Laborator Sisteme cu Microprocesoare Integrate


Departamentul de Automatic i Informatic Industrial

Referine online
[1] LED series/parallel array wizard http://led.linear1.org/led.wiz
[2] Serial to Parallel Shifting-Out with a 74HC595 http://arduino.cc/en/Tutorial/ShiftOut
[3] 74HC595 8-bit serial-in, serial or parallel-out shift register with output latches
http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf
[4] TPIC6B595 POWER LOGIC 8-BIT SHIFT REGISTER
http://www.datasheetcatalog.org/datasheet/texasinstruments/tpic6b595.pdf
[5] Secrets of Arduino PWM http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM

20