Sunteți pe pagina 1din 106

1

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Facultatea Inginerie si Management in Electronic

i Telecomunicaii

Catedra SDE

7
8

Proiect de an

9
10

La disciplina Microcontrolere

11

TEMA: Proiectarea ceasului electronic si termometrului pe baza de


microprocesor

12

13
14
15
16
17

A efectuat

18

studenta gr. E-111

Lasco Marina

19
20
21

A verificat

22

Conf. Univ.

23

Andronic Sergiu

24
25
26

Chiinau 2014

27
28
29

CUPRINS

30

INTRODUCERE.............................................................................................................................4

31

1.

ELABORAREA ALGORITMULUI DE FUNCTIONARE A DISPOZITIVULUI........................................4

32

2.

ELABORAREA SCHEMEI DE STRUCTURA....................................................................................5

33

3.

EVIDENTIEREA TUTUROR OPERATIILOR DISPOZITIVULUI IN CURS DE PROIECTARE...................6

34

4.

ALEGEREA MICROPROCESORULUI SI TUTUROR DISPOZITIVELOR PERIFERICE NECESARE..........6

35

4.1. Microprocesorul.....................................................................................................................6

36

4.2. Termometrul...........................................................................................................................7

37

4.3. Ceasul de timp real.................................................................................................................8

38

4.4. Displeiul.................................................................................................................................8

39

5.

ELABORAREA SCHEMEI ELECTRICE DE PRINCIPIU.....................................................................9

40

6.

EFECTUAREA CALCULELOR NECESARE...................................................................................12

41
42

6.1. Calculul valorii rezistentei R9 pentru evitarea iesirii din functiune a ledurilor...................12
7.

ELABORAREA ALGORITMILOR SI PROGRAMELOR DE COMANDA A DISPOZITIVULUI................13

43

7.1. Descrierea afisorului graphic LCD HD44780......................................................................13

44

7.2. Descrierea ceasului de timp real...........................................................................................16

45

7.3. Descrierea termometrului digital..........................................................................................18

46

7.4. Descrierea protocolului 1-WIRE pentru termometrul digital...............................................18

47

7.5. Descrierea protocolului I2C.................................................................................................20

48

8.

ELABOAREA GHIDULUI DE UTILIZARE A DISPOZITIVULUI PROIECTAT.....................................22

49

Concluzie.......................................................................................................................................23

50

Bibliografie....................................................................................................................................24

51
52

ANEXA1. LISTINGUL PROGRAMEI

53

ANEHA2. SCHEMA ELECTRICA PRINCIPIALA

54
55

56
57
58

INTRODUCERE
In aceasta lucrare de curs am sa prezint modul si principiie de elaborare a unui dispozitiv pe baza

59de microprocesor care o sa aiba ca functie de baza a indica pe un displei temperatura data si ora
60curenta. Pentu a realiza aceasta sarcina o sa analizez realizarile posibile in limitele care ne le propune
61baza de elemente disponibila. Pentru a realiza aceasta sarcina sa mers pe calea cea mai simpla, alegind
62elemente schemotehnic simple din punct de vedere si usor programabile.

63

Deoarece lucrarea data poarta un character mai mult de instruitre si de familiarizare decit

64constructiv, o sa se prezinte descrierea complete a tuturor etapelor de proiectare si a proceselor care se


65petrec atit in interiorul microprocesorului atit sin in modulele folosite .
66
Se presupune microprocesorul de baza va lua asupra sa sarcina principala de prelucrare stocare si
67dirijare cu informatia primita de la modulele conectate. La prima etapa a proiectarii sa pus ca scop
68alegrerea bazei de elemente si limbajului de programare pe care se va baza dispozitivul. Ca limbaj de
69programare sa ales assemblerul pentru familia de microprocesoare AVR, dearece fiind un limbaj de
70nivel jos ne ofera posibilitati de a evidentia cele mai amanuntite momente in etapa proiectarii. Ca

71mediu de programare am ales AVRStudio. AVRStudio este un mediu de software dezvoltat de Atmel
72pentru nscrierea n limbaj de asamblare, compilarea i simularea de programe destinate
73microcontrolerelor produse de aceast companie.
74
75

1. Elaborarea algoritmului de functionare a dispozitivului

76
77

Odata cu

conectare

78intrerupatorului SW1

alimentarii fie unind elementul de alimentare sau apasind minerul

microcircuitul DA1 incepe a forma tensiune de alimentare +5V

pentru

79microcontroller si toate perifericile unite (ceas, termometru, displei). Putem controla conectarea

80alimentarii dupa indicatia ledului HL1. Microcontrollerul DD2 incepe eczecutarea programei in caz ca
81in prealabil a fost programat prin conectorul XT1. Mai amanuntit despre modul functionarii programei
82este decris in paragraful 7. Cu ajutorul rezistorului R10 si condensatorului C7 se formeaza un interval
83de timp pina se stabilizeaza tensiunea de intrare.
84
Microcontrollerul prelucreaza datele preluate de la ceas si termometru si le afiseaza pe displei. Cu
85ajutrorul butoanelor SB1-SB3 peutem seta ceasul. Cu butonul SB4 se reseateza manual
86microcontrollerul in caz de dereglarii iin lucrul programei.
87
Luaind in consideratie ca dispozitivul va avea alimentare autonoma de baza, este prevazut
88deconectarea iluminarii ecranului manual de la al doielea miner al intrerupatorului SV. Ceia ce

89considerabil va mari timpul autonom de lucru al apartaului luind in consideratie ca iluminarea de


90fundal al displeiului consuma 100mA. Iar tot dispozitivul cu iluminarea deconectata consuma in jur de
9150 mA.
92
93

2. Elaborarea schemei de structura

94

Pentru a avea o reprezentare generala despre modul de functionare si despre structura proiectului

95vom analiza rind-pe-rind blocurile functionale din care este alcatuit proiectul.

Ceas timp
real

Sistema de
alimentare
4

Acumulator

97
98
99
100
101
102
103
104
105
106

Fig.1. Schema de structura.


1. Termometu digital.
2. Tastatura.
3. Ceas de timp real.
4. Acumulator
5. Microprocesor.
6. Sistema de alimentare.
7. Displei 16x2.

107

La baza dispozitivului proiectat sta un microprocesor (B5) care achizitioneaza datele de la

108unitatile periferice si in dependenta de program dirijaza cu unitatile periferice la iesire. Functia de baza
109este de a plelua datele de la termometrul digital (B1) de a prelucra aceste date si le afisa pe displei (B7)
110intrun mod comod utilizatorului.
111
Blocul 1 reprezinta un termometrul digital destul de precis. Ca tastatura se vor folosi 3 butoane
112care prin intermediul lor o se sa infaptuiasca toate setarile necesare. In caz de deconectare a alimentarii
113de baza sau este pervazut alimentarea casului de timp real (B3) de la o baterie adaugatoare (B4) care
114asigura dupa promisiunile producatorului un lucru autonom timp de 10 ani.

115

In calitate de dispozitiv de afisare serveste un displei pe cristale lichide (in continuare in tecst

116LCD) care permite afisarea a 16 caractere in doua rinduri (cite 16 caractere pe fiecare rind).
117
118
119
120

3. Evidentierea tuturor operatiilor dispozitivului in curs de proiectare


Una din primele etape proiectarii dispozitivului este analiza sarcinii. Dina ceasta analiza reese

121conditiile in care trebue sa fie exploatat aparatul.


122
Avind ca sarcina proiectarea unui dispozitiv pe baza de microprocesor care va indica la displei
123temperatura si ora curenta am inceput cu analiza surselor biografice la aceasta tematica.

124
125

Analizind prototipurile existente am trecut la analiza lor.


