Sunteți pe pagina 1din 127

Sorin NANU

EDITURA CONSPRESS
2013
Copyright © 2013, Editura Conspress şi autorul
EDITURA CONSPRESS
este recunoscută de
Consiliul Naţional al Cercetării Ştiinţifice din Învăţământul Superior

Lucrare elaborată în cadrul proiectului: "Reţea naţională de centre pentru


dezvoltarea programelor de studii cu rute flexibile şi a unor instrumente
didactice la specializarea de licenţă şi masterat, din domeniul Ingineria
Sistemelor"

Descrierea CIP a Bibliotecii Naţionale a României

NANU, SORIN

Microcontrolere : aplicaţii / Sorin Nanu – Bucureşti :


Conspress, 2013
Bibliogr.
ISBN 978-973-100-282-8

004
Carte universitară

CONSPRESS
B-dul Lacul Tei nr.124, sector 2,
cod 020396, Bucureşti
Tel.: (021) 242 2719 / 300; Fax: (021) 242 0781
INTRODUCERE

Volumul “MICROCONTROLERE-APLICAŢII” este destinat studenţilor din anul II


ai domeniului Ingineria Sistemelor, ca parte aplicativă pentru materia
“MICROCONTROLERE”.
Volumul conţine 10 lucrări de laborator cu microcontrolerul I80552 INTEL, o lucrare de
laborator cu microcontrolerul S12 FREESCALE, şi 4 proiecte cu microcontrolerul
ATMEGA32 de la ATMEL.

Scopul celor 11 lucrări de laborator este de a crea competenţe de lucru cu


microcontrolerul, cu interfeţele acestuia prin exemple simple. Se utilizează în special
funcţii de bibliotecă, dar unele dintre aplicaţii apelează la setarea regiştrilor.

Cele 4 proiecte se referă la sisteme automate în buclă închisă, realizate fizic, la care
studenţii trebuie să scrie câte un program de conducere.

1
2
LUCRAREA DE LABORATOR NR. 1
SISTEMUL DE DEZVOLTARE CU MICROCONTROLERUL
80C552,
NOŢIUNI INTRODUCTIVE

1. OBIECTIVELE LUCRĂRII:

 Prezentarea sistemului de dezvoltare cu microcontrolerul 80C552,


componentele hardware (placă de dezvoltare) şi software (compilator,
asamblor, mediu de programare şi comunicaţie, programe de aplicaţie),
 Familiarizarea cu modul de lucru cu placa (pornire, încărcare program
aplicaţii, lansare aplicaţii),
 Consolidarea cunoştintelor prin rularea unor exemple.

2. FUNDAMENTELE LUCRĂRII:
Sistemul de dezvoltare are componente
o hardware (placa de dezvoltare)
o software (compilator, asamblor, mediu de programare şi comunicaţie,
programe de aplicaţie exemplu)

2.1. Descrierea componentei hardware a sistemului de dezvoltare cu


microcontroler

Placa de dezvoltare este realizată în jurul microcontrolerului 80C552. Ea


cuprinde o serie de componente hardware şi software, care împreună formează un
sistem performant şi uşor de utilizat pentru dezvoltarea programelor de aplicaţie.

Microcontrolerul 80C552 este un microcontroler reprezentativ din familia 8051.


Principalele sale componente sunt următoarele:
- unitate centrala pe 8 biţi
- memorie internă RAM de 256 octeţi
- două numărătoare pe 16 biţi (timer/counter T0, T1)
- un numărător special cu facilităţi de capturare şi comparare (timer/counter T2)
- watchdog timer (T3)
- cinci porturi I/O pe 8 biti (port P0-P4)
- un convertor analog-numeric ADC pe 10 biţi cu 8 canale analogice multiplexate
(port P5)
- două ieşiri “pulse width modulated” (PWM0, PWM1)
- interfaţă serială RS-232
- interfaţă serială I2C

3
Placa de dezvoltare cuprinde următoarele elemente (fig.1.1):
- Sursa de alimentare de 5V
- Microcontroler 80C552 la frecvenţa de 11,0592 MHz (fără memorie program
internă)
- Memorie EPROM - 32 Ko, adresabilă ca memorie program
- Memorie RAM - 32 Ko, adresabilă atât ca memorie program cât şi ca memorie de
date
- Memorie nevolatilă EEPROM - 512 octeţi, adresabilă pe magistrala internă I2C
- Interfaţă serială RS-232 pentru conectarea la PC, cu conectorul asociat
- Conectori pentru extensie (J4, J5, J6) la care sunt disponibile toate semnalele de pe
placa de baza
- Tasta de reset si tasta de comutare memorie
- Jumperi de configurare
- Display cu cristale lichide LCD (2*16 caractere)
- Tastatură (16 taste)
- Port de intrare pentru citirea a 8 linii de semnal cu nivel MOS si TTL
- Port de ieşire pentru comanda a 8 linii de semnal cu nivel MOS si TTL
- Convertor numeric-analogic DAC pe 8 bişi, cu 1 canal unipolar (0-5V)

Toate aceste componente sunt comandate prin porturi de date, plasate într-o zonă de
memorie de date, care nu este ocupată de memoria RAM principală a plăcii (zona se
suprapune peste EPROM). Astfel, porturile microcontrolerului ramân libere pentru a fi
folosite in alte aplicaţii.

4
Fig.1 Placa de dezvoltare cu microcontroler I80552

2.2 Descrierea componentei software a sistemului de dezvoltare cu


microcontroler

Sistemul de dezvoltare cuprinde următoarele:


- Programul monitor de pe placa de baza (conţinut in EPROM)
- Mediul integrat de dezvoltare a programelor de aplicatie EZM ADV 8051 pe PC,
- Biblioteca de funcţii C pentru aplicaţii
- Programe exemplu

El permite dezvoltarea unor programe de aplicaţie complexe, scrise în limbajul C sau


în limbaj de asamblare, având acces la toate resursele microcontrolerului şi ale
componentelor de pe placă.

5
Programul monitor

Placa de baza a sistemului de dezvoltare conţine în EPROM un program monitor, care


permite conectarea plăcii la un calculator personal PC. Monitorul comunică pe linia
serială cu programul principal de pe PC, executând comenzile de încărcare pe placă a
unui program în cod .hex si lansând in executie a acestui program.

Mediul integrat de dezvoltare (EZM ADV 8051)

Acest mediu de dezvoltare are următoarele facilităţi:


- încărcarea, editarea şi salvarea programelor sursă, folosind editorul de text încorporat
- apelarea programelor utilitare pentru compilarea, asamblarea, link-editarea şi
generarea programului executabil în format .hex
- încărcarea programului executabil pe placă în memoria RAM şi lansarea în execuţie
- configurarea parametrilor programului

Pentru detalii vezi Anexa-Software.

Biblioteca de funcţii

Programatorul de aplicaţii pentru sistemul de dezvoltare are la dispoziţie o importantă


bibliotecă de funcţii C pentru gestiunea principalelor resurse ale plăcii.
Funcţiile din bibliotecă pot fi apelate din programele de aplicaţie scrise în limbajul C
sau în limbaj de asamblare.

Programe exemplu

Programatorul de aplicaţii pentru sistemul de dezvoltare are la dispoziţie programe


exemplu, pentru aproape toate componentele plăcii de bază, programe care folosesc
funcţii din biblioteca de funcţii.
Aceste programe exemplu pot fi încărcate pe placa şi testate, iar ulterior pot fi
modificate si folosite ca model pentru dezvoltarea programelor proprii.

3. Desfăşurarea lucrării

3.1 Temele lucrarii de laborator


• Se vor analiza programele exemplu:
Keyboard (Tastatura)
Display LCD
PWM (Pulse Width Modulation)
DAC (Digital Analog Converter- în româneste CNA- Convertor Numeric
Analogic)
InOut (Port Paralel)

6
• Pentru înţelegerea sistemului de dezvoltare cu microcontroler, se cere
să se lanseze în execuţie programele exemplu de la punctul anterior

3.2 Operaţiile necesare lansării în execuţie a unui program


Pentru a lansa un program de aplicaţie acesta trebuie să se găseasca în format .hex.
Mediul integrat EZM ADV conţine instrumentele încărcării şi lansării acestuia.
Paşii care trebuie urmaţi pentru aceasta sunt:
o Se conectează placa la PC cu ajutorul cablului serial, la conectorul RS232.
o Se alimentează placa introducând cupla alimentatorului de 9V AC la JP1.
Ca urmare, se aprinde LED-ul rosu D9.
o Se lanseaza mediul integrat EZM ADV 8051.

Atenţie, după instalare, la prima rulare, programul este setat implicit să folosească
portul serial COM2 care se poate să nu coincidă cu portul la care este conectată placa.
În acest caz se schimbă portul folosit de program, corespunzător portului de la
calculator, din setarea File/Configure Port (de regula COM1).

La pornire, programul aşteaptă resetarea plăcii. Acest lucru se face de pe butonul


RESET situat pe placă sub afişajul LCD.

Fig.2. Meniurile mediului de programare


După resetare se pot încărca programele în format HEX folosind opţiunea Load Hex
file din meniul File. (Fig.2)
Se selectează directorul specificat in lucrare (LCD, KEYB, DAC, etc) iar fisierul .hex
are numele main.hex. Toate aceste fisiere din directoarele demonstartive exemplu
trebuie păstrate nealterate. Ele vor îndeplini şi funcţia de model pentru dezvoltările de
programe ulterioare.

7
Fig.3. Meniul mediului de programare-
adresa 8000 de încărcare în memoria RAM a plăcii

Când se vor scrie programe noi, acestea se vor găsi în directorul PRJ, fişierul main.c.
După scrierea programului, acesta va fi compilat şi asamblat utilizând fişierul make.bat
care se găseşte în acelaşi director. Dacă se doreşte scrierea unui nou program, acesta se
va scrie tot ca main.c, având grijă ca vechiul program main.c să fie salvat dacă este
necesar.

După alegerea fişierului dorit, se începe încărcarea programului în placa de dezvoltare.


Spre sfârşit apare mesajul “HEX – Records Loaded Succesfully”, după care este
cerută adresa de început a programului (ASM Starting Position). Aici se introduce
valoarea 8000 (adresa de start a programului scrisă în baza 16). După apăsarea
butonului OK, se asteaptă încărcarea ferestrei Program Monitor cu date, după care se
poate rula programul din meniul Run/Go.

Fig.4. Meniul mediului de programare- adresa lansare a programului 8000H

8
4. PROGRAMUL LUCRĂRII
 se identifică toate elementele hardware descrise în partea teoreticî
(placa cu microcontroler, componente, cablu)
 se lansează mediul integrat EVZ-ADV-8051 urmându-se paşii descrişi în
paragraful 3.2.
 dintre proiectele exemplu existente
01_UART, 02_LCD, 03_KEYB, 04_INOUT, 05_PWM, 06_ADC, 07_DAC
 se alege proiectul 02_LCD şi se lansează programul de aplicaţie output.hex. Se
urmăreşte pe ecran defilarea caracterelor.
 Se alege proiectul 03_KEYB. Se lansează programul de aplicaţie output.hex. Se
tastează o tastă şi se vizualizează pe LCD tasta apasată.
 Se alege proiectul 05_INOUT. Se lansează programul de aplicaţie inout.hex.
Acest program citeşte portul paralel de intrare, afişează pe ecran configuraţia în
binar şi generează pe portul de ieşire aceeaşi dată.

Portul paralel are două componente


-portul paralel de ieşire (de nivel TTL), de 8 biţi, DOUT0-DOUT7 care pot fi
vizualizaţi pe LED-uri (fig.1), iar biţii DOUT0-DOUT3 sunt aduşi la 4 pini pe cupla
J5..
-portul paralel de intrare (de nivel TTL), de 8 bit, DIN0-DIN7, dintre care 4 biţi DIN0-
DIN3 sunt disponibili la cupla J5, iar DIN4-DIN7 la switch (vezi fig.5).

Fig.5. Configuraţia pinilor plăcii conectaţi la portul paralel

Se comută câte un pin al switch-ului cu ajutorul unui vârf de creion, şi se urmăreşte


modificarea stării LED-ului corespunzător, şi a datei de pe ecran.

Se conectează un fir metalic la linia DIN0 a portului paralel de intrare (conectorul J5)
si se face legatura alternativ cu pinul GND şi +5V al aceluiaşi conector şi se urmăreşte
pe ecran modificarea alternativă a stării bitului 0 din ‘0’ in ‘1’. Se urmăreste cu un
aparat de masură (voltmetru DC) şi pe pinul DOUT0 al conectorului J5 al portului
paralel de ieşire modificarea alternativă a tensiunii din 0V in 5V.
 Se alege proiectul 05_PWM. Se lansează programul de aplicaţie otput.hex.
Programul generează la ieşirea PWM1 (Pulse Width Modulation) pe pinul 38 al
conectorului J5, un semnal de o anumită frecvenţă selectabilă din taste. Se

9
conectează un osciloscop pe pinul PWM1 şi se măsoară frecvenţa, comparându-se
cu valoarea de pe display. Se apasă diverse taste obţinându-se diferite frecvenţe,
repetându-se operaţiile de măsurare şi comparare.
 Se alege proiectul 07_DAC. Se lanseaza programul de aplicatie dac.hex.
Programul permite generarea unei tensiuni continue la iesirea convertorului
numeric-analogic de pe placa (pinul 17 DACOUT al conectorului J4).
Pe ecran apare un număr între 0 şi 255. Tensiunea de ieşire variază proporţional cu
acest număr între 0V şi 10V. Se măsoară cu un aparat de măsură (voltmetru DC)
tensiunile generate la bornele conectorului J4, pinul DACOUT, şi se face un tabel de
corespondenţă.

Fig.6. Imaginea plăcii de dezvoltare cu microcontrolerul 80552

10
LUCRAREA DE LABORATOR NR. 2
EXECUŢIA UNEI APLICAŢII CU PLACA DE DEZVOLTARE
CU MICROCONTROLER
1 OBIECTIVELE LUCRĂRII:

 Asimilarea cunoştinţelor despre funcţiile de bibliotecă,


 Realizarea unei aplicaţii cu convertoarele analog-numerice si numeric-analogice
folosind funcţiile de bibliotecă.
 Familiarizarea cu procesarea programelor de aplicaţie scrise în limbajul C
(compilare, asamblare, link-editare),
 Scrierea în C a unor programe şi lansarea în execuţie pe placa cu microcontroler.

2 FUNDAMENTELE LUCRĂRII:

2.1. Noţiuni generale despre funcţiile de bibliotecă

Programatorul de aplicaţii pentru sistemul de dezvoltare, are la dispoziţie o importantă


bibliotecă de funcţii C pentru gestiunea principalelor resurse ale plăcii. Funcţiile din
bibliotecă pot fi apelate din programele de aplicaţie scrise în limbajul C sau în limbaj
de asamblare (respectând regulile de interfaţare C/asamblare).

Biblioteca de funcţii se află în directorul: \LIB.

Fişierul: AP_LIB.H , este fişierul header care conţine toate declaraţiile şi prototipurile
de funcţii necesare pentru utilizarea bibliotecii. El trebuie inclus în programele de
aplicaţie astfel:
#include “..\..\LIB\AP_LIB.H”

Biblioteca conţine module .OBJ. Astfel:


LIB_UART.OBJ - funcţii pentru întârzieri, interfaţa serială, iniţializare timer
T0
LIB_EEP.OBJ - funcţii pentru memoria nevolatilă EEPROM, I2C
LIB_LCD.OBJ - funcţii pentru afişajul cu cristale lichide LCD
LIB_KEYB.OBJ - funcţii pentru tastatură
LIB_PORT.OBJ - funcţii pentru porturile de intrare/iesire, buzzer, intrările
analogice (ADC)
LIB_DAC.OBJ - funcţii pentru convertorul numeric-analogic (DAC)
LIB_ASM.OBJ - funcţii pentru iniţializarea modului de lucru Trace Mode
De asemenea este disponibil un modul .LIB, obţinut prin combinarea tuturor modulelor
.OBJ intr-o singură bibliotecă (folosind programul utilitar LIB51):

11
AP_LIB.LIB - biblioteca de funcţii pentru sistemul de dezvoltare
Aceste biblioteci (modulele .OBJ sau .LIB), trebuie legate de modulele programului de aplicaţie în
faza de link-editare (folosind programul utilitar L51).

Exemple de programe se află în directorul: \SAMPLES.

Fiecare dintre sub-directoarele directorului \SAMPLES conţine câte un program exemplu care
foloseşte funcţii din biblioteca de funcţii.
De asemenea, aici se află şi fişierele: MAKE.BAT - pentru obţinerea programului executabil .HEX si
PCMON.INI - pentru iniţializarea mediului integrat.
Aceste programe exemplu pot fi încărcate pe placă şi testate, iar ulterior pot fi modificate şi folosite ca
model pentru dezvoltarea programelor proprii.

Lista tuturor funcţiilor disponibile împreună cu descrierea lor se afla în ANEXA SOFTWARE.
2.2. Elemente de conversie analog-numerica
Operaţia de conversie analog-numerică are rolul de a transforma valoarea unei mărimi electrice
(tensiune) într-un număr. Scopul acestei operaţii este de a permite introducerea într-un echipament de
calcul numeric (sistem cu microprocesor, microcontroler) informaţii despre o mărime fizică. Cum
echipamentele lucrează doar cu numere, mărimea fizică este transformată în număr, dispozitivul care
realizează aceasta operaţie poartă numele de Convertor analog-numeric (CAN).

2.2.1. Mecanismul conversiei analog-numerice


In continuare se prezintă principiul acestei operaţii, detalierea făcându-se la curs.
Pentru a transforma o tensiune într-un număr, aceasta se măsoară cu o unitate de măsură, care în acest
caz poartă numele de cuanta convertorului şi se notează cu q. Prin măsurare se determină de câte ori
cuanta q se cuprinde (parte întreagă) în tensiunea de măsurat1. Întotdeauna rezultatul este un număr
natural. În fig. 2.1. este prezentat un exemplu de conversie analog-numerică.

Fig. 1. Exemplificarea operaţiei de conversie analog-numerica


Dar care este valoarea cuantei q? Pentru determinarea valorii cuantei se definesc două mărimi
caracteristice convertorului analog-numeric: domeniul de tensiune de intrare şi numărul de biţi.
Domeniul de tensiune de intrare [Umax, Umin] reprezintă tensiunea minimă şi maximă care poate
fi aplicată la intrarea convertorului. Dacă se aplică o tensiune în afara acestui domeniu,
măsurarea se va face incorect sau se va deteriora convertorul.
Cele mai uzuale domenii de tensiune sunt:
- Pentru CAN bipolare : [-5, 5] V, [-10, 10] V,
- Pentru CAN unipolare : [0, 5] V, [0, 10] V.

1
Operaţiunea este identică cu orice măsurare, de exemplu măsurarea lungimii unei coli de hârtie de
format A4. În acest caz, se determină câţi milimetri cuprinde aceasta lungime, prin comparare cu o
riglă gradată. Numărul rezultat este 297. Prin urmare lungimea colii (care este o mărime fizică) este
transformată într-un număr. În cazul conversiei analog numerice, lungimea colii reprezintă tensiunea
de măsurat, milimetrul reprezintă cuanta q, numărul rezultat prin măsurare, 297, reprezintă
rezultatul conversiei care este furnizat echipamentului de calcul numeric.

12
Numarul de biţi N B reprezintă dimensiunea cuvântului care este transmis echipamentului de calcul
numeric şi care conţine rezultatul conversiei. Dimensiunile cele mai uzuale sunt: 8, 10, 12, 16, 24 bit.
Numărul maxim ce poate fi reprezentat pe N B bit este 2 N B -1.
Rezultă că domeniul de tensiune de la intrare poate fi reprezentat pe 2NB-1 cuante. De aici rezultă că o
cuanta este egală cu

[Umax, Umin]
q=
2 NB − 1

Exemplu : Pentru un convertor de [-10, 10] V de 12 bit, ce valoare are cuanta?


10 - (-10) 20
Raspuns : Conform formulei q = = = 0.00488 V adica 4.88mV
2 −1
12
4095
Exercitiu : Ce valoare are cuanta
- pentru un convertor analog numeric cu domeniul de [0, 5] V de 10 bit?
- pentru un convertor analog numeric cu domeniul de [-5, 5] V de 12 bit?

2.2.2. Calcularea rezultatului conversiei

Deoarece rezultatul conversiei este un număr natural N care arată de câte ori cuanta q se cuprinde în
tensiunea de intrare u i (la fel cum milimetri se cuprind in lungimea foii de hârtie), formula de calcul
este :
u 
N = i
q
unde [] semnifică parte întreagă din raport.
Înlocuind pe q din prima relaţie, rezultă
 ui 
N= . ∗ (2 N B − 1)
[U max − U min ] 
Exemplu : Pentru un convertor de [0, 10] V de 12 bit, ce rezultat va avea o conversie analogica pentru
o tensiune de intrare u i de 7 V ?
Raspuns : Pentru calcul se aplica formula [2.3]
7 
N =  . ∗ 4095 = [2866.5] = 2866
10 
Prin urmare, un CAN de domeniu [0,10] V, de 12 bit caruia i se aplică la intrare o tensiune de 7 V va
transmite la ieşire numărul 2866.
Exerciţiu: Pentru CAN din exemplul precedent, ce rezultat va furniza dacă la intrare se vor aplica 2.5
V? Dar pentru 3.8V ?

2.2.3. Codificarea rezultatului conversiei

Dacă pentru CAN cu domenii de tensiune de intrare unipolare numărul rezultat se exprimă în Cod
Binar Normal (CBN), pentru CAN cu domenii de tensiune bipolare există mai multe coduri uzuale:
- Cod Binar Deplasat (CBD)
 pentru valoarea minimă de intrare (corespunzătoare lui U min ) rezultă numărul minim 0,
 pentru valoarea maximă a tensiunii de intrare (corespunzatoare lui U max ) rezultă numărul
maxim adica 2 N B − 1 .
- Cod Semn Mărime (CSM)
 pentru valoarea zero a tensiunii de intrare se obţine numărul 0 sau un numar cu bitul de
semn “1”,
 pentru tensiuni pozitive se obţine un număr cu bitul de semn (cel mai semnificativ) pe
