Sunteți pe pagina 1din 30

Probleme tip

Orice implementare din curs i din laborator, din seciunea pentru nota 5 i din seciunea opional, constituie
subiect de examen. Implementrile cerute la examen vor fi asemntoare cu cele din curs i laborator.
Pe baza cursului i a laboratorului rezult urmtoarele probleme tip:
T1.
S se proiecteze un microsistem bazat pe procesorul generic din prelegerea 1 (16 adrese, 8 date, RD#, WR#), cu
urmtoarele specificaii iniiale:
x KB ROM implementai cu circuiteC1 mapai ncepnd de la adresa A1 n spaiul extern de date.
y KB SRAM implementai cu circuite C2 mapai ncepnd de la adresa A2 n spaiul extern de date.
z porturi de intrare i/sau ieire implementate cu circuitele C3 i/sau C4 ncepnd de la adresa A3 n
spaiul extern de date.
Exemplele de decodificare se gsesc n prelegerea 1 i 2.
Se cere s se prezinte schema simplificat a microsistemului (ca n prelegerea 1, figura16 i prelegerea 2,
figurile 3 i 4). Pentru decodificatoarele de adres se cere doar forma minim, fr a fi necesar implementarea
cu un anumit tip de pori sau alte dispozitive logice.
T2.
S se emuleze un multipol logic descris conform tabelei de adevr T sau prin intermediul formelor booleene.
Intrrile se citesc prin intermediul a n pini de intrare iar ieirile se genereaz prin intermediul a m pini de ieire.
Implementarea se va face folosind una dintre metodele prezentate n laboratorul 3 i laboratorul 4:
Implementarea SLC-urilor pornind de la forma minim.
Implementare folosind operatori aritmetici, relaionali i logici
Implementarea SLC-urilor prin metoda LUT.
Exemplu particular: s se implementeze un convertor BCD 8421 BCD Gray. Folosii cele 2 metode.
T3.
S se conecteze la un microsistem bazat pe ATmega16 n afioare cu m segmente, varianta nemultiplexat.
Valoarea lui m poate fi 7, 14 sau 16. Un exemplu se gsete n laboratorul 4. Un alt exemplu l constituie
problema particular 35declanator.
T4
Extensie de porturi la ATMega16 conform prelegerii 3.
T5
S se conecteze la un microsistem bazat pe ATmega16 un LCD sau VFD alfanumeric. Organizarea afiorului
este de tip l x c, unde l este numrul de linii iar c este numrul de caractere afiabile per linie. LCD-ul folosit la
laborator are organizarea 2x16. Un exemplu de implementare ct i documentaia LCD se gsete n
laboratoarele 5&6. Documentaia pentru afiorul VFD Noritake se afl n folderul Noritake mpreun cu
problemele particulare.
T6.
Tastatura. Se cere cuplarea unei tastaturi cu organizarea l_linii x c_coloane la un microcontroler ATmega16.
Se cere rescrierea funciei kbscan() pentru o configuraia l_linii i c_coloane particular. Se cere nglobarea
funcionalitii acesteia n diverse scopuri. Exemple pentru tastatur se gsesc n prelegere 4 i n laboratoarele
7 i 8. Se poate cere implementarea funciilor de SHIFT , CAPS LOCK, repetiie ct tasta este apsat.

1
T7.
Maini de stare. Probleme conform modelelor din laboratorul 8 i prelegerea 7.
T8.
Timere. S se programeze timerele 0, 1 i 2 n modurile normal, CTC, fast PWM, capture. Programarea
timerelor poate constituie o problem de sine stttoare sau poate constitui un sub punct al altei probleme.
Exemple particulare sunt aplicaiile Numrare evenimente, PWM led i afior 7 segmente, Ceas digital (2
variante), turometru din prelegerea 5 i aplicaiile ceas din laboratorul 9 i pwm din laboratorul 10.
T9.
ntreruperi. S se programeze sistemul de ntreruperi la ATmega16. Programarea sistemului de ntreruperi va
constitui un sub punct al altei probleme. De exemplu, se cere contorizarea unor impulsuri de durata foarte mic,
de exemplu 1s. Durata mic a impulsurilor face imposibil contorizarea acestora prin metoda pooling plus
dou eantioane succesive din prelegerea 4.
T10.
Afiaj multiplexat. Se cere cuplarea a n afioare de tip 7 segmente sau de tip matriceal la un microsistem
bazat pe microcontrolerul Atmega16. S se proiecteze schema de conectare i softul aferent. Un exemplu de
afior matriceal este circuitul Liteon LTP-1057ae . Un exemplu de afior multiplexat 7 segmente se gsete n
prelegerea 6.
T11.
Protocoale seriale. Un exemplu se gsete in prelegerea 7.

ATENTIE:
Comentariile, indicaiile i sugestiile sunt scrise cu verde deschis. i acest paragraf este scris cu verde deschis.
Tot ce este scris cu verde deschis nu face parte din rezolvare, aa cum ar aprea la examen.

2
1. Tip 1, 8 (ROM-RAM, timer pwm) Problema 40.
I. S se proiecteze un microsistem bazat pe microcontrolerul ATMega162. Schema bloc a
microcontrolerului ce conine latchul de adres este prezentat n figura 1. Microsistemul va conine 32KB de
memorie SRAM implementai cu circuite W24129A. Schema bloc a circuitului W24129A este prezentat n
figura 2 iar descrierea pinilor n figura 3.
W24129A 16Kx8 HIGH-SPEED CMOS STATIC RAM
coreATmega162
ADR[15:0]

DATA[7:0]

RD#

WR#

figura 1

figura 3
figura 2
Cei 32 KB se mapeaz contiguu ncepnd de la adresa 4000h. Se va folosi decodificarea complet.
Se cere schema simplificat a microsistemului (cu magistrale, ca n prelegerea 1) ce conine nucleul
ATmega162, circuitele RAM i blocurile de decodificare. Pentru decodificatoarele de adres se cere doar forma
minim, fr a fi necesar implementarea cu un anumit tip de pori sau alte dispozitive logice. 2 puncte

II. La un microcontroler ATmega16 trebuie conectate opt LED-uri notate L0, L1, , L7 i apte push-
butoane notate B0, B1, , B6. Fiecare push-buton are montat n interior un LED: L0 este montat n interiorul
lui B0, L1 este montat n interiorul lui B1, i L6 este montat n interiorul lui B6. Orice apsarea a unui buton
va produce schimbarea strii LED-ului interior: dac acesta era stins se va aprinde iar dac era aprins se va
stinge. Aceast funcionalitate trebuie implementat pentru toate cele 7 perechi LED push-buton.
Funcionarea unei perechi este independent de funcionarea celorlalte 6 perechi. De exemplu, dac se apas B3
se va schimba numai starea lui L3; starea celorlalte LED-uri va rmne neschimbat. Push-butoanele prezint
instabilitate.
LED-ul L7, cel fr push-buton, va lumina proporional cu numrul de leduri L0-L6 aprinse.
Intensitatea luminoas a lui L7 variaz dup regula:
n
IL7 = IL7 max
7
IL7 este intensitatea curent a ledului L7, IL7max este intensitatea luminoas maxim a ledului L7 iar n este
numrul de leduri L0-L6 aprinse. Intensitatea variabil a lui L7 se va baza pe tehnica PWM. Durata ciclului
timerului trebuie s fie n plaja 10-20ms, ct mai aproape de 10 ms. Frecven ceasului procesor este 5 MHz.
S se prezinte tabelar modul de conectare a ledurilor i a push butoanelor la ATmega16. S se scrie programul
C care controleaz sistemul ce funcioneaz conform descrierii anterioare:
a) Calculele necesare pentru utilizarea timerului. 1 punct
b) Tabelul de conectare a resurselor, gestionarea push-butoanelor i a ledurilor L0-L6 3 puncte
c) Codul pentru gestiunea ledului L7. Punctajul la acest punct se acord numai dac la punctul b) s-a
obinut cel puin jumtate din punctaj. 3 puncte
Atenie: programul trebuie s aib o singur funcie main i o singur bucla principal while(1). Codul care nu
se integreaz n aceast structur nu se puncteaz.
3
I.
Deoarece trebuie mapai 32 KB iar un modul are capacitatea de memorare de 16 KB, rezulta ca sunt necesare 2
module de memorie (32/16=2). Primul modul se va mapa ncepnd cu adresa 4000h.
Numrul de adrese ale modulului de memorie este 13. Tabelul pentru maparea primului modul de memorie este
(se urmrete procedura din prelegerea 1, capitolul 3 - Decodificarea complet (minim) exemplu ):
Adresa procesor ADR(15:0)= 4000h = 0100 0000 0000 0000b
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4000h
. . . . . . . . . . . . . . . . ...
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7fffh
Al doilea modul se mapeaz lipit de primul modul pentru a crea un spaiu de contiguu. Adresa care urmeaz
dup ultima adresa din primul modul este prima adresa din alocat celui de-al doilea modul. Valoarea acesteia
este 7fffh+1=8000h.
Pentru al doilea modul se urmeaz aceeai procedura ca pentru primul modul. Numrul de adrese ale modulului
de memorie este tot 13. Tabelul pentru maparea primului modul de memorie este:
Adresa procesor ADR(15:0)= 8000h = 1000 0000 0000 0000b
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8000h
. . . . . . . . . . . . . . . . ...
1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Bfffh
Schema simplificat a microsistemului:
uP_2