Sa analizat posibilitatile de realizare a ceasului pe baza de microprocesor si sa ales folosirea unui

126ceas de tiimp real care va fi realizat ca un microcircuit aparte care o sa ne ofrere precizie si
127functionalitate mare in comparatie cu scrierea programei si realizarea ceasului in interiorul
128microprocesorului. Urmatoarea etaapa a fost alegerea dispozitivelor periferice ramase. Sa trecut la
129proiectarea schemei electrice de structura si apoi acea principiala. O analiza fugitiva a proiectui nea
130aratat ca cu usurinta o sa se poata de realizat chiara si un machet al dispozitivului proiectat deoarece
131sau folosit elemente raspindite si cu pret rezonabil.

132

Pentru scrierea programei sa trecut la analiza mai profunda a teoriei si metodelor de programare

133a periferiei. Ca sa se reduca timpul de scrierea a programei sa folosit o parte de subprograme


134imprumutate din alte surse si fisierilor incluse ceia ce nea permis de a reduce in primul rind timpul
135elaborarii programului si intral doilea rind a redus listingul programei care si asa ocupa aprohimativa
136600 de rinduri. Deasemenea o etapa inportanta a fost introducerea in listingul programei comentarii
137cere sint inportante la scrierea in limbajul asembler.

138

Partea teoretica a fost descrisa in mare parte in capitolul 7 in care sau descris protocoalele de

139comunicare intre microprocesor si dispozitivele periferice. In subcapitol aparte a fost descrisa si sina
140sincrona paralela de comunicare a microprocesorului cu displeiul.
141
Ghidul de utilizare sa prezintat in capitiolul 8 si contine modul de setare si navigare prin meniul
142dispozitivului.
143
144
145

4. Alegerea microprocesorului si tuturor dispozitivelor periferice necesare

146

4.1.

Microprocesorul

147
148
149

In baza proiectului sta microcontrollerul firmei Atmel ATtiny2313.


Insasi microcontrollerul se alimenteaza cu tensiunea de 5V . Stabilizarea si trasformarea tensiunii

150de intrare se face cu micriocircuitul L7805 datorita eu putem conecta la intrare o tensiune de la 7,5V
151pina la 35V.

152
153

Fig. 2. Microcontrollerul Attiny2313. interfata.

154

Este un microcontroler raspindit si atragator din punct de vedere economic. Doar la pretul 25 lei

155ofera o gama destul de larga de periferice si 18 porturi de intrare/iesire care ne indestuleaza toate
156cerintele puse in acest proiect.
157
Deasemenea o sa avem nevoie de taimerul care in regim de numarare ne va forma intreruperi
158aprohimativ odata pe secunda. Consumul propriu la la sursa de alimentare este doar de 230 A la
159frecventa de 1 MHz si tensiunea de 1.8V.
160
161
162

4.2.

Termometrul.

163

Termometrul digital DS18b20 poseda un sir de avantaje. Una din avantaje este raspindirea lui

164larga, datorita careia putem gasi o multime de exemple de lucru al acestui senzor digital. Permite
165masurarea temperaturii in diapazonul de -55,0 125,0 asta precum ca curentul de consum este
166de 6mA.
167
Descrierea senzorului: Termometru digital DS18B20 cu rezoluie programabil de la 9 pn la
16812-bii, care pot fi stocai n memoria EEPROM. DS18B20 comunic printr-o magistral 1-Wire, i nu
169poate fi doar singurul dispozitiv pe linie ci i poate funciona n grupuri. Toate procesele de pe in
170sunt procesat de microprocesorul central. Diapazonul de msurare este de la -55 C pn la +125 C i

1710,5 C. Precizia se afl n intervalul de la -10 C la +85 C. n plus, DS18B20 poate s se alimenteze
172de la linia de date ("putere parazit"), n absena unei surse externe.
173
Fiecare DS18B20 are un cod unic n 64 de bii, care permite s comunice cu mai mul i senzori
174DS18B20 instalai pe in. Acest principiu permite utilizarea unui microprocesor pentru a controla mai
175muli senzori DS18B20, care sunt distribuii pe o arie mare. DS18B20 poate fi conectat la sursa de
176alimentare extern (VDD) , sau poate funciona n "putere parazit", care permite funcionarea
177DS18B20 fr putere pe pinul VDD. Puterea parazit este foarte util pentru aplica ii care necesit

178citirea temperaturii de la distan, sau este realizat din cauza proiectrii liniilor vechi de comunicare,
179care este realizat doar pe dou fire.
180
Parametri tehnici
181
Msurarea temperaturii de la -55 C pn la +125 C (pasul 0,1 C)
182
Setarea temperaturii de la -55 C la 124 C (pasul 0,1 C).
183
Histerezis de la 0,1 C la 25 C

185
186

Fig. 3. Ceasul. Configurarea pinilor si infatisarea.

187

4.3.

Ceasul de timp real.

188
189

Cicuitul Ds1307 este un Real-tine clock (RTC)care comunic serial prin I2C cu