“0”,

13
 pentru tensiuni negative, se numără cuantele în valoare absolută iar numărului i se
setează bitul de semn pe “1”.
- Cod Complement faţă de 2 (CC2)- este codul utilizat în interiorul calculatoarelor
 Pentru valoarea zero a tensiunii de intrare se obţine 0,
 Pentru tensiuni pozitive se obţine un număr cu bitul de semn pe “0”,
 Pentru tensiuni negative se numără cuantele în valoare absolută, se complementează
biţii si se adună 1.
Un exemplu simplu, de convertor bipolar cu domeniul [-5, 5] V, pe 4 biti, cu toate cele trei variante de
codificare a rezultatului, este prezentat in fig. 2.

Fig.2. Exemplu de codificare pentru convertoare bipolare

3 DESFĂŞURAREA LUCRĂRII:

3.1. Tema aplicaţiei practice

Se consideră CAN (de intrare) de pe placa cu microcontroler, cu domeniul tensiune de intrare de [0,5]
V, pe 10 bit, şi CNA (de ieşire, DAC) cu domeniul de tensiune de ieşire [0, 10]V, pe 8 bit, cod binar
normal. Să se realizeze un montaj si să se scrie un program care să citească o tensiune de la intrare şi
să furnizeze la ieşire o tensiune egală cu cea de la intrare.

Indicaţii :
• Dacă prin conversia realizată de convertorul numeric analogic (CAN) a semnalului u i se
obţine numărul N i , se cere să se găseasca numărul N e care aplicat la convertorul numeric
analogic (CNA) generează la ieşire tensiunea u e egală cu u i .
• Dacă cele două convertoare sunt identice din punct de vedere al caracteristicilor statice (au
acelaşi domeniu de intrare şi acelasi număr de biţi) nu este necesară nici o prelucrare a
numărului N i (adica N e =N i )
• Dacă cele două convertoare nu sunt identice (şi acest caz este întâlnit în general), se urmăreste
raţionamentul : se consideră un convertor ca un element de transfer proporţional cu funcţia de
transfer k c astfel :

14
q CAN
Pentru ca u e =u i → N i ∙q CAN =N e ∙q CNA → N e = ∙N i
q CNA
Relatia de calcul este suficienta deoarece cele doua convertoare au ca U min aceeasi tensiune. (ex : in
cazul plăcii cu microcontroler studiate, U min CNA = U min CAN =0 [V])

3.2. Desfăşurarea lucrarii

3.2.1. Se va scrie programul de aplicaţie în limbaj C şi se va complila.


3.2.2. Se va realiza montajul din figură cu ambele alimentări oprite.
3.2.3. Se va alimenta placa cu microcontroler, apoi se va porni sursa si se va programa cu o
tensiune in domeniul [0, 5]V.
3.2.4. Se va incarca programul de aplicatie in format .hex si se va lansa in executie.

Crearea unui nou program si compilarea

Pentru crearea unui nou program, se urmează paşii:


1. In folderul APLIB\Samples se creeaza un nou folder cu numele dorit.

2. Se creeaza si editeaza in acest folder codul sursa al programului (in exemple, s-a folosit
main.c)
Ca punct de inceput se poate folosi codul de mai jos:

main.c:
#include <reg552.h> //headerul pentru 80C552
#include "..\..\lib\ap_lib.h" //headerul pentru APLIB

15
void main(void)
{
while (1) //bucla infinita
{
}
}

3. Se copiaza in folderul creat la punctul 1 fisierul STARTUP.OBJ aflat in folderul APLIB.


Acesta este un fisier binar scris in asamblare si compilat ce instruieste linker-ul sa situeze tot codul
programului in memorie incepand cu adresa 0x8000.

4. Se creeaza si editeaza un fisier de tip .BAT (in exemple make.bat). Acesta contine dupa cum
urmeaza:

make.bat:
@SET C51INC=C:\C51V41\INC\
@SET C51LIB=C:\C51V41\LIB
@SET CPU_TYPE=80C552
@SET CPU_VENDOR=Philips
@SET CPU_XTAL=0x00A8C000

@C:\C51V41\BIN\C51.EXE "main.c" INTVECTOR(0x8000)


@C:\C51V41\BIN\L51.EXE "startup.obj", "main.obj", "..\..\lib\ap_lib.lib" TO "output"
RAMSIZE(256) CODE(8000h)
@C:\C51V41\BIN\OH51.EXE "output"

@del *.
@del *.lst
@del *.m51
@del main.obj

Primele 5 linii conţin parametrii pentru compilator (calea către folderul ce conţine headerele standard
C:\C51V41\INC\, calea către folderul ce conţine librăriile standard C:\C51V41\LIB, tipul
microcontroller-ului 80C552, producătorul Philips, frecvenţa la care rulează microcontrolerul scrisă in
hexa 0x00A8C000 care corespunde frecvenţei de 11.0592 MHz).
Urmatoarele 3 linii conţin comenzile pentru compilare, asamblare + link-editare si conversia
formatului rezultat din binar in format de tip HEX:
- C:\C51V41\BIN\C51.EXE "main.c" INTVECTOR(0x8000) – compileaza fisierul program creat la
punctul 2, cu specificarea unui offset pentru adresele intreruperilor şi adresa de plasare a programului
fizic în memoria RAM (0x8000).
-C:\C51V41\BIN\L51.EXE "startup.obj", "main.obj", "..\..\lib\ap_lib.lib" TO "output"
RAMSIZE(256) CODE(8000h) – uneste fisierele STARTUP.OBJ (copiat la punctul 3), MAIN.OBJ
(creat de instructiunea anterioara) si libraria AP_LIB.LIB (ce contine functiile pentru placa de
dezvoltare), intr-un singur fisier binar output cu specificarea adresei codului (8000h) si dimensiunea
memoriei ram (256).
-C:\C51V41\BIN\OH51.EXE "output" – converteste fişierul din format binar creat anterior (output)
intr-un fişier binar de tip .HEX pentru a fi incărcat pe placa de dezvoltare.
Urmatoarele 4 comenzi şterg din folderul proiectului, fisierele intermediare create de compilator şi de
linker in urma executării comenzilor anterioare.

5. In acest moment, se poate trece la incărcarea programului output.hex pe placa de


dezvoltare.

16
O metoda mai comoda pentru crearea unui nou program presupune construirea folderului pentru noul
program în calea APLIB\Samples după care se copiază fişierele “main.c”, “startup.obj” şi
“make.bat” din oricare exemplu (01_uart, 02_lcd, etc.) în folderul tocmai creat. După editarea
fişierului main.c (scrierea programului de aplicaţie), se poate lansa în execuţie fişierul make.bat care
va genera fişierul binar de tip .HEX : output.hex ce poate fi încărcat pe placa de dezvoltare.

17
18
LUCRAREA DE LABORATOR NR. 3
GENERAREA DE SEMNALE LOGICE ŞI ANALOGICE
1. OBIECTIVELE LUCRĂRII:

 Generarea unor semnale cu ajutorul plăcii de dezvoltare


 Selectarea de la tastatură a semnalului generat
 Modificare de la tastatură a perioadei, a amplitudini sau a factorului de umplere
2.FUNDAMENTARE TEORETICĂ:

2.1. Prezentare generală

În lucrare se doreşte genenerarea a trei tipuri de semnale: dreptunghiular, dinte de fierăstrău,


sinusoidal. Tipul semnalului se selecteaza de la tastatură cu tastele “1”, “2”, respectiv ”3”. În funcţie
de semnal, de la tastele “*”/”#” se incrementează/decrementează: factorul de umplere pentru semnalul
dreptunghiular, perioada pentru dinte de fierăstrău sau amplitudinea pentru sinus.

2.2. Semnalul dreptunghiular

Fig. 1. Semnal dreptunghiular (tren de impulsuri)

Semnalul din Fig. 1 se poate obţine folosind trei resure hard de la placa de dezvoltare:
• Portul paralel de ieşire
• Ieşirea PWM
• Convertorul numeric-analogic.
În lucrarea de laborator se va utiliza ieşirea portului paralel.
A. Ca prim pas, se va genera un semnal de tip tren de impulsuri fără controlul perioadei, adică o
succesiune de tranziţii 0-1 şi 1-0. Vizualizarea se face cu ajutorul osciloscopului. Pentru aceasta,
programul va conţine în buclă funcţiile

While(1)
{outp_WritePort(0);
outp_WritePort(0xFF);
}

Această secvenţă va modifica toţi pinii portului paralel de ieşire de pe 0 pe 1 şi invers, cu anumită
întârziere.
Care este această întârziere?

19
Cum arată secvenţa de program dacă doresc să modific doar pinul 0 al portului? Dar dacă doresc
să modific pinul 3?

B. În al doilea pas, semnalul va avea perioada de 10ms, iar factorul de umplere variabil între 1/2 si
1/5 din perioadă. Temporizarea se realizează cu ajutorul funcţiei Delay(ms), iar vizualizarea se face cu
ajutorul osciloscopului.

La apasarea tastei # perioada va creste cu cate 1 ms pana la 30ms, respectiva la apasarea tastei *
perioada va scadea cu 1 ms pana la 1ms.

2.3. Semnalul dinte de fierăstrău

Fig. 2. Semnal dinte de fierăstrău

Semnalul se generează cu ajutorul convertorului numeric-analogic (DAC). Funcţia utilizată


pentru conversie este dac_WriteChannel(unsigned Data). La această placă de dezvoltare domeniul
pentru DAC este [0V…5V], pe 8 bit.
Valorile trimise catre DAC se obtin in urma operatilor de esantionare si cuantizare a semnalului
dinte de fierastau (Fig. 2 sus). Eşantionarea se realizează astfel încât să se obţină 6 valori (esantioane):
d[0]=0V, d[1]=1V, d[2]=2V, d[3]=3V, d[4]=4V, d[5]=5V. Următorul pas este cuantizarea acestor
tensiuni, pentru a afla numărul care trebuie introdus în convertorul numeric analogic (DAC) (DAC are
domeniul de iesire de [0, 5] V, pe 8 bit, cod binar normal).( vezi Fig. 2 jos).

La apasarea tastei # perioada va creste cu cate 6 ms pana la 50ms, respectiv la apasarea tastei *
perioada va scădea cu 1 ms până la 6 ms.

20
2.4. Semnalul sinus

v
Fig. 3. Semnal sinus

Ca şi semnalul anterior, semnalul sinus se generează cu ajutorul convertorului numeric-


analogic (DAC). Eşantionarea se realizează astfel incât să se obţină 12 eşantioane. Datorită simetriei
funcţiei sinus, trebuiesc calculate valorile doar pentru 4 esantioane: x[0]=sin(0), x[1]=sin(π/6),
x[2]=sin(π/3), x[3]=sin(π/2). Următoarele esantioane, x[4]…x[11], au valorile primelor 4 esantioane în
diverse combinatii (x(4)=x(2)=-x(8)=-x(10), x(1)=x(5)=-x(7)=-x(11), x(0)=x(6), x(3)=-x(9)).

3. PROGRAMUL LUCRĂRII

3.1 Generarea unui semnal dreptunghiular pe portul paralel


Se vor utiliza funcţiile de bibliotecă

outp_WritePort(0); //toţi biţii pe 0


outp_WritePort(0xFF); //toţi biţii pe 1
Delay(1000); //delay de 1000 ms

3.2 Generarea unui semnal dreptunghiular prin convertorul numeric-analogic

Se vor utiliza funcţiile de bibliotecă

dac_WriteChannel(150); //se generează 150 de cuante la ieşirea CNA


dac_WriteChannel(0); //se generează 0 cuante la ieşirea CNA

3.3 Generarea unui semnal dinte de fierăstrău prin convertorul numeric-analogic

21
Structura programului este:

void main(void)
{
unsigned char var;
while( 1 )
{
for (var=0, var=160, var++) dac_WriteChannel(var);

}
}

3.4 Generarea unui semnal sinusoidal prin convertorul numeric-analogic

Se va genera un semnal sinus pentru valorile 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330.
Valorile funcţiei sinus ∈[-1, 1].
Valorile parametrului functiei dac_WriteChannel ∈[0, 160]. Prin urmare este necesară scalarea
semnalului astfel:

grade val. sinus val.la CNA


0 0 80
30 0,5 120
60 0,86 149
90 1 160
.
.
330 ... -0.5 40

Programul este:

void main(void)
{
while( 1 )
{
dac_WriteChannel(80);
dac_WriteChannel(120);
dac_WriteChannel(149);
dac_WriteChannel(160);
dac_WriteChannel(149);
.
.
.
}
}

22
LUCRAREA DE LABORATOR NR. 4

CONSTRUIREA UNUI CEAS DE TIMP REAL


UTILIZAREA ÎNTRERUPERILOR.
1. OBIECTIVELE LUCRĂRII
 Prezentarea întreruperilor
 Familiarizarea cu utilizarea întreruperilor
 Realizarea unui ceas de timp real cu ajutorul întreruperii de depăşire a timerului T0
2. FUNDAMENTELE LUCRĂRII
2.1. Sistemul de întreruperi al microcontrolerului 80C552 recunoaşte 15 surse dinstincte de
întreruperi:
 2 întreruperi externe INT0 şi INT1
 2 întreruperi de depăşire pentru T0 şi T1
 Intrerupere pentru transmisia serială RS232 (recepţie sau transmisie)
 8 întreruperi pentru timerul T2:
 4 pentru captură (CT0, CT1, CT2, CT3)
 3 pentru comparare (CM0, CM1, CM2)
 una pentru depăşire T2
 întrerupere generată la finalul conversiei analog-numerice
 întrerupere generată de interfaţa serială I2C
Pentru a puntea utiliza o întrerupere, acesta trebuie validată. Validarea se realizează prin prin
setarea/resetarea bitului corespunzător din registrele de validare a întreruperilor IEN0 şi IEN1. Există
şi un bit de validare/invalidare globală a întreruperilor: bitul EA din registrul IEN0 (IEN0.7).

IEN0

EA - setat valideaza generarea de intreruperi, iar resetat invalideaza toate intreruperile


EAD - setat valideaza intreruperea de la ADC
2
ES1 - setat valideaza intreruperea de la interfata I C
ES0 - setat valideaza intreruperea de la interfata UART
ET1 - setat valideaza intreruperea de la Timer T1
EX1 - setat valideaza intreruperea externa 1
ET0 - setat valideaza intreruperea de la Timer 0
EX0 - setat valideaza intreruperea externa 0

IEN1

ET2 - valideaza intreruperea data de depasirea capacitatii lui T2


ECM2 - valideaza intreruperea de la comparatorul 2 al T2
ECM1 - valideaza intreruperea de la comparatorul 1 al T2
ECM0 - valideaza intreruperea de la comparatorul 0 al T2
ECT3 - valideaza intreruperea de capturare 3 de la T2
ECT2 - valideaza intreruperea de capturare 2 de la T2
ECT1 - valideaza intreruperea de capturare 1 de la T2
ECT0 - valideaza intreruperea de capturare 0 de la T2

23
Validarea unei surse de intrerupere presupune setarea bitului corespunzator din unul din
registrele IEN0 sau IEN1 precum si setarea bitului EA. Invalidarea unei surse de intrerupere se poate
face prin resetarea bitului corespunzator. Invalidarea tuturor intreruperilor se poate face prin resetarea
bitului EA.
Sursele de întrerupere se pot organiza de 2 nivele de prioritare prin regiştrii IP0 şi IP1. Dacă
există cereri simultate de pe acelaşi nivel de prioritate, ordinea de servire este următoarea: X0, S1,
ADC, T0, CT0, CM0, X1, CT1, CM1, T1, CT2, CM2, S0, CT3, T2. O rutină de tratare a întreruperii
poate fi intreruptă doar de o rutină de tratare de nivel superior.
IP0
PAD - stabileste niv. de intrerupere pentru ADC
2
PS1 - stabileste niv. de intrerupere pentru I C
PS0 - stabileste niv. de intrerupere pentru UART
PT1 - stabileste niv. de intrerupere pentru Timer 1
PX1 - stabileste niv. de intrerup. pentru intreruperea externa 1
PT0 - stabileste niv. de intrerupere pentru Timer 0
PX0 - stabileste niv. de intrerup. pentru intreruperea externa 0

IP1
PT2 - stabileste niv. de intrerupere pentru depasire la T2
PCM2 - stabileste niv. de intrerupere pentru comparatorul 2 al T2
PCM1 - stabileste niv. de intrerupere pentru comparatorul 1 al T2
PCM0 - stabileste niv. de intrerupere pentru comparatorul 0 al T2
PCT3 - stabileste nivelul intrerupererii de capturare 3 al T2
PCT2 - stabileste nivelul intrerupererii de capturare 2 al T2
PCT1 - stabileste nivelul intrerupererii de capturare 1 al T2
PCT0 - stabileste nivelul intrerupererii de capturare 0 alT2
0 = Prioritate mica
1 = Prioritate mare

2.2. Pentru temporizare se foloseste timerul T0, împreună cu întreruperea sa de depăşire.


Setările pentru iniţializarea timerului sunt realizate cu ajutorul funcţiei timer_InitTimer0() din cadru
bibliotecii de funcţii. Funcţia se apelează în main()
void timer_InitTimer0(void)
{
// Intrerupere la 10 milisecunde pentru cuartz de 11.0592 MHz
TL0 = 0x00;
TH0 = 0xDC; //T0=56320
TMOD = TMOD | 0x01; // Timer 16 biti - Modul 1
ET0 = 1; // Activează intrerupere T0
TR0 = 1; // Porneste Timer 0
EA = 1; // Autorizeaza intreruperile
}
În rutina de tratare a întreruperii (depăşire T0), pentru obţinerea unei noi întreruperi peste 10
ms, este necesară reîncărcarea în regiştri TL0 şi TH0 a unei valori astflel încât timerul să ajungă la
valoarea de 65535(2nr biţi-1) in 10 ms.
În timer există un divizor de 1/12 a frecvenţei de tact. Astfel timerul se incrementează cu o
frecvenţă de 11.0592/12 MHz(T≈ 1 µs). Numărul de incrementări necesar pentru o temporizare de 10
ms, se calculeaza după formula: n=10’000*(11,0592/12)=9215.
void timer_Update(void)
{
// Reincarca valoarea
TL0 = 0x00;
TH0 = 0xDC;
// Reset timer watchdog intern
PCON = PCON | 0x10;

24
T3 = 0x01;
}
În această rutină se incrementează o variabilă care se foloseşte pentru obţinerea secundei.

Pentru a obţine o întrerupere la 10 ms, funcţiile se apelează astfel în program :


#include <reg552.h>
#include "..\..\lib\ap_lib.h"
// Rutina de intrerupere depăşire pentru Timer0
Timer0() interrupt 1
{
timer_Update();
}
void main(void)
{
timer_InitTimer0();
while( 1 ){
....
}
}
Rutina Timer0 se va apela la fiecare 10 ms
2.3. Pentru lucrul cu tastatura, se foloseşte rutina de întrerupere la 10 ms pentru filtrarea software.
Astfel, tastatura se citeşte la fiecare 10 ms, iar dacă un cod de tastă este este citit consecutiv la 6 citiri,
tasta este validată. Altfel, se consideră că este o citire falsă.
Structura programului este:

#include <stdio.h>
#include "..\..\lib\ap_lib.h"
// Rutina de intrerupere pentru Timer0
Timer0() interrupt 1
{
timer_Update();
keyb_Update();
}

// Mesaje
#define MES_KEYBOARD " KEYBOARD "
#define MES_DOTTEDLINE "................"
#define MES_KPRESSED00 "0..............."
#define MES_KPRESSED01 ".1.............."
#define MES_KPRESSED02 "..2............."

void main(void)
{
unsigned Key;

lcd_InitDisplay();
keyb_InitKeyboard(0, 0);
timer_InitTimer0();

lcd_Write( 1, MES_KEYBOARD );
lcd_Write( 2, MES_DOTTEDLINE );

while( 1 )
{
// Toate tastele validate (din parametru se pot dezactiva taste)
if( Key = keyb_ScanKeyboard( 0xFFFF ) )
{
switch (Key)
{

25
case KEY_0 : lcd_Write( 2, MES_KPRESSED00 ); break;
case KEY_1 : lcd_Write( 2, MES_KPRESSED01 ); break;
case KEY_2 : lcd_Write( 2, MES_KPRESSED02 ); break;
}
}
}
}
3. PROGRAMUL LUCRĂRII
A. Realizarea unui cronometru cu ajutorul microcontrolerului 80C552, cu afisare pe LCD a orei in
formatul urmator:
mm : ss
B. Oprirea cronometrului cu tasta <1> şi repornirea cu tasta <0>
C. Afişarea textului ALARMA! la secunda 30 şi ştergerea acestui text la tastarea unui cod de 4
cifre <2463>

3.1. A. Temporizarea ceasului de timp real se face prin întreruperea de depăşire a timerului T0. Cu
ajutorul funcţilor timer_InitTimer0() şi timer_Update() se poate obţine o temprizare de 10ms.
Prin variabila t se contorizează numărul de întreruperi de 10ms.

Structura programului:
#include <reg552.h>
#include "..\..\lib\ap_lib.h"
// Rutina de intrerupere depăşire pentru Timer0
Timer0() interrupt 1
{
timer_Update();
t++;//incrementare contor
}
void main(void)
{
unsigned char t, s=0, m=0;
unsigned char msg[7]=” “;
lcd_InitDisplay();
timer_InitTimer0();

while( 1 ){
if (t==100) //a trecut o secundă
{ t=0; //resetare contor
s++; //incrementare secundă
if (s==60)
{s=0;
m++;
}
//afişare
msg[1]= m+0x30;
msg[2]= ‘:’;
msg[3]= s/10+0x30;
msg[4]= s%10+0x30;
lcd_Write(1, msg )
}
}
}

3.1.B. Oprirea ceasului cu tasta <1>

#include <stdio.h>
#include "..\..\lib\ap_lib.h"

26
Timer0() interrupt 1
{
timer_Update();
keyb_Update();
t++
}