ADR[15:0]
ADR[15:0]
RAM_1 RAM_2
ADR15
ADR14

A[13:0] A[13:0]
DCD

CS2#
A14 CS2

A15 CS1

RD#
RD# CS2#
WR# CS# CS#
WR# RD# RD#
OE# OE#
WR# WR#
DATA[7:0] WE# I/O[8:1] WE# I/O[8:1]

W24129A W24129A

DB[7:0]

Funciile CS1# i CS2# se implementeaz din adresele procesor ADR15 i ADR14, adrese care nu sunt
conectate la pinii de adres ai memoriei. CS1# este 0 logic cnd A[15:14]=01 (vezi primul tabel) iar CS2#
este 0 logic cnd A[15:14]=10. Formele logice pentru aceste funcii sunt:
1# = 15 + 14
2# = 15 + 14
Cele dou funcii sunt implementate n blocul de decodificare DCD din figura de mai sus.

4
II.
Tabelul cu modul de conectare a ledurilor i a push butoanelor:
Push buton Pin pt. push buton LED Pin pt. LED
B0 PC0 L0 PD0
B1 PC1 L1 PD1
B2 PC2 L2 PD2
B3 PC3 L3 PD3
B4 PC4 L4 PD4
B5 PC5 L5 PD5
B6 PC6 L6 PD6
L7 PB3/OC0

n loc de tabel se poate folosi notaia vectorial din prelegerea 1, pagina 16:
B[6:0] PC[6:0], L[6:0] PD[6:0], L7PB3/OC0
Buton apsat nseamn 0 logic pe pinul PC corespunztor iar buton neapsat nseamn 1.
Orice LED L[0..6] se aprinde cu 1 logic pe pinul PD corespunztor i se stinge cu 0.
L7 este controlat PWM.

a. Calculele necesare pentru utilizarea timerului:


Pentru a controla luminozitatea LED-ului L7 vom alege pentru timer modul fast PWM. Pentru modul PWM
plecm de la relaia 3 din prelegerea 5:
f CLK _ CPU 256 p
fCLK_CPU = p*N*fcycle = 256*p* fcycle f cycle = , Tcycle =
256 * p f CLK _ CPU

nlocuim n relaia anterioar pe fCLK_CPU . Pentru p=256 obinem:

256 p 256 256 216 216 3 1 216 216 216 213


Tcycle = = = = 10 = ms = ms = ms = ms = 13.1ms
f CLK _ CPU 5MHz 5 106 Hz 5 103 Hz 5 103 5 2 3 53 2 35 4 54

Pentru p=128 obinem un Tcycle de dou ori mai mic, adic 6,5 ms iar pentru p=1024 obinem un Tcycle de 4 ori
mai mare, adic aproximativ 52 ms. Singura valoare a lui p pentru care Tcycle este n intervalul 10-20 ms este
256.
Vom folosi timerul 0 n mod fast PWM, cu p=256.

b) i c) gestionarea push-butoanelor i a ledurilor

#include <avr/io.h>
#define DELAY 30

int main(){
unsigned char sample_ante = 0xff;
unsigned char sample_now = 0xff;
unsigned char loop_cnt=0;

unsigned char i, val, status =0, mask;

DDRC=0; // portul push butoanelor in mod IN

DDRD=0xff; // portul LED-urilor L[0..6] in mod OUT


PORTD=0; // Stinge toate LED-urile.
DDRB=0xff; // portul LED-ului L7 in mod OUT
5
// Fast PWM
TCCR0=0b01101100;
// clk /256
I/O
// Set OC0 on BOTTOM, Clear on compare.

OCR0=0; // L7 stins

while (1){
//se folosete ca model codul din prelegerea 4, pagina 5
if(loop_cnt== DELAY){
loop_cnt=0;
sample_ante = sample_now;
sample_now = PINC;

val=0;
for(i=0; i<=6; i++){
if( (sample_ante & 1<<i)!=0 && (sample_now & 1<<i)==0){
//daca s-a apasat butonul i, bitul i din val va fi setat.
val |=1<<i;
}
}

//
status ^=val; // inverseaza starea LED-urilor pentru care butonul corespunzator
// s-a apsat
PORTD=status;

i=0;
// numr cte din LED-urile L[0..6] sunt aprinse
for(mask=1; mask<=0b01000000; mask<<=1){
if(status & mask)
i++; //in i se calculeaza numarul de LED-uri L[0..6] aprinse
}

// se calculeaz luminozitatea lui L7 cu regula de 3 simpl:


// 7 LED-uri 255(100%)
// i LED-uri x
// --------------------
// x=255*i/7

OCR0=i*255/7;
}
loop_cnt++;
} //end while 1
return 0;
}

6
2. Tip 2 (funcii logice), Problema 53.
S se proiecteze un microsistem bazat pe microcontrolerul ATmega16 care calculeaz 3 funcii logice ce
depind de 8 variabilele de intrare x0, x1,, x7. Cele 3 funciile logice se definesc astfel:
f 0 = x0 x1 x2 x3 x4 x5 x6 x7
f1 = x0 + x1 x2 + x3 x4 + x5 x6 x7
f2 este 1 cnd numrul de variabile de intrare care au valoarea 1 este mai mare dect numrul de
variabile care au valoarea 0 i 0 n rest.
Variabilele de intrare sunt generate prin intermediul comutatoarelor K0..K7 iar funciile logice sunt afiate prin
intermediul LED-urilor L0, L1 i L2. Cnd o funcie este 1, LED-ul care o afieaz trebuie s fie aprins.
La microcontroler se mai conecteaz LED-ul L3. Intensitatea acestui LED este direct proporional cu
numrul X=x7 x6 x5 x4 x3 x2 x1 x0: dac X=0b00000000 L3 este stins, dac X=0b11111111 L3 lumineaz cu
intensitatea maxima Imax, dac X=128, L3 lumineaz cu jumtate din intensitatea Imax, etc.

Specificaii i cerine obligatorii:


1. Ceasului microcontrolerului se genereaz cu un cristal de 2,5 MHz.
2. Intensitatea LED-ului L3 este controlat folosind tehnica PWM.
3. Valoarea lui Tcycle PWM trebuie s fie n intervalul [10ms, 15ms]
4. Programul trebuie s aib o singur funcie main() i o singur bucla principal while(). Codul care nu se
integreaz n aceast structur nu se puncteaz.

Se cere:
Schema i programul C care controleaz sistemul ce funcioneaz conform descrierii anterioare:
a. Schema microsistemului, ce conine comutatoarelor K0..K7 i LED-urile L0-L3 1 punct.
b. Implementarea functiilor logice: f0 1 punct, f1 2 puncte, f2 1 punct
c. Calculele necesare pentru stabilirea modului de funcionare a timerului, calculul lui Tcycle i iniializarea
timerului. Putei utiliza ce timer dorii. Alegerea i setrile timerului (numrul timerului, modul, p, etc.) se
justific. 2 puncte
d. Setarea intensitii lui L3. 2 puncte

7
Rezolvare:
a) schema este asemntoare cu schema din figura 2, laboratorul 3
IC1
ATMega16-DIP40
L0 R1 470 1 40 X0
2 PB0/(XCK/T0) PA0/(ADC0) 39 K0
3 PB1/(T1) PA1/(ADC1) 38 VCC
L1 R2 470
4 PB2/(INT2/AIN0) PA2/(ADC2) 37
L2 R3 470 5 PB3/(OC0/AIN1) PA3/(ADC3) 36 X1
6 PB4/(SS) PA4/(ADC4) 35 K1
7 PB5/(MOSI) PA5/(ADC5) 34 VCC
L3
8 PB6/(MISO) PA6/(ADC6) 33
PB7/(SCK) PA7/(ADC7) X2
9 K2
RESET VCC
U 10 32 U
VCC 11 VCC AREF 31
Z Z X3
GND GND 30 U K3
12 AVCC VCC
R4
470 13 XTAL2
XTAL1 X4
14 29 K4
15 PD0/(RXD) PC7/(TOSC2) 28 VCC
16 PD1/(TXD) PC6/(TOSC1) 27
17 PD2/(INT0) PC5/(TDI) 26 X5
18 PD3/(INT1) PC4/(TDO) 25 K5
19 PD4/(OC1B) PC3/(TMS) 24 VCC
20 PD5/(OC1A) PC2/(TCK) 23
21 PD6/(ICP) PC1/(SDA) 22 X6
PD7/(OC2) PC0/(SCL) K6 VCC

X7
K7 VCC