190microcontro1erul i ofer informaii precise despre or, minute secunde i dat, setate anterior de ctre
191utilizator.
192
Acest ceas are modul de comuncare prin protocol i2c (2 fire active, SDA = intrare/iesire date,
193respectiv SCL = intrare seriala ceas), ceasul intern se bazeaza pe un cristal de cuart de 32,768kHz (cum

194sunt cele din ceasurile de mana), iar partea de alimentare de rezerva (in cazul intreruperii alimentarii)
195se realizeaza cu o baterie de 3V tip CR2302 (cum sunt cele de pe placile de baza ale calculatoarelor
196(PC), dar sepot folsi si 2 inseriate de 1,5V...

197
198
199
200

Fig. 4. Ceasul DS1307.


4.4.

Displeiul

201

Un din cerinte si cred ca ce-a mai importanta este sa ne ofere spatiu destul de larg pentru a afisa

202toata informatia. Pe displei trebue afisata urmatoarea informatie: data, luna, anul, temperatura, ora in
203format- ora si minutele. Un displei care permite afisarea a 16 carectere in 2 rinduri este deajuns.

204
205

Fig. 5. Afisorul grafic.

206

Afisorul WH1602D este raspindit si deasemenea se poate de gasit descrierea completa a lui. Ceia

207ce tare usureaza scrierea programului.


208
209
210
211

5. Elaborarea schemei electrice de principiu


Urmatoarea etapa dupa alegerea tuturor comonenteler periferice si am elaborarea schemei de

212structura este elaborarea schemei electrica principiala.


213
XT1 (nu este prezintat) este conectorul de programare ISP (In-System Programming); acesta
214permite programarea memoriei FLASH din procesor folosind un programator extern. De notat ca

215exist mai multe standarde de conector (n principal 2x3 pini i 2x5 pini), noi l vom folosi numai pe
216acesta pentru compatibilitate.
217

L A I lu m in a r e

SV1

+5V

12

11

10

7
S W D 1 -6
+5V

XT2

VD1

D A1

219
220

Fig. 6 Circuitul de alimentare.


Pentru alimentare se foloseste stabilizatorul U3 cu 3 terminale (7805), 2 condensatoare de 100nF

221necesare pentru stabilitatea functionrii acestuia, i dioda D1 care protejeaz la alimentarea inversa.
222
De la intrerupatorul SV1 gestionam cu alimentarea si iluminarea displeiului.
223
Ceasul de timp real are o conectare tipica ce este prezintata in specificatia tehnica care am
224repetato si in proiect.

DD3
R 5

PB4
PB5

R 6

5 .1 k

5 .1 k

5
7
3

C 2
22uF

SC L
SD A
SO U T
VBAT

X1
X2
Vcc
G nd

1
2
8

ZQ 1
32767 kH z

+5V

VG 1
B a t a r e ic a D S 1 3 0 7

225
226

Fig. 7. Conectarea ceasului de timp real.

227

Apropo DS1307 permite lucrul si fara cuartul de tactaere . Pentu aceasta la pinul X1 se aplica

228semnalul extern de tactare 32.768 kHz, iar X2 ramine sa stee neconectat.


229
Conectare senzoruui de temeratura este reprezintata mai jos si tot este tipica.
D D 4
1

PB7
R 8

+5V

230
231

3
4 .7 k

D Q

VC C

G N D

D S18B20

Fig.8. Conectarea senzorului e temperatura.

232

Rezistentele pull-up R1...R3 asigura nivelul 1 pe pin cand butonul este in repaus. Cand butonul

233este apasat, nivelul pinului este 0 prin legare la GND. Desigur portul respectiv si anume
234PB0,PB1,PB2 trebue de configurat ca intrare.
235

SB1
M IN U S

PLU S

SET

R 1
11k

R 2
11k

R 3
11k

SB2

236
237
238

PB2

PB1

PB0

SB3

+5V

Fig. 9. Conecttarea butoanelor.


R10, C7 formeaza circuitul de power-on reset. n momentul aplicarii Vcc, C7 este descrcat i

239trage linia RESET* n 0, resetnd procesorul. Ulterior, condensatorul se va incrca prin R10 i

240linia va sta n 1 (procesul este asimptotic, dar sfritul ncrcrii se consider dupa un timp
241aproximativ egal cu 5R10C7).
R 10 10k
+5V

C 7
2 ,2 u F

R ESET

242
243
244

SB4
1

R ESSET

Fig. 10. Circuitul de resetare.

245

Acest reset este necesar pentru a asigura pornirea n bune condiii a procesorului; n lipsa lui,

246tensiunile tranzitorii care apar n momentul alimentrii pot duce la ajungerea procesorului intr-o stare
247incert. Practic, linia RESET* e inut n 0 un timp semnificativ mai lung dect are nevoie sursa de
248alimentare s intre n regim staionar.
249
Pentu a avea posibilitate de a manipula cu luminozitatea displeiului folosim un rezistor variabil
250R4. Condensatorul C1 serveste ca filtru.

+5V
Vdd
Vss
C 1
0 .1 u F

251
252
253

R 4
20k

Vq

Fig.11. Setarea luinozitatii displeiului.


In Fig 12 este aratat conectarea displeiului la micropriocesor.

+5V
D D 1

C 1
0 .1 u F

R 4
20k

Vdd

Vss

Vq

3
4
5
6

R 7
5 O hm

>=105mA

15
16

Vdd
Vss

DPY
LCD

VQ

16 x 2

R S
R /W
E

D B0
D B1
D B2
D B3
D B4
D B5

Anod

D B6

C a to d

D B7

7
8
9
10
11
12
13
14

255
256

Fig.12. Conectarea displeiului.


Displeiul WH1602D are un microcontroller HD44780 incorporat care comunica cu

257microcontrolerul extern prin un protocol.


258Microcontrolerul dat este ncorporat direct n LCD si unde pinii sunt prezentate mai jos:
259
260
261
1 VSS
8 DB1
262
2 VDD
9 DB2
263
3 Vo
10 DB3
264
4 RS
11 DB4
265
5 R/W 12 DB5

266
267
268
269
270
271
272
273
274
275
276

6 E
7 DB0

13 DB6
14 DB7

Unde VSS tensiunea de alimentare;


VDD la pamint(potentialul comun);
Vo tensiunea de contrast a indicatorului;
RS - comutarea tipului de date / instruciunii, ( 0 - datele, 1 - instructiuni );
R/W alegerea regimului de scriere/citire, ( 0 - scriere, 1 - citire );
E semnalul de permitere a citirii/scrierii;
DB0-DB7 intrarile /iesirile de informatie.
Pinul de intrare/iesire DB7 este folosita pentru verificarea starii flagului sinei(BF).

277

Daca BF = 1 se efectuiaza instructiunea anterioara, BF = 0 microcontrolorul poate sa

278primeasca urmatoarea instructiune. Citirea BF se efectuiaza prin RS = 0, R/W = 1.


279
HD44780 poate sa lucreze in regimurile cu limea magistralei de date de 4 si 8 biti.
280
Aceasta ne permite sa economisim pinii a controului dispoziivului, sau de marit viteza sa lucru
281cu indicatorul.
282
283
284

6. Efectuarea calculelor necesare

285

6.1.

286
287

Se foloseste formula luii Ohm (1) :

288
289
290
291

De aici reese ca tensiunea care ese din microcontroller este =5V.


Becurile noastre se alimenteaza cu intensitatea 10ma.
Reese ca rezistenta de limitare este calculata cu ajutorul formulei:

292

Calculul valorii rezistentei R9 pentru evitarea esirii din functiune a ledurilor

R 9
330

H L1
W P113G D T

293
294
295
296
297

Fig.13. Rezistenta de limitare pentru ledul HL1


7. Elaborarea algoritmilor si programelor de comanda a dispozitivului

298

In listingul programei am folosit fisiere incluse. In aceste fisiere sint descrise procedurile pentru

299lucrul cu sinile I2C, 1-wire si lucrul cu LCD. Aceste fisiere nu leam inclus in listingul programei din
300anecsa, dar mai jos in tecst o sa fie lamurit rolul acestor fisiere.
301
In ciclul principal al programei rind 143-145 din anexa (in continuare se va scrie numai numarul
302rindului, subintelegind numarul rindului din listingul programei) se face numai citirea butoanelor
303incontinuu si ciclic. Dupa ce sa intimplat intreruperea dupa comparator cu aprocsimatie odata pe
304secunda microcontrollerul primesete temperatura, datele din ceasul de timp real, prelucreaza
305informatia primita si o indica la ecran.

306

In microcontroller informatia primita de la ceasurile de timp real ds1307 se salveza in memoria

307ram in variabila clock , iar din senzorul de temperatura ds18b20 in variabila buffer. Ceasul de timp
308real implicit nu este pornit, si nu merge, asa ca el trebue pornit.
309
Cum sa mai spus in rindurile de mai sus in corpul programului se face numai citirea butoanelor,
310iar dupa intreruperea taimerului pe rind se chemama subprogramele de lucru cu acele trei dispozitive
311periferice conectate la microcontroller. Deaceia este rezonabi de analizat careva subprograme in parte,
312avind in vedere ca analiza programului intreg este deneinfaptuit in cadrul acestei lucrari de curs.
313
Vom incepe cu descrierea afisorului grafic.
314

315

7.1.

Descrierea afisorului graphic LCD HD44780.

316
317

Indicatoare simbolice pe cristale lichide cu microcontroloare incorporate au primit o raspindire

318larga n electrocasnice, datorit consumului redus de energie, a confortului si usurinta de utilizare.


319
Indicatoarele simbolice in doua linii cu 8 si 16 simboluri in linie ce sunt suficient de accesibile
320i funcionale pentru realizarea mai multor sarcini..
321
Analizam microcontrolerul LCD HD44780, utilizate de ctre productorii de LCD, reprezentnd
322cea mai larg gam de produse pe piaa .

323

Prima etapa a lucrului cu HD44780 este initializarea. Initializarea se efectuiaza in ordinea de

324mai jos.
325
Dupa aplicarea tensiunei de alimentare la microcontrolor este necesar de efectuat o pauza de 15
326ms, dar din cauza diferenelor dintre caracteristicile de surse de alimentare

folosite durata

327recomandat de pauza este de 1-2 secunde.


328
Deoarece am folosit conectarea displeiului folosind interfata de 4 biti,o sa prezint numai
329initializarea respectiva.
330
Initializarea (interfata de 4 biti).

331

Initializarea HD44780 in regimul de 4 biti se efectuiaza practic asemanator cu acea de 8 biti,

332numai ca datele se transmit in doua etape cite 4 biti, cu toate ca primele merg cei mai mari 4 biti.
333
Sa analizam mai in detaliu initializarea regimului de 4 biti.
334
1. Conectarea tensiunii de alimentare.
335
2. Pauza 1-2 secunde.
336
3. RS R/W DB7 DB6 DB5 DB4
337
0 0 0 0 1 1
338
4. Pauza 4.1 ms.
339
5. RS R/W DB7 DB6 DB5 DB4
340
0 0 0 0 1 1
341
6. Pauza 100 s.

342
343
344
345
346
347
348
349
350
351
352
353

7. RS R/W DB7 DB6 DB5 DB4


0 0 0 0 1 1
8. Pauza 200 s.
9. RS R/W DB7 DB6 DB5 DB4
0 0 0 0 1 0 Instalarea interfetei de 4 biti
10. RS R/W DB7 DB6 DB5 DB4 Instalarea interfetei de 4 biti, numrul de rnduri,
0 0 0 0 1 0 instalarea punctelor de afisare a simbolurilor
0 0 N F * *
11. RS R/W DB7 DB6 DB5 DB4 Display conectat
0 0 0 0 0 0
0 0 1 0 0 0
12. RS R/W DB7 DB6 DB5 DB4

354
355
356
357
358
359
360

0 0 0 0 0 0
0 0 0 0 0 1 Display conectat
13. RS R/W DB7 DB6 DB5 DB4
0 0 0 0 0 0 Instalarea parametrilor de afisare a informatiei
0 0 0 1 I/D S
Afisarea informatiei la diplay.
Afisarea informatiei in forma de simbol la display se efectuiaza prin metoda

transmiiterii

361informatiei despre simbolurile afisate la iesirile de informative si dirijarea procesului de nregistrare a


362iesirilor RS,R/W E.

363

La inceput microcontrollerul primeste informatia despre adresa introdusa a simbolului. Adresa

364de la nceputul primei linii 080, l doilea - 00, mai departe deplasarea pe linii se efectuiaza cu
365marirea adresei.
366
Pentru a afirea simbolului pe ecran se foloseste urmtoarea secven:
367
1. RS = 0, R/W = 0, E = 1;
368
2. Stabilirea adresei liniilor informationale;
369
3. Pauza 50 s;
370
4. RS = 0, R/W = 0, E = 0;
371
5. Pauza 255 s;
372
6. RS = 1, R/W = 0, E = 1;
373
7. Setam codul simbolului pe liniile informationale;

374
375
376
377
378
379
380
381
382
383
384
385

8. Pauza 50 s;
Ca exemplu mai jos sa prezinta afisarea mesajului de salut UTM FIMET
ldi simv,0x55
;U
rcall Writes
ldi simv,0x54
;T
rcall Writes
ldi simv,0x4D
;M
rcall Writes
ldi simv,0x20
;' '
rcall Writes
ldi simv,0x46
;F

386
387
388
389
390
391
392
393
394
395
396

rcall
ldi
rcall
ldi
rcall
ldi
rcall
ldi
rcall
ldi
rcall

Writes
simv,0x49
Writes
simv,0x4D
Writes
simv,0x45
Writes
simv,0x54
Writes
simv,0x20
Writes

;I
;M
;E
;T
;' '

398
399

Fig.14. Spatiul cu simboluri in memoria displeiului.


Din tabel usor se poate gasi codul oricarui simbol introdus in memoria displeiului. De exemplu

400codul 55(baza 16) corespunde caracterului U, codul 0x54 corespunde caracterului T.


401
402

7.2.

Descrierea ceasului de timp real.

403
404

Microcircuitl dat are 60 baiti de memorie. Din care primii 8 sint de lucru. In ei se pastereaza

405timpul, data, ziua saptaminii. Iar altii ramasi din baiti sint destinati pentru cerintele utilizatorului. In ei
406se poate de pastrat de exemplu setarile curente sau alte date. Normal ca daca alimentarea de rezerva va

407disperea informatia se va pierde. Tot luctrul cu cieasurile (cititul si setatul orei si timpului ) se reduce la
408aceia ce trebue de scris sau de citit celulele de memorie respective.

409
410

Tabelul 1. Memoria interna a ceasului de timp real.

412
413

Toate numerile in memorie se pastreaza in cod binar-zecimal. Aceasta inseamna ca in fiecare bait

414poate sa se pastreze deodata doua cifre. De eczemplu 023- contie cifra 2 si cifra 3. Pentru fiecare cifra
415se aloca 4 biti. Aceasta este pefacu pentu comoditate si economie de memorie. Inafara de ora si data in
416memorie se mai pasgtreaa si citeva biti al setarilor. Care sunt :
417
Clock Halt dirijeaza cu ceasul. Cind bitul este setat apoi ceasul este oprit (nu numara timpul).
418Pentru a porni ceasul ca sa numere timpul este necesar de a inscri in acest bit 0. Dupa conectarea
419batereii de alimentare rezerva acest bit este setat si nu numara timpul. Trebue de mentionat aceasta.

420

24/12 ascesta este bitul de alegere regimului ceasului. Daca se foloseste regimul de 12ore

421atunci al cincilea bit arata AM sau PM acum. Daca bitul este egal cu 1 atunci PM. In regim de 24 de
422oreacest bit se foloseste pentru pastararea zecimilor de ceas inpreuna cu bitul 4.
423
Output seteaza starea pinului SQW/OUT. Daca bitul este setat pe pin este 1 logic. Dacai
424resetat apoi este 0 logic. Pentru a manipula in asa fel bitul SQWE trebue sa fie resetat.
425
SQWE- cint bitul este setat la pinul SQW/OUT apar impulsuri dreptunghiulare.
426
RS1,RS0- cu aceste bituri se seteaza fregventa impulsurilor. Depaenenta frecventei de
427combinatia bitilor se arata in tabelul de mai jos.
428

429

430
431

Tabelul 2. Dependenta frecventei de combinatia bitilor.

432

7.3.

Descrierea termometrului digital.

433
434

Principiul masurarii temperaturii este bazat pe compararea fregventelor a doua generatoare.

435Frecventa unuia dintre generatoare nu depinde de temperatura, iar fregventa al doilea generator se
436schimba odata cu schimbarea temperaturii. Diferenta dintre frecventele acestor doua generatoare si
437stabilesc valoarea temperaturii. Codul de opt biti bit cu bit incepind cu bitul inferior a aplica pe linia de
438legatura. Al noualea bit stabileste semnul temperaturii. Daca al noualea bit este setat in unu atunci
439temperatura are semnul minus si invers. Transmiterea fiecarrui bit dureaza 60mks. Daca durata

440nivelului jos pe linie este de la 1 pina la 15mks atunci impulsul se identifica ca unu logic. Zero logic se
441identifica atunci cind durata impulsilui este de la 15 pina la 60mks.
442
443

7.4.

Descrierea protocolului 1-WIRE pentru termometrul digital

444
445

Pentu a incepe lucrul cu senzorul de temperatura microcontrollerul trebue sal initializeze prin

446transmiterea comenzilor necesare. Vom analiza destinatia fiecarei comenzi care conduc cu lucrul
447senzorului de temperatura.

448

Se prezinta instructiunile de initializare, si mai jos se va descrie metode de lucru cu protocolul 1-

449wire. Alimantarea de la linie (Read Power Supply) [0xB4]. Dupa acesta comanda senzorul trece la
450alimantarea de la linie. In component senzorului de temperatura se afla un condensator, care se incarca
451de la nivelul inalt al liniei. Inainte de a se adresa la senzorul de temperatura microcontrolerul ytrebue
452sa pastreze un interval de timp, necesar incarcarii condensatorului.
453
Transmiterea datelor pe o singura linie se infaptuieste cu impulsuri de nivel jos, dar de durata
454diferita. Impulsul va fi perceput ca 1 logic daca durata lui nu este mai mare ca 15 mks . vezi desenul
455de mai jos. In cazul cind durata impulsului este mai mare decit 15mks atunci bitul trimis se percepe ca

4560. Durata unui bit de informatie este egal cu 60mks. De aicea si avem asa de multe variante de durate
457de impuls: nivelul logic 0-1....15mk, nivelul logic 1-16...60 mks.

459
460

Fig.15. Diagramele de timp a sinei 1-Wire

462
463

Fig.16. Diagramele de timp a sinei 1-Wire

465
466

Fig.17. Diagramele de timp a sinei 1-Wire


Pentru a pregati senzorul de temperatura pentru primirea informatiei microcontrolerul trebue sa

467trimita in linie un impuls de resetare (Reset) vezi desenul de mai sus. Impulsul de resetare trebue sa
468aiba durata de 480...960mks. In raspuns la resetarea facuta de microcontroller senzorul de temperatura
469trimite impulsul de prezenta (Presence). Daca in dispozitiv nu este prevazut deconectarea senzorului
470atunci impulsul de prezenta pentru a simplifica programa putem sa nu il controlam, da sa uplem acest
471timp cu pauza (aprohimativ 100mks). Durata impulsului Presence poate fi in limitele 60...240mks.

472

Daca la o linie sint conectate mai multe senzoare de temperatura atunci controlul impulsului de

473prezenta este obligatorie. Inaiintea de primire fiecarui bit de informatie de la senzor microcontrollerul
474trebue sa trimita un impuls scurt de gatinta (crerere) cu durata de 1...3mks.
475
476

7.5.

Descrierea protocolului I2C

477
478

Protocolul I2C a fost dezvoltat pentru a crea un canal de comunicatie intre circuite integrare (CI).

479

I2C consta fizic in linii 2 active i o conexiune de impamintare. Liniile active sint denumite

480SDA i SCL, Ambele linii sint bi direcionale. SDA este Serial Date Line iar SCL este Serial Clock
481Line.
482
Orice device conectat la bus are adresa sa unica fara a conta daca este MMU , driver LCD ,
483memorie sau ASIC. Fiecare din aceste cipuri poate primi si / sau transmite depinzind de
484functionalitatea dorita. Evident un driver LCD poate doar primi in timp ce o memorie sau un dispozitiv
485I/O poate primi si transmite date.
486
I2C este un bus multi-master. Astfel pe in I2C bus pot fi conecate mai multe circuite integrate
487capabile sa initieze transferuri de date. Protocolul I2C specifica ca integratul care initializeaza

488conexiunea este considerat Bus Master . In consecinta restul circuitelor conectate la I2C sint privite ca
489Bus Slaves.
490
Cum Bus Master sint microcontrolere(MCU) iata cum arata o secventa de comunicatie pe I2C.
491
MCU trimite secventa START . In acest moment toate circuitele de pe bus trec in modul
492receptie.
493
MCU trimite ADRESA circuitului cu care vrea sa comunice impreuna cu flagul operatiei
494( READ / WRITE ) .
495
Circuitele compara ADRESA cu adresa proprie si daca nu ii este destinat mesajul asteapta
496conditia de STOP.

Daca un circuit are ADRESA dorita de MCU atunci chipul va produce un mesaj

497ACKNOWLEDGE.

Apoi se trece la transferul datelor. Cind s-au terminat de transferat datele se

498trimite secventa de STOP.


499
Acum cind am descris modurile de lucru cu taoata periferia conectata la microcontroller trecem
500in sa la descrierea algoritmului programei.
501
Corpu l principal al programei prezinta blocurile 1-8, prelucrarea butoanelor prezinta 16-23,
502plelucarea informatiei de la dispozitivele periferice si lucrul cu ele prezinta blocurile 10-15.

503
START

1
Def. variabile
2
Perm.
intreruperile

Timer1_com
p1

10

Interz.
intreruperile
11
Primim t-ra

12

Set. Porturile
13

4
Set taimerul

Afisam
ceas,data

5
Initializare
LCD

Afisam t-ra
15

6
Initializare
Term

14

Perm.
intreruperile

Initializare
Ceas

PRESS

RETURN

16

Press

Interz.
intreruperile

STOP

20
17

18

Perm.
intreruperile
21

*but
apas ?

D
a

+but
apas ?Nu
-but
apas ?

D
a

RETURN

Incr
23

22

19
dec

LCD

Nu

504
505
506

Fig 18 Algoritmul programei


Duapa cum sa mentionat mai sus programul a fost cules compilat si emulat in mediul de

507programare AVR Studio 4.


508
Mai jos prezint informatia generata de AVR Studio ca rezultata a compilarii.
509In memoria flesh [.cseg] programul ocupa 2048 bytes ceia ce prezinta 79.0% din toata memoria
510isponibila. Ddtele [.dseg] ocoupa 13.3%. Im memoria eeprom [.eseg] 0.0%.
511
512
ATtiny2313 memory use summary [bytes]:
513
Segment Begin End
Code Data Used Size Use%
514
---------------------------------------------------------------

515
516
517
518
519
520

[.cseg] 0x000000 0x000652 1586 32 1618 2048 79.0%


[.dseg] 0x000060 0x000071
0 17 17 128 13.3%
[.eseg] 0x000000 0x000000
0
0
0 128
Assembly complete, 0 errors. 7 warnings
8. Elaboarea ghidului de utilizare a dispozitivului proiectat

521
522Pentua a seta ceasurile si calendarul apasati "Set". Apasind "Set" o singura data nimerim in regimul
523setarii minutelor. Cu butoanele "plus" si "minus" setam minutele. Apasind "set a doilea oara nimerim

524in regimul setarii orei." Apasind al treilea oara nimerinm in setarea zilei de saptamina (nu se indica ).
525Mai departe data, luna, anul. Apasind de a saptelea oara Set iesim din regimul de setare.
526

Minus

LCD1
LM016L

VCC

R2
11k

R3

D0
D1
D2
D3
D4
D5
D6
D7

11k

R4

7
8
9
10
11
12
13
14

RS
RW
E
4
5
6

VSS
VDD
VEE

R1
11k

Plus
SET

1
2
3

5.1k

U4
5
4
1
2
3
6
7
8

PA0/XTAL1
PA1/XTAL2
PA2/RESET

PB0/AIN0/PCINT0
PB1/AIN1/PCINT1
PB2/OC0A/PCINT2
PB3/OC1A/PCINT3
PD0/RXD
PB4/OC1B/PCINT4
PD1/TXD
PB5/MOSI/DI/SDA/PCINT5
PD2/INT0/XCK/CKOUT
PB6/MISO/DO/PCINT6
PD3/INT1
PB7/USCK/SCL/PCINT7

12
13
14
15
16
17
18
19

R5
5.1k

U3
6
5
7

SCL
SDA

X1

528

Fig. 19. Schema principiala simulata in Proteus.

529
530Concluzie
531
532

In aceasta lucrae de curs sa arat pas cu pas etapele de proiectare ceasului si termometrului pe

533baza de microprocesor. Dupa primirea sarcinii am trecut la analiza surselor biografice prezintate mai
534jos. Sa ajuns la concluzia de folosit microprocesorul Atiny2313 deoarece acest microprocesor este
535similar cu microprocesorul Atmega8 care sa studiat la disciplina microprocesoare. Attiny2313 este

536un microprocesor cu periferie mai saraca dar cu pret corespunzator si care foarte bine rezolva
537sarcinilile puse in aceasta lucrare de curs.
538
In prim plan sa pus precizia cu care o sa numaram timpul si cu care o sa masuram temperatura.
539Din aceste considerente am ales senzori inteletuali cu precizie destul de mare si care necesita minimul
540elemente adaugatoare. Dar un dezavantaj foarte considerabil poate fi comunicarea dintre ceas,
541termometru si microprocesor destul de complicata si greu de realizat in limbajul asembler. Dar aceasta
542problema sa rezolvat prin folosirea la scrierea programei a fisirerelor incluse cu descrierea
543protocolalelor de comunicare si initializare.

544

Programul a fost scris si compilat in mediul sost AVR Studio 4 in limbajul de programare

545assembler. Ceia ce a dat volum programului dar in rest mi-a aprofundat cunostintele despre structura
546interna a microcontrolerului.
547
Dispozitivul proiectat are avantaje fata de alte realizari prin metoda masurare, numarare si
548schemotehnica simpla.
549
In final pot concluziona ca am avut o sarcina interesanta pe care am efectuat-o cu succes
550totodata acumulind o experienta in proiectarea dispozitivelor.
551
552
553

554
555
556
557
558
559
560
561
562
563
564
565

566
567Bibliografie
568
569
570

2.

1. . . . " PIC "


. . I2 . .: -, 2002. 192

571. ( )
572 3. . AVR. . /. . .: 573 -1, 2006. 272 .: . ( ).

574

4.

.. . .: ,

5752005. 256 .: .
576 5. 1) .., CodeVisionAVR , 2008-600M;
577 6. 2) . ., C AVR PIC ,
5782006;
579
Surse biografice din internet
580 7. AVR Studio
581
582
583
584