void main(void)
{
unsigned Key;
unsigned char t, s=0, m=0;
unsigned char msg[7]=” “;
lcd_InitDisplay();
keyb_InitKeyboard(0, 0);
timer_InitTimer0();

while( 1 )
{
// Toate tastele validate (din parametru se pot dezactiva taste)
if( Key = keyb_ScanKeyboard( 0xFFFF ) ) //citeşte tasta
{
switch (Key)
{
case KEY_0 : var=0; break;
case KEY_1 : var=1; break;
}
}
if (t==100) //a trecut o secundă
{ t=0; //resetare contor
if(var=0) //doar dacă tasta 0 este apăsată se incrementează secunda
{
s++; //incrementare secundă
if (s==60)
{s=0;
m++;
}
//afişare
msg[1]= m+0x30;
msg[2]= ‘:’;
msg[3]= s/10+0x30;
msg[4]= s%10+0x30;
lcd_Write(1, msg )
}
}
} //de la while
} //de la main

3.2. La apăsarea tastei 1 se opreşte afişarea, dar cronometrul merge în continuare (lap time)
3.3. Adăugarea unei funcţii de alarmă la ceasul existent. Pe linia 2 a LCD-ului se va afişa mesajul
ALARMA!, iar la tastarea codului <2463>, mesajul se va şterge.

27
28
LUCRAREA DE LABORATOR NR. 5
TIMER-UL T2 ÎN REGIM DE CAPTURĂ

1. OBIECTIVELE LUCRĂRII:

 Fixarea unor elemente fundamentale de utilizare si programare a Timerului 2 al


microcontrolerului 80C552 în regim de captură
 Crearea de abilităţi de lucru- hardware si software – cu echipamentele de calcul specifice
automaticii

2. FUNDAMENTELE LUCRĂRII:

2.1. Timer-ul T2 al microcontrolerului 80C552. Generalităţi

Timer-ul T2 este un numărător pe 16 bit (TMH2 şi TML2) care poate număra impulsuri de ceas (când
este configurat ca Timer) sau semnale externe de la pinul T2 (când este configurat ca numărător),
printr-un circuit divizor programabil cu 1, 2, 4 sau 8. Pentru comanda lui se foloseste registrul
TM2CON si registri specifici ce vor fi descrisi ulterior.
Timer-ul T2 poate fi doar citit, nu poate fi înscris, iar resetarea se poate face de la semnalul RESET
extern sau de la semnalul RT2 extern (dacă acesta este validat prin bitul TM2ER din TM2CON).
Oprirea se face din registrul TM2CON biţii T2MS1 T2MS0.
La depăşire (Overflow) pe 8 sau 16 bit, se poate genera, dacă este validată, o cerere de întrerupere.
Adresa rutinei de tratare a întreruperii este aceeaşi, selecţia tipului de întrerupere (pe 8 sau 16 bit) se
face din TM2CON, cu biţii T2IS0 respectiv T2IS1. La întrerupere, se mai setează două fanioane, ce
trebuie resetate prin software, T2B0 şi T2OV din TM2CON respectiv T2IR. Setarea întreruperii se
face din registrul de întreruperi IEN1 bit 7.

Registrul de control a Timerului T2, TM2CON:


TM2CON

T2IS1 - validare generare întrerupere la depăşire capacitate T2 ( pe 16 biti )


T2IS0 - validare generare întrerupere la depăşire capacitate T2 ( pe 8 biti - octetul inferior )
T2ER - validare reset extern pentru T2;
T2B0 - fanion intrerupere depăşire capacitate T2, pe octet;
T2P1 T2P0 - stabilesc conţinutul registrului de divizare;
0 0 - factor de divizare 1 1 0 - factor de divizare 4
0 1 - factor de divizare 2 1 1 - factor de divizare 8
T2MS1 T2MS0 - selectare mod de lucru pentru T2;
0 0 - T2 este oprit; 1 0 mod test ( nu se foloseşte)
0 1 - se foloseste tact intern 1 1 semnalul de tact este extern la pinul T2.

29
Fig.1. Structura Timerului T2

2.2.Timer-ul T2 in regim de captura

Timerul T2 este conectat la 4 regiştri de capturare, CT0, CT1, CT2, CT3. Aceşti regiştri sunt încărcaţi
cu conţinutul timerului T2 (TMH2 şi TML2) atunci când microcontrolerul primeşte semnalele externe
CT0I, CT1I, CT2I, respectiv CT3I pe front pozitiv sau negativ. În momentul capturii, se setează
fanioane (flag) din TM2IR şi se poate genera de asemenea şi întrerupere.
Registrul care configurează T2 pentru procesul de capturare este CTCON:

CTCON
CTN3 - capturare pe frontul negativ (pentru CT3I)
CTP3 - capturare pe frontul pozitiv (pentru CT3I)
CTN2 - capturare pe frontul negativ (pentru CT2I)
CTP2 - capturare pe frontul pozitiv (pentru CT2I)
CTN1 - capturare pe frontul negativ (pentru CT1I)
CTP1 - capturare pe frontul pozitiv (pentru CT1I)
CTN0 - capturare pe frontul negativ (pentru CT0I)
CTP0 - capturare pe frontul pozitiv (pentru CT0I)

Registrul fanioanelor de întrerupere este TM2IR:


TM2IR
T20V - fanion de întrerupere la depăşire pe 16 biti
CMI2 - fanion de întrerupere corespunzător lui CM2
CMI1 - fanion de întrerupere corespunzător lui CM1
CMI0 - fanion de intrerupere corespunzător lui CM0

30
CTI3 - fanion de întrerupere corespunzător lui CT3
CTI2 - fanion de întrerupere corespunzător lui CT2
CTI1 - fanion de întrerupere corespunzător lui CT1
CTI0 - fanion de întrerupere corespunzător lui CT0

Fig.2 Detaliu de structura a T2 referitor la regimul de captura


3. DESFĂŞURAREA LUCRĂRII:
3.1. Tema lucrării
Să se realizeze un montaj pentru măsurarea unor impulsuri de nivel TTL, cu timerul T2 în regim de
captură. În cazul particular, semnalul va fi de perioadă 40 msec (0.04 sec) si factor de umplere 50%
(vezi fig.4)

Fig.3 Forma impulsului pentru lucrarea de laborator

3.2. Realizarea montajului

Pentru aducerea semnalului la o intrare de captură a timerului T2 se conecteazăa ieşirea generatorului


de semnal la intrarea CT0 a microcontrolerului (a se urmări schema de amplasare a componentelor pe
placa cu microcontroler din laborator). Semnalul se conectează şi la canalul 1 al osciloscopului (vezi
fig.4)

31
Fig.4. Realizarea montajului pentru realizarea aplicaţiei practice

3.3. Algoritmul de achiziţie a semnalului şi calcul a perioadei

Se prezintă în fig.5 ordinograma aplicaţiei cu explicaţiile fiecărui bloc.

32
In ordinogramă se disting trei module corespunzătoare la trei programe de implementare:
• Programul principal – in care in primul bloc se fac iniţializările:
o Programarea timerului T2 (prin SFR TM2CON)
o Programarea capturii (prin SFR CTCON)
o Programarea întreruperilor (prin SFR IEN0 si IEN1) de la captură şi T2 overflow
 iar in bucla infinită se calculează timpul între două întreruperi de captură
succesive şi se afisează pe ecran
• Rutina de tratare a întreruperii de captură (de la CT0) denumită RUT CAPTURA
• Rutina de tratare a întreruperii de la T2 – depăşire pe 16 bit.

33
4. PROGRAMUL LUCRARII

1. se verifică însuşirea părţii teoretice


2. se construieşte sistemul de măsură urmându-se paşii de la pct. 3.2.
Pentru o simplă punere în funcţiune a aplicaţiei scrise, se recomandă împărţirea
acesteia în componente după cum urmează:
a) verificarea corectitudinii afişării - se forţeaza paramentrul rutinei
toASCII la o valoare constantă (de exemplu 21234). Se urmăreşte
afişarea corectă pe ecranul LCD.
b) Verificarea setărilor şi intrările în rutinele de tratare a înteruperii- se
introduce afişarea pe rând, în cadrul celor două rutine, a unor mesaje
(de exemplu ”rutina captură” si ”rutina T2depăşire”).
3. se setează la generatorul de semnal parametrii semnalului de ieşire către placa cu
microcontroler (semnal dreptunghiular, aplitudine 0-5V).
4. se urmăreşte pe osciloscop dinamica şi parametrii semnalului de intrare dat.

34
LUCRAREA DE LABORATOR NR. 6
TIMERUL T2 ÎN REGIM DE COMPARARE

1. OBIECTIVELE LUCRĂRII:

 Fixarea unor elemente fundamentale de utilizare si programare a Timerului 2 al


microcontrolerului 80C552 în regim de comparare
 Crearea de abilităţi de lucru- hardware si software – cu echipamentele de calcul specifice
automaticii
2. FUNDAMENTELE LUCRĂRII:

2.1.Logica de comparare la Timerul T2


La fiecare incrementare a T2, conţinutul a trei regiştri CM0, CM1 şi CM2 este comparat cu noua
valoare a T2. Când se sesizează o coincidenţă (match), se setează fanionul corespunzător din TM2IR,
se modifică biţii portului 4 de ieşire conform setării regiştrilor STE şi RTE, şi se poate de asemenea
genera întrerupere dacă este setată această opţiune.
Registri care configurează T2 pentru procesul de comparare sunt STE (pentru “set”- punere pe “1”
logic) si RTE (pentru “set”- punere pe “0” logic) :

STE
TG47- fanion, daca este “1”, P4.7 este setat la urmatoarea comutare; daca este “0”, P4.7 este resetat la
urmatoarea comutare
TG46- fanion, daca este “1”, P4.6 este setat la urmatoarea comutare; daca este “0”, P4.6 este resetat la
urmatoarea comutare
SP45 - dacă este setat "1", P4.5 este setat dacă CM0 si T2 coincid
SP44 - dacă este setat "1", P4.4 este setat dacă CM0 si T2 coincid
SP43 - dacă este setat "1", P4.3 este setat dacă CM0 si T2 coincid
SP42 - dacă este setat "1", P4.2 este setat dacă CM0 si T2 coincid
SP41 - dacă este setat "1", P4.1 este setat dacă CM0 si T2 coincid
SP40 - dacă este setat "1", P4.0 este setat dacă CM0 si T2 coincid
Daca STE.i sunt “0”, atunci P4.i nu este afectat de coincidenta CM0 si T2 ( i = 0, 1, 2, 3, 4, 5 )

RTE
TP47 - dacă este setat "1", P4.7 basculează (toggle) dacă CM2 si T2 coincid
TP46 - dacă este setat "1", P4.6 basculează (toggle) dacă CM2 si T2 coincid
RP45 - dacă este setat "1", P4.5 este resetat dacă CM1 si T2 coincid
RP44 - dacă este setat "1", P4.4 este resetat dacă CM1 si T2 coincid
RP43 - dacă este setat "1", P4.3 este resetat dacă CM1 si T2 coincid
RP42 - dacă este setat "1", P4.2 este resetat dacă CM1 si T2 coincid
RP41 - dacă este setat "1", P4.1 este resetat dacă CM1 si T2 coincid
RP40 - dacă este setat "1", P4.0 este resetat dacă CM1 si T2 coincid
Daca RTE.i este “0”, atunci P4.i nu este afectat de coincidenţa CM1 si T2 sau CM2 si T2

35
Fig.2 Detaliu de structura a T2 referitor la regimul de comparare

Registrul fanioanelor de întrerupere este TM2IR:


TM2IR
T20V - fanion de întrerupere la depăşire pe 16 biti
CMI2 - fanion de întrerupere corespunzător lui CM2
CMI1 - fanion de întrerupere corespunzător lui CM1
CMI0 - fanion de intrerupere corespunzător lui CM0
CTI3 - fanion de întrerupere corespunzător lui CT3
CTI2 - fanion de întrerupere corespunzător lui CT2
CTI1 - fanion de întrerupere corespunzător lui CT1
CTI0 - fanion de întrerupere corespunzător lui CT0

3. DESFĂŞURAREA LUCRĂRII:

3.1.Tema aplicaţiei

Realizarea unui montaj pentru generarea unui semnal de tip impulsuri repetitive de nivel TTL, pe linia
0 a portului P4, cu ajutorul timerului T2 în regim de comparare. Forma semnalului de generat este
prezentată în fig.3.

36
Fig.3 Forma semnalului ce trebuie generat

3.2. Realizarea montajului

Pentru observarea semnalului generat la linia P4.0 a timerului T2, se conecteaza acest pin la canalul 1
al osciloscopului (vezi fig.4)

Fig.4. Montajul pentru realizarea aplicatiei practice

37
3.3. Algoritmul de generare a semnalului

Fig.5. Ordinograma programului de generare a semnalului cerut, prin comparare

În ordinogramă se disting trei module ale programului de implementare:


a) Programul principal – in care in primul bloc se fac initializarile:
o Programarea timerului T2 (prin SFR: TM2CON)
o Programarea momentelor de SET si RESET prin comparare (prin SFR: RTE si STE)
o Programarea intreruperilor (prin SFR: IEN0 si IEN1) de la comparare
iar in bucla infinită nu se execută nimic, aşteptându-se doar cele două întreruperi de la
regiştri de comparare.
b) Rutina de tratare a întreruperii de la registrul de comparare CM0 denumită COMP0, în care se
actualizează valoarea contorului pentru urmatoarea comparare şi se reseteaza fanionul de
intrerupere CMI0.
c) Rutina de tratare a întreruperii de la registrul de comparare CM1 denumita COMP1 şi care
este simetrică cu COMP0.

4. PROGRAMUL LUCRĂRII

o se verifică însuşirea părţii teoretice


o se verifică întelegerea algoritmului de generare a semnalului
o se construieşte montajul din fig.4 verificând corectitudinea legării sondei
osciloscopului la pinul P4.0 al microcontrolerului.
o se scrie programul conform ordinogramei din fig.5.
o se încarcă în microcontroler fişierul în format .hex

38
o se urmăreşte pe osciloscop semnalul generat verificând corectitudinea
parametrilor (frecvenţă si factor de umplere).

39
40
LUCRAREA DE LABORATOR NR. 7

CONSTRUIREA UNEI APLICAŢII


PE BAZA DESCRIERII PRIN ORDINOGRAMĂ
1. OBIECTIVELE LUCRĂRII
 Familiarizarea cu gestionarea informatiilor dinspre proces şi construirea unei aplicaţii
pe baza unei ordinograme

2. DESFĂŞUIRAREA LUCRĂRII

Se dă ordinograma din figură. Programul scris pentru microcontroler trebuie să indeplinească funcţiile
cerute.
Astfel:
-Iniţial, se citeşte tensiunea la CAN, tensiune setată prin potenţiometru. Tensiunea este citită şi pe un
voltmetru. În funcţie de valoarea citită în microcontroler, se parcurge programul pe una din cele trei
ramuri. Pe fiecare ramură se citeşte portul paralel, bitul 0, 1 sau 2 legat la comutatorul de tip
microswitch. Dependent de fiecare combinaţie se va afişa un mesaj pe display şi LED-urile portului
paralel vor clipi după o anumită configuraţie.

LUCRAREA DE LABORATOR NR. 8


GENERAREA DE SEMNALE PWM

1. OBIECTIVELE LUCRĂRII:

 Familiarizarea cu metode de abordare a programarii generatorului de semnale PWM al


microcontrolerului

41
 Crearea de abilitati de lucru- hardware si software – cu echipamentele de calcul specifice
automaticii

2. FUNDAMENTELE LUCRĂRII:

2.1.Generalitati
Semnalul PWM este un semnal foarte utilizat in automatica. Denumirea reprezinta acronimul de la
Pulse Width Modulation – adica modulatie in latime de impuls. Dintre aplicatii se remarca comanda
actionarilor electrice (chopper), emulator de convertor numeric-analogic, generator de impulsuri, etc.

2.2. Caracteristici
Semnalul PWM este un semnal electric de tensiune de amplitudine TTL (0V – 5V), repetitiv, de
perioada T si latime a impulsului Ta (vezi fig. 1).

Fig. 1. Semnalul PWM

Latimea sa se poate modifica (de exemplu in fig. A.1., de la Ta la Ta1), perioada sa T ramanand
constanta.

Se defineste factorul de umplere (eng. duty cycle)


ν=(Ta*100/T)
ca raportul între timpul cât semnalul este pe ”1" şi perioada semnalului.
Semnalul PWM este deci un semnal TTL cu factorul de umplere ν variabil de la 0% pana la 100%.

2.3Generarea semnalui PWM


Generarea poate fi realizată cu circuite analogice sau numerice (digitale). Metoda analogică este cea a
semnalului dinte de fierastrau. In cadrul acestei metode, prin compararea unui semnal dinte de
fierastrau cu un nivel de tensiune de referinta se obtine tranzitia de la momentul de timp Ta (vezi
fig.2).

Fig.2 Generatorul analogic de semnal PWM

42
Circuitele numerice utilizează pentru generare de semnal PWM un numărător care se incrementează
de la un ceas şi este resetat la fiecare perioadă a PWM. Când conţinutul contorului depăşeşte valoarea
de referinţă (momentul Ta), ieşirea este trecută de pe „1” pe „0”.

2.4. Aplicaţii

1. Comanda unui motor de curent continuu.


Pentru comanda unui motor de curent continuu (MCC) ar fi necesară o sursă de tensiune
(curent) programabilă de putere. Cum aceasta este dificil de realizat, se adoptă următoarea
schemă, în care amplificatorul pentru MCC este denumit chopper (vezi fig.3).

Fig.3. Comanda cu chopper a Motorului de Curent Continuu

Cum turaţia MCC este dependentă de tensiunea aplicată la borne, conform modelului său
matematic, prin schema cu chopper, tensiunea variabilă este înlocuita cu o tensiune constantă (în
cazul din exemplul din fig. 6.4 tensiunea este Vcc), dar care se întrerupe periodic, prin
întrerupătorul static chopper, comandat de semnalul PWM. Efectul este aproximativ identic cu cel
original, însă schema este mult mai simplă. Semnalul PWM se descompune în:
- o componentă continuă,
- un semnal de frecvenţă egală cu a semnalului original (fundamentala)
- o serie de armonici.

Pentru ca tensiunea medie U M sa fie singura care se aplică consumatorului, este necesar ca
fundamnetala şi toate armonicile să fie filtrate. Deci, pentru o corectă funcţionare a schemei, este
necesară inserarea unui filtru trece jos, cu frecvenţa de tăiere mai mică decât a fundamentalei.
Daca frecvenţa semnalului PWM este corect aleasă, MCC poate îndeplini si rolul de filtru

Tensiunea pe care o vede MCC, notata U M , este tensiunea medie a semnalului. Pentru a obţine
tensiunea medie se porneşte de la definiţie
Ta
U M ⋅ T = ∫ U( t )dt
0
Cum U(t) este constantă pe intervalul [0, Ta] şi egală cu Vcc, iar pe intervalul (Ta, T) este 0, relaţia
devine:
1 T ν
UM = VCC ⋅ Ta = a VCC = VCC ⋅
T T 100

Aceasta este ilustrată în fig.5.

43
Fig.5. Relaţia între U M si factorul de umplere al semnalului PWM

Schema este eficientă şi datorită economisirii energiei, puterea transmisă motorului, sau
oricărui alt consumator, este proportională cu factorul de umplere. Nu există disipări de
energie pe alte componente rezistive ca în alte cazuri.
Soluţia este utilizată şi pentru comanda dimmer-elor (surse de lumină de intensitate luminoasă
variabilă) sau a amplificatoarelor de mare putere.

2. Sursa de tensiune
Sursele de tensiune de putere mare folosesc solutia cu comanda de tip PWM, purtand astfel
numele de surse in comutaţie .

3. Telecomunicaţii
Prin modularea unui semnal PWM a lăţimii impulsului cu o informaţie (pentru fiecare
informaţie se atribuie o anumita valoare a Ta), se poate folosi această soluţie pentru transmisia
de date.

2.4.Programarea generatorului PWM la microcontrolerul 80C552


Microcontrolerul 80C552 contine două canale ( ieşiri ) pe care se pot genera impulsuri cu frecvenţa si
factor de umplere programat ( “pulse width modulation ” ). Schema bloc este prezentată în fig.6.

Fig.6. Schema bloc a generatorului de semnale PWM

44
Frecvenţa de repetiţie este definită de un divizor pe 8 biti - registrul PWMP din spatiul SFR, care
genereaza impulsuri pentru un numarator pe 8 biti, comun pentru ambele canale.
Numărătorul numără modulo 255 ( deci intre 0 si 254 inclusiv ). Valoarea acestuia este comparată
permanent cu conţinutul a două registre PWM0 si PWM1; daca conţinutul oricăruia dintre aceste
registre este mai mare decât conţinutul numărătorului, ieşirea corespunzătoare este pusă pe zero, iar
dacă este mai mic sau egal, ieşirea corespunzătoare este pusă pe unu. Astfel registrele PWMi
determină factorul de umplere al semnalelor generate în domeniul 0 - 255/255 programabil în
incremenţi de 1/255.
Exemple:
- în fig.7.a este prezentat un semnal cu factorul de umplere 10%, cuvântul scris în SFR-ul
PWM0 este 230,
- în fig.7.b este prezentat un semnal cu factorul de umplere 30%, cuvântul scris în SFR-ul
PWM0 este 179,
- în fig.7.c este prezentat un semnal cu factorul de umplere 80%, cuvântul scris în SFR-ul
PWM0 este 50,

Fig.7. Exemple de semnale PWM

Frecvenţa semnalelor obţinute la cele două ieşiri este dată de relaţia:


FOSC
FPWM =
2(1 + PWMP) ⋅ 255

iar valoarea PWMP pentru o frecvenţă dorită F PWM este:


FOSC
PWMP =
(2 ⋅ 255 ⋅ FPWM ) − 1

De exemplu pentru frecvenţa de oscilaţie a quartz-ului de 12MHz rezultă F PWM intre 92 Hz si 23,5
KHz.
Daca registrele PWMi se incarcă cu 00H sau FFH ieşirile PWMi pot fi menţinute la un nivel constant
de “1” respectiv “0”.

3.DESFĂŞURAREA LUCRĂRII:
Să se scrie un program care să genereze un semnal PWM pe canalul 0 cu caracteristicile:
• 100 Hz, factor de umplere 10%
• 100 Hz, factor de umplere 40%
• 100 Hz, factor de umplere 80%
• 10000 Hz, factor de umplere 10%
• 10000 Hz, factor de umplere 40%
• 10000 Hz, factor de umplere 80%