c. Calculele necesare pentru utilizarea timerului:


Pentru a controla luminozitatea LED-ului L3 vom alege pentru timer modul fast PWM. Pentru modul PWM
plecm de la relaia 3 din prelegerea 5:
f CLK _ CPU 256 p
fCLK_CPU = p*N*fcycle = 256*p* fcycle f cycle = , Tcycle =
256 * p f CLK _ CPU

nlocuim n relaia anterioar pe fCLK_CPU . Pentru p=256 obinem:

256 p 256 256 216 216 3 1 216 216 214


Tcycle = = = = 10 = ms = ms = ms = 26.2ms
f CLK _ CPU 2,5MHz 2,5 106 Hz 2,5 103 Hz 25 10 2 2 2 54 54

Pentru p=128 obinem un Tcycle de dou ori mai mic, adic 13,1 ms iar pentru p=1024 obinem un Tcycle de 4 ori
mai mare, adic 104,8 ms. Singura valoare a lui p pentru care Tcycle este n intervalul 10-15 ms este 128.
Vom folosi timerul 2 deoarece este singurul timer care are p=128. Timerul 2 va fi folosit n mod PWM.

b, d.
#include <avr/io.h>
int main(){

unsigned char inputs, x0, x1, x2, x3, x4, x5, x6, x7;
unsigned char temp, i, mask, outs;

DDRA=0; // portul comutatoarelor K[0..7] in mod IN

DDRB=0xff; // portul LED-urilor L[0..2] in mod OUT


PORTB=0; // Stinge toate LED-urile.

DDRD=0xff; // portul LED-ului L3 in mod OUT

// Fast PWM
TCCR2=0b01101101;
// clk /128
I/O
// Set OC0 on BOTTOM, Clear on compare.

8
OCR2=0; // L3 stins

while (1){
//se folosete ca model laboratorul 3
inputs =PORTA;
x0= inputs & 1<<0;
x1= inputs >>1 & 1<<0;
x2= inputs >>2 & 1<<0;
x3= inputs >>3 & 1<<0;
x4= inputs >>4 & 1<<0;
x5= inputs >>5 & 1<<0;
x6= inputs >>5 & 1<<0;
x7= inputs >>7 & 1<<0;

outs=0;

// f 0 = x0 x1 x2 x3 x4 x5 x6 x7
if(inputs == 0xff){
outs |=1<<0;
}

// f1 = x0 + x1 x2 + x3 x4 + x5 x6 x7
temp=x0 | (x1 & ~x2) | (x3 & ~x4) | (x5 & ~x6 & ~x7 );
temp &=1;
if(temp){
outs |=1<<1;
}

// f2
for(mask=1; mask<=0b10000000; mask<<=1){
if(inputs & mask)
i++; //in i calculeaza numarul de 1-uri din x
}
}
if(i>4){
outs |=1<<2;
}

PORTB=outs;

// se calculeaz luminozitatea lui L7 cu regula de 3 simpl:


// 255=max(inputs) 255(100%)
// inputs x
// -------------------------
// x= inputs *255/255= inputs
OCR2= inputs;

} //end while 1
return 0;
}

9
3. Tip 3,8 (7segmente, timere), Problema 42
S se proiecteze un microsistem bazat pe microcontrolerul ATmega16 care va controla un zar
electronic. Zarul este prevzut cu un push-buton notat n continuare cu P i 7 LED-uri notate a, b,,g. Push-
butonul este ideal, adic nu prezint instabilitate la apsare sau la eliberare.
Pentru ca rezultatul aruncrii s fie aleator acesta trebuie generat pornind de la un eveniment aleatoriu.
Acest eveniment este timpul ct P este apsat. Ct P este apsat se va incrementa o variabil software. Fie ta
(tast apsat) numele acestei variabile. nainte de apsare ta este iniializat cu zero. Pe durata apsrii
variabila ta este incrementat ct mai repede cu putin. Imediat dup eliberarea lui P incrementarea lui ta se
oprete.
Valoarea lui ta obinut la eliberarea lui P se mparte la
6, se determin restul i n final la rest se adun o
unitate. Restul+1 este rezultatul aruncrii. De exemplu,
dac la eliberarea lui P valoarea variabilei este 60002,
rezultatul aruncrii este 60002 % 6+1=3. figura 4
g b
Zarul electronic funcioneaz dup cum urmeaz: a
f c
1. La apsarea push-butonului zarul ncepe s se
e d
roteasc. Pentru a da senzaia de rotire se afieaz
n continuu succesiunea din figura 4. Rotirea ncepe
ntotdeauna cu configuraia cea mai din dreapta din
figura 4.
2. Ct timp P este apsat, oricare din configuraiile
figura 5
pentru rotire din figura 4 se va afia exact 0,2
secunde.
3. n momentul n care P este eliberat se afieaz rezultatul aruncrii. Rezultatul aruncrii este un numr ntre
1 i 6. Acest numr este afiat ca n figura 5.
Specificaii i cerine obligatorii:
1. Ceasului microcontrolerului se genereaz cu un cristal de 16 MHz.
2. Nu se admit ntrzieri implementate cu bucle soft de tip for(i=0;i<DELAY;i++){}
3. Programul trebuie s aib o singur funcie main() i o singur bucla principal while(). Codul care nu se
integreaz n aceast structur nu se puncteaz.
Implementarea care nu respecta cerinele i specificaiile de mai sus nu se puncteaz.

Se cere:
1. Schema de conectarea al LED-urile a, b, ., g i al push-butoanul P la pinii ATMega16 si configurarea
porturilor. 1 punct
2. Stabilirea modului de funcionare a timerului, calculul lui Tcycle, iniializarea timerului. Putei utiliza ce
timer dorii. Alegerea i setrile timerului (numrul timerului, modul, p, ieirea OC) se justific. Tcycle
trebuie s fie mai mare sau egal cu 5ms. 2 puncte
3. Utilizarea timerului pentru rotire i afiarea rotirii. 3 puncte
4. Gestiunea push-butonului, calcularea i afiarea rezultatului aruncrii. 3 puncte

10
Rezolvare:
1. Schema de conectarea al LED-urile a, b, ., g i al push-butoanul:

Schema de conectare a unui LED este prezentat n laboratorul 3, pagina 5. Schema de conectare a push-
butonului este prezentat n prelegere 4, pagina 1.
Configurarea porturilor: DDRA=0xFF; DDRB=0;
2. Se aplic (sau se deduce) relaia 5 din prelegere 5:
f CLK _ CPU Rel. 1
= kpN
fr
fCLK_CPU=16MHz, Tr=0,2s => fr=1/Tr=1/0,2s=5Hz
f CLK _ CPU 16 10 6 Hz 2 4 2 6 5 6
= kpN , = = 210 55 = 1 210 55 = 5 2 210 5 3
fr 5 Hz 5

Pentru timerele 0 i 1 p este una din valorile =1, 8, 64, 256, 1024. Pentru timerul 0 i 2 N<256 iar pentru
timerul 1 N < 65536.
Putem alege k=1, p=210 =1024, N=55=3125. Deoarece 256 < N < 65536 ar trebui s alegem timerul 1.
Sau putem alege k=52=25, p=210 =1024, N=53=125. Deoarece N < 256 putem alege timerul 0.
Calculam Tcycle n fiecare caz:
Tr
Din prelegere 5, pagina 16: Tr = k Tcycle , Tcycle =
k
Pentru k=1 => Tcycle=0,2s/1=0,2 s = 200ms
Pentru k=25 => Tcycle=0,2s/25 = 8 ms
Vom alege timerul 1 deoarece ofer cel mai mare Tcycle, adic 200ms. n concluzie k=1, p=1024, N=3125
Pentru timerul 1 alegem modul CTC deoarece este singurul mod modulo programabil. Registrele de control i
semnificaia acestora este prezentat n atmega16a.pdf ncepnd de la pagina 109. Pentru modul CTC ales
modul este 0100 ia valoarea top este n OCR1A; ieirile OC nu sunt utilizate. Valorile registrelor sunt:
// CTC Mode
TCCR1B=0b00001101;
// clk /1024
I/O
// CTC Mode
TCCR1A=0b00000000;
OCR1A=3125-1;

