Documente Academic
Documente Profesional
Documente Cultură
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
NANU, SORIN
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
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:
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)
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
5
Programul monitor
Biblioteca de funcţii
Programe exemplu
3. Desfăşurarea lucrării
6
• Pentru înţelegerea sistemului de dezvoltare cu microcontroler, se cere
să se lanseze în execuţie programele exemplu de la punctul anterior
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).
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.
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ă.
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ţă.
10
LUCRAREA DE LABORATOR NR. 2
EXECUŢIA UNEI APLICAŢII CU PLACA DE DEZVOLTARE
CU MICROCONTROLER
1 OBIECTIVELE LUCRĂRII:
2 FUNDAMENTELE LUCRĂRII:
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”
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).
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).
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
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 ?
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.
3 DESFĂŞURAREA LUCRĂRII:
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])
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
{
}
}
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
@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.
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:
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.
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
3. PROGRAMUL LUCRĂRII
21
Structura programului este:
void main(void)
{
unsigned char var;
while( 1 )
{
for (var=0, var=160, var++) dac_WriteChannel(var);
}
}
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:
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
IEN0
IEN1
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
24
T3 = 0x01;
}
În această rutină se incrementează o variabilă care se foloseşte pentru obţinerea secundei.
#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 )
}
}
}
#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:
2. FUNDAMENTELE LUCRĂRII:
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.
29
Fig.1. Structura Timerului T2
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)
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
31
Fig.4. Realizarea montajului pentru realizarea aplicaţiei practice
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
34
LUCRAREA DE LABORATOR NR. 6
TIMERUL T2 ÎN REGIM DE COMPARARE
1. OBIECTIVELE LUCRĂRII:
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
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
Pentru observarea semnalului generat la linia P4.0 a timerului T2, se conecteaza acest pin la canalul 1
al osciloscopului (vezi fig.4)
37
3.3. Algoritmul de generare a semnalului
4. PROGRAMUL LUCRĂRII
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
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.
1. OBIECTIVELE LUCRĂRII:
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).
Latimea sa se poate modifica (de exemplu in fig. A.1., de la Ta la Ta1), perioada sa T ramanand
constanta.
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
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
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.
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,
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.
1. OBIECTIVELE LUCRĂRII:
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:
46
Fig.1. Serializarea datelor pe portul paralel
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.
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.
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
}
}
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--;
}
} // 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.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.
49
50
LUCRAREA DE LABORATOR NR. 10
NOŢIUNI DE PROGRAMARE A SISTEMELOR ÎNCORPORATE.
PLANIFICAREA TASK-URILOR
1. OBIECTIVELE LUCRĂRII:
2. FUNDAMENTELE LUCRĂRII:
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ă.
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ă
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
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.):
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)
Î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
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
57
58
LUCRAREA DE LABORATOR NR. 11
DEZVOLTAREA DE APLICAŢII
CU MICROCONTROLERUL S12 FREESCALE
1. OBIECTIVELE LUCRĂRII
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.
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
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
61
Fig.5. Imagine a plăcii de dezvoltare ZK_S12-B
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.
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
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.
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
66
Fig. 10. Schema bloc a microcontrolerului MC9S12DJ256CPV
Porturile Microcontrolerului
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
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
74
Contactele unui releu pot fi de patru tipuri :
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).
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
b. să se scrie la portul D o combinaţie care să asigure combinaţia 01 sau 10 prin comanda PORTD= ...
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.
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
78
Fig.3. Schema de conexiuni între placa cu microcontroler şi motorul pas-cu-pas
79
- Schema de conectare a senzorilor de lumină. Senzorii de lumină se conectează la trei
canale ale interfeţei analogice (Convertor Analog Numeric).
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.
1. OBIECTIVELE PROIECTULUI
Utilizarea plăcii cu microcontroler 80C552 pentru realizarea unui sistem de regare automată a poziţiei
unui motor de curent continuu
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.
81
Fig.2. Sistemul de tracţiune şi măsurare
4. Driver (amplificator) de motor cu următoarele caracteristici (fig.3.):
5. Placa cu microcontroler
82
Fig.4. Schema de conexiuni între placa cu microcontroler şi modelul sistemului de poziţionare
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ă.
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
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.
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)
5. limitare
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.
87
Fig.2. Caracteristica traductorului de temperatură LM35 în grade Celsius
88
Fig. 3. Schema de conexiuni între placa cu microcontroler şi modelul sistemului de încălzire
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..
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.
90
Fig.6. Ordinograma programului ce implementează algoritmul de reglare bi-poziţional cu
histerezis
91
92
ANEXE
ANEXA 1.
SOFTWARE PENTRU MEDIUL DE DEZVOLTARE CU
MICROCONTROLERUL I80552
Generalităţi
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”
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).
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
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.
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_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.
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_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_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_ClearScreen(void)
Functia sterge complet ecranul display-ului.
De fapt se scrie caracterul ‘blank’ in toate locatiile din memoria interna a display-ului.
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.
void buser_ON(void)
Functia porneste buzzer-ul, prin apelul functiei buser_Frequence.
void buser_OFF(void)
Functia opreste buzzer-ul.
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.
void dac_Clear(void)
Functia inscrie valoarea 0 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.
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
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.
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.
101
Fig.5 Prezentarea familiilor de circuite integrate logice în funcție de consum și timpul de propagare
(răspuns)
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
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:
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.
ATENTIE! Pentru a folosi acest driver trbuie inclus in main.c fisierul “io_pin.h”.
• 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
};
3.1.1. IO_PIN_Initialization
Functia realizeaza initializarea pinilor placii.
Header-ul functiei:
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:
3.2.2 IO_IN_GetPortState
Functia returneaza starea intregului port.
Header-ul functiei:
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);
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:
• STAREA PORTULUI
Se va seta valoarea dorita.
Exemplu: IO_OUT_SetPortState(IO_IN_PORT_M, 0x00AA);
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:
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);
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);
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:
• 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[] = {
};
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 )
• 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 )
111
Header-ul functiei:
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:
• 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
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:
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);
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);
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);
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);
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);
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.
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;
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(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;
}
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:
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)
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.
5. CONFIGURAŢIA PINILOR
118
119
120
Bibliografie
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
121