45
Semnalul PWM generat se va măsura cu osciloscopul, conectând firul de masă a sondei la pinul 2 a
cuplei J4, iar borna de semnal la pinul 38 a cuplei J4.

LUCRAREA DE LABORATOR NR. 9


SERIALIZAREA DATELOR PE PORTUL PARALEL

1. OBIECTIVELE LUCRĂRII:

 Familiarizarea cu metode de abordare a programarii portului paralel al microcontrolerului


pentru transmiterea datelor serial
 Crearea de abilitati de lucru- hardware si software – cu echipamentele de calcul specifice
automaticii

2. FUNDAMENTELE LUCRĂRII:

2.1. Generalitati
Comunicaţia serială este foarte importantă în conectarea mai multor echipamente de calcul. Pentru
acest tip de comunicaţie există interfeţe specializate, bazate pe diverse standarde, corespunzătoare
particularităţilor conjuncturale (distanţă, viteză, siguranţă, etc). Transmiterea datelor sseriale pe
interfaţa paralelă are utilitate în cazul stabilirii unei linii de comunicaţie nestandard, destinată inei
aplicaţii specifice.
2.2. Caracteristici
Serializarea unei date inseamnă generarea secvenţială a biţilor unui cuvânt pe o linie a portului paralel
de ieşire. Un semnal serial are unele caracteristici care îi permit sa fie recepţionat şi interpretat corect.
1. Formatul: - i. Numărul de biţi
ii. Bit de start
iii. Bit de paritate
2. Frecvenţa
3. Este însoţit sau nu de un semnal de ceas (clock)

Pentru realizarea frecvenţei, este necesară temporizarea cu un timer care generează întrerupere la
momente de timp echidistante şi egale cu jumatatea perioadei unui bit. Dacă semnalul de date este
insoţit de un semnal de ceas (clock), el va arăta ca în fig.7.8. Presupunem că frontul coborâtor al
ceasului este cel ce validează data, aceasta înseamnă că data trebuie să fie stabilă în momentul
frontului coborâtor al ceasului. Întreruperile de la timer sosesc la momentele t1, t2, ... t16 pentru un
cuvant de 8 biţi. La portul paralel, pe biţii 0 (ceas) si 1 (data) se vor scrie la întrerupere, succesiv,
cuvintele:

La momentul t1 xxxx xx11 incarca data 1, armeaza ceas


La momentul t2 xxxx xx10 front coborator la ceas cu data pe 1 (bit START)
La momentul t3 xxxx xx11 incarca data 1, armeaza ceas
La momentul t4 xxxx xx10 front coborator la ceas cu data pe 1
La momentul t5 xxxx xx01 incarca data 0, armeaza ceas
.
.
.
La momentul t15 xxxx xx11 incarca data 1, armeaza ceas
La momentul t16 xxxx xx10 front coborator la ceas cu data pe 1
La momentul t17 xxxx xx01 incarca data 0, armeaza ceas
La momentul t18 xxxx xx00 front coborator la ceas cu data pe 0

46
Fig.1. Serializarea datelor pe portul paralel

Dacă este necesar, se adaugă un bit de paritate, start sau stop.

Pentru deserializare se procedează în modul următor:

a) dacă semnalul de date nu este insoţit de semnal de ceas – este necesară cunoaşterea frecvenţei
(perioadei) cu care s-au generat biţii de date seriale şi neapărat este necesar un front iniţial (bit de start)
pentru a anunţa un şir de date. Receptorul programează timer-ul la perioada de transmisie, frontul
iniţial armează timerul, iar la prima întrerupere va citi primul bit de date, şi succesiv se vor citi toti
biţii de date.

b) dacă semnalul de date este insoţit de un semnal de ceas, frontul coborator al ceasului indica
valoarea datei. Semnalul de ceas este legat la pinul de intreruperi externe, active pe front coborator, iar
in rutina de tratare a intreruperii se citeste bitul 1 care reprezinta bitul de date.

2.3. Programarea portului paralel la microcontrolerul 80C552 pentru


serializarea unei date cu semnal de ceas

Bitul 4 al portului paralel (OUT0 pe conectorul J5) va conţine ceasul, bitul 5(OUT1 pe conectorul J5)
va conţine data. Data va fi transmisă începând cu cms bit. Citirea (deserializarea) se va face pe frontul
coborâtor al ceasului.

1. Toate operaţiile se execută la întreruprerea de 10 ms al timerului T0


2. Din data de transmis se extrage cel mai semnificativ bit (prin mascare cu 1000 0000). Se
deplasează data la stânga prin înmulţire cu 2.
3. Se generează frontul urcător al ceasului (v.fig.7.1.) şi se setează (pe 1) sau resetează (pe
0) bitul de date al portului paralel, dependent de valoarea bitului cms din cuvântul de dată
4. se generează frontul coborâtor al ceasului, reprezentând momentul citirii la deserializare
(strob).
5. Se repetă operaţia pentru ceilalţi 7 biţi de date

Exemplu:
Data de transmis se află în variabila D1
Timer0( ) interrupt 1
{
timer_Update();

47
if n
{
if (D1&128) //daca bitul cms este pe 1
{
outp_WritePort(3<<4); // clock pe 1, data pe 1, deplasat la stanga 4 poz
Delay(2);
outp_WritePort(2<<4); // clock pe 0, data pe 1, deplasat la stanga 4 poz
}
else //daca bitul cms este pe 0
{
outp_WritePort(1<<4); // clock pe 1, data pe 0, deplasat la stanga 4 poz
Delay(2);
outp_WritePort(0<<4); // clock pe 0, data pe 0, deplasat la stanga 4 poz
}
D1=D1<<1; //deplasare a cuvantului data la stanga pentru repoziţionare a următorului bit
n=n-1; //contor pentru 9 biti (8 de date +bitul de start)
else
{D1=0x0F;
n=8; //reîncărcare contor de biţi
}
}

2.4. Programarea portului paralel la microcontrolerul 80C552 pentru


deserializarea unei date

Data recepţionată are pe bitul 0 al portului paralel semnalul de ceas, iar pe bitul 1 data.

1.Se citeşte continuu, în bucla while, portul paralel, se maschează primul bit (clock) şi se
aşteaptă o tranziţie 1-0.
2. Când la o tranziţie 1-0 pe linia de clock, pe linia de date se citeşte primul „1”, aceasta
indică transmisia unei date.
3. Se citeşte simultan bitul 1 de date pe următoarele 8 fronturi coborâtoare ale clockului.
4. Se salvează bitul într-o variabilă şi se deplasează la stânga (prin înmulţire cu 2).
5. Se repetă operaţia pentru ceilalţi 7 biţi de date, la ultimul bit recepţionat nu se mai face
deplasarea la stânga. Fiecare bit se adaugă la cuvânt prin însumare.
Exemplu de fragment de program:

void main(void)
{
unsigned n=8;
//clock e pe bitul 0
//data e pe bitul 1
...
while(1)
{
D2=inp_ReadPort();
if (D2&1) // citire clock, daca este 1 intra in bucla
{
while (D2&1) // se asteapta front coborator
{
D2=inp_ReadPort(); //citire data de la port paralel
}
// a aparut front coborator al clockului
if (D2&2); // a fost citit bitul de start
{
while (n)
{
D2=inp_ReadPort(); //citire data de la port paralel

48
if (D2&1) // citire clock, daca este 1 intra in bucla
{
while (D2&1) // se asteapta front coborator
{
D2=inp_ReadPort(); //citire data de la port paralel
}
// a aparut front coborator a clockului
if (D2&2) D_rez++; // daca bitul de data este 1, se
//introduce in rezultat 1 pe bitul CMPS
if(n>1) D_rez=D_rez<<1; //deplasare la stanga a rezultatului
n--;
}

} // s-a citit un caracter


n=8; //se reincarca n pentru următorul caracter
//proceseaza data D_rez
} // nu a fost citit bitul de start

} // clock este pe 0
}

3. DESFĂŞURAREA LUCRĂRII:
3.1. Generarea repetitivă a unui cuvânt (0xA5) pe portul paralel
• Se generează cuvântul 0xB2 repetitiv (pentru a putea fi urmărit pe ecranul osciloscopului)
pe pinii 0 şi 1 ai portului paralel de ieşire.
• Se verifică cu osciloscopul corectitudinea datei conform fig. 7.1.

3.2. Citirea unui cuvânt serial pe portul paralel


• Se generează conform 3.1 un cuvânt serial pe portul paralel
• Se conectează prin fir biţii 0 şi 1 ai portului paralel de ieşire cu biţii 0 şi 1 ai portului
paralel de intrare (fig.7.2.)
• Se face deserializarea şi se afişează pe display codul hexa al cuvântului
• OBS: În scrierea aplicaţiei se disting 3 segmente:
i. Determinarea unui front căzător al clockului
ii. Ceterminarea apariţiei bitului de start
iii. Citirea a 8 biţi de dată.
Pentru rezolvarea facilă a problemei, se sugerează afişarea unui mesaj pe display la fiecare eveniment
detectat (fronr coborâtor al clockului, bitul de start, biţilor de dată).

3.3. Citirea pe portul paralel a unui cuvânt serial generat pe altă placă
• Se generează un cuvânt serial pe portul paralel
• Se conectează portul paralel de ieşire cu portul parale de intrare a altei plăci
• Se recepţionează cuvântul şi se afişează pe display.

Fig.2. Configuraţia pinilor de la placa cu microcontroler

49
50
LUCRAREA DE LABORATOR NR. 10
NOŢIUNI DE PROGRAMARE A SISTEMELOR ÎNCORPORATE.
PLANIFICAREA TASK-URILOR

1. OBIECTIVELE LUCRĂRII:

 Recapitularea si fixarea unor elemente fundamentale de programare a microcontrolerului


80C552
 Familiarizarea cu metode de programare a sistemelor încorporate
 Metoda time schedulling de planificare a task-urilor

2. FUNDAMENTELE LUCRĂRII:

2.1.Tipuri de algoritmi de planificare.

i. În buclă
Cea mai simplă şi răspândită structură de program pentru aplicaţii de timp real de complexitate
scăzută este cea în care
a. task-urile sunt non-preemptive,
b. rulează într-o buclă infinită (de tip while(1){} )
c. rulează succesiv într-o ordine prestabilită,
d. iniţial se execută un task de iniţializare, o singură dată.

Structura este adecvată aplicaţiilor cu puţine task-uri, sistemelor în timp real SOFT, în care
interacţiunea cu mediul este minimă sau predictibilă.

Fig.1. Algoritmul de planificare in buclă

Dacă se cunoaşte durata execuţiei unui task, se poate afla durata execuţiei unui ciclu (a buclei).

Structura programului
Structura este prezentată în ordinograma din fig.2. Task-urile T 1 , T 2 şi T 3 se execută încontinuu în
bucla infinită.

51
Fig.2. Ordinograma programului cu task-uri executate în buclă

2.În buclă cu taskuri preemptive


Structura este asemănătoare celei de la pct.1 cu diferenţa că pot exista evenimente care să solicite
lansarea unui task în timpur rulării altui task de prioritate mai redusă.
De exemplu depăşirea unei temperaturi limită este sesizată de un comparator a cărui ieşire este
conectată la o linie de întrerupere a sistemului emebedded (microcontroler).

Fig.3. Algoritmul de planificare in buclă cu taskuri preemptive

Evenimentul care solicită execuţia task-ului T4 poate apărea în orice moment relativ la începutul seriei
de task-uri. Se numeşte că acel eveniment este asincron.

Task-ul care este întrerupt la sosirea evenimentului asincron îşi continuă execuţia atunci când task-ul
T4 se încheie.
Structura programului
În fig.4. este prezentată ordinograma programului care implementează task-urile preemptive în buclă.
Programul principal este identic cu cel de la cazul anterior. În plus, un eveniment asincron poate
întrerupe rularea buclei, lansând task-ul T 4 .

52
Fig.4. Ordinograma programului cu task-uri preemptive

3. În buclă, cu task-uri nepreemptive, executate la intervale constante de timp (h-buclă de


durată constantă)

Există situaţii când unul sau mai multe task-uri trebuie să se execute la intervale egale de timp. Este
cazul foarte răspândit al sistemelor de reglare în care algoritmul de reglare trebuie să se execute la
fiecare h secunde, unde h este perioada de eşantionare. Algoritmul de reglare este la rândul lui format
dintr-o succesiune de task-uri (se consideră structura unui sistem de reglare automată numerică din
fig.5.):

Fig.5. Structura unui sistem de reglare automată numerică


Task-urile prezente în acest program sunt:
• T1: Citire prescriere w (de la Convertor Analog-Numeric sau din memorie)
• T2: Citire valoarea curentă a ieşirii procesului r (de la Convertor Analog-Numeric)
• T3: Procesarea informaţiei –
o Calcul a = w – r
o Calcul u = f(a) (lege de reglare)
o Elaborare comandă către elementul de execuţie (limitare şi scalare)
• T4: Trimitere comandă către elementul de execuţie (utilizând Convertorul Numeric-Analogic
sau canalul PWM).

Acest set de task-uri trebuie lansat la fiecare h secunde. h este calculat la proiectarea sistemului de
reglare automată, şi trebuie să respecte legea lui Shannon (să fie cel mult jumătate din cea mai mică
perioadă a semnalului sau din cea mai mică constantă de timp a sistemelor – proces, EM, EE).

53
Fig.6. Task-uri în buclă de durată constantă

Problema majoră la acest tip de aplicaţii, care necesită rularea unui set de task-uri la perioadă
constantă, este durata de execuţie a task-urilor. Este obligatoriu ca suma timpilor pentru fiecare task
să fie mai mică decât h. Din acest motiv, aceste task-uri nu sunt preemptive, nu pot fi întrerupte,
deoarece o întrerupere asincronă poate prelungi necontrolat durata de execuţie peste perioada h, lucru
care ar duce la disfuncţionalităţi.

Un program cu acest algoritm de planificare de task-uri are structura din fig.7. El este format dintr-un
program principal care conţine un segment de iniţializări (setare parametri comunicaţie, timer,
întreruperi, convertoare, variabile, etc) în care se programează un timer pentru întrerupere la h
secunde. Programul rămâne într-o buclă infinită, nu execută nimic până soseşte întreruperea de la
timer, după fiecar eh secunde. La apariţia întreruperii se execută rutina de tratare a întreruperii, adică
task-urile T1, T2 şi T3 în ordine, după care se revine la programul principal, în bucla infinită.

Fig.7. Structura unui program cu task-uri în buclă la momente definite de timp (h)

4. Task-uri programate în timp (Time scheduling)

În aplicaţiile mai complexe este necesar să se execute taskurile la diverse momente de timp. De
exemplu (fig.8)

54
Fig.8 Exemplu de aplicaţie cu task-uri programabile în timp

Secvenţa de task-uri se repetă după un anumit ciclu (ciclu de repetabilitate Cr), de durată t Cr .
În secvenţa din exemplu, T 1 se execută la momentele t 1 , t 3 , t 6 , t 8 . task-ul T 2 se execută la momentele
t 2 , t 7 , task-ul T 3 la momentul t 5 , iar T 4 se execută la meomentele t 4 şi t 9 , raportate la începutul
ciclului. După aceasta, secvenţa se repetă cu task-ul T 1 la momentele t 1 +t Cr , ... .

Pentru a scrie un program de implementare a unui astfel de algoritm, se determină un interval de timp
care este cel mai mic divizor comun al tuturor monentelor de timp t 1 ...t 9 , t Cr . Fie h acest interval de
timp. În aceste condiţii fiecare moment de timp poate fi scris ca:
t i = k ti * h

Deci fiecare task va fi lansat la un multiplu al perioadei h. La momentul t Cr = k tCr * h reîncepe


numărarea perioadelor.
Structura unui program pentru implementarea algoritmului de programare a task-urilor este prezentat
în fig.9.

55
Fig.9. Structura programului de implementare a algoritmului „Time schedulling”
Programul este format din două segmente:
1. Programul principal – în care se fac iniţializările
o Timer-ul se programează să numere h secunde
o Timer-ul dă întrerupere la depăşire
o Contorul n este resetat
o Alte iniţializări specifice task-urilor
2. subrutina de tratare a întreruperii de la Timer – se execută atunci când apare o întrerupere la h
secunde
o verifică dacă este momentul de lansare în execuţie a unui task prin coincidenţa
contorului n cu factoul k ti corespunzător momentelor de lansare în execuţie a task-
urilor
o la fiecare coincidenţă între n şi k ti este lansat în execuţie task-ul corespunzător, iar la
terminarea execuţiei task-ului, se reîntoarce la programul principal
o dacă nu există nici o coincidenţă se reînoarce în programul principal fără să execute
nimic

56
o dacă a ajuns la sfârşitul buclei, se resetează contorul n şi se revine în programul
principal.

3. DESFĂŞURAREA LUCRĂRII:
• 3.1. Scrierea unui program care să implementeze aplicaţia cu task-uri programabile în
timp din fig. 10

Fig.10. Aplicaţia cu task-uri programabile


unde
t1=10ms
t2=20ms
t3=30ms
t4=60ms
t5=70ms
t6=90ms
t7=100ms
t8=110ms
t9=120ms=t cr =perioada ciclului de repetabilitate

task-ul T1: DOUT0=1


task-ul T2: DOUT1=1
task-ul T3: DOUT2=1
task-ul T4: DOUT3=1
Când task-urile nu sunt active, biţii DOUT0, DOUT1, DOUT2, DOUT3 vor sta pe valoarea 0 logic.
Pentru planificarea task-urilor se va folosi întreruperea de 10ms pentru care există funcţii de
bibliotecă.
Corectitudinea activării task-urilor se va urmări cu ajutorul osciloscopului, vizualizând simultan câte
două linii de port paralel.

Fig.11. Configuraţia pinilor de la placa cu microcontroler

57
58
LUCRAREA DE LABORATOR NR. 11
DEZVOLTAREA DE APLICAŢII
CU MICROCONTROLERUL S12 FREESCALE
1. OBIECTIVELE LUCRĂRII

 Prezentarea sistemului de dezvoltare cu microcontrolerul MC9S12, componentele


hardware (placă de dezvoltare) şi software (compilator, asamblor, mediu de programare şi
comunicaţie, programe de aplicaţie),
 Familiarizarea cu modul de lucru cu placa (pornire, încărcare program aplicaţii, lansare
aplicaţii),
 Consolidarea cunoştintelor prin rularea unor exemple.

2. FUNDAMENTE TEORETICE
2.1. Noţiuni generale despre Microcontrolerul MC9S12

Microcontrolerul MC9S12 este produs de firma Freescale (fost Motorola), are magistrala de date de 16
bit, şi este destinat aplicaţiilor
− comerciale,
− industriale,
− automotive.

Câteva carectersitici de bază ale familiei S12 sunt:


• Flash până la 256 k
• RAM până la 8k
• EEPROM până la 2k
• Comunicaţie serială
- CAN bus
- SCI
- SPI
- I2C
• Convertor analog numeric (notat ATD), până la 16 canale de 10 bit
• Port paralel 59 linii
• PWM – 8 canale de 8 bit
• Tensiune de alimentare 3 V la 5,5 V
• 80 pin
• Frecvenţa bus 25 MHz
• Timer 8 canale de 16 bit (captură şi comparare)
• Sistem de întreruperi
• Magistrală de date şi adrese externe multiplexate
• Background debug module (BDM 2) care permite urmărirea derulării programului fără intervenţia
asupra acestuia (facilitate folosită –prin conversie la USB- pentru comunicaţia cu PC)
• Posibilitate de a seta breakpoints
• Frecvenţe de clock programabile

22
BDM (Background Debug Module) este un standard de comunicaţie serial pe un fir care permite transferul de
date direct în interiorul microcontrolerului fără a interveni asupra derulării programului. Se utilizează la depanare
şi la încărcarea programului de aplicaţie direct în memoria FLASH fără aportul Unităţii Centrale.

59
Tabel 1. Caracteristici comparative ale variantelor de componente din familia MC9S12B

Fig.1. Capsula LQFP

Fig.2.Capsula LQFP de 80 pin


2.2. Sistemul de dezvoltare cu microcontroler

Pentru a dezvolta aplicaţii cu microcontrolerul MC9S12B, se utilizează o placă ZK-S12_B Starter Kit.
Structura plăcii de dezvoltare este prezentată în fig.11.3.

60
Fig. 3. Structura plăcii de dezvoltare cu microcontroler S12B

2.2.1. Placa de dezvoltare conţine următoarele zone:


1. Zona microcontroler – conţine
- Microcontrolerul S12B plasat într-un soclu de tipul ZIF (Zero Insertion Force) care nu solicită
pinii componentei la introducerea acesteia, ci stabileşte contactul la acţionarea unui levier. În
fig.11.4. este prezentat o versiune de soclu de tip ZIF, iar în fig.11.5. este o imagine a plăcii de
dezvoltare ZK _S12-B cu soclul ZIF deschis.

Fig.4. Conector ZIF (Zero Insertion Force)

61
Fig.5. Imagine a plăcii de dezvoltare ZK_S12-B

- Conectori de acces la toţi pinii microcontrolerului


- Zona oscilator, în care se poate configura sursa de ceas penru microcontroler
- Jumperi pentru setarea modului de operare a microcontrolerului (regulatorul intern de
tensiune, tensiunea de referinţă internă pentru convertorul analog-numeric).
2. Zona sursei de alimentare – conţine o sursă de alimentare ce furnizează din 12
VDC, tensiunea necesară plăcii (5V sau 3.3V).
3. Zona convertorului USB-BDM conţine un circuit ce transformă semnalul BDM în
semnal USB pentru comunicare cu PC.
4. Zona conectorului BDM permite conectarea unui circuit de depanare expern pe
magistrala serială BDM.
5. Zona RESET conţine butonul de RESET şi circuitele aferente de formare a unui
semnal potrivit pentru microcontroler şi perifericele conectate
6. Zona de intrări conţine componente pentru intrarea analogică (potenţiometru) şi
pentru intrările logice (butoane cu revenire şi switch-uri).
7. Zona de ieşiri conţine LED-uri de curent mic conectate la microcontroler cu
Jumperi pentru o eventuală deconectare.
8. Zona comunicaţiei seriale RS-232 conţine adaptoarele de nivel
9. Zona de comunicaţii LIN 3 conţine adaptorul de la comunicaţia serială la LIN
10. Zona de setări pentru comunicaţia serială (selecţia între RS232 şi LIN)
11. Zona de comunicaţie CAN4
12. Zona de extindere şi dezvoltare de aplicaţii – conţine pad-uri pentru realizarea de
montaje electronice.

2.2.2. Modurile de lucru ale plăcii de dezvoltare ZK_S12-B


- Modul independent – în care microcontrolerul rulează un program încărcat în memoria sa
FLASH, fără nici o conexiune cu exteriorul (cu PC sau modul de depanare)
- Modul ”host” – în care execuţia programului este controlată de PC. Acesta poate fi utilizat
pentru a permite execuţia pas-cu –pas şi urmărirea conţinutului regiştrilor, prin intermediul

3
LIN (Local Interconect Network) este un standard de comunicaţie serial ce se obţine din semnalul 232 printr-un
adaptor. Este folosit la comunicaţia în automotive, alături de CAN.
4
CAN (Controller Area network) standard de comunicaţie serial asincron, multimaster utilizat în automotive

62
CodeWarrior Development Studio. Modalitatea prin care PC poate face acest lucru este prin
magistrala BDM (cu convertorul USB) sau fără PC, printr-un programator conectat direct la magistrala
BDM.

2.3. Lansarea unei aplicaţii cu placa de dezvoltare

Placa permite, prin intermediul Code Warrior Development Studio (ce conţine Editor, Asamblor,
Compilator C şi Debugger)
- Scrierea, compilarea, încărcarea şi depanarea programului pe placă
depanarea hardware şi software în timp real.
PC este conectat de placă prin linia USB,conexiunea cu microcontrolerul se face prin linia BDM, prin
intermediul adaptorului USB-BDM.
Pentru lansarea unei aplicaţii care este deja scrisă în Code Warrior se parcurg următorii paşi:
2.3.1. Se verifică conectarea plăcii la PC prin cablul USB şi la sursa de alimentare de 12V DC.
2.3.2. Se verifică corectitudinea setării Jumperilor (ei trebuie să se găsească în configuraţia setată
de fabrică)
2.3.3. Se lansează Code Warrior Development Studio
Din meniul principal se deschide folderul Demo cu următoarele comenzi:
“File > Open”. Se selectează “Demo.mcp” care se găseşte în “\Program
Files\SofTecMicrosystems\SK and ZK-S12(X) Series\CodeWarrior Examples\[Your Starter Kit
Code]\[Your Target Microcontroller]\Demo” şi se dă comanda “ Open”. Microcontrolerul instalat pe
placă este MC9S12DJ256CPV.
Apare ferestra din fig.6

Fig.6.meniul principal al aplicaţiei Code Warrior


2.3.4. Codul sursă se află în fişierul main.c. Se deschide acest fişier prin dublu click. Apare
fereastra din fig. 7

63
Fig.7. Meniul ce conţine codul sursă
2.3.5. Din meniul principal se selectează ”Project/Debug” care compilează codul sursă,
asamblează şi linkeditează, generează un fişier executabil şi îl încarcă în microcontroler.
2.3.6. Se deschide mediul de programare (fig.8.)
2.3.7. Din meniul principal se selectează ”Run>Start/Continue”. Programul va fi executat în
timp real. Programul demo citeşte tensiunea de la potenţiometrul de pe placă prin
Convertorul analog-numeric, transmiţând rezultatul conversiei la portul paralel conectat la
LED-uri. Pe cele 8 LED-uri va apărea codul biar al rezultatului conversiei. Cei mai puţin
semnificativ biţi nu sunt prezenţi.
2.3.8. Dacă din meniul principal se selectează “Run > Halt”, execuţia programului încetează şi
următoarea instrucţie de executat este marcată în ecranul ”source”.
2.3.9. Dacă din meniul principal se selectează “Run > Single step”, instrucţia marcată se execută,
execuţia programului încetează din nou şi următoarea instrucţie este marcată în ecranul
”source”. A fost executat un sigur pas (instrucţie).
2.3.10. La selectarea comenzii ”Run>Start/Continue” se reia execuţia programului.

64
Fig. 8.

2.4. Dezvoltarea unei aplicaţii noi

Pentru a crea un nou proiect se urmăresc paşii:


2.4.1. Din meniul principal se selectează “File > New”.
2.4.2. Din căsuţa de dialog apărută se selectează “HC(S)12 New Project Wizard”.
2.4.3. Se urmăresc paşii Project Wizzard. Trebuie acordată atenţie opţiunii tipului de
microcontroler.

2. 5. Lansarea unei sesiuni de depanare (debug)

Pentru a intra într-o sesiune de debug, din meniul principal se selectează “Project >Debug”. În casuţa
de dialog trebuie specificată placa şi microcontrolerul cu care se lucrează (fig.11.9).

65
Fig. 9. meniu configurare microcontroler

Code Warrior are o serie de tool-uri pentru analiza controlul programului:


- Breakpoints
- Watchpoints
- Trace buffer
Dependent de microcontrolerul folosit, unele facilităţi pot să nu fie disponibile.

66
Fig. 10. Schema bloc a microcontrolerului MC9S12DJ256CPV

Porturile Microcontrolerului

PA (7:0) – port de uz general/ ADDR(15:8)/ DATA(15:8)


PB (7:0) – port de uz general/ ADDR(7:0)/ DATA(7:0)
PK (7:0) – port de uz general/ XADDR(19:16)/

PE (7:0) – port de uz general/ semnale de comandă


PAD (15:0) – port de uz general/ AN(15:0) convertor analog-numeric
PJ(7,6,1,0) – port de uz general/comunicaţie serială I2C, CAN/întreruperi
PH(7:0) – port de uz general/comunicaţie serială SPI/întreruperi
PM(7:0) – port de uz general/comunicaţie serială CAN

67
PP(7:0) – port de uz general/generator PWM/serial SPI
PS(7:0) – port de uz general/comunicaţie serială
PT(7:0) – port de uz general/Timer

Configurarea pinilor porturilor:


-sensul de transmitere a informaţiei (DDR)
-nivel logic (I/O)
-putere redusă (RDR) –reduce curentul la ieşire la o treime
-validare rezistor de pull-up sau pull-down – pentru intrări (PE)
-selectare up-down (PS)
-validare intrerupere (IE) –valabil doar pentru porturile P, J, H

Tabel 1 Configuraţia pinilor microcontrolerului

Fig.11. Schema bloc a ieşirii portului microcontrolerului

3. Desfăşurarea lucrării

68
Se vor lansa aplicaţiile 2 IN-OUT şi 3 ATD.
Se vor urma paşii pentru oprire, depnare. Se va urmări corectitudinea datelor pe portul paralel şi la
Convertorul Analog-Numeric

69
70
PROIECT 1. SISTEM DE CODUCERE A UNUI LIFT

1. OBIECTIVELE PROIECTULUI
• Proiectarea unui sistem cu microcontrolerul 80C552 pentru conducerea unui model fizic
de lift pe trei nivele (parter şi două etaje).
• Câştigarea unor deprinderi de proiectare şi experimentare.
2. ETAPELE URMATE PENTRU REALIZAREA PROIECTULUI SUNT:
1. Înţelegerea temei de proiectare
2. Înţelegerea modelului fizic al procesului (lift) şi a elementelor de execuţie şi de
măsură
3. Stabilirea conexiunilor procesului la sistemul cu microcontroler
4. Separarea pe module indpendente şi testarea fiecărei resurse hardware a
procesului
5. Elaborarea algoritmului de conducere
6. Scrierea programului de implementare a
3. TEMA PROIECTULUI
Se dă un model fizic al liftului, a cărui schemă bloc este prezentată în fig.1.
Să se scrie un program care să permită conducerea liftului, cu următoarele funcţii:
- Dacă uşa cabinei este deschisă, să nu preia nici o comandă, şi nu execută nimic,
- Dacă uşa este închisă, şi nu este persoană în cabină, la apăsarea unui buton exterior,
cabina se deplasează la etajul corespunzător butonului apăsat. Butoanele interioare vor fi
ignorate
- Dacă uşa este închisă, şi este persoană în cabină, la apăsarea unui buton interior, cabina se
deplasează la etajul corespunzător butonului apăsat. Butoanele exterioare vor fi ignorate.

71
Fig.1. Schema bloc a proiectului LIFT
4. DESCRIEREA MODELULUI FIZIC AL PROIECTULUI
Modelul este format din:
1. cabina liftului
2. sistem de tracţiune format din motor de curent continuu şi un angrenaj cu două roţi de
antrenare, cu cablu de oţel. Motorul este alimentat cu o tensiune fixă de 3V, care poate fi
conectată cu polaritate inversă, având efect schimbarea sensului de deplasare a cabinei.
3. sistem de măsurare a poziţiei liftului (fig.1.2) format din potenţiometru de lungime L,
alimentat între 0 şi 5V, şi un cursor solidar pe cabină, care preia tensiunea de pe rezistor.

72
Fig.2. Sistemul de tracţiune şi măsurare
4. Driver (amplificator) de motor. Pentru comanda motoarelor de curent continuu cu turaţie fixă
(tensiune constantă la borne) şi cu posibilitatea de reversare a sensului de rotaţie există două
soluţii prezentate în fig.1.3. În ambele cazuri, driverul este format din două relee care se
alimentează de la o tensiune (în primul caz releele sunt alimentate de la 24V, în al doilea caz,
sunt alimentate de la 5V), prin câte un tranzistor de tip ”open collector”. care asigură atât
aplicarea tensiunii de 3V şi schimbarea de polaritate prin cele două variante de conectare
(fig.3). În proiect a fost utilizată versiunea b.

73
Versiunea a)

Versiunea b)
Fig.3. Driverul de motor pentru comanda ON-OFF cu schimbare de sens în cele două versiuni
5. Butoane pentru selecţia etajului (elemente de ieşire din proces)
Butoanele preiau informaţia despre comenzile care se dau liftului:
- butoanele exterioare cabinei, BE0, BE1, BE2 (de pe peretele fiecărui etaj) care
cheamă liftul la etajul respectiv
- butoanele interioare cabinei, BI0, BI1, BI2, care trimite liftul al etajul corespunzător
6. Senzori de prezenţă persoană şi uşă închisă, G, U care sesizează dacă o persoană, simulată
printr-o greutate, este în lift, respectiv dacă uşa liftului este închisă
7. Becuri indicatoare (mărimi de intrare în proces), prezente pe fiecare etaj, care se aprind cân
liftul este la etajul respectiv.
8. Placa cu microcontroler