585
586
587
588
589
590
591
592
593
594
595

596
597
598
599
600
601
602
603
604
605
606
607

608
609
610
611
612

613

Anexe

614
615
616
617
618

193

Anexa1. Listingul programei


619;*****************************************************************
620;Autor:
Lasco Marina
621;Data:
2014
622;Versiunea:
beta :)
623;Nume proiect: nivelul fluidului in rezervor
624;Procesor:
625;Tactarea: 8MGZ de la oscilator intern
626
627;TERMOMETRU, CEAS, CALENDAR
628;Portul PC2 se folos pentru 1-Wire la care este conectat ds18b20
629;*******************************************************************
630
631.include "tn2313def.inc"
; AVR ATtiny2313
632.include "macros.inc"
; macrosurile adaugatoare
633.include "ds1820.inc"
; descrierea comenzilor senzorilor
634
635;*****DEECLARARI***************************************************
636; registri de lucru. se folosesc pentru prelucrarea algoritmului
637
638.def
Temp
= r18
639.def
Temp1
= r19
640.def
Temp2
= r20
641.def
button
= r22
642.def
Simv
= r23
643.def
Kur
= r24
644
645;============================================================
646;segment date in RAM - celule ajutatoare
647;============================================================
648
649setRAM:
650;SRAM baitul superior de adresa SRAM=0x01
651.equ Sek = 0x10
;valoarea curenta a SEC
652.equ Min = 0x11
;valoarea curenta a MIN
653.equ Hour = 0x12
;valoarea curenta a OREI
654.equ Date = 0x13
;valoarea curenta a DATEI
655.equ Month = 0x14
;valoarea curenta a LUNII
656.equ Year = 0x15
;valoarea curenta a ANULUI
657
658;=============================================================
659; segment de cod - programa
660;=============================================================
661.dseg
662
663
clock: .byte
7
; sec, min, ore, ziua sapt, num ziua, luna, an
664.cseg
665
.org
0
; si, incepem!!!!
666
667;=============================================================
668; Vectorii intreruperilor (se foloseste numai una !!!!)
669;=============================================================
670rjmp Reset
671rjmp INT_0
672rjmp INT_1
673rjmp Timer1_capt1
674rjmp Timer1_comp1
675rjmp Timer1_OVF1
676rjmp Timer0_OVF0
677rjmp UART_RX
678rjmp UART_UDRE
679rjmp UART_TX