11
3,4. Valorile care se vor afia se stocheaz n vectorul dots. n dots[0] se memoreaz configuraia pentru 1, n
dots[1] se memoreaz configuraia pentru 2etc. Valorile pentru rotire se memoreaz n dots[6..9]. Afiarea
punctelor zarului este se face asemntor cu afiarea 7 segmente din laboratorul 4.
Din analiza cerinelor rezult c exist 4 cazuri mutual exclusive:
Aciuni care se execut cnd P este neapsat. Nu exist aciuni n aceast categorie.
Aciuni care se execut cnd P trece din neapsat n apsat, adic pe frontul cobortor. Se reseteaz
ta i timerul 1 i se iniializeaz val (valoarea care se va afia) cu dots[6] (prima configuraie a
rotirii. Detecia frontului cobortor este prezentat n prelegere 4, pagina 2.
Aciuni care se execut cnd P este apsat. Se incrementeaz variabila ta i de fiecare dat cnd
timerul 1 cicleaz, se schimba configuraia pentru rotire.
Aciuni care se execut cnd P trece din apsat n neapsat, adic pe frontul ridictor. Se calculeaz
valoarea care se va afia i se afieaz. Detecia frontului ridictor NU este prezentat dar se face
asemntor cu detecia frontului cobortor. Se testeaz capacitatea de adaptare la situaii noi, dar
asemntoare cu cele ntlnite n prealabil.

#define P 0
int main(){
unsigned char sample_ante = 1, sample_now = 1, val;
unsigned long int ta=0;
//gfedcba
unsigned char dots[]={0b0000001, //1
0b0010010, //2
0b0010011, //3
0b1011010, //4
0b1011011, //5
0b1111110, //6
0b0000010, //I
0b0001000, //II
0b0010000, //III
0b1000000 //IV
};

DDRA=0xff;
DDRB=0;

// CTC Mode
TCCR1B=0b00001101;
// clk /1024
I/O
// CTC Mode
TCCR1A=0b00000000;
OCR1A=3125-1;

while(1){

sample_ante = sample_now;
sample_now = PINB;

//front coborator=apsare: cerinta 3


if( (sample_ante & 1<<P)==1 && (sample_now & 1<<P)==0 ){
ta=0;
TCNT1=0;
val=6;
}

//push butonul P apasat: cerinta 3


else if ( (PINB&1)=0 ){
ta++;

12
PORTA=dots[val];
if(TIFR & 1<< OCF1A){
TIFR |= 1<< OCF1A;
val++;
if(val == 10)
val=6;
}
}

//front ridicator = eliberare. Cerinta 4


else if ((sample_ante & 1<<P)==1 && (sample_now & 1<<P)==0) {
val = ta%6;
PORTA = dots[val];
}

}//end while
}//end main

13
4. Tip 4 (extensie porturi), Problema 64.
S se proiecteze un microsistem bazat pe microcontrolerul ATMega16 care controleaz o ghirland luminoas
cu urmtoarele specificaii:
U1 M
D D Q Q
D1 D Q
CLK
L_LED
FD CLK
Vcc
VCC GND
Vcc GND
figura 8
figura 7

figura 6
a. Ghirlanda este alctuit din 64 LED-uri. Acestea vor lumina ca n figura 6 (numrtor Johnson). n figur pe
vertical s-a figurat timpul. La momentul t0 nu este nici un LED aprins. Apoi LED-urile se aprind unul cte
unul, la rnd, pn cnd sunt aprinse toate: la momentul t1 se aprinde L1, la t2 sunt aprinse L1 i L2, etc. La
t64 sunt aprinse toate. n continuare LED-urile se sting pe rnd pn cnd la t127 este aprins numai L64.
Urmtoarea configuraie, la t128, are toate LED-urile stinse i este identic cu configuraia de la t0. Secven
t0-t127 se repet la nesfrit.
b. Fiecare configuraie din figura 6 este meninut o perioad de timp de 0,1 secunde.
c. Oricare LED al ghirlandei este controlat de un bistabil D comutabil pe front ridictor. Bistabilul D i
LED-ul sunt conectate ca n figura 7. Schema din figura 7 este implementat pe un circuit (cablaj) i
formeaz un modul independent numit n continuare modul M (figura 8). Ghirlanda este alctuit din 64 de
module M interconectate astfel nct sa formeze un registru de deplasare.
d. Se garanteaz c la punerea sub tensiune toate bistabilele sunt n starea 0.
Specificaii i cerine obligatorii:
1. Ceasului microcontrolerului se genereaz cu un cristal de 8 MHz.
2. Tcycle este obligatoriu 0,1s.
3. Nu se admit ntrzieri implementate cu bucle soft de tip for(i=0;i<DELAY;i++){}
4. Programul trebuie s aib o singur funcie main(), o singur bucla principal while() i ISR-uri (dac este
cazul). Codul care nu respect aceast structur nu se puncteaz.

Se cere:
1. Schema microsistemului format din microcontrolerul ATMega16, la care se conecteaz modulele M. Se vor
figura doar primul modul, al doilea modul, penultimul i ultimul modul. Restul modulelor se vor figura cu
(puncte). Pe schem modulele se vor reprezenta prin intermediul schemei bloc din figura 8. 2 puncte
Atenie: dac n loc de schema bloc se folosete schema detaliat sau dac se deseneaz mai mult de 4
module M, nu se acord punctajul.
2. Stabilirea modului de funcionare a timerului. Putei utiliza ce timer dorii. Alegerea i setrile timerului
(numrul timerului, modul, p, eventual ieirea OC) se justific. Implementarea fr justificare sau care
nu respect condiia asupra lui Tcycle nu se puncteaz. 2 puncte
3. Programul C pentru ATMega16:
1. Setri porturi, iniializarea timerului 1 punct
2. Controlul LED-urilor conform figurii 1. 4 puncte

14
Rezolvare:
1. registrele de deplasare sunt tratate n cursul de BLPC (LDDC)
(http://www.cs.ucv.ro/staff/edumitrascu/DSD/LD2_05.pdf)
IC1
ATMega16-DIP40
1 40
2 PB0/(XCK/T0) PA0/(ADC0) 39
3 PB1/(T1) PA1/(ADC1) 38
4 PB2/(INT2/AIN0) PA2/(ADC2) 37
5 PB3/(OC0/AIN1) PA3/(ADC3) 36
6 PB4/(SS) PA4/(ADC4) 35
7 PB5/(MOSI) PA5/(ADC5) 34
8 PB6/(MISO) PA6/(ADC6) 33
PB7/(SCK) PA7/(ADC7)
9
RESET
10 32
11 VCC AREF 31
GND GND 30
12 AVCC
13 XTAL2 M1 M2 M63 M64
XTAL1 SD
14 29 D Q D Q D Q D Q
15 PD0/(RXD) PC7/(TOSC2) 28 CP
16 PD1/(TXD) PC6/(TOSC1) 27 CLK CLK CLK CLK
17 PD2/(INT0) PC5/(TDI) 26
18 PD3/(INT1) PC4/(TDO) 25 Vcc GND Vcc GND Vcc GND Vcc GND
19 PD4/(OC1B) PC3/(TMS) 24
20 PD5/(OC1A) PC2/(TCK) 23 CP
21 PD6/(ICP) PC1/(SDA) 22
PD7/(OC2) PC0/(SCL)

0
VCC

2.
tim c
Tcycle=0.1 s fCLK_CPU=8MHz T=1/f
Aplicm relaia 2 din prelegere 5:
Tcycle = p * N * TCLK_CPU
Tcycle f CLK _ CPU = pN
Tcycle f CLK _ CPU = 0,1s 8MHz = 101 s 8 106 Hz = 8 105 = pN 232555 = pN 2855 = pN

p este evident 28 iar N=55=3125. Deoarece N=3125>255, vom folosi timerul 1.


n concluzie vom folosi timerul 1 n mod CTC cu p=256 i N=3125.

3.
#include <avr/io.h>

#define clrbit(var,bit) var &= ~(1<<bit)


#define setbit(var,bit) var |= 1<<bit

#define SD 7
#define CP 6
#define N 64

int main(){
unsigned char i;
//3.1
// data serial (SD)pe PC7 iar ceasul de serializare (CP) pe PC6
// soluia este aproape identic cu exemplul din prelegerea 3, capitolul
// Extensie de porturi de ieire cu registre serie-paralel, pagina 11
PORTC=0;
DDRC=0xFF;

15
// CTC Mode
TCCR1B=0b00001100;
// clk /256
I/O
// CTC Mode
TCCR1A=0b00000000;

OCR1A = 3125-1;

//3.2
while(1){
for(i=1;i<=2*N;i++){
while((TIFR & 1<<OCF1A)==0){}
TIFR |= 1<<OCF1A;

//genereaza bitul i
// n exemplul amintit anterior se trimiteau biii variabilei data.
// Acum se trimit 64 de 1 urmai de 64 de 0
if(i<=N)
setbit(PORTC, SD);
else
clrbit(PORTC, SD);

//genereaza puls CP
setbit(PORTC, CP);
clrbit(PORTC, CP);
}
}//end while 1
return 0;
}

16
5. Tip 6, 9, 11 (tastatur, intreruperi, protocol), Problema 48.
S se proiecteze un microsistem bazat pe microcontrolerul ATmega16 care va ndeplini funcia de
controler de tastatur. Microcontrolerul va genera codului tastei apsate i va transmite n exterior acest cod
serial. Matricea de taste din care este alctuit tastatura este prezentat n figura 9. Schema bloc a tastaturii este
prezentat n figura 10.
VCC VCC VCC VCC VCC
Codul tastei este chiar indexul
tastei, adic este codul de
KB5L5C
scanare:
T0 T1 T2 T3 T4
c4c3c2c1c0
L0
T5 T6 T7 T8 T9
L0
T0 0 0 0 0 0
L1 T1 0 0 0 0 1
L1
T10 T11 T12 T13 T14
L2 T2 0 0 0 1 0
L3 T3 0 0 0 1 1
L2

C0

C1

C2

C3

C4
L4
T15 T16 T17 T18 T19
T23 1 0 1 1 1
<Value>
L3
T20 T21 T22 T23 T24
T24 1 1 0 0 0

L4 figura 10 c4 este MSb iar c0 este LSb.

C0 C1 C2 C3 C4

figura 9
Biii c4c3c2c1c0 se vor emite serial prin intermediul unui pin IO. Semnalul generat prin intermediul acestui pin se
numete Data. Emisia serial ncepe cu c0 i se termin cu c4. Fiecrui bit i corespunde un puls cu durata de
100s. Factorul de umplere este 80% pentru un bit de 1 i 20% pentru un bit de 0. Cnd nu este nimic de
transmis linia Data este 0. Ca exemplu, n figura urmtoare este prezentat timingul emisiei codului 11001:
1 0 0 1 1
80uS 20 uS
Data
100uS 100uS
figura 11
Specificaii i cerine obligatorii:
1. Durata instabilitii pentru pushbuton mai mica de 10ms.
2. Ceasului microcontrolerului se genereaz cu un cristal de 16 MHz.
3. Nu se admit ntrzieri implementate cu bucle soft.
4. Programul trebuie s aib o singur funcie main() i o singur bucla principal while(). Codul care nu se
integreaz n aceast structur nu se puncteaz.
Implementarea care nu respecta cerinele de mai sus nu se puncteaz.

Se cere:
a. Se cere schema simplificat a microsistemului format din microcontrolerul ATMega16, tastatura KB5L5C
i semnalul Data. Pe schem tastatur se va reprezenta ca n figura 10. 1 punct
b. S se scrie funcia care face scanarea tastaturii i ntoarce codului tastei. Aceast funcie se va numi
kbscan5x5(). Pentru funcie + secvena de iniializare 3 puncte
c. Calculele necesare pentru stabilirea modului de funcionare a timerului, iniializarea timerului i utilizarea
timerului. Putei utiliza ce timer dorii. Alegerea i setrile timerului (numrul timerului, modul, p, N) se
justific. 2 puncte
d. Detecia apsrii unei taste i emisia conform protocolului serial specificat anterior. 3 puncte

17
Rezolvare:
KB5L5C
a. n figura alturat este prezentat schema
simplificat a microsistemului. L0

L1
Schema este asemntoare cu schema de
L2
cuplare a tastaturii din laboratorul 7, figura 4. Spre
L3
deosebire de laboratorul 7, acum avem de cuplat

C0

C1

C2

C3

C4
L4
10 semnale: 5 linii i 5 coloane. Cum un port are 8
biii rezult ca este nevoie de cel puin dou IC1
<Value>
ATMega16-DIP40
porturi. 1 40
2 PB0/(XCK/T0) PA0/(ADC0) 39
3 PB1/(T1) PA1/(ADC1) 38
Deoarece n enunul problemei nu exist 4 PB2/(INT2/AIN0) PA2/(ADC2) 37
5 PB3/(OC0/AIN1) PA3/(ADC3) 36
nici o restricie privitor la utilizarea porturilor, cel 6 PB4/(SS) PA4/(ADC4) 35
7 PB5/(MOSI) PA5/(ADC5) 34
mai simplu este s folosim un port pentru linii i 8 PB6/(MISO)
PB7/(SCK)
PA6/(ADC6)
PA7/(ADC7)
33

un port pentru coloane. 9


RESET
10 32
Vom folosi biii PB4-PB0 pentru linii i 11 VCC
GND
AREF
GND
31
30
PA4-PA0 pentru coloane. 12
XTAL2
AVCC
13
XTAL1
14 29
DATA 15 PD0/(RXD) PC7/(TOSC2) 28
16 PD1/(TXD) PC6/(TOSC1) 27
17 PD2/(INT0) PC5/(TDI) 26
18 PD3/(INT1) PC4/(TDO) 25
19 PD4/(OC1B) PC3/(TMS) 24
20 PD5/(OC1A) PC2/(TCK) 23
21 PD6/(ICP) PC1/(SDA) 22
PD7/(OC2) PC0/(SCL)

Funcia kbscan5x5() este foarte asemntoare cu kbscan() implement n laboratorul 7. n continuare este
prezentat o varianta de implementare, dar orice implementare care funcioneaz se puncteaz:
b.
#define nop asm("nop"::);

unsigned char kbscan5x5(){


unsigned char cols, temp, la, ca;

for(DDRB=1; DDRB<=0b10000; DDRB<<=1){


nop; nop; nop; nop; nop; nop;
cols =~PINA;
cols &= 0x1f;
if(cols){
break;
}
}

if(cols == 0)
return 0x7f;

la=0;
temp=DDRB;
while((temp&1) == 0){
la++;
temp>>=1;
}

ca=0;
while((cols&1) == 0){
ca++;
cols>>=1;
}

return la*5+ca;
}

18
c. Durata necesara pentru transmiterea unui bit este 100 us. Aceast durat se va numi n continuare celul. La
nceputul oricrei celule semnalul Data va primi valoarea 1. Dup 20 us pentru un bit 0 sau dup 80 us
pentru un bit 1 Data va deveni 0. Indiferent de bit trebuie atept s treac 100 us pentru a transmite
urmtorul bit. Cel mai mare divizor comun a lui 20, 80 i 100 us este 20 us. Aceasta este rezoluia minim a
timerului. n concluzie Tr din prelegerea 5 este 20 us.
Pentru aplicaiile de tip ceas se aplic relaia 4 din prelegerea 5. Transmisia unui cod se bazeaz pe un ceas de
tip 20 us 5 5. Un ceas obinuit este de tip 1s 60 60.
Conform relaiei 4 din prelegerea 5 avem Tr=kTcycle iar conform relaiei 2 avem Tcycle = p * N * TCLK_CPU. Din
cele dou relaii rezult:
Tr = k * p * N * TCLK_CPU
Dup cum s-a explicat n prelegerea 5 se dorete cel mai mic k posibil, adic k=1.
Pentru Tr=20us i TCLK_CPU =1/16MHz avem:
Tr = k * p * N * TCLK_CPU , T=1/f => Tr * fCLK_CPU = k * p * N , 20us *16MHz =k*p*N,
20 10-6 *16 106 = k*p*N, 20*16 =k * p * N,
Pentru timerele 0 i 1 prescalerul p poate fi 1, 8, 64, 256, 1024
20*16 = 8*40 = k * p * N => k=1, p=8, N=40
Vom folosi timerul 0 n mod CTC, cu prescaler 8 iar N va fi nscris n registrul OCR0:
// CTC mode
TCCR0=0b00001010;
// P=8
// Normal port operation, OC0 disconnected.
OCR0=40-1; // N=40

d. La nceputul prelegerii 6 s-au explicat noiunile de eveniment urgent i timp de rspuns. Revedei aceste
noiuni!
Respectarea ct mai exact a timingului din figura 11 este esenial n aplicaiile de transmisii de date.
Dac durata unui bit de 0 crete mult peste 20 us sau durata unui bit de 1 scade mult sub 80 us, exist
posibilitatea ca celulele s fie interpretate greit.
Semnalul Data va primi valoarea 0 sau 1 atunci cnd cicleaz timerul 0. Ciclarea timerului este
evenimentul urgent. Pentru ca ntre momentul n care timerul cicleaz i momentul n care semnalul data
primete o nou valoare s treac ct mai puin timp, ciclarea timerului se va trata prin mecanismul de
ntreruperi. Un exemplu de transmisie serial se gsete n prelegerea 7, capitolul Emitorul PS/2.
Codul pentru preluarea unei taste i transmisia sa seriala este prezentat n continuare:
#include <avr/interrupt.h>
#include <avr/io.h>

#define DELAY 10

volatile unsigned char t20=0;


volatile unsigned char kbhit=0, kbcode, mask;

int main(){
unsigned char sample_ante = 1;
unsigned char sample_now = 1;
unsigned char loop_cnt=0;

PORTB=0; //coloane
DDRA=0; // linii
19
DDRD =1; // semnalul data
PORTD=0;

TCCR0 = 0b00001010;
OCR0 = 40-1;
sei();

while(1){ //bucla principala


if(loop_cnt >= DELAY){
loop_cnt=0;
sample_ante = sample_now;
sample_now = kbscan5x5();

if( sample_ante == 0x7f && sample_now !=0x7f){


kbhit=1;
kbcode=sample_now;
//pana aici citirea unei taste este la fel ca n prelegerea 4, pagina 10

// mask selecteaz bitul din cod care se va transmite.


// primul bit care se transmite este c0, pentru c0 mask este 0b00001
// pentru c1 mask se deplaseaza stanga si devine ob00010, .a.m.d.
mask=1;

//t20 numr intervalele de 20 us.


//Este nevoie de 5 intervale pentru a transmite un bit.
t20=0;

// Timerul numr permanent, dar tastele se apas rar, cel mult 10 pe secund.
// Cnd se detecteaz o noua apsare OCF0 este sigur 1.
// Pentru ca primul interval de 20 us sa fie ntreg, trebuie ca sa resetm OCF0
TIFR|=1<<OCIE0;

// demascm ntreruperea de la timer doar cnd este ceva de transmis.


TIMSK |= 1<<OCIE0;
}
}
loop_cnt++;
}//end while(1)
}

ISR(TIMER0_COMP_vect){
if(t20==0)
PORTD=1;
else if(t20==1 && ((kbcode & mask)==0))
PORTD=0;
else if(t20==4)
PORTD=0;

t20++;
if(t20==5){

//au trecut 5 intervale de 20 us


t20=0;
mask<<=1;
if(mask==0b100000){

// s-a transmis tot codul. Mascheaz IRQ de la timer pentru ca nu mai avem
// nimic de transmis
TIMSK &= ~(1<<OCIE0);

// de fapt nu este nevoie de kbhit, dar a fost pstrat ca implementarea


// s semene cu cea din curs
kbhit=0;
}
}
}

20
6. Tip 7, 8 (maini de stare, timere pwm), Problema 68.
S se proiecteze un microsistem cu ATMega16 care controleaz ua automat din figura urmtoare:
Ua este prevzut cu:
SP (senzor prezen). Ofer la ieire un semnal
care este 1 cnd n fa uii sau n dreptul uii
se afl o persoan.
SD (senzor deschis) i SI (senzor nchis) sunt
doi senzori magnetici. Senzorul magnetic ofer
la ieire un semnal care este 1 cnd n dreptul
senzorului se afl un magnet.
Magnetul T este lipit de colul uii, ca n figur.
Cnd ua este deschis la maxim, T se afl n
dreptul senzorului SD. Cnd ua este nchis, T
se afl n dreptul senzorului SI.
Motorul M mic ua stnga-dreapt cu dou
viteze. Viteza motorului este controlat PWM de
semnalul MV (motor vitez). Factorul de umplere (FU) al lui MV controleaz viteza motorului astfel : dac
FU(MV) = 100% motorul mic ua cu vitez mare, dac FU(MV)= 10% motorul mic ua cu vitez
mica iar dac FU(MV)=0% motorul este oprit. Motorul mai primete i semnalul de comand MS (motor
sens). Dac MS= 0 motorul mic ua astfel nct aceasta s se nchid iar dac MS= 1 motorul mic
ua astfel nct aceasta s se deschid.
Ua va funciona dup cum urmeaz:
P1. n mod normal ua este nchis. Cnd ua este nchis semnalul de la senzorul SI este 1.
P2. Dac senzorul SP detecteaz o persoan, ua ncepe s se deschid cu vitez mare. Micarea cu vitez mare
dureaz 4 secunde.
P3. n continuare ua se mic cu vitez mic pn se deschide la maxim, adic pn cnd semnalul de la
senzorul SD devine 1.
P4. Ua rmne deschis la maxim pn cnd semnalul de la senzorul SP devine 0, adic nu mai este nimeni
n dreptul uii. n continuare ua mai rmne deschis nc 5 secunde.
P5. Apoi ua ncepe s se nchid cu vitez mare. Micarea cu vitez mare dureaz 4 secunde.
P6. n final ua se mic cu vitez mic pn se nchide, adic pn cnd semnalul de la senzorul SI este 1.
P7. Dac n procesul de nchidere a uii semnalul de la SP devine 1, sari la P3.
P8. La punerea sub tensiune ua se va nchide cu vitez mic pn cnd SI=1.
Specificaii i cerine obligatorii:
1. Ceasului microcontrolerului se genereaz cu un cristal de 2,048 MHz (sau 3MHZ).
2. Nu se admite gestiunea timpului cu bucle soft de tip for(i=0;i<DELAY;i++){}
3. Se va utiliza un singur timer/counter.
4. Tcycle [8 ms, 12 ms]
5. Cnd ua este nchis sau deschis la maxim este obligatoriu ca FU(MV)=0%.
6. Programul trebuie s aib o singur funcie main(), o singur bucla principal while() i ISR-uri (dac este
cazul). Codul care nu respect aceast structur nu se puncteaz.
Se cere:
1. S se precizeze pe ce pin al microcontrolerului se conecteaz fiecare semnal. Dac aceast cerin nu este
ndeplinit, nu se acord punctaj la c).
2. Stabilirea modului de funcionare a timerului i calculul lui Tcycle. Putei utiliza ce timer dorii. Alegerea i
setrile timerului (numrul timerului, modul, p, eventual valoarea OCR, eventual ieirea OC) se justific.
Implementarea fr justificare sau care nu respect condiia asupra lui Tcycle nu se puncteaz. 2
puncte
3. Programul C pentru ATMega16:
a. Setarea porturilor i a timerului. 1 punct
b. Maina de stare. 4 puncte
c. Gestiunea timpului. 2 puncte

21
Rezolvare:
1. SP PA0, SI PA1, SD PA2, MVPB3/OC0, MS PB0
2. Rezolvm varianta cu fCLK_CPU = 2,048MHz.
Pentru a controla viteaza motorului prin tehnica PWM, vom alege pentru timer modul fast PWM.
Pentru modul PWM plecm de la relaia 3 din prelegerea 5:
f CLK _ CPU
fCLK_CPU = p*N*fcycle = 256*p* fcycle p=
256 * f cycle

Deoarece se impune Tcycle [8 ms, 12 ms], ncercm un Tcycle la mijlocul intervalului, adic 10ms. f=1/T =>
fcycle=1/10ms=100Hz.
nlocuim n relaia anterioar pe fcycle i pe fCLK_CPU :

2,048MHZ 2048 103 211 1000


p= = = 8 = 23 10 = 80
256 * 100 256 * 100 2 * 100
Cel mai apropiat p de 80 este 64. Pentru p=64 obinem:

pN 64 256 2 6 28
Tcycle = = = 11 10 3 = 23 10 3 = 8ms , 8 [8 , 12 ]
f CLK _ CPU 2048 1000 2

Vom folosi timerul 0 n mod fast PWM, cu p=64.


Trebuie obinui 3 factori de umplere: 100% pentru viteaz mare, 0% pentru viteaz 0 i 10% pentru viteaz
mic. FU=100% se obine cu OCR0=255, viteza 0 cu OCR0=0 iar valoarea care se va nscrie n OCR0 pentru
FU=10% se calculeaz cu regula de trei simpl:
100 255
10 x
x=255 10 / 100 26
Cerin 3 impune utilizarea unui singur timer. Timerul 0 n mod fast PWM se va utiliza i pentru
implementarea unui ceas. Deoarece pasul P2 dureaz 4s, pasul P4 dureaz 5s iar pasul P5, 4s, rezoluia acestui
ceas este 1s. i 4s i 5s sunt multiplii secundei.
Deoarece rezoluia este 1s iar Tcycle este 8ms, vom aplica relaia 4 - Tr=kTcycle - din prelegerea 5:
1s=k * 8ms k= 1s/8ms= 1000ms/8ms=125
3.
#include <avr/io.h>

#define clrbit(var,bit) var &= ~(1<<bit)


#define setbit(var,bit) var |= 1<<bit

//senzor prezen SRP, senzor nchis SRI, senzor deschis SRD


#define SRP 0
#define SRI 1
#define SRD 2

//Motor sens
#define MS 0

//strile FSM. Semnificaia strilor va fi explicat pe msur ce acestea vor fi folosite


#define START 0
#define TOPEN 1
#define OPENF 2

22
#define OPENS 3
#define OPEN 4
#define CLOSEF 5
#define CLOSES 6

void init_time();

unsigned char sec, cycles;

int main(){
unsigned char status = START;
// cerin 3a
DDRA=0; // portul A este configurat ca port de intrare pentru a citi informaiile
// de la senzori

DDRB=0xFF; // portul B este configurat ca port de ieire pentru a controla motorul

//configurarea timerului se face dup modelul din prelegere 5, pagina 22


// Fast PWM
TCCR0=0b01101011;
// clk /64
I/O
// Set OC0 on BOTTOM, Clear on compare.

//la iniializare ua trebuie s se nchid cu vitez mic: FU=10%, MS=0


OCR0=26; //FU=10%

clrbit(PORTB, MS); //MS=0 (direcia inchidere)

while(1){
//Cerinta 3c
// ceas cu rezolutie de o secund asemntor cu exemplul din prelegere 5,
// pagina 17 i cu exemplul din laboratorul 9
if(TIFR & 1<< TOV0){
TIFR |= 1<< TOV0;
cycles++;
if(cycles == 125){
cycles=0;
sec++;
}
}

//Cerin 3b - FSM. Vezi laboratorul 8 i exemplele din prelegerea 7


switch (status){
// motorul se rotete cu vitez mic i sens nchidere pn cnd semnalul
// de la senzorul SI devine 1
case START:
if(PINA & 1<<SRI){
OCR0=0;
status = TOPEN;
}
break;

//TOPEN nseamn TEST OPEN. n aceast stare se testeaz semnalul de la


// senzorul de prezen SP. Cnd se detecteaz 1, se seteaz FU=100% si
// sens nchidere.
case TOPEN:
if(PINA & 1<<SRP){
// Se iniializeaz la zero componentele ceasulu. Componentele ceasului
// sunt secundele sec, numrul de cicluri cycles, valoarea timerului i
// indicatorul de ciclare TOV0. Toate componentele se nscriu cu zero de
// ctre funcia init_time(), mai puin valoarea timerului. Valoarea
// timerului nu se modific deoarece modificarea ar afecta ieirea PWM,
// ceea ce ar putea afecta viteza de rotire a motorului. Din aceast cauz
// acurateea cu care se msoar timpul este de un Tcycle, adic 8 ms, ceea
// ce este admisibil n cazul unei ui automate.
init_time();
setbit(PORTB, MS); // sens rotire pentru nchidere

23
OCR0=255; // viteza mare
status = OPENF;
}
break;

// OPENF vine de la OPEN FAST deschide repede. Viteza mare i sensul stabilite
// n starea TOPEN se menin 4 secunde.
case OPENF:
if(sec==4){
OCR0=26; //dupa 4 secunde seteaz viteza mic
status = OPENS;
}
break;

// OPENS vine de la OPEN SLOW deschide ncet. Viteza mic i sensul stabilite
// anterior se menin pn cnd semnalul de la senzorul SD devine 1.
case OPENS:
if(PINA & 1<<SRD){
init_time();
OCR0=0; //viteza zero pentru starea urmtoare
status = OPEN;
}
break;

//usa este deschis. Stai n aceast stare 5 secunde


case OPEN:
if(sec==5){
//dup 5s seteaz viteaz mare, sens deschidere, timp=0
init_time();
clrbit(PORTB, MS);
OCR0=255;
status = CLOSEF;
}
break;

// CLOSEF vine de la CLOSE FAST nchide repede. Viteza mare i sensul stabilite
// n starea OPEN se menin 4 secunde.
case CLOSEF:
// dac pe durata nchiderii senzorul de prezen se activeaz, seteaz viteaz
// mic i sens deschidere i treci n starea OPENS
if(PINA & 1<<SRP){
setbit(PORTB, MS);
OCR0=26;
status = OPENS;
}
else if(sec==4){
OCR0=26;
status = CLOSES;
}
break;

// CLOSES vine de la CLOSE SLOW nchide ncet. Viteza mic i sensul stabilite
// anterior se menin pn cnd semnalul de la senzorul SI devine 1.
case CLOSES:
// dac pe durata nchiderii senzorul de prezen se activeaz, seteaz viteaz
// mic i sens deschidere i treci n starea OPENS
if(PINA & 1<<SRP){
setbit(PORTB, MS);
OCR0=26;
status = OPENS;
}
else if(PINA & 1<<SRI){
OCR0=0;
status = TOPEN;
}
break;
}//end switch

24
}//end while 1
return 0;
}

void init_time(){
TIFR |= 1<< TOV0;
cycles=0;
sec=0;
}

25
7. Tip 8, 9 (timer - turometru, intreruperi), Problema 61
S se proiecteze un computer de biciclet bazat pe microcontrolerul ATMega16. Computerul primete semnalul
REV de la perechea magnet permanent traductor magnetic de
proximitate. Magnetul i traductorul sunt montate ca n figura
alturat.
Atunci cnd magnetul este n dreptul senzorului semnalul REV
are valoarea 1; n caz contrar REV este 0.
La fiecare rotaie a roii traductorul genereaz un puls pozitiv al
semnalului REV. Limea pulsului depinde de turaia roii: cu
ct turaia roii este mai mare cu att pulsul va avea o durat mai
mic.
Computerul trebuie s calculeze i s afieze 3 mrimi: viteza
instantanee, distana parcurs i timpul n care a fost parcurs
aceast distan, adic timpul activ. Aceste 3 mrimi se calculeaz n urmtoarele condiii:
a. Circumferin roii este 2 metri.
b. Se garanteaz c limea minim a pulsului pozitiv al semnalului REV este 30 microsecunde.
c. Viteza maxim a bicicletei este 72 km/h. Se garanteaz c bicicleta nu poate depi aceast vitez.
d. Dac viteza este mai mic de 3,6 km/h, viteza afiat va fi zero i nici distan parcurs, nici timpul nu se
vor modifica. De exemplu, atunci cnd bicicleta st viteaza este zero, distana parcurs rmne neschimbat,
la fel i timpul activ.
e. Afiarea celor trei mrimi se face pe un LCD cu organizarea 2 linii i 16 coloane. Pentru afiare se vor
folosi funciile putchLCD(char ch), putsLCD(char *ch), clrLCD() i gotoLC(unsigned char line, unsigned
char col) cu semnificaia de la laborator. Codul pentru aceste funcii este deja disponibil i nu mai trebuie
scris. Durata de execuie pentru aceste funcii este minim 40 s i maxim 1 ms.
f. Ceasul microcontrolerului este generat cu un cristal cu frecvena de 1,024 MHz.
g. La reset viteza, distana i timpul activ se vor iniializa cu zero.
Cerine obligatorii:
1. Durata mare de execuie a funciilor de afiare n raport cu durata impulsului de la senzor face imposibil
detecia prin pooling. Detecia impulsului REV n pooling prin metoda celor dou eantioane nu se
puncteaz.
2. Pentru oricare mrime calculat se va descrie metoda de calcul, inclusiv formulele matematice necesare
(dac este cazul). Se vor preciza toate resursele folosite (porturi, timere, sistem de ntreruperi) i modul n
care acestea sunt folosite. Se va implementa conform descrierii. Implementarea fr descriere nu se
puncteaz.
3. Programul trebuie s aib o singur funcie main(), o singur bucla principal while() i ISR-uri (dac este
cazul). Codul care nu se integreaz n aceast structur nu se puncteaz.
Se cere:
1. S se specifice pe ce pin se conecteaz semnalul REV. n lipsa acestei specificaii nu se acorda nici in punct.
Conectarea LCD-ul la microcontroler se va rezolva ulterior i nu se puncteaz.
2. Calcularea i afiarea vitezei instantanee. Viteza se afieaz n kilometrii pe or, fr zecimale, n plaja 3,6-
72 km/h (de exemplu 35 km/h). n intervalul 3,6-72 km/h viteza se va calcula cu precizie de minim 1%.
Implementarea care nu respect precizia de 1% se depuncteaz. Descrierea metodei + formule 2 puncte,
implementare 2 puncte
3. Calcularea i afiarea distanei parcurse. Distan se afieaz n kilometrii pe dou cifre la partea ntreag i
o cifr la partea zecimal (de exemplu 25,7 km). 3 puncte
4. Calcularea i afiarea timpului activ (timpul n care s-a parcurs distan calculat la punctul 2). Timpul activ
se afieaz n ore i minute (de exemplu 2h35). 2 puncte
26
Rezolvare:
1. REV se conecteaz pe pinul (ICP1) PD6 pentru a putea folosi blocul de captur din timerul 1. Vezi
turometru din prelegere 5, capitolele 5.1, 5.2. Timerul 1 se va folosi modul normal.

#
2. Viteza se calculeaz cu formula : = = . Trev este timpul n care roata execut o
$%&'
rotaie complet i se calculeaz prin metoda celor dou amprente de timp. Timpul este msurat cu timerul
1. Timpul necesar pentru o rotaie complet se msoar ca diferen ntre timpii frontului ridictor a dou
impulsuri succesive ale semnalului REV.
Notm s2 valoarea timerului 1 capturat pe frontul ridictor cel mai recent al impulsului REV i cu s1
valoarea timerului 1 capturat pe frontul ridictor precedent al impulsului REV. Dac nlocuim pe Tr cu (s2-
s1)TCLK_CNT obinem:
()*(+ ,-*). */)) ()*(+ ,-*). */)) 2 2
= = = = =
0 1 2 2 140567_59$ 2 2 14 : 0567_5;< 2 2 14 : 0567_5;<