5. CONEXIUNILE PROCESULUI LA PLACA CU MICROCONTROLER


Schema de conexiuni este prezentată în fig.4.
- Schema de conectare a butoanelor. Când butonul este relaxat, intrarea este conectată
la 5V prin rezistorul de 1k (1 logic). Când butonul este apăsat, intrarea este conectată
la masă (0 logic). Butoanele se conectează la portul paralel de intrare al
microcontrolerului.
- Schema de conectare a motorului. Motorul de curent continuu este comandat prin
doua relee care aduc la bornele sale tensiunea de 3 V, cu o polaritate sau cu altă
polaritate, pentru schimbarea sensului de rotaţie. Cele două relele sunt comandate prin
portul paralel de ieşire şi tranzistorul de tip open-collector.
 Când ieşirea este pe 0 logic, tranzistorul este blocat, emitorul său este în aer
şi prin urmare, prin releu nu circulă curent. În consecinţă releul este relaxat
(neacţionat), în cazul variantei b, ambele relee rămân conectate la borna de
masă.

74
Contactele unui releu pot fi de patru tipuri :

1. SPST (Single Pole Single Terminal)

2. SPDT (Single Pole Double Terminal)

3. DPST (Double Pole Single Terminal)

4. DPDT (Double Pole Double Terminal)


NO -normal deschis. Atunci când releul este relaxat,
contactul este deschis. Când sunt declanşate (acţionate)
contactul se închide.
NC -normal închis. Atunci când releul este relaxat, contactul
este închis. Când sunt declanşate (acţionate) contactul se
deschide.
Când ieşirea este pe 1 logic, tranzistorul este saturat, emitorul său este conectat la masă şi prin urmare,
prin releu circulă curent. În consecinţă releul este declanşat (acţionat), trecând în starea
complementară (în cazul variantei b, conectează borna motorului la 3V).

Biţii 2 şi 3 ai portului D comandă cele două relee, lucru ce permite inversarea polarităţii prin
combinaţiile 01 sau 10 pe cei doi pini. Releele se conectează prin tranzistoarele în schemă de tip open
collector (fig.4).
- Senzorul de poziţie din sistemul de măsurare (fig.2.) se conectează la interfaţa
analogică de intrare (Convertorul Analog Numeric).

Fig. 4. Schema de conexiuni între placa cu microcontroler şi modelul liftului

75
6. METODOLOGIA DE REZOLVARE A TEMEI
Se va utiliza informaţia din fişierul Anexa.doc
Modulele independente de la tema „LIFT” sunt:
1. Deplasarea motorului
1. a. pornire-oprire
Pentru a opri si porni liftul (conform schemei 1.2) este necesar ca bitul 2 de la portul D paralel de
ieşire să fie trecut pe 1 logic, iar bitul 3 de la portul D paralel de ieşire să fie trecut pe 0 logic. Când
motorul începe să se învârtă, trebuie deconectată borna de alimentare pentru a opri motorul.
1.b. deplasare într-un sens şi în celălalt
Pentru shimbarea sensului de deplasare a liftului (sensului de rotaţie a motorului) se trec alternativ biţii
2 şi 3 pe 01 logic şi 10 logic cu un delay de 1 sec (_delay_ms(1000)). Trebuie ca iniţial cabina liftului
să se afle la mijlocul cursei (etaj 1).
1.c.deplasare între două puncte
Pentru a deplasa între două puncte a cursei, trebuie citită valoarea curentă a poziţiei cabinei prin CAN.
Ţinând cont că în poziţia superioară tensiunea pe cursor este 0V (000h sau 0) iar în poziţia inferioară
5V (0x3FF sau 1023),se citeşte poziţia curentă, dacă este mai mică decât 100 se schimbă sensul, iar
dacă este mai mare decât 900 se schimba din nou sensul.
O descriere a structurii programului este făcută în continuare:
- start
- initializări (porneste motorul în sus)
Buclă: - citeste poziţia
- dacă pozitia este mai mică decât 100 comandă rotirea motorului în jos
- dacă pozitia este mai mare decât 900 comandă rotirea motorului în sus
- salt la Buclă
2. Citirea butoanelor
Se scrie un program care citeşte portul paralel de intrare şi afişează co ţinutul acestuia. Se lansează, se
apasă câte un buton şi se notează corespondenţa butonului cu bitul din portul paralel.

7. Scrierea aplicaţiei
După etapa de punere în funcţiune parţială a temei, se elaborează un algoritm care implementat pe
placa cu microcontroler să îndeplinea că sarcinile temei de proiectare. Pentru elaborarea algoritmului
se aplică cunoştinţele dobândite in cadrul activităţilor didactic.

OBS1: pentru a genera combinaţia 01 sau 10 pe biţii 2 şi 3 ai portului D, pentru mişcarea motorului în
cele două sensuri, trebuie

a. Să se seteze în main() direcţia pinilor 2 şi 3 ca ieşire prin DDRD (pinii pe 1)

b. să se scrie la portul D o combinaţie care să asigure combinaţia 01 sau 10 prin comanda PORTD= ...

OBS2: pentru a citi semnale logice de la butoane, trebuie

a. Să se seteze în main() direcţia pinilor conectaţi la butoane ca intrare prin DDRD (pinii pe 0)

b. să se citească de la portul X un cuvânt prin comanda val = PINX care se maschează pentru a selecta
doar bitul de interes

OBS3: deoarece biţii 6 şi 7 ai portului D şi biţii 0-3 ai portului B se folosesc pentru scrierea la LCD,
când se setează direcţia pinilor trebuie ţinut seama de acest lucru (sensul datelor trebuie setat pe
ieşire).

76
PROIECT 2. SISTEM DE ORIENTARE DUPĂ LUMINĂ
1. OBIECTIVELE PROIECTULUI
Utilizarea plăcii cu microcontroler 80C552 pentru conducerea unui model fizic cu cadru rotitor care se
orientează după lumină.
Câştigarea unor deprinderi de proiectare şi experimentare.
2. TEMA PROIECTULUI
Se dă un model fizic cu cadru rotitor, a cărui schemă bloc este prezentată în fig. 1.

Fig. 1. Schema bloc a proiectului LUMINĂ


Să se scrie un program care să permită rotirea cadrului, cu următoarele funcţii:
- Dacă nu este aprinsă nici o sursă de lumină, la pornire, cadrul rotitor să caute poziţia de
referinţă care corespunde plasării magnetului de pe tamburul cadrului pe senzorul HALL
plasat pe suport pe placa de baza.
- Dacă este aprinsă o sursă de lumină, cadrul se va deplasa astfel încât să se poziţioneze
perpendicular p esursa de lumină.
- Când sursa de lumină se stinge, cadrul se va poziţiona din nou pe poziţia de referinţă.
3. DESCRIEREA MODELULUI FIZIC AL PROIECTULUI
Modelul este format din:
1. Cadrul rotitor care este antrenat de motorul pas-cu-pas prin curea elastică. El conţine trei
senzori de lumină care furnizează o tensiune continuă astfel:
- la iluminare ambiantă (când nu este aprinsă nici o sursă de lumină) tensiunea este de
aproximativ 0.2 Vcc.
- Când o sursă de lumină este aprinsă şi este orientată perpendicular pe un senzor,
tensiunea este de 5 Vcc.
Cadrul mai conţine pe tamburul de antrenare un magnet.
2. Sistemul de tracţiune format din motor pas-cu-pas comandat de la placa cu microcontroler
printr-un driver (amplificator) cu tranzistoare (fig.2.1.). Motorul are 200 de paşi pe rotaţie,

77
întârzierea între 2 paşi trebuei să fie minim 25ms. Mişcarea de rotaţie se transmite cadrului
rotitor prin curea elstică.
3. Senzor HALL plast pe un suport pe placa de bază. La apropierea magnetului de pe tambur,
tensiunea la ieşirea senzorului este 0 Vcc. La îndepărtarea magnetului, tensiunea devine 5
Vcc.
4. Placa cu microcontroler

4. CONEXIUNILE PROCESULUI LA PLACA CU MICROCONTROLER

Fig.2. Schema de conexiuni a proiectului LUMINĂ


Schema de conexiuni este prezentată în fig.2.
- Schema de conectare a motorului. Motorul pas-cu-pas este conectat la portul paralel
fiind comandat prin driverul construit cu tranzistoare (fig.3.). Rotirea cu un pas se
realizează prin o combinaţie de 0 logic şi 1 logic, conform fig.4 Pentru deplasare în
sens contrar, se schimbă ordinea succesiunii bitului 1 logic (fig.5.).

78
Fig.3. Schema de conexiuni între placa cu microcontroler şi motorul pas-cu-pas

Fig.4. Diagrama comenzilor pentru motorul pas-cu-pas

Fig.5. Diagrama comenzilor pentru reversarea mişcării la motorul pas-cu-pas


- Schema de conectare a senzorului HALL. Senzorul Hall se conectează la o linie a
portului paralel de intrare.

79
- Schema de conectare a senzorilor de lumină. Senzorii de lumină se conectează la trei
canale ale interfeţei analogice (Convertor Analog Numeric).

5. METODOLOGIA DE REZOLVARE A TEMEI


Modulele independente de la tema „LUMINĂ” sunt:
1. Deplasarea motorului
- 1.a. deplasare într-un sens. Se va scrie un program care să genereze secvenţa de la
fig.3. cu o lăţime a impulsului de 25 ms.
- 1.b. deplasare în sens opus cu viteză redusă. Se va scrie un program care să genereze
secvenţa de la fig.4. cu o lăţime de impuls de 40ms.
2. Citirea senzorului HALL. Se va scrie un program care să citească o tensiune logică (0Vcc sau
5 Vcc) de la senzorul HALL şi să afişeze pe display valoarea logică citită. La rotirea cu mâna
a cadrului rotitor, când magnetul va fi poziţionat pe senzorul HALL, se va citi pe display 0,
cănd magnetul va fi depărtat, se va citi 1.
3. Citirea tensiunilor de la senzorii de lumină. Programul va citi cele trei tensiuni de la senzorii
de lumină şi va afişa simultan valorile tensiunii, cu o zecimală, pe display. La deplasarea
luminii prin faţa senzorilor, se va urmări dependenţa valorii tensiunii de unghiul şi distanţa
sursei de lumină faţă de senzori.

6. SCRIEREA APLICAŢIEI
După etapa de punere în funcţiune parţială a temei, se elaborează un algoritm care implementat pe
placa cu microcontroler să îndeplinească sarcinile temei de proiectare.
OBS1: pentru a genera combinaţiile de biţi pe portul A, trebuie
a. Să se seteze în main() direcţia pinilor prin DDRD
b. să se scrie la portul A combinaţia de biţi prin comanda PORTD= ...
OBS2: deoarece biţii 6 şi 7 ai portului D şi biţii 0-3 ai portului B se folosesc pentru scrierea la LCD,
când se setează direcţia pinilor trebuie ţinut seama de acest lucru.

PROIECT 3. SISTEM DE REGLARE PROPORŢIONALĂ A POZIŢIEI


UNUI MOTOR DE CURENT CONTINUU

1. OBIECTIVELE PROIECTULUI

Utilizarea plăcii cu microcontroler 80C552 pentru realizarea unui sistem de regare automată a poziţiei
unui motor de curent continuu

Câştigarea unor deprinderi de proiectare şi experimentare.

2. TEMA PROIECTULUI

Se dă un model fizic al sistemului de poziţionare, a cărui schemă bloc este prezentată în fig.1.

80
Fig.1. Schema bloc a proiectului LIFT
Să se scrie un program care să permită reglarea poziţiei cursorului acţionat de un motor de curent
continuu, printr-o lege de reglare de tip proporţional.