194
195

26

196
680rjmp ANA_COMP
681
682
683;Reset:
684INT_0:
685INT_1:
686Timer1_capt1:
687;Timer1_comp1
;taimerul unu in regim de comparatie
688Timer1_OVF1:
689Timer0_OVF0:
690UART_RX:
691UART_UDRE:
692UART_TX:
693ANA_COMP:
694
reti
695
696;=============================================================
697; includem biblioteca cu descrierea LCD
698.include "LCD16S2D.asm"
699;=============================================================
700; includem biblioteca cu descrierea i2c
701.include "i2c.asm"
702;=============================================================
703; includem biblioteca cu descrierea 1-Wire
704.include "1-wire.asm"
705;=============================================================
706
; macrosul ajutator de inscriere in 1-Wire
707
.macro Send_1w
708
ldi Temp, @0
; primul parametru
709
mov r0, Temp
710
rcall
Send1w
; inscriem (trimitem)
711
.endmacro
712
713;=============================================================
714Reset: ; de aici se incepe insasi codul de lucru (un fel de functie main :)
715;=============================================================
716
ldi Temp,0b011110000
; setam porturile
717
out DDRB,Temp
718
ldi Temp,0b11111111
; setam porturile
719
out DDRd,Temp
720
ldi Temp,RamEnd
; stabilirea indicatorul de stiva(
721
out SPL,Temp
722
723
ldi Temp1,0b01000000
724
out Timsk,Temp1
;permitem intreruperile comparatorului
725
726
ldi Temp1,0b00000100
727
out Tccr1b,Temp1
;semnalul de tactare /256
728
729
ldi Temp1,0xff
730
out Ocr1ah,Temp1
731
ldi Temp1,0xff
732
out Ocr1al,Temp1
;inscriem numarul pentru comparatie
733
734;==============================================================
735;Lucrul cu LCD
736
737
rcall Delay40mks
; facem o pauza inainte de pornire
738
rcall Init_LCD16s2d
; initializam LCD
739
rcall Write_CGRAM
; cream un simbol propriu
740
741;==============================================================
742
743;==============================================================
744; Setam regimul ds18b20
745
rcall
reset1w
;resetam 1-Wire
746
Send_1w CMD_SKIP_ROM
; comanda "sarim peste adresa"

197

198
747
send_1w CMD_W_SCRATCHPAD
; inscriem in buferul interior (registri)
748
send_1w 0b00000000
; TL
749
send_1w 0b00000000
; TH
750
send_1w 0b01111111
; Registrul de configurare
751
752;==============================================================
753;Initializam ceasurile
754
clr Temp
;curatam
755
rcall IniSek
;pornim ceasurile (Temp<128)
756
sei
; permitem intreruperile
757
758;==============================================================
759; Ciclul de baza de lucru
760;==============================================================
761
main_loop:
762
rcall Press
; ciclam. asteptam intreruperea
763
rjmp
main_loop
;
764
765
766;==============================================================
767;Prelucram intreruperea
768;==============================================================
769
770
Timer1_comp1:
771
ldi Temp,0
;resetam taimerul
772
out TCNT1H,Temp
773
out TCNT1L,Temp
774
775; primim rezultatul masurarii temperaturii
776
rcall
reset1w
; resetam 1-Wire
777
Send_1w CMD_SKIP_ROM
; comanda "sarim peste adresa"
778
Send_1w CMD_R_SCRATCHPAD
; camanda "citim registrii"
779
rcall
readbytes1w
; primim datele
780
rcall
reset1w
; resetam 1-Wire
781
Send_1w CMD_SKIP_ROM
; comanda "sarim peste adresa"
782
Send_1w CMD_CONVERT_T
; comanda "masuram temperatura"
783
784; transformam rezultatul masurarii temperaturii
785
786
ldi Kur,0b11000000
; Cursorul la simbolul 0 din rindul 2
787
rcall WriteCmd
; setam cursorul
788
789;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
790
ldi
simv,0x55
;U
791
rcall
Writes
792
ldi
simv,0x54
;T
793
rcall
Writes
794
ldi
simv,0x4D
;M
795
rcall
Writes
796
ldi
simv,0x20
;' '
797
rcall
Writes
798
ldi
simv,0x46
;F
799
rcall
Writes
800
ldi
simv,0x49
;I
801
rcall
Writes
802
ldi
simv,0x4D
;M
803
rcall
Writes
804
ldi
simv,0x45
;E
805
rcall
Writes
806
ldi
simv,0x54
;T
807
rcall
Writes
808
ldi
simv,0x20
;' '
809
rcall
Writes
810;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
811
812
813
lds Temp, Buffer
; baitul inferior a rezultaului

199

200
814
lds
Temp1, Buffer+1
; baitul superior a rezultatului (simbol)
815
LSL Temp1
; il mutam . deacum el va fi in flagul C
816
brcc
no_minus
; daca nu a fost transfer il lsam
817
NEG Temp
; negativ
818
COM Temp1
; il inversam
819
820; afisan simbolul"-"
821
822
ldi simv,0x2d
823
rcall
Writes
; afisan simbolul"-"
824
inc
kur
825no_minus:
826
827
LSR Temp
828
LSR Temp
; primim un numar intreg a gradelor prin deplasari
829
LSR Temp
830
LSR Temp
831
andi
Temp,0b00001111
; taem dupa sablon
832
LSL Temp1
; primim un numar intreg a gradelor prin deplasari
833
LSL Temp1
834
LSL Temp1
835
andi
Temp1,0b01110000
; taem dupa sablon
836
ADD
Temp,Temp1
837
838
839
rcall
bin2bcd8
; transformam temperatura in cod binar-zecimal
840
tst Temp1
841
BREQ
M0
; controlam de 0 baitul superior
842
ldi
simv,0x30
; coeficient de corectie pentru indicator
843
ADD
simv,temp1
;
844
845;afisam valoarea bitului inferior
846
rcall
Writes
; afisam simbolul
847
848M0:
849
850; afisam valoarea bitului superior
851
ldi
simv,0x30
852
ADD
simv,Temp
; coeficient de corectie pentru indicator
853
rcall
Writes
; afisam simbolul
854; afisam simbolul "."
855
ldi
simv,0x2e
856
rcall
Writes
857
858; ne ocupam cu partea dupa virgula. zecimala
859
lds Temp, Buffer
; baitul inferior a l rezultaului
860
andi
Temp,0b00001110
; taiem dupa shablon
861
862
MOV
temp1,Temp
863
add Temp,Temp1
; termometrul masoara multiplu la 0,0625
864
add Temp,Temp1
; deaceia immultim la 6
865
add Temp,Temp1
866
add Temp,Temp1
867
add Temp,Temp1
868
add Temp,Temp1
869
870
rcall
bin2bcd8
871
ldi
simv,0x30
872
ADD
simv,Temp1
; coeficient de corectie
873
rcall
Writes
; afisam
874
875; afisam "gradele celsius"
876
ldi
simv,0
877
rcall
Writes
878
ldi
simv,0x43
879
rcall
Writes
880

201

202
881
ldi
simv,0x20
; niste lacune
882
rcall
Writes
883
ldi
simv,0x20
884
rcall
Writes
885
886no_print:
887;================================================================
888
889rcall ReadClk
;citim ceasurile-calendar
890rcall LSD
;afisam ceasurile calendar
891reti
892
893;***********************************SUBPROGRAMELE****************************
894;afisam ceasurile si calendarul
895LSD:
896
ldi Kur,0b10000000 ; cursorul la simbolul 0 al 2 rind
897
rcall WriteCmd
; setam cursorul
898
899
lds Temp, clock+2
;luam ceasurile
900
rcall bcdout
;convertim si afisam binar-zecimalele
901
902
903; Afisam simbolul ":"
904
ldi
simv,0x3A
905
rcall
Writes
906
907
lds Temp, clock+1
;luam minutele
908
rcall bcdout
;convertim si afisam binar-zecimalele
909
910
ldi
simv,0x20
;lacuna
911
rcall
Writes
912
ldi
simv,0x20
;lacuna
913
rcall
Writes
914
ldi
simv,0x20
;lacuna
915
rcall
Writes
916
917
lds Temp, clock+4
;luam data
918
rcall bcdout
;convertim si afisam binar-zecimalele
919
920; afisam simbolul"/"
921
ldi
simv,0x2f
922
rcall
Writes
923
924
lds Temp, clock+5
;luam luna
925
rcall bcdout
;convertim si afisam binar-zecimalele
926
927; afisam simbolul "/"
928
ldi
simv,0x2f
929
rcall
Writes
930
931
lds Temp, clock+6
;luam anul
932
rcall bcdout
;convertim si afisam binar-zecimalele
933
934ret
935
936;==============================================================
937 ;convertim si afisam binar-zecimalele pe ecran
938bcdout:
939
940; afisam valoarea bitului superior
941
mov Temp1,Temp
942
andi
Temp,0b11110000
943
swap Temp
944
ldi
simv,0x30
945
ADD
simv,Temp
; coeficientul de corectie poentru indicator
946
rcall
Writes
; afisam simbolul
947
andi
Temp1,0b00001111

203

204
948
ldi
simv,0x30
; coeficientul de corectie poentru indicator
949
ADD
simv,temp1
;
950; afisam valoarea bitului inferior
951
rcall
Writes
; afisam simbolul
952ret
953;=======================================================
954;convertim cifra de 8 biti in binar-zecimal
955;la iesire Temp,rezultat Temp1-superior, Temp-inferior
956
957bin2bcd8:
958
clr Temp1
959bBCD8_1:subi Temp,10
960
brcs bBCD8_2
961
inc Temp1
962
rjmp bBCD8_1
963bBCD8_2:subi Temp,-10
964
ret
965;=======================================================
966;marim cifra binar zecimala
967;la iesire Temp, strica Temp1
968
969FuncInc:
970
mov Temp1,Temp
971
andi
Temp,0b11110000
972
andi
Temp1,0b00001111
973
CPI
Temp1,0b00001001
974
BREQ K1
; trecem dacai egal
975
inc
Temp1
;marim
976
add Temp,Temp1
977
ret
978K1:
979
ldi
Temp1,0b00010000
980
ADD
Temp,Temp1
;marim
981
ret
982
983
984;=======================================================
985;micsoram cifra binar zecimala
986;la iesire Temp, strica Temp1
987
988FuncDec:
989
mov Temp1,Temp
990
andi
Temp1,0b11110000
991
andi
Temp,0b00001111
992
CPI
Temp,0
993
BRNE K2
; trecem dacai egal
994
dec
Temp1
;micsoram
995
ldi
Temp,0b00001001
996
andi
Temp1,0b11110000
997ADD Temp,Temp1
998
ret
999K2:
1000
dec
Temp1
;micsoram
1001
ADD Temp,Temp1
1002
ret
1003
1004
1005;========================================================
1006;===========initializam ceasurile ===================
1007
1008IniSek:
;secundele - in temp, daca bitul 7=1
1009
;apoi oprim, sau daca nu pornim ceasurile
1010
sbis Pinb,pSDA
;linia ocupata
1011
rcall err_i2c
1012
ldi ClkA,0
;adresa registrului in secunde
1013
mov DATA, temp
1014
rcall write_i2c

205

206
1015
1016ret
1017
1018;=======================================================
1019;setam ceasurile, citim informatia din clock si o trimitem in
1020Setclock:
1021
sbis Pinb,pSDA
;linia ocupata
1022
rcall err_i2c
1023
1024
ldi DATA,0
;resetam secundele
1025
ldi ClkA,0
;adresa registrului de secunde
1026
rcall write_i2c
1027
brcs stopSet
;C=1 dacai eroare
1028
1029
lds DATA, clock+1
;luam minutele
1030
ldi ClkA,1
;adresa registrului de minute
1031
rcall write_i2c
1032
brcs stopSet
;C=1 adcai eroare
1033
1034
lds DATA, clock+2
;luam ceasurile
1035
ldi ClkA,2
;adresa registrului cesului
1036
rcall write_i2c
1037
brcs stopSet
;C=1 adcai eroare
1038
1039
lds DATA, clock+3
;luam ziua de saptamina
1040
ldi ClkA,3
1041
rcall write_i2c
1042
brcs stopSet
;C=1 dacai erpoare
1043
1044
lds DATA, clock+4
;luam numarul zilei
1045
ldi ClkA,4
1046
rcall write_i2c
1047
brcs stopSet
;C=1 dacai eroare
1048
1049
lds DATA, clock+5
;lauam numarul de luna
1050
ldi ClkA,5
1051
rcall write_i2c
1052
brcs stopSet
;C=1 dacai eroare
1053
1054
lds DATA, clock+6
;laum anul
1055
ldi ClkA,6
1056
rcall write_i2c
1057
brcs stopSet
;C=1 dacai eroare
1058
1059ret
1060stopSet:
1061rcall err_i2c
1062ret
1063
1064;=======================================================
1065
1066IniClk:
;setam iesirea SQW
1067
ldi ClkA,7
;adresa registrului conducere
1068
ldi DATA,0b00010000 ;iesirea SQW cu frecventa 1 HZ
1069
rcall write_i2c
1070
1071ret
1072;=======================================================
1073err_i2c:
1074
1075sei
1076ret
1077;=======================================================
1078
1079ReadSet:
1080
sbis Pinb,pSDA
;linia ocupata
1081
rcall err_i2c

207

ds1307

208
1082
ldi ClkA,7
;adresa registrului de conducere
1083
rcall read_i2c
1084
mov temp, data
;in temp valoarea registrului de conducere
1085
ldi ClkA,0
;adresa registrului secundelor
1086
rcall read_i2c
;in data valoarea registrului secundelor
1087
1088ret
1089
1090rcall ReadSet
;am citit baiturile
1091
;in temp registrul de conducere, in data secundele
1092
cpi DATA,$80
;dacai >= 128
1093
brsh setsek
;apoi zavodim ceasurile
1094
1095setsek:
1096
clr temp
1097
rcall IniSek
;setam secundele = 0
1098
1099;=======================================================
1100;===========citim ceasurile ===================
1101
1102
1103ReadClk:
;citim BSD din cesuuri
1104
ldi zL, low(clock)
1105
ldi zH, high(clock)
1106
ldi ClkA,0
;adresa secundelor in cesuri
1107
sbis Pinb,pSDA
1108
rcall err_i2c
1109
rcall start
1110
ldi DATA, 0b11010000 ; i-2adresa ceasuri+inscrierea
1111
rcall
write
1112
brcs stopR
;C=1 dacai eroare
1113
mov
DATA,ClkA ;adresa registrului secundelor
1114
rcall
write
1115
brcs stopR;
C=l dacai eroare
1116
rcall start
1117
ldi DATA, 0b11010001 ;adresa ceasurilor+citirea
1118
rcall
write
1119
brcs stopR
;C=1 dacai eroare
1120
set ;CK
1121
rcall read
;citim secundele
1122
brcs stopR
;C=1 dacai greseala
1123
st z+,DATA
;inscriem secundele in memorie
1124
rcall read
;citim minutele
1125
brcs stopR
;1 dacai greseala
1126
st z+,DATA
;inscriem minutele in memorie
1127
rcall read
;citim minutele
1128
brcs stopR
;1 dacai greseala
1129
st z+,DATA
;ceasurile le scrim in memorie
1130
rcall
read
;citim ziua saptaminii
1131
st z+,DATA
;ziua saptaminii inscriem in memorie
1132
brcs
stopR
;1 dacai greseala
1133
rcall
read
;citim daat
1134
brcs stopR
;1 dacai greseala
1135
st z+,DATA
;inscrim im memorie
1136
rcall
read
;citim luna
1137
brcs stopR
;1 dacai greseala
1138
st z+,DATA
;inscrim luna in memorie
1139
clt
;nu trimitem sfirsitul citirii
1140
rcall
read
;citim anul
1141
brcs stopR
; 1 dacai greseala
1142
st z+,DATA
;anul inscriem in memorie
1143
rcall stop
1144
ret
1145
stopR:
1146ret
1147
1148;==============================================================

209

210
1149;Prelucram butoanele
1150;==============================================================
1151
1152Press:
1153
CLi
; interzicem intreruperile
1154
in button,Pinb
;citim portul D
1155
andi button,0b00000100
;taiem dupa masca
1156
ldi Temp1,0b00000100
1157
eor button,Temp1
;convertim biturile dupa masca
1158
1159breq Nobut
; dacai 0 (nui apasat ->) iesim
1160
1161;intram in regimul setarii ceasurilor
1162
ldi Kur,0b11000000
; cursorul la simbolul 0 al rindului 2
1163
rcall WriteCmd
; setam cursorul
1164
ldi
simv,0x20
; stergem rindul de jos
1165
rcall
Writes
1166
ldi
simv,0x20
1167
rcall
Writes
1168
ldi
simv,0x20
1169
rcall
Writes
1170
ldi
simv,0x20
1171
rcall
Writes
1172
ldi
simv,0x20
1173
rcall
Writes
1174
ldi
simv,0x20
1175
rcall
Writes
1176
1177
ldi zL, low(clock+1)
1178
ldi zH, high(clock+1)
1179
ldi Temp2,0
1180
rcall Delay2
1181m1:
1182
in button,Pinb
;citim portul b
1183
andi button,0b00000010
;stergem dupa masca
1184
ldi Temp1,0b00000010
1185
eor button,Temp1
;inversam biturile dupa masca
1186
1187breq m2
; nui apasat +
1188
ld Temp, z
;luam
1189
rcall
FuncInc
;marim Temp
1190
st z,Temp
;inscriem in memorie
1191
rcall LSD
1192
rcall Delay2
1193m2:
1194
in button,Pinb
;citim porul b
1195
andi button,0b00000001
;taiem dupa masca
1196
ldi Temp1,0b00000001
1197
eor button,Temp1
;invertim biturile dupa masca
1198
1199breq m3
; nui apasat 1200
ld Temp, z
;luam
1201
rcall FuncDec
;micsoram Temp
1202
st z,Temp
;inscriem in memorie
1203
rcall LSD
1204
rcall Delay2
1205m3:
1206
1207
in button,Pinb
;citim D
1208
andi button,0b00000100
;taiem dupa masca
1209
ldi Temp1,0b00000100
1210
eor button,Temp1
;invertim biturile
1211
1212breq m1
; nui apasat ->
1213
inc ZL
1214
inc Temp2
1215
rcall Delay2

211

212
1216
CPI Temp2,6
1217
1218brne m1
; trecem daca nu-i egal
1219
1220rcall Setclock
1221
1222Nobut:
1223sei
; permitem intreruperile
1224ret
1225;================================================================
1226
1227Delay2:
1228LDI r26,15
1229Delay1:
1230dec r23
1231brne Delay1
1232dec r24
1233brne Delay1
1234dec r26
1235brne Delay1
1236ret

1237

213

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