Microcontrolere - Aplicatii PDF [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

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 programareadresa 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 DIN0DIN3 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

q=

[Umax, Umin] 2 NB − 1

Exemplu : Pentru un convertor de [-10, 10] V de 12 bit, ce valoare are cuanta? Raspuns : Conform formulei q =

10 - (-10) 20 = = 0.00488 V adica 4.88mV 12 4095 2 −1

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 . ∗ (2 N B − 1) N= [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

Pentru ca u e =u i → N i ∙q CAN =N e ∙q CNA → N e =

q CAN ∙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 //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", RAMSIZE(256) CODE(8000h) @C:\C51V41\BIN\OH51.EXE "output"

"..\..\lib\ap_lib.lib"

TO

"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 numericanalogic (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 0 30 60 90 . . 330 ...

val. sinus 0 0,5 0,86 1

val.la CNA 80 120 149 160

-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 #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 #include "..\..\lib\ap_lib.h" // Rutina de intrerupere pentru Timer0 Timer0() interrupt 1 { timer_Update(); keyb_Update(); } // Mesaje #define MES_KEYBOARD #define MES_DOTTEDLINE #define MES_KPRESSED00 #define MES_KPRESSED01 #define MES_KPRESSED02

" KEYBOARD "................" "0..............." ".1.............." "..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 şi repornirea cu tasta C. Afişarea textului ALARMA! la secunda 30 şi ştergerea acestui text la tastarea unui cod de 4 cifre 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 #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 #include #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 , 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 o o o o

se verifică însuşirea părţii teoretice se verifică întelegerea algoritmului de generare a semnalului se construieşte montajul din fig.4 verificând corectitudinea legării sondei osciloscopului la pinul P4.0 al microcontrolerului. se scrie programul conform ordinogramei din fig.5. 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:

UM =

T 1 ν 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:

FPWM =

FOSC 2(1 + PWMP) ⋅ 255

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

PWMP =

FOSC (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 La momentul t2 xxxx xx10 La momentul t3 xxxx xx11 La momentul t4 xxxx xx10 La momentul t5 xxxx xx01 . . . La momentul t15 xxxx xx11 La momentul t16 xxxx xx10 La momentul t17 xxxx xx01 La momentul t18 xxxx xx00

incarca data 1, armeaza ceas front coborator la ceas cu data pe 1 (bit START) incarca data 1, armeaza ceas front coborator la ceas cu data pe 1 incarca data 0, armeaza ceas

incarca data 1, armeaza ceas front coborator la ceas cu data pe 1 incarca data 0, armeaza ceas 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. 2. 3. 4. 5.

Toate operaţiile se execută la întreruprerea de 10 ms al timerului T0 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. 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ă se generează frontul coborâtor al ceasului, reprezentând momentul citirii la deserializare (strob). 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