3. DESCRIEREA MODELULUI FIZIC AL PROIECTULUI

Modelul este format din:


1. Cursor antrenat de un cablu de oţel peste doi scripeţi,
2. Motor de curent continuu de antrenare a cursorului.
3. Sistem de măsurare a poziţiei (fig.2) format din potenţiometru de lungime L, alimentat între 0
şi 5V, şi cursorul care preia tensiunea de pe potenţiometru.

81
Fig.2. Sistemul de tracţiune şi măsurare
4. Driver (amplificator) de motor cu următoarele caracteristici (fig.3.):

Fig.3. Driverul motorului de curent continuu


Driverul furnizează motorului de curent continuu o tensiune între 0 şi 7 Vcc de valoare egală cu
tensiunea analogică de la intrare Vin, şi curent până la 80mA. Sensul de rotaţie este dat de semnalele
logice In0 şi In1, conform tabelului.
IN0 IN1 Motorul
0 O Motor nealimentat
0 1 Motorul se deplaseaza la
dreapta
1 0 Motorul se deplaseaza la
stanga
1 1 Motor frânat

5. Placa cu microcontroler

82
Fig.4. Schema de conexiuni între placa cu microcontroler şi modelul sistemului de poziţionare

4. CONEXIUNILE PROCESULUI LA PLACA CU MICROCONTROLER

Schema de conexiuni este prezentată în fig.4.


- Schema de conectare a driverului de motor. Acesta se comandă prin 3 semnale,
 Vin care este un semnal analogic, şi este generat de generatorul PWM (Pulse
Width Modulation). Acesta se comandă pe 12 bit (între 0 şi 0xFFF). Dar
deoarece comanda este insuficientă pentru mişcare pentru valori PWM mai
mici decât 0x080, se consideră domeniul de lucru al PWM de la 0x080 la
0xFFF. Aceasta înseamnă că la valoarea ce trebuie trimisă la PWM se va
aduna 0x80.
 In0 şi In1, semnale logice, care vor fi generate de portul paralel de ieşire.
- Schema de conectare a sistemului de măsurare. Tensiunea Ux care este măsură a
poziţiei cursorului pe rigla va fi preluată de interfaţa analogică de intrare (Convertorul
Analog Numeric).

5. METODOLOGIA DE REZOLVARE A TEMEI

Modulele independente de la tema „POZIŢIONARE” sunt:


1. Deplasarea motorului
1. a. pornire
Pentru a opri si porni motorul este necesar să se genereze cele 3 semnale astfel:
- Vin se va seta la valoarea 0x1FF prin PWM

83
- Ino şi In1 (biţii 2 şi 3 ai portului D) se vor seta în combinaţia 10, asigurându-se o
deplasare într-un sens prin comanda PORTD=.
1.b. deplasare în sens opus
Pentru shimbarea sensului de deplasare a cursorului (sensului de rotaţie a motorului) In0 şi In1 se vor
seta în combinaţia 01.
1.c. deplasare între două puncte
Pentru a deplasa între două puncte a cursei, trebuie citită valoarea curentă a poziţiei cursorului prin
CAN. Ţinând cont că la un capăt tensiunea pe cursor este 0V (000h sau 0) iar în poziţia capătul opus
tensiunea este de 5V (3FFh sau 1023), se citeşte poziţia curentă. Dacă este mai mică decât 100 se
schimbă sensul, iar dacă este mai mare decât 900 se schimba din nou sensul. Dacă este între cele două
limite, comanda rămâne neschimbată.

O descriere a structurii programului este făcută în continuare:


- start
- iniţializări (porneste motorul într-o direcţie)
Buclă: - citeşte poziţia
- dacă poziţia este mai mică decât 100 comandă rotirea motorului în sensul 10
- dacă poziţia este mai mare decât 900 comandă rotirea motorului în sensul 01
- salt la Buclă

6. SCRIEREA APLICAŢIEI DE REGLARE

Fig.5. Structura sistemului de reglare automată

După etapa de punere în funcţiune parţială a temei, se elaborează un algoritm care implementat pe
placa cu microcontroler să îndeplinească sarcinile temei de proiectare.

Pentru realizarea unui sistem de reglare automată, conform fig.5., regulatorul trebuie să implementeze
legea de reglare proporţională. Astfel

Vin = k. |a| (1.)

Unde

a = w-Ux (cu w=500), iar k este constanta de proporţionalitate a legii de reglare (iniţial k=2).

Semnul produsului k.a va determina combinaţia 01 sau 10 la semnalele In0 şi In1, generate prin portul
paralel, iar valoarea modului produsului va determina viteza, fiind transmisă prin modulul PWM.

După efectuarea calculelor matematice, este necesară limitarea valorii trimise către PWM, la 0x3FF.

PWM lucrează pe 10 bit, în gama 0x80 – 0x3FF la ieşire.

Exemplu A: Dacă se obţine din calcul o comandă 0 (adică motorul trebuie oprit deoarece a ajuns la
poziţia prescrisă), valoarea 0 se adaugă valorii 0x080 (deci 0x080, sau 128) şi se trimite la PWM prin
prin funcţia corespunzătoare.

84
Exemplu B: Dacă se obţine din calcul o comandă 3000, se adaugă această comandă la 0x080( adică
128), se obţine 3128. Dar această valoare depăşeşte domeniul PWM (de 0xFFF sau 1023). Prin
urmare, rezultatul trebuie limitat la valoarea maximă care este validă pentru PWM, adică 1023 sau
0x3FF, după care se trimite la PWM.

Exemplu de program:

1. citire CAN

2. calcul a= w-Ux (atenţie, variabila a trebuie să fie de tip int şi nu unsigned deoarece
rezultatul poate fi şi negativ)

3. daca a>0 , se trimite la PORTD combinaţia 01 be biţii 2 şi 3(pentru I1 şi I0),


Vin=a*2+0x80

4. daca a<0 , se trimite la PORTD combinaţia 10 pe biţii 2 şi 3 (pentru I1 şi I0), Vin=-


a*2+0x80

5. limitare

6. trimitere Vin la PWM

OBS1: pentru a genera combinaţia 01 sau 10 pe biţii 2 şi 3 ai portului D, trebuie


a. Să se seteze în main() direcţia pinilor 2 şi 3 ca ieşire prin DDRD
b. să se scrie la portul D o combinaţie care să asigure combinaţia 01 sau 10 prin comanda
PORTD= ...
OBS2: deoarece biţii 6 şi 7 ai portului D şi biţii 0-3 ai portului B se folosesc pentru scrierea la LCD,
când se setează direcţia pinilor trebuie ţinut seama de acest lucru.

85
86
PROIECT 4. SISTEM DE REGLARE
BIPOZIŢIONALĂ A TEMPERATURII
1. OBIECTIVELE PROIECTULUI
Utilizarea plăcii cu microcontroler 80C552 pentru realizarea unui sistem de reglare automată a
temperaturii.
Câştigarea unor deprinderi de proiectare şi experimentare.

2. TEMA PROIECTULUI
Se dă un model fizic al sistemului de încălzire, a cărui schemă bloc este prezentată în fig.4.1.

Fig. 1. Schema bloc a sistemului de reglare a temperaturii


Să se scrie un program care să permită reglarea temperaturii, cu următoarele funcţii:
- Legea de reglare este de tip bi-poziţional, cu histerezis de ±1°C
- Temperatura curentă şi temperatura prescrisă sunt afişate pe două linii ale diplay-ului
- Temperatura prescrisă este 37°C.
3. DESCRIEREA MODELULUI FIZIC AL PROIECTULUI
Modelul este format din:
1. Elementul de încălzire, un rezistor alimentat de la tensiunea 230Vca printr-un releu
comandat la 12Vcc (fig.3.)
2. Sistem de măsurare a temperaturii format din traductorul LM35 conectat la 5Vcc prin
rezistor de 6k. Caracteristica statică a traductorului este prezentată în fig.2.

87
Fig.2. Caracteristica traductorului de temperatură LM35 în grade Celsius

4. CONEXIUNILE PROCESULUI LA PLACA CU MICROCONTROLER


Schema de conexiuni este prezentată în fig.3.
- Schema de conectare a rezistorului de încălzire. Conform fig. 3., rezistorul se
alimentează de la sursa de tensiune de 230Vac prin releul comandat pe portul paralel
de ieşire de putere (prin circuitul open collector).
- Schema de conectare a traductorului de temperatura. Traductorul de temperatură LM
35 se conectează la un canal al Convertorului Analog Numeric.

88
Fig. 3. Schema de conexiuni între placa cu microcontroler şi modelul sistemului de încălzire

5. METODOLOGIA DE REZOLVARE A TEMEI


Se va utiliza informaţia din fişierul metodologie.doc
Modulele independente de la tema „TEMPERATURĂ” sunt:
2. Citirea şi afişarea temperaturii
a. Citirea tensiunii de la traductorul de temperatură şi afişarea pe display. Se verifică cu
voltmetrul corectitudinea datei afişate. Din cauza probabilelor zgomote, se recomandă să se
facă 50 de citiri succesive şi să se afişeze media lor aritmetică (filtrare numerică).
b. Convertirea tensiunii în temperatură şi afişarea valorii temperaturii în °C pe display.
(Atenţie, informaţia despre temperatură este conţinută în tensiune –la ieşirea senzorului, şi în
cuante – la ieşirea CAN. Informaţia trebuie gestionată corect pentru a evita greşeli de calcul).

2. Conectarea/deconectarea rezistorului de încălzire prin acţionarea releului prin portul paralel de


putere (open collector). Se comandă linia de port paralel de putere succesiv cu 1 şi 0, cu o întârziere de
1 sec. Trebuie să se audă aclanşarea şi relaxarea releului.

6. SCRIEREA APLICAŢIEI
După etapa de punere în funcţiune parţială a temei, se elaborează un algoritm care implementat pe
placa cu microcontroler să îndeplinească sarcinile temei de proiectare.
Algoritmul de reglare este de tip bi-poziţional cu histerezis de 1°C, structura sistemului de reglare este
prezentată în fig.4.4..

Fig. 4. Structura sistemului de reglare automată a temperaturii

89
Ieşirea θ a procesului, ca urmare a acţiunii regulatorului bi-poziţional, are o formă de variaţie ca în
fig.5.a, comanda u se modifică conform fig. 5.b.

Fig.5.a. Graficul ieşirii sistemului de reglare automată a temperaturii

Fig. 5.b. Graficul comenzii u a sistemului de reglare automată a temperaturii

Un exemplu de ordinogramă ce implementează legea de reglare a programului este prezentată în fig.6.

90
Fig.6. Ordinograma programului ce implementează algoritmul de reglare bi-poziţional cu
histerezis

OBS 1: pentru a genera combinaţia 1 sau 0 pe bitul 5 al portului D, trebuie


a. Să se seteze în main() direcţia pinului 5 ca ieşire prin DDRD
b. să se scrie la portul D bitul 5 pe 0 sau 1 prin comanda PORTD= ... (Atenţie, pinul 5 al portului D
este folosit şi la PWM, deci este obligatoriu să se elimine din program comenzile de iniţializare şi
setare a PWM)
OBS 2: deoarece biţii 6 şi 7 ai portului D şi biţii 0-3 ai portului B se folosesc pentru scrierea la LCD,
când se setează direcţia pinilor trebuie ţinut seama de acest lucru.

91
92
ANEXE

ANEXA 1.
SOFTWARE PENTRU MEDIUL DE DEZVOLTARE CU
MICROCONTROLERUL I80552

Generalităţi

Programatorul de aplicaţii pentru sistemul de dezvoltare, are la dispozitie o importanta biblioteca de


functii C pentru gestiunea principalelor resurse ale plăcii. Funcţiile din bibliotecă pot fi apelate din
programele de aplicaţie scrise în limbajul C sau în limbaj de asamblare (respectind regulile de
interfaţare C/asamblare).

Biblioteca de funcţii se afla în directorul: \LIB.

Fişierul: AP_LIB.H , este fişierul header care conţine toate declaraţiile si prototipurile de funcţii
necesare pentru utilizarea bibliotecii. El trebuie inclus în programele de aplicaţie:
#include “..\..\LIB\AP_LIB.H”

Biblioteca conţine module .OBJ. Astfel:


LIB_UART.OBJ - funcţii pentru intirzieri, interfata seriala, iniţializare timer T0
LIB_LCD.OBJ - funcţii pentru afisajul cu cristale lichide LCD
LIB_KEYB.OBJ - funcţii pentru tastatura
LIB_PORT.OBJ - funcţii pentru porturile de intrare/iesire, buzzer, intrările analogice (ADC)
LIB_DAC.OBJ - funcţii pentru convertorul numeric-analogic (DAC)

De asemenea este disponibil un modul .LIB, obţinut prin combinarea tuturor modulelor .OBJ intr-o
singura biblioteca (folosind programul utilitar LIB51):
AP_LIB.LIB - biblioteca de funcţii pentru sistemul de dezvoltare

Aceste biblioteci (modulele .OBJ sau .LIB), trebuie legate de modulele programului de aplicaţie in
faza de link-editare (folosind programul utilitar L51).

Exemple de programe se afla in directorul: \SAMPLES.

Fiecare din sub-directoarele directorului \SAMPLES contine câte un program exemplu care foloseşte
funcţii din biblioteca de funcţii.
De asemenea aici se află si fişierele: MAKE.BAT - pentru obţinerea programului executabil .HEX.
Acestea programe exemplu pot fi încărcate pe placa şi testate, iar ulterior pot fi modificate şi folosite
ca model pentru dezvoltarea programelor proprii.

93
Descrierea functiilor de biblioteca

Functii pentru întârzieri, interfaţa serială, iniţializare timer T0

void Delay(unsigned miliseconds)


Funcţia generează o întârziere, exprimată în milisecunde, programabilă prin parametrul de intrare
miliseconds. Întârzierile sunt aproximative şi vor fi ceva mai mari in cazul cind in program sunt
activate unele întreruperi.

void uart_InitSerial(void)
Funcîia iniîializează interfaţa serială a microcontrolerului, cu parametrii standard folosiţi ăi de
programul monitor: modul 3, comunicaţie multiprocesor, 9600 bauds, 11 biţi de date, timer-ul T1
generează rata de transfer, nu generează intrerupere.

unsigned char uart_Transmit(unsigned char Data)


Funcţia transmite pe linia serială octetul Data, dacă transmisia este posibilă (TI=1). Returnează 1 daca
octetul a fost transmis, 0 în caz contrar.

unsigned char uart_Receive(unsigned char *Data)


Functia receptionează un octet de pe linia serială, dacă recepţia este posibilă (RI=1). Returnează 1 şi
memorează octetul recepţionat în parametrul Data dacă octetul a fost recepţionat, şi returnează 0 în
caz contrar.

void uart_Message(unsigned char *Text, unsigned miliseconds)


Funcţia transmite pe linia serială şirul de caractere Text (terminat cu ‘\0’), cu o pauză programabilă
între caractere, specificată în milisecunde prin parametrul miliseconds.

void timer_InitTimer0(void)
Funcţia iniţializează şi porneşte timer-ul T0 în modul 1, timer pe 16 biţi, generează intrerupere la 10
milisecunde. Dacă se foloseşte această funcţie în program , atunci programul trebuie să conţina şi
rutina de întrerupere pentru timer-ul T0. De exemplu:

Timer0() interrupt 1
{
timer_Update(); // prima instrucţiune din rutina de întrerupere

// alte instructiuni
}

void timer_Delay(unsigned miliseconds)


Funcţia generează o întârziere, exprimată în milisecunde, programabilă prin parametrul de intrare,
folosind pentru măsurarea întârzierii timer-ul T0. Întârzierea este exactă dacă miliseconds este un
multiplu de 10 milisecunde. Pentru ca funcţia de întârziere să funcţioneze corect, este necesar ca
timer-ul T0 să fie pornit, iar in cadrul rutinei de intrerupere să se apeleze funcţia:
delay_Update();

void timer_Update(void)
Functia trebuie sa fie prima instructie din rutina de intrerupere pentru timer-ul T0.
Ea reincarca valorile programate in registrele timer-ului la initializare si deasemenea reseteaza
timer-ul T3 (watchdog).

void delay_Update(void)

94
Functia trebuie apelata numai din rutina de intrerupere pentru timer-ul T0, daca in programul de
aplicatie se foloseste functia: timer_Delay. Ea asigura incrementarea contorului necesar pentru
masurarea intirzierii programate.

Functii pentru afisajul cu cristale lichide LCD

void lcd_InitDisplay(void)
Functia initializeaza afisajul cu cristale lichide cu urmatorii parametrii: interfata de 8 biti, format 2
linii, matrice caracter 5*7.Toate celelalte functii pentru display pot fi folosite numai dupa initializarea
lui. După iniţializare, afisajul este sters, afisarea este activata, cursorul este pozitionat in prima pozitie
caracter de pe prima linie a afisajului si este dezactivat.

void lcd_InitDisplay_1(bit font)


Functia permite initializarea unui afisaj cu cristale lichide cu o singura linie de caractere.
Functia initializeaza afisajul cu cristale lichide cu urmatorii parametrii: interfata de 8 biti, format 1
linie, matrice caracter 5*7 daca font este 0, sau matrice caracter 5*10 daca font este 1.

void lcd_CursorAtHome(void)
Functia muta cursorul pe linia 1, in pozitia caracter 1.

void lcd_BlinkOn(void)
Functia activeaza afisarea cursorului de tip bloc caracter intermitent.

void lcd_BlinkOff(void)
Functia dezactiveaza afisarea cursorului de tip bloc caracter intermitent.

void lcd_CursorOn(void)
Functia activeaza afisarea cursorului de tip linie continua (se afiseaza sub caracter).

void lcd_CursorOff(void)
Functia dezactiveaza afisarea cursorului de tip linie continua.

void lcd_DisplayOn(void)
Functia activeaza afisarea pe ecran a continutului memoriei interne a display-ului.

void lcd_DisplayOff(void)
Functia dezactiveaza afisarea pe ecran a continutului memoriei interne a display-ului. Mesajele nu se
afiseaza pe ecran, dar se incarca in memoria interna a display-ului.

void lcd_MoveCursor(unsigned char Line,unsigned char x)


Functia muta cursorul pe linia Line (1-2), in pozitia caracter x (1-40). Cursorul trebuie activat in
prealabil.

void lcd_ShiftCursorRight(void)
Functia deplaseaza cursorul cu o pozitie caracter la dreapta.
Din pozitia 40 a liniei 1, cursorul trece in pozitia 1 a liniei 2.
Din pozitia 40 a liniei 2, cursorul trece in pozitia 1 a liniei 1.

void lcd_ShiftCursorLeft(void)
Functia deplaseaza cursorul cu o pozitie caracter la stinga.
Din pozitia 1 a liniei 2, cursorul trece in pozitia 40 a liniei 1.
Din pozitia 1 a liniei 1, cursorul trece in pozitia 40 a liniei 2.

95
void lcd_ShiftDisplayRight(void)
Functia deplaseaza afisarea pe ecranul display-ului cu o pozitie caracter la dreapta in cadrul memoriei
interne.

void lcd_ShiftDisplayLeft(void)
Functia deplaseaza afisarea pe ecranul display-ului cu o pozitie caracter la stinga in cadrul memoriei
interne.

void lcd_WriteString(unsigned char Line,unsigned char x,unsigned char *Buffer) reentrant


Functia afiseaza sirul de caractere Buffer pe linia Line, incepind din pozitia caracter x a liniei. Mesajul
poate aparea pe ecranul display-ului complet sau incomplet in functie de display-ul folosit (cu 16, 24
sau 40 de caractere pe linie).

void lcd_Write(unsigned char Line,unsigned char *Message)


Functia afiseaza mesajul Message pe linia Line, incepind din pozitia caracter 1 a liniei.

void lcd_ClearScreen(void)
Functia sterge complet ecranul display-ului.
De fapt se scrie caracterul ‘blank’ in toate locatiile din memoria interna a display-ului.

Functii pentru tastatura

void keyb_InitKeyboard(bit beeps, bit autorepeat)


Functia initializeaza tastatura. Prin parametrul beeps se poate programa functionarea in cazul apasarii
unei taste invalidate prin masca KeyMask (functia keyb_ScanKeyboard) si anume: daca beeps are
valoarea 1, atunci la apasarea tastei invalidate se genereaza 3 beep-uri scurte. Daca beeps este 0, atunci
la apasarea tastei invalidate nu se genereaza nici un sunet.
Prin parametrul autorepeat se poate programa functionarea autorepeat-ului la apasarea mai lunga a
unei taste. Daca autorepeat este 1 facilitatea este activata, altfel ea este dezactivata.

unsigned keyb_ScanKeyboard(unsigned KeysMask)


Functia scaneaza tastatura pentru determinarea apasarilor de taste. Functia trebuie apelata in bucla. Se
considera ca o tasta a fost apasata, daca ea a fost apasata pentru cel putin 60 de milisecunde.
Apasarile mai scurte se considera ca au fost perturbatii si se ignora.
Prin parametrul KeysMask se pot valida sau invalida anumite taste. Se foloseste cite un bit pentru
fiecare tasta (12 biti). Daca un anumit bit este pe 1, atunci tasta corespunzatoare este validata. La
apasarea unei taste validate se genereaza un beep scurt. La apasarea unei taste invalidate, functionarea
este stabilita la initializarea tastaturii prin functia: keyb_InitKeyboard.
Functia returneaza tasta apasata (bitul corespunzator din valoarea returnata este pe 1), dar numai in
cazul in care tasta este validata.
Nu se permite apasarea a mai multe taste simultan.
La apasarea mai lunga a unei taste validate, poate exista facilitatea de autorepeat, daca ea e fost
programata la initializarea tastaturii prin functia: keyb_InitKeyboard.
Interpretarea tastelor depinde de tastatura folosita. Se pot folosi tastaturi cu 12 taste, organizate in 3
grupe de 4 taste. In fisierul ap_lib.h, trebuie selectata configuratia corespunzatoare, sau trebuie creata
o noua configuratie daca cele existente nu corespund tastaturii folosite.
Pentru ca functia de scanare sa functioneze corect, este necesar ca timer-ul T0 sa fie pornit, iar in
cadrul rutinei de intrerupere sa apeleze functia:
keyb_Update();