DE 1
2 ,567=>? 2 1,024ABC 2 1024 1000 BC 2 2 1000 FGG GHHH
= = = = =
2 2 14 : 2 2 14 : 2 2 14 : 2 2 14 : 2IF IG4 J
n continuare se va alege p. Pentru a alege pe p vom considera dou situaii: vitez minim i vitez
maxim.
a. Viteza minim: la viteza minim Tcycle al timerul 1 trebuie s fie mai mare ca Trev. Mai nti
PQEE
calculm viteaza minim n metri pe secund: = 3,6M / = PQEE
= 1 / . Apoi calculm ct
# V
timp dureaz o rotaie a roii la viteaza minim: 0 1_ =1 R
= 1STU
=D /
=2 .
Pentru ca s putem msura prin metoda amprentei de timp trebuie ca Tcycle > Trev_min.
tim (conform relaiei 2, pagina 8, prelegere 5 sau deducem dac nu tim) c 0 W X = :NT[\]_[^_ . N
pentru timerul 1 n modul normal, este 216 iar TCLK_CPU se d.
Aflm pentru ce p este adevrat inegalitatea Tcycle> Trev_min:
$ $%&'_STU =bc=>? V DEVd DEe fR V Vgi Ve je Vgk je
0W X = :`0567=>? > 0 1_ , : > 9$%&'_STU = 9
= Vgh
= Vgh
= Vgh
=bc=>?

DVj
= d
= 31,25. Deci p>31,25

b. Viteza maxim: la viteza maxim precizia de msurare trebuie s fie de minim 1%.
Durata unei rotaii la viteza maxim este
()*(+ ,-*). */)) 72M 72000 20 ()*(+ ,-*). */))
l = , l = = = 0 1_ l = =
0 1_ l 3600 l

2
= = 0,1
20 /
Durata unei rotaii la o vitez cu 1% mai mic dect viteza maxim este:
1
72 o1 100p M 72000 99 ()*(+ ,-*). */))
lD = = = 20 0,99 0 1_ lD = =
3600 100 l
2 1
= = 0,1 = 0.10101
0, 99 20 / 0,99
Din diferena Trev_ max1 - Trev_max = 0,10101- 0,1=0,00101s=1,01 ms rezult perioada minim a ceasului
de numrare:

27
TCLK_CNT < 1,01 ms, p TCLK_CPU < 1,01 ms ,
D,ED
:<$ = 1,01 ,567_5;< = 1,01 10tP 1024 10P = 1,01 1024
=bc_=>?

La punctul a) a rezultat c p>31,25 iar mai sus a rezultat c p< 1,01 1024. Vom alege din valorile
posibile (1, 8, 64, 256, 1024) o valoare la mijlocul intervalului: vom alege p=256.
tiind pe p revenim la calculul vitezei:
M
211 1000 211 1000 23 1000 23 1000 1000 23 3600 M 28800 M
= = = = = =
2 2 14 : 2 2 14 2 8 2 2 14 2 2 14 2 2 14 2 2 14
3600
3. Exprim durata unei rotaii la viteaza minim n impulsuri de ceas numrtor. Pornim de la Trev_min de la
punctul 2a:
$%&'_STU V V =bc_=>? V DEVd DEEE V Vgi DEEE
` 1_ = = = = = = 8000
$=bc_=uv $=bc_=>? VjQ Vw

Nrev_min este necesar pentru a decide cnd calculm i afim viteza, distana i timpul activ.
4. Pentru p=256 vom determina Tcycle:

DQ
1 2x 2DQ 2Vd 2DD 2048
0W X = :NT[\]_[^_ = 256 2 = DE P P = DP P = P = 16,3
1024 10P 2 2 5 2 5 5 125
Precizri privind implementarea:
a. Vom relua analogia cu ceasul i vom analiza dou cazuri. n primul caz o activitate ncepe la ora 10 i se
termin la ora 2. Respectiva activitate a durat 4 ore i ceasul a ciclat deoarece a trecut prin 12. n al doilea
caz activitatea ncepe tot la ora 10 i dureaz 16 ore, terminndu-se tot la ora 2. i n acest caz ceasul a
ciclat deoarece a trecut prin 12, numai c acum a trecut de 2 ori! Dac durata maxim permis pentru
activitate este 8 ore, cum ne dam seama c n primul caz nu exist depire i n al doilea exist? n ambele
cazuri avem nceputul la 10, sfritul la 2 i tim c ceasul a ciclat. Evident trebuie s numrm de cte ori
a ciclat! n primul caz avem 1ciclu +2-10=12+2-10=4 iar n al doilea caz avem 2cicluri +2-10=24+2-
10=16.
Dac durata maxim permis este de un ciclu (12 ore) nu mai are sens s sa calculam durata activitii
pentru a vedea dac exist depire atunci cnd numrul de ciclri este mai mare sau egal cu 2. Pentru a
evita depirea formatului de reprezentare numrul de ciclri se va incrementa cu saturare la 2. n
implementarea urmtoare variabila care memoreaz numrul de cicli de numrare se numete cycles.
b. n continuare vom analiza al treilea caz. n acest caz o activitate ncepe la ora 9 i se termin la ora 11.
Deoarece suntem ocupai, ne uitam la ceas la ora 1. Cnd activitatea s-a sfrit timpul de terminare este
nregistrat automat de ceas, aa c i dac ora este 1 tim c sfritul activitii a fost la 11. Dar n acest caz
apare ciclare i calculul duratei activitii conform procedurii anterioare conduce la un rezultat eronat:
1ciclu +11-9=12+11-9=14, ceea ce nseamn depire. Depirea apare pentru ca o ciclare din ciclul
urmtor de msurare a fost contorizat n ciclul curent. Contorizarea incorect se poate determina dac se
analizeaz timpul curent i timpul la care s-a terminat activitatea, 1 i 11 n acest caz: dac timpul curent
este mai mic dect timpul la care s-a terminat activitatea, atunci avem aceast situaie. Evident, detecia
funcioneaz dac nu ntrziem mai mult de un ciclu de numrare. Cum un ciclu de numrare dureaz
aproximativ 16 secunde iar execuia buclei principale dureaz maxim 5 ms (1clr LCD x 1 ms + 32 scrieri
LCD x 40 us + calcule diverse) ntrzierea n tratarea capturii nu poate depi un ciclu de numrare.
c. A treia precizare privind implementarea se va face dup prezentarea codului C.

28
#include <avr/io.h>
#include <stdio.h>

int main(){
unsigned int s2, s1, cnt_now, v=0, t_min, t_hrs;
unsigned long int t=0, d=0, delta, t_sec;
unsigned char cycles=2, cycles_cpy;
char buf[17];

// Normal Mode
TCCR1B=0b01000100;
// clk /256
I/O
// ICES1=1: capture on rising edge.
// Normal Mode
TCCR1A=0b00000000;

while(1){
//contorizeaz ciclrile numrtorului
if(TIFR & 1<<TOV1){
cycles++;
TIFR |= 1<<TOV1;
if(cycles>2)
cycles=2;
}
//cazul 4. Aici se face captura; timerul este in starea 0000 i simultan apare i TOV1
// detecteaz ca exista o captur
if( (TIFR & 1<<ICF1) && TCNT1 != 0 && TCNT1 != 0xFFFF){
cnt_now = TCNT1; // cnt_now este folosit pentru detectia situaiei b.
TIFR |= 1<<ICF1;
cycles_cpy = cycles;
s1=s2;
s2=ICR1;

// trateaz situaia b.
if (cnt_now < s2){
cycles=1;
cycles_cpy--;
} else{
cycles=0;
}

//calculeaz durata rotatiei roii prin metoda celor dou amprente de timp
delta = (unsigned long int)cycles_cpy * 65536UL + s2 - s1;

if(delta <=8000 ){ //dac viteza este mai mare decat viteaza minim
v=28800UL/delta;
d+=2; //in metri
t+=delta; //in pulsuri CLK NUM
}
else{
v=0;
}

t_sec = t/4000UL;
t_min = t_sec/60;
t_hrs = t_min/60;

sprintf(buf, "%2d km/h %2dh%dm", v, t_hrs, t_min);


gotoLC(1,1);
putsLCD(buf);

sprintf(buf, "%2ld,%1ld km",d/1000, (d-d/1000)/100);


gotoLC(2,1);
putsLCD(buf);
}
} //end while 1
}

29
A treia precizare:
Vom considera al patrulea caz. Acest caz apare foarte rar si netratarea lui nu va scdea nota. n acest al patrulea
caz trebuie s aib loc simultan trei evenimente:
1. Execuia programului s fie la nceputul testului de detecie a capturii, loc marcat cu //cazul 4" n
implementarea de mai sus.
2. Numrtorul s fie n starea 0000, imediat dup tranziia din starea 0xffff. (Nu uitai, o stare a
numrtorului dureaz p impulsuri de ceas, adic 256.) n acest moment apare TOV1.
3. Captura s se fac exact n starea 0000, imediat dup tranziia din starea 0xffff, simultan cu TOV1.
n acest caz testul de captur reuete, dar suntem n starea 0000 i ciclarea care a aprut dup testarea lui
TOV1 nu a fost contorizat. n concluzie avem cu un TOV1 mai puin!
Pentru a evita apariia acestei situaii nu vom face calculele dac numrtorul este n starea 0000 sau 0xFFFF.
Aceast soluie introduce o ntrziere a afirii de 512 ceasuri procesor, ceea ce nu constituie o problem.

30