void keyb_WaitKey(unsigned Key)


Functia permite oprirea unui program pina la apasarea unei taste. Daca parametrul Key este 0, atunci
functia asteapta apasarea oricarei taste. Daca parametrul Key este diferit de 0, atunci functia asteapta
apasarea tastei specificate prin Key.

96
void keyb_Update(void)
Functia trebuie apelata numai din rutina de intrerupere pentru timer-ul T0, daca in programul de
aplicatie se foloseste tastatura. Ea asigura incrementarea contoarelor necesare pentru scanarea
tastaturii.

Functii pentru porturile de intrare/iesire, buzzer, intrarile analogice (ADC)

unsigned char inp_ReadPort(void)


Functia returneaza un octet care reprezinta valoarea curenta citita din portul de intrare.

void outp_WritePort(unsigned char Value)


Functia scrie octetul Value in portul de iesire.

void buser_Frequence(unsigned char Frequence)


Functia porneste buzzer-ul, cu un anumit ton stabilit prin parametrul Frequence.
De fapt, se genereaza pe iesirea PWM0 a microcontrolerului, un semnal periodic, dreptunghiular, cu
factor de umplere ½ si frecventa stabilita de Frequence (valoarea se incarca in registrul PWMP).

void buser_ON(void)
Functia porneste buzzer-ul, prin apelul functiei buser_Frequence.

void buser_OFF(void)
Functia opreste buzzer-ul.

void buser_Beep(unsigned miliseconds)


Functia genereaza un beep cu durata programabila prin parametrul miliseconds.
Nu se altereaza sunetul buzzer-ului stabilit cu functia buser_Frequence.

void buser_Beeps(unsigned miliseconds,unsigned char beeps)


Functia genereaza un numar de beeps beep-uri cu durata programabila prin miliseconds.
Nu se altereaza sunetul buzzer-ului stabilit cu functia buser_Frequence.

void buser_Blink(void)
Functia permite generarea unor semnale intermitente pe buzzer. La fiecare apel se inverseaza starea
buzzer-ului. Pentru a obtine un semnal intermitent, functia trebuie apelata periodic, dar numai dupa ce
in prealabil a fost pornit buzzer-ul.

unsigned char adc_ReadInput(unsigned char Address, unsigned *Result)


Functia citeste una din intrarile analogice a portului P5, stabilita prin parametrul Address (0-7),
realizeaza conversia analog-numerica, depune rezultatul (10 biti) in parametrul Result, apoi returneaza
1 daca operatia a reusit, sau 0 in caz contrar.
Functii pentru convertorul numeric-analogic (DAC)

void dac_Clear(void)
Functia inscrie valoarea 0 in canalul convertorului numeric-analogic.

void dac_WriteChannel(unsigned char Data)


Functia inscrie valoarea parametrului Data in canalul convertorului numeric-analogic.

97
98
ANEXA 2.
SEMNALE ŞI CIRCUITE LOGICE
1. Nivele logice de tensiune
În circuitele logice, un nivel logic este una dintre stările finite pe care un semnal le poate avea. Nivelul
logic este reprezentat de tensiunea față de masă (sau alt punct de referință) a semnalului. De exemplu
în logica binară, cea mai utilizată situație în aplicații, este cea în care celor două nivele logice ”high”
și ”low” le corespund valorile binare ”1” respectiv ”0”.
În logica ”three state”, o a treia stare este cea de impedanță ridicată, căreia nu îi corespunde un nivel
de tensiune, ci indică faptul că circuitul nu controlează ieșirea, permițând altor circuite să o facă.
În tehnică, unui nivel logic i se asociază un domeniu de tensiune sau de curent. Acesta depinde de
tehnologia de producere a circuitului logic. În cazul logicii binare, cel mai uzual, se lucreză cu nivele
de tensiune, care sunt asociate astfel:
Se stabilește un prag de tensiune. Dacă tensiunea în punctul de lucru este sub pragul stabilit,
punctul se află la un nivel logic. Dacă tensiunea este peste pragul stabilit, punctul se află la
celălalt nivel logic.
Exemplu: La începutul dezvoltării circuitelor logice, nivelele logice cele mai utilizate au fost
cele numite TTL (de la tehnologia tranzistor-tranzistor-logic), acestea fiind utilizate și astăzi
pe scară largă. Nivelul de tensiune corespunzător lui ”1” logic este 5V, iar cel corespunzător
lui ”0” logic este 0V 5. În realitate fiecărui nivel logic îi corespunde un domeniu de tensiune,
conform fig. 1. Circuitele TTL sunt alimentate cu 5V. Membrii familiei sunt circuitele cu
codificarea 74xx, 74Fxx, 74Sxx, 74ASxx, 74LSxx, 74ALSxxx. Explicațiile acestor coduri este
dată în tabelul 1.

Fig. 1. Nivelele logice de tensiune pentru familia TTL


Se observă că nivelele de tensiune acceptabile pentru cele două nivele logice nu sunt identice pentru
intrare și ieșire. La ieșire nivelele sunt mai restrictive iar la intrare sunt mai permisive ([0, 0.35] V față
de [0, 0.8]V pentru ”LOW” și [2.7, 5] V față de
[3.3 ,5]V pentru ”HIGH”). Aceasta pentru ca recunoașterea nivelul logic să se poată face după ce
semnalul de tensiune a parcurs un traseu (cablu electric, traseu imprimat) de la ieșire la intrare, traseu
pe care au loc căderi de tensiune datorită rezistenței firelor, sau însumarea unor zgomote. De exemplu,
dacă semnalul ”LOW” la ieșire are 0.35 V și firul de pe traseul către intrare este afectat de zgomot
aditiv, pentru o valoare de 0.3 V a acestuia, intrarea de 0.65 V se va găsi în zona acceptabilă de 0.8 V.
O altă familie de circuite logice, foarte utilizată este familia CMOS, ale cărei componente pot fi
alimentate cu tensiuni de la 3V până la 15 V, nivele logice sunt prezentate in fig.3.2 pentru o tensiune
de alimentare de 5 V. Avantajele față de familia TTL sunt: posibilitatea selectării nivelelor de tensiune
logice și un consum redus de curent.

5
Există situația când se lucrează cu așa numita ”logică negată” caz în care nivelele de tensiune se inversează,
adică nivelului logic ”1” îi corespund 0V, iar nivelului logic ”0” îi corespund 5V.

99
Fig.2. Nivelele logice pentru familia CMOS

Fig.3. Nivelele de tensiune pentru 4 familii de circuite logice


In fig.2.3. este prezentată o sinteză a nivelelor logice pentru familiile TTL, CMOS, TTL/CMOS
(circuite logice hibride TTL și CMOS, utilizate pentru conectarea componentelor din cele două
familii), și CMOS de tensiune redusă LowV (alimentarea la 3.6 V).

2. Consumul de curent în scheme cu circuite logice


Curentul furnizat/absorbit de un circuit logic este de trei tipuri (vezi fig.2.4.a):
- de intrare I I – care circulă prin pinii de intrare a circuitului
- de ieșire I O – care circulă prin pinul/pinii de ieșire a circuitului
- de alimentare I S – care este preluat de la sursa de alimentare.
Curentul consumat de circuitul logic de la sursa de alimentare (curentul de alimentare) depinde de
curentul de intrare, de curentul de ieșire și de tehnologia de construcție a circuitului logic.
De asemenea consumul de curent depinde de starea circuitului, și anume:
- curentul în cazul intrării/ieșirii în starea ”HIGH”
- curentul în cazul intrării/ieșirii în starea ”LOW”
- curentul în cazul intrării/ieșirii în tranziție

100
Consumul de curent trebuie urmărit în specificațiile tehnice ale fiecărui circuit, deoarece nu există o
informație generală despre acesta.
În continuare se prezintă un exemplu de conectare de circuite logice din familia TTL standard, (poarta
logică ȘI-NU). În fig.2.4.b si c este prezentată o schemă în care la ieșirea porții 1 se leagă două intrări
ale unor porți identice ca tip, porțile 2 și 3.

Fig.4. Curenții în porțile logice TTL


În cazul circuitelor logice TTL, când ieșirea este pe nivelul logic ”HIGH”, acestea furnizează curentul
(vezi fig.2.4.b), I OHmax = 400μA
Curentul maxim absorbit la intrare pe nivelul logic ”HIGH”, este I IHmax = 40μA
Prin urmare, o poartă logică standard poate furniza curent, în starea ”HIGH” pentru alte 10 intrări de
porți logice.

Numărul de intrări care pot fi conectate la ieșirea unei porți logice poartă
numele de fan-out al porții logice
Când ieșirea este pe nivelul logic ”LOW”, acestea absoarbe curentul IOLmax = 16 mA
(vezi fig.2.4.c),
Curentul maxim furnizat la intrare pe nivelul logic ”LOW”, este IILmax = 1,6 mA
O poartă logică poate prelua curent, în starea ”LOW” tot de la 10 intrări de porți logice.

3. Familii de circuite logice


O familie de circuite logice reprezintă totalitatea componentelor construite după o anumită tehnologie.
În fig.2.5 sunt prezentate familiile de circuite logice după criteriul vitezei (timpul de propagare sau
timp de răspuns, timpul dintre frontul semnalului de intrare şi frontul semnalului de la ieşire), şi a
consumului de energie, iar în tabelul 2.1 sunt prezentate semnificaţiile acronimelor.

101
Fig.5 Prezentarea familiilor de circuite integrate logice în funcție de consum și timpul de propagare
(răspuns)

Tabelul 1 Codurile pentru cele mai uzuale familii de circuite logice.


TTL (74xx) Standard TTL
74L Low power
74S Schottky
74H High speed
74LS Low power - Schottky
74AS Advanced - Schottky
74ALS Advanced - Low power - Schottky
74F(AST) Fast - (Advanced - Schottky)
74C CMOS
74HC (U) High speed - CMOS (Unbuffered output)
74HCT High speed - CMOS - TTL inputs
74AHC Advanced - High speed - CMOS
74AHCT Advanced - High speed - CMOS - TTL inputs
74FCT (-A) Fast - CMOS - TTL inputs (speed variations)
74FCT (-T, -AT) Fast - CMOS - TTL inputs (speed variations)
74AC Advanced - CMOS
74ACT Advanced - CMOS - TTL inputs
74FACT AC, ACT (Q) series
74ACQ Advanced - CMOS - Quiet outputs
74ACTQ Advanced - CMOS - TTL inputs - Quiet outputs
Driver de magistrală (amplificator)
74ABT Advanced - BiCMOS
74ABTE ABT - Enhanced Transceiver Logic
74ABTH Advanced - BiCMOS - Technology - bus Hold
74BCT BiCMOS - TTL inputs
74BTL Backplane - Transceiver - Logic

102
74GTL Gunning - Transceiver - Logic
74GTLP GTL Plus
Low Voltage
74ALB Advanced - Low Voltage - BiCMOS
74LV (U) Low - Voltage (Unbuffered output)
74LVC (R) (U) LV - CMOS (damping Resistor)(Unbuffered output)
74LVCH Low - Voltage - CMOS - bus Hold
74ALVC Advanced - Low - Voltage - CMOS
74LVT (R) (U) LV - TTL (damping Resistor(Unbuffered output)
74LVTZ Low - Voltage - TTL - High Impedance power-up
74ALVC (R) ALV - CMOS (bus Hold) (damping Resistor)
74ALVCH Advanced - Low - Voltage - CMOS - bus Hold
74LCX LV - CMOS (operates with 3v & 5v supplies)
74VCX LV - CMOS (operates with 1.8v & 3.6v supplies
4000 Familia CMOS
Observaţii:
- Pentru familia CMOS (HC, AC și FC), versiunea "T" (HCT, ACT, and FCT) are nivele
de tensiune de intrare compatibile atât cu familia TTL cât și cu 3.3V CMOS. Circuitele la
care numele nu conţine litera "T", au doar nivele CMOS.
- Familia 74H este asemănătoare cu familia 74, cu diferența că rezistențele interne sunt
diminuate ca valoare, în consecință timpul de propagare este redus de la 9ns la 6ns, însă
cu creșterea consumului de putere.
- Circuitele din familia 74S ce utilizează tehnologie Schottky consumă mai multă putere
decât cele din familia 74, însă sunt mai rapide. Circuitele din familia 74LS sunt versiunea
de mică putere a familiei 74S, fiind cel mai bun compromis putere/viteză, motiv pentru
care au fost cele mai utilizate circuite logice.
- Familia 74F introdusă de Fairchild Semiconductor și adoptată și de alți producători, este
mai rapidă decât circuitele din familiile 74, 74LS și 74S.
Reguli de numerotare a circuitelor integrate logice:
• Primul prefix de două sau trei litere (uzual omise) indică, dar nu în mod univoc, producătorul
(de ex. SN pentru Texas Instruments, DM pentru National Semiconductor, dar Fairchild
Semiconductor utilizează atât prefixul MM cât și DM).
• Al doilea prefix de două litere reprezintă domeniul de tempeartură ("74", indică domeniul
comercial de temperatură, iar "54", indică domeniul militar –extins - de temperatură).
• Până la 4 litere ce semnifică subfamilia de circuite logice (de ex. "LS" sau "HCT").
• Două sau mai multe cifre ce reprezintă funcția circuitului logic ( de ex. 00 pentru circuitul cu
4 porți NAND cu două intrări)
• Un eventual sufix format din litere sau cifre care poate semnifica capsula sau alte informații.
EXEMPLU: SN74ALS245N reprezintă un circuit produs de Texas Instruments (SN), de tip TTL în
gama de temperaturi comerciale (74), face parte din familia "advanced low-power Schottky" (ALS),
este un buffer bidirecțional de 8 bit (245) într-o capsulă de plastic DIP (N).

103
104
ANEXA 3.
LIBRĂRII DE FUNCŢII
PENTRU PLACA DE DEZVOLTARE S12

1. NIVELE FUNCŢIONALE

Fig. 1. Arhitectura Software


Proiectul este impărţit pe 4 niveluri majore. Fiecare nivel are o anumită funcţionalitate.

2. ARHITECTURA STATICĂ

105
Arhitectura statică descrie structura software a proiectului, convenţiile de denumire si dependenţele
dintre module.
Pentru fiecare nivel este creat un folder anume dupa cum este descris in continuare:

IO - Project_path\IO\...IO modules folders\


Ex: D:\Project1\IO\ATD\atd.c

Module software
• un modul software este alcatuit din fisierele de implementare si configurare aferente
• numele folderului unui modul consta in abrevierea numelui sau (ex. ATD, PWM)

3. Componentele nivelului IO
Urmatoarele module software implimenteaza functionalitatatile microcontroller-ului S12.

3.1. PIN driver


Acest driver realizeaza initializarea tuturor pinilor placii de dezvoltare folositi in aplicatie cu
functionalitatea si starea initiala dorita.

ATENTIE! Pentru a folosi acest driver trbuie inclus in main.c fisierul “io_pin.h”.

Pentru setarea pinilor de va modifica structura io_pin_config_pins[] din fisierul io_pin_config.c

Pentru fiecare pin se va specifica:

• PORTUL
Parametrul poate lua una din valorile predefinite:
IO_PIN_PORT_T, IO_PIN_PORT_S, IO_PIN_PORT_M, IO_PIN_PORT_P,
IO_PIN_PORT_H, IO_PIN_PORT_J, IO_PIN_PORT_A, IO_PIN_PORT_B

• NUMARUL PINULUI
Parametrul poate lua una din valorile predefinite:
IO_PIN_PIN0, IO_PIN_PIN1, IO_PIN_PIN2, IO_PIN_PIN3, IO_PIN_PIN4,
IO_PIN_PIN5, IO_PIN_PIN6, IO_PIN_PIN7

• FUNCTIONALITATEA
Parametrul poate lua una din valorile predefinite:
IO_PIN_FUNCTION_OUTPUT
IO_PIN_FUNCTION_INPUT
IO_PIN_FUNCTION_PULL_UP
IO_PIN_FUNCTION_PULL_DOWN
IO_PIN_FUNCTION_OPEN_DRAIN

• STAREA INITIALA
Parametrul poate lua una din valorile predefinite:
IO_PIN_LOW - starea initiala va fi 0
IO_PIN_HIGH - starea initiala va fi 1

Exemplu de configurare:

/* pins configuration */
IO_PIN_ConfigPin io_pin_config_pins[]={
{IO_PIN_PORT_T, IO_PIN_PIN6, IO_PIN_FUNCTION_INPUT, IO_PIN_LOW_LEVEL},
{IO_PIN_PORT_S, IO_PIN_PIN2, IO_PIN_FUNCTION_OUTPUT, IO_PIN_HIGH_LEVEL}

106
};

/* PIN driver configuration */


IO_PIN_Config io_pin_config={
sizeof(io_pin_config_pins) / sizeof(IO_PIN_ConfigPin), /* number of pins */
io_pin_config_pins /* pointer to pin configuration */
};
Nota! Un pin poate avea mai multe functionalitati.In acest caz in strucura de configurare se va face
pentru fiecare functionalitate o noua inregistrare

3.1.1. IO_PIN_Initialization
Functia realizeaza initializarea pinilor placii.

Header-ul functiei:

void IO_PIN_Initialization(IO_PIN_Config * cnf);

Exemplu de folosire a functiei:

#include <io_pin.h> /* access to IO_PIN_Initialization interface */


#include <io_pin_config.h> /* access to io_pin_config structure */
int main(void) {
/* system startup.... */
IO_PIN_Initialization(&io_pin_config); // io_pin_config este predefinit
/*....... */
return 0;
}
3.2 IN driver
Acest driver se ocupa de pinii setati ca pini de intrare digitala.

ATENTIE! Pentru a folosi acest driver trbuie inclus in main.c fisierul “io_in.h”.

3.2.1 IO_IN_GetPinLevel
Functia returneaza nivelul logic al pinului specificat.
Header-ul functiei:

In apelul functiei se vor specifica:


u8 IO_IN_GetPinLevel(u8 port, u8 pin);
• PORTUL
Parametrul poate lua una din valorile predefinite:
IO_IN_PORT_T, IO_IN_PORT_S, IO_IN_PORT_M, IO_IN_PORT_P, IO_IN_PORT_H,
IO_IN_PORT_J, IO_IN_PORT_A, IO_IN_PORT_B
• NUMARUL PINULUI
Parametrul poate lua una din valorile predefinite:
IO_IN_PIN0, IO_IN_PIN1, IO_IN_PIN2, IO_IN_PIN3, IO_IN_PIN4, IO_IN_PIN5,
IO_IN_PIN6, IO_IN_PIN7

Exemplu: pin=IO_IN_GetPinLevel(IO_IN_PORT_M, IO_IN_PIN1);

3.2.2 IO_IN_GetPortState
Functia returneaza starea intregului port.
Header-ul functiei:

In apelul functiei se va specifica: u8 IO_IN_GetPortState(u8 port);

107
• PORTUL
Parametrul poate lua una din valorile predefinite:
IO_IN_PORT_T, IO_IN_PORT_S, IO_IN_PORT_M, IO_IN_PORT_P, IO_IN_PORT_H,
IO_IN_PORT_J, IO_IN_PORT_A, IO_IN_PORT_B

Exemplu: port=IO_IN_GetPortState(IO_IN_PORTA);

3.3 OUT driver


Acest driver se ocupa de pinii setati ca pini de iesire digitala.

ATENTIE! Pentru a folosi acest driver trbuie inclus in main.c fisierul “io_out.h”.

3.3.1 IO_OUT_SetPinLevel
Functia seteaza nivelul logic al pinului specificat.
Header-ul functiei:
În apelul functiei se vor specifica:
• PORTUL void IO_OUT_SetPinLevel(u8 port, u8 pin, u8 level);
Parametrul poate lua una din valorile predefinite:
IO_OUT_PORT_T, IO_OUT_PORT_S, IO_OUT_PORT_M, IO_OUT_PORT_P,
IO_OUT_PORT_H, IO_OUT_PORT_J, IO_OUT_PORT_A, IO_OUT_PORT_B

• NUMARUL PINULUI
Parametrul poate lua una din valorile predefinite:
IO_OUT_PIN0, IO_OUT_PIN1, IO_OUT_PIN2, IO_OUT_PIN3, IO_OUT_PIN4,
IO_OUT_PIN5, IO_OUT_PIN6, IO_OUT_PIN7
• NIVELUL LOGIC
Parametrul poate lua una din valorile predefinite:
IO_OUT_LOW, IO_OUT_HIGH
Exemplu: IO_OUT_SetPinLevel(IO_IN_PORT_M, IO_IN_PIN1);

3.3.2 IO_OUT_SetPortState
Functia seteaza starea intregului port specificat.
Header-ul functiei:

In apelul functiei se vor specifica:


void IO_OUT_SetPortState(u8 port, u8 state);
• PORTUL
Parametrul poate lua una din valorile predefinite:
IO_OUT_PORT_T, IO_OUT_PORT_S, IO_OUT_PORT_M, IO_OUT_PORT_P,
IO_OUT_PORT_H, IO_OUT_PORT_J, IO_OUT_PORT_A, IO_OUT_PORT_B

• STAREA PORTULUI
Se va seta valoarea dorita.
Exemplu: IO_OUT_SetPortState(IO_IN_PORT_M, 0x00AA);

3.4 ATD driver


Acest driver se ocupa cu conversiile analog-digitale si pune la dispozitie interfetele prezentate in
continuare. Pinii de input analogici pot fi configurati si ca pini de input digital. Configurarea corecta a
pinilor de input analogici se face prin intermediul diverului PIN la pornirea aplicatiei.

ATENTIE! Pentru a folosi acest driver trbuie inclus in main.c fisierul “io_atd.h”.

108
Pentru configurarea ATD-ului se va specifica:

• REZOLUTIA
Parametrul poate lua una din valorile predefinite:
IO_ATD_8_BIT_RESOLUTION, IO_ATD_10_BIT_RESOLUTION
• FORMATUL REZULTATULUI (JUSTIFICATION)
Parametrul poate lua una din valorile predefinite:
IO_ATD_LEFT_JUSTIFIED, IO_ATD_RIGHT_JUSTIFIED
• SAMPLE TIME
Parametrul poate lua una din valorile predefinite:
IO_ATD_2_CLOCK_PERIODS, IO_ATD_4_CLOCK_PERIODS,
IO_ATD_8_CLOCK_PERIODS, IO_ATD_16_CLOCK_PERIODS

• PRESCALER
Parametrul poate lua una din valorile predefinite:
IO_ATD_CLOCK_DIVIDER_X,
unde X se inlocuieste cu o valoare para de la 2 la 64.
Pentru setarea pinilor de va modifica structura io_atd_config din fisierul io_atd_config.c

Exemplu de configurare:

/* ATD driver configuration */


IO_ATD_Config io_atd_config = {
IO_ATD_10_BIT_RESOLUTION, IO_ATD_LEFT_JUSTIFIED,
IO_ATD_2_CLOCK_PERIODS, IO_ATD_CLOCK_DIVIDER_6
};

3.4.1 IO_ATD_Initialization
Functia realizeaza initializarea si configurarea modulului de conversie analog-digitala.
Apelul acesteia se face la inceputul programului. Conversiile ATD sunt initiate doar de utilizator.
Acesta trebuie sa asigure configuratia cea mai potrivita pentru fiecare aplicatie. Rezultatul conversiei
este o valoare unsigned pe 16 biti.

Header-ul functiei:
void IO_ADT_Initialization(IO_ATD_Config* cnf);

Exemplu de folosire a functiei:

#include <io_atd.h> /* acces spre interfata IO_ATD_Initialization */


#include <io_atd_config.h> /* acces spre structura io_atd_config */
int main(void) {
/* system startup.... */
IO_ATD_Initialization(&io_atd_config); // io_atd_config este predefinit
/*....... */
return 0;
}

3.4.2 IO_ATD_StartSequence
Aceasta interfata porneste o secventa de conversie pentru toate canalele de intrare analogice conform
parametrilor setati prin configurare. Fiecare canal este configurat in acelasi mod. Apelarea acestei

109
functii va intrerupe o conversie in curs si va porni una noua. Aceasta interfata ar trebui apelata doar
dupa ce conversia precedenta a fost finalizata.

Header-ul functiei:
void IO_ATD_StartSequence(void);

3.4.3 IO_ATD_ConversionResult
Aceasta interfata returneaza rezultatul ultimei conversii de pe canalul specificat. Daca inca nu a fost
initiata o secventa de conversie, valuarea returnata este 0xFFFF, la fel ca si in cazul in care conversia
in curs nu a fost inca finalizata.
Header-ul functiei:
u16 IO_ATD_ConversionResult(u8 channel);

In apelul functiei se va specifica:


• CANALUL
Parametrul poate lua una din valorile predefinite:
CHANNEL_ANi, unde i = 0..7

Exemplu: rezultat_atd = IO_ATD_ConversionResult(CHANNEL_AN0);

3.5 SCI driver


Acest driver se ocupa de realizarea comunicarii seriale intre microcontroller-ul S12 si alt terminal.
ATENTIE! Pentru a folosi acest driver trbuie inclus in main.c fisierul “io_sci_config.h” si “io_sci.h”

3.5.1 IO_SCI_Initialization
Aceasta functie initializeaza paramterii pentru comunicarea seriala.
Header-ul functiei:
void IO_SCI_Initialization(IO_SCI_Config* cnf);
Exemplu de folosire a functiei:

#include <io_sci.h> /* access to io_sci_Initialization interface */


#include <io_sci_config.h> /* access to io_sci_config structure */
int main(void)
{
/* system startup.... */
IO_SCI_Initialization(&io_sci_config); // io_sci_config este predefinit
/*....... */
return 0;
}
Pentru setarea porturilor se va modifica structura io_sci_config[] din fisierul io_sci_config.c

Pentru fiecare canal se va specifica:

• BAUD RATE
Parametrul poate lua una din valorile predefinite:

110
IO_SCI_BAUD_RATE_1200, IO_SCI_BAUD_RATE_2400, IO_SCI_BAUD_RATE_4800,
IO_SCI_BAUD_RATE_9600, IO_SCI_BAUD_RATE_19200, IO_SCI_BAUD_RATE_38400

• FORMATUL DATELOR
Parametrul poate lua una din valorile predefinite:
IO_SCI_8N1_DATA_BITS -8 biti de date
IO_SCI_9N1_DATA_BITS -9 biti de date

• PARITATEA
Parametrul poate lua una din valorile predefinite:
IO_SCI_NO_PARITY
IO_SCI_ODD_PARITY
IO_SCI_EVEN_PARITY

• NUMARUL CANALULUI
Parametrul poate lua una din valorile predefinite:

IO_SCI_CHANNEL_0
IO_SCI_CHANNEL_1

Exemplu de configurare:

/* SCI configuration */
IO_SCI_Config io_sci_config[] = {

{IO_SCI_BAUD_RATE_2400, IO_SCI_8N1_DATA_BITS, IO_SCI_NO_PARITY,


IO_SCI_CHANNEL_0 },
{IO_SCI_BAUD_RATE_2400, IO_SCI_8N1_DATA_BITS, IO_SCI_NO_PARITY,
IO_SCI_CHANNEL_1 }

};

3.5.2 IO_SCI_SendData
Aceasta functie va trimite un pachet de date pe canalul specificat.
ATENTIE! Numarul de biti din “data” trebuie sa fie acelasi cu numarul de biti suportati de canal(cu
care a fost configurat )

Header-ul functiei: extern void IO_SCI_SendData(u16 data, u8 channel);

In apelul functiei se vor specifica:


• DATA care se trimite

• CANALUL
IO_SCI_CHANNEL_0
IO_SCI_CHANNEL_1

3.5.3 IO_SCI_SendFrame
Aceasta functie va trimite un anumit numar de pachete de date pe canalul specificat.
ATENTIE! Numarul de biti din “data” trebuie sa fie acelasi cu numarul de biti suportati de canal(cu
care a fost configurat )

void IO_SCI_SendFrame(u8 count, u16* buffer, u8 channel);

111
Header-ul functiei:

In apelul functiei se vor specifica:


• Numarul de pachete trimise
• DATA care se trimite
• CANALUL
IO_SCI_CHANNEL_0
IO_SCI_CHANNEL_1

3.5.4 IO_SCI_DataAvailable
Functia va returna 1 daca un nou pachet de date a fost primit corect, 0 daca nu a fost primit niciun
pachet nou de date, si 2 daca a avut loc o eroare in procesul de primire a datelor.
Header-ul functiei:
u8 IO_SCI_DataAvailable(u8 channel);
In apelul functiei se vor specifica:
• CANALUL
IO_SCI_CHANNEL_0
IO_SCI_CHANNEL_1

3.5.5 IO_SCI_GetData
Functia va returna pachetele de data primite pe portul serial. Functia ar trebui sa fie folosita numai in
cazul in care functia IO_SCI_DataAvailable returneaza 1.
Header-ul functiei:

u16 IO_SCI_GetData(u8 channel);

In apelul functiei se vor specifica:


• CANALUL
• IO_SCI_CHANNEL_0
• IO_SCI_CHANNEL_1

3.6 PWM driver


Driverul initializeaza si se ocupa cu toate canalele PWM folosite in aplicatie. Exista 8 canale PWM
hardware la dispozitie.

Pentru configurarea PWM-ului se va specifica:

• PRESCALER CLOCK A
Parametrul poate lua una din valorile predefinite:
IO_PWM_CLK_DIV_X, unde X este o putere a lui 2 de la 0 la 128
• PRESCALER CLOCK B
Parametrul poate lua una din valorile predefinite:
IO_PWM_CLK_DIV_X, unde X este o putere a lui 2 de la 0 la 128
• PRESCALER SCALE_CLOCK A
Parametrul poate lua una din valorile 0..255
• PRESCALER SCALE_CLOCK B
Parametrul poate lua una din valorile 0..255
• FACTORUL DE UMPLERE INITIAL (%)
Pentru setarea canalelor PWM se va modifica structura io_pwm_config din fisierul io_pwm_config.c

Pentru configurarea fiecarui canal PWM-ului se va specifica:

112
• CANALUL
Parametrul poate lua una din valorile predefinite:
IO_PWM_X, unde X = 0..7
• POLARITATE
Parametrul poate lua una din valorile predefinite:
IO_PWM_HIGH, IO_PWM_LOW
• CLOCK SURSA
Parametrul poate lua una din valorile predefinite:
IO_PWM_CLOCK, IO_PWM_SCALE_CLOCK
• PERIOADA INITIALA
• FACTORUL DE UMPLERE INITIAL (%)
Pentru setarea canalelor PWM se va modifica structura io_pwm_config_channels[] din fisierul
io_pwm_config.c

Exemplu de configurare:

/* configurarea canalelor PWM */


IO_PWM_ConfigChannel io_pwm_config_channels[] ={
{IO_PWM_0, IO_PWM_LOW, IO_PWM_CLOCK, 100, 50},
{IO_PWM_1, IO_PWM_HIGH, IO_PWM_CLOCK, 250, 10},
{IO_PWM_2, IO_PWM_HIGH, IO_PWM_CLOCK, 250, 60},
{IO_PWM_7, IO_PWM_HIGH, IO_PWM_CLOCK, 250, 30}
};

/* configurarea driver-ului PWM */


IO_PWM_Config io_pwm_config={
IO_PWM_CLK_DIV_8, //prescaler for CLOCK A
IO_PWM_CLK_DIV_8, //prescaler for CLOCK B
200, //prescaler for SCALE CLOCK A [0-255]
100, //prescaler for SCALE CLOCK B [0-255]
sizeof(io_pwm_config_channels) / sizeof(IO_PWM_ConfigChannel), //number of channels
io_pwm_config_channels //pointer to channel configuration
};

ATENTIE! Pentru a folosi acest driver trbuie inclus in main.c fisierul “io_pwm.h”.

3.6.1 IO_PWM_Initialization
Interfata realizeaza initializarea canalulelor PWM si surselor clock. Se executa la inceputul
programului. Initial, toate canalele trebuie sa fie inactive.

Header-ul functiei:
void IO_PWM_Initialization(IO_PWM_Config * cnf);

Exemplu de folosire a functiei:

#include <io_pwm.h> /* aces catre interfata IO_PWM_Initialization */


#include <io_pwm_config.h> /* aces catre structura io_pwm_config pentru configurare */
int main(void) {
/* system startup.... */
IO_PWM_Initialization(&io_pwm_config);
/*....... */
return 0;
}

113
3.6.2 IO_PWM_Enable
Aceasta interfata activeaza / dezactiveaza generarea de pulsuri pe un canal PWM. Activarea unui canal
dupa initializarea lui va genera un semnal folosindu-se de perioada si factorul de umplere setati initial
in configurare.

Header-ul functiei:
void IO_PWM_Enable(u8 channel, u8 enable);

In apelul functiei se va specifica:


• CANALUL
Parametrul poate lua una din valorile predefinite:
IO_PWM_i, unde i = 0..7
• ACTIVARE / DEZACTIVARE (enable)
Parametrul poate lua una din valorile: 0 – dezactivare sau 1 – activare.

3.6.3 IO_PWM_SetDuty
Aceasta interfata seteaza factorul de umplere pe un canal PWM, fara sa modifice perioada semnalului.
Noul factor de umplere va fi reactualizat incepand cu urmatoarea perioada.

Header-ul functiei:
void IO_PWM_SetDuty(u8 channel, u8 duty);

In apelul functiei se va specifica:


• CANALUL
Parametrul poate lua una din valorile predefinite:
IO_PWM_i, unde i = 0..7
• FACTORUL DE UMPLERE
Parametrul este reprezentat de un numar 0-100 (%).

3.6.4 IO_PWM_SetPeriod
Aceasta interfata seteaza perioada pe un canal PWM, fara sa modifice factorul de umplere al
semnalului. Noua perioada este actualizata incepand cu perioada urmatoare.

Header-ul functiei:
void IO_PWM_SetPeriod(u8 channel, u16 period);

In apelul functiei se va specifica:


• CANALUL
Parametrul poate lua una din valorile predefinite:
IO_PWM_i, unde i = 0..7
• PERIOADA
Parametrul este un numar intre 0 si 65535, reprezentand microsecunde.

3.6.5 IO_PWM_Override
Aceasta interfata modifica perioada si factorul de umplere pe un canal PWM in momentul in care
functia este apelata. Efectul va fi suprascrierea configuratiei vechi si pornirea unei perioade noi cu
parametrii setati la apel.

Header-ul functiei:

114
void IO_PWM_Override(u8 channel, u16 period, u8 duty);

In apelul functiei se va specifica:


• CANALUL
Parametrul poate lua una din valorile predefinite:
IO_PWM_i, unde i = 0..7
• PERIOADA
Parametrul este un numar intre 0 si 65535, reprezentand microsecunde.
• FACTORUL DE UMPLERE
Parametrul este reprezentat de un numar 0-100 (%).
ANEXA 4.
PROGRAMAREA SISTEMULUI CU ATMEGA32

1. NOŢIUNI DESPRE PROGRAMAREA PLĂCII:

Proiectele se execută pe placa cu microcontrolerul Atmega32 utilizând mediul de proiectare


AVR Studio.

Proiectul GENERIC conţine un program exemplu de plecare (template) pentru toate proiectele.
Pentru lansarea aplicaţiei, se copiază directorul GENERIC în subdirectorul de lucru şi se lansează
fişierul generic.aps.
Toate modificările care se fac în fişierul main.c se salvează automat în directorul GENERIC, care la
sfârşitul activităţii se copiază şi se păstrează, lăsând directorul original nealterat, pentru a putea fi
folosit în continuare de alţi utilizatori.

Programul principal (main.c)

//fişier main.c -model


#include "avr\io.h"
#include "lcd.h"
#include "KeyBoard.h"
#include "ADC.h"

115
#include "PWM.h"
#include <util/delay.h>

uint8_t d1,d2,d3,d4;
uint16_t voltage;
uint32_t voltage1;
uint32_t voltage2;
uint16_t ret_val=0;

void UpdateLCDDisplay(int value)


{
lcd_putc(value+48);
}
//rutina de afişare a tensiunii,
//parametrul de intrare fiind numărul de cuante
void DisplayReading(uint16_t Reading)
{

voltage1=Reading*(uint32_t)5000;
voltage=voltage1/1023; //calculează tensiunea în mV

d4=voltage % 10;
voltage/=10;

d3=voltage % 10;
voltage/=10;

d2=voltage % 10;
voltage/=10;

d1=voltage % 10;
voltage/=10;

lcd_gotoxy(0,0); // afişează tensiunea în mV cifră cu cifră


UpdateLCDDisplay(d1);

lcd_gotoxy(1,0);
UpdateLCDDisplay(d2);

lcd_gotoxy(2,0);
UpdateLCDDisplay(d3);

lcd_gotoxy(3,0);
UpdateLCDDisplay(d4);
//rutina de întârziere
_delay_ms(1000);
}

int main(void)
{

lcd_init(LCD_DISP_ON);

116
lcd_clrscr();
// lcd_puts("LCD test ...");

InitADC();
PWMinit();
//rutina de scriere la PWM
set_pwm_val(0x0300); // PWM este pe 10 bit, de la 0x000 la 0x3FF
while(1)
{
ret_val = ReadChannel(2); //citire convertor analog-numeric
DisplayReading(ret_val);
}
return 0;
}

2. LUCRUL CU PORTUL PARALEL

Microcontrolerul ATMEGA32 are 4 porturi de câte 8 bit PORT A, B, C, D.

Fiecare bit poate fi configurat ca bit de ieşire sau de intrare.


Procedura de lucru cu portul paralel este următoarea:

1. Se setează sensul fiecărui bit din portul cu care se lucrează (ieşire sau intrare ), prin comanda
DDRX (unde X=A, B, C sau D) astfel: ieşire 1 sau intrare 0:

DDRA=0; // toţi pinii de la portul A sunt de intrare


DDRA=0xFF; // toţi pinii de la portul A sunt de ieşire
DDRB=0xF0 ;// pinii 0,1,2,3 de la portul D sunt de intrare, pinii 4,5,6,7 sunt de ieşire

2. Pentru pinii de ieşire se configurează valoarea ”0” (resetat)sau ”1” (setat) prin mascare
PORTD = PORTD | 0x01; // pinul 0 de la portul este pe „1” (setat)
PORTD = PORTD & 0xFE;// pinul 0 de la portul este pe „0” (resetat)

3. Pentru citirea unui port


Val= PIND; //Variabila Val este încărcată cu valoarea citită de la portul D

4. Pentru citirea unui bit (bit 0) se maschează variabila Val citită

Val=Val & 0x01; //

3. METODOLOGIE DE REALIZARE A PROIECTELOR


Tema proiectelor este de a scrie un program pe microcontroler care sa conducă procesele, în buclă
închisă, conform sarcinilor enunţate.

Pentru a realiza acest lucru, trebuie parcurşi următorii paşi:

i. Înţelegerea corectă a temei.


Tema este prezentată la curs, cât mai clar posibil, iar documentele vor fi disponibile
pentru studenţi.
ii. Înţelegerea corectă a procesului, elementelor de măsură şi de execuţie, a conexiunilor
cu placa cu microcontroler.
Vor fi identificate toate elementele prezentate pe modelul fizic, se vor verifica conexiunile
la resursele plăcii. Acolo unde nu este posibilă identificarea vizuală, se va lansa un
program de verificare a conexiunilor (ex. Lift).

117
iii. Stabilirea conexiunilor hardware dintre elementele de execuţie şi de măsură la placa
cu microcontroler
Pe baza caracteristicilor elementelor de execuţie şi de măsură se vor stabili interfeţele de
proces de pe placa cu microcontroler la care se vor conecta aceastea.
iv. Separarea proiectului pe module independente care se vor pune în funcţiune separat.
Este foarte importantă această abordare deoarece are o serie de avantaje:
- este mult mai facilă punerea în funcţiune a unui subsistem decât a întregului
ansamblu, de la început. În cazul nefuncţionării, depanarea este foarte simplă.
- programul scris pentru un modul poate fi folosit ulterior ca program de test pentru
hardware, în cazul în care proiectul nu va funcţiona
- programul va fi folosit opentru aplicaţia finală.
- permite înţelegerea funcţionării, a caracteristicilor elementelor de măsură şi execuţie
Se identifică modulele independente. Ele reprezintă partea din proces (împreună cu
elementele de măsurare şi de execuţie), conectată la un singur tip de interfaţă a
microcontrolerului (Port paralel de ieşire, Port paralel de intrare, Convertor analog-
numeric, PWM).
Pentru aceste proiecte, ţinând cont de aspectul educativ, modulele vor fi desemnate în
descrierea temei.
v. Punerea în funcţiune a modulelor independente
Reprezintă cea mai importantă etapă a rezolvării temei. Se defineşte o sarcină pentru fiecare
modul (care să fie asemănătoare sarcinii finale), se scrie programul care să îndeplinească
acea sarcină. În caz de nefuncţionare, se folosesc aparatele de măsură (osciloscop,
multimetru) pentru a vizualiza semnalele.
În această etapă se vor analiza semnalele de la şi către proces, se vor verifica caracteristicile
elementelor din proiect. Se va înţelege de asemenea şi funcţionarea elementelor de interfaţă
ale microcontrolerului.

vi. Elaborarea algoritmului de conducere şi scrierea programului final


Pe baza temei proiectului şi a programelor scrise pentru fiecare modul, se va imagina
algoritmul de conducere a procesului, se va scrie programul şi se va verifica.
Dacă nu va funcţiona, se testează pe porţiuni, amplasând în puncte esenţiale ale programului:
- mesaje afişate pe display.
- bucle de aşteptare, pentru a permite verificarea semnalelor cu osciloscopul.

Convertorul Analog-Numeric are 10 bit, domeniul de tensiune de intrare este 0-5V


Generatorul de semnale PWM are 10 bit (0x3FF), valoarea minimă care poate fi programată şi are
efect asupra motorului de curent continuu este 0x080.

5. CONFIGURAŢIA PINILOR

118
119
120
Bibliografie

Han-Way Huang, The HCS12/9S12: An introduction to Software and Hardware Interfacing,


Delmar, Cengage Learning, NY, USA

***CodeWarrior- Development Studio for Freescale HCS12(X) Microcontrollers, v.4.5.

***Freescale Semiconductor, MC9S12B Family Product Brief HCS12BFAMILYPP Rev. 2.8,


7/2005

***Motorola Inc.PWM_8B8C, Block User GuideV01.17 DOCUMENT NUMBER


S12PWM8B8CV1/D Rev.: 1 .07. 2004

***Freescale Semiconductor, S12CPUV2 Reference Manual, Rev. 4.0, 03/2006

***Motorola Inc. ATD_10B16C Block User Guide, V03.00, DOCUMENT NUMBER


S12ATD10B16CV3/D, Rev.9 .10. 2002

***Philips, Single chip Microcontrollers PCB83C552/562, User Manual, 1989

***Philips Semiconductors, *80C552/83C552, **Single-chip 8-bit microcontroller **with**


10-bit A/D, capture/compare timer, **high-speed outputs, PWM*, data Sheet, Sep.2002
[http://www.nxp.com/documents/data_sheet/80C552_83C552.pdf] feb.2013

***Philips Semiconductors, 80C552/83C552 Single-chip 8-bit microcontroller Product


specification, IC20 Data Handbook, Aug 1998
[http://pdf.datasheetcatalog.com/datasheet/philips/S80C552-4B.pdf] feb.2013

***Advanced Microcomputers Systems (Educational Division), Embedded programming


using Intel 8051/Philips 80C552, FL, USA, 2002

Schultz, W. T., C and 8051 Hardware, Vol1., Modular Programming and Multitasking,
Prentice Hall, NJ, USA, 1998

Schultz, W. T., C and 8051 Hardware, Vol 2., Building Efficient Applications, Prentice Hall,
NJ, USA, 1998

*** Atmel Corporation, 8-bit Microcontroller with 32KBytes In-SystemProgrammable Flash,


2011, [http://www.atmel.com/Images/doc2503.pdf] feb.2013

***AVR Programming – a Step by Step Tutorial 2002


[http://atmega32-avr.com/avr-programming-a-step-by-step-tutorial/] feb.2013

***Atmel Corporation – ATMEL Studio, [http://www.atmel.com/tools/atmelstudio.aspx]


feb.2013

  121

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