Sistem de Masura a Consumului de Combustibil la Motoare cu Injectie. Transmisia Si Gestionarea Datelo

Memoriu justificativ

Dezvoltarea tehnicii general si a Electronicii in special in ultimii zeci de ani a dus la o evidenta creștere a fiabilității tuturor sistemelor operate si controlate numeric. In cadrul acestor sisteme se număra si dispozitivele electronice care au preluat practic controlul asupra automobilelor din ziua de azi, sporindu-le performanta si fiabilitatea . Acest fapt împreuna cu o scădere a costului componentelor electronice a făcut ca aceste dispozitive sa fie predominante in piața.

Marile concerne producătoare de automobile sesizând acest fapt au adoptat noile tehnologi , care sau impus in piața dovedind încă odată superioritatea fata de sistemele vechi mecanice .Majoritatea sistemelor importante ce beneficiază de aportul electronicii la un automobil iar printre acestea se numără și interfața om – automobil.

Cunoașterea unor parametri suplimentari in funcționarea automobilului este o necesitate .Oferirea de informații cum ar fi cele legate de consumul de combustibil, are consecințe pozitive în ceea ce privește stilul de șofat și starea de spirit a conducătorului auto. Astfel, cunoscând valoarea instantanee a consumului de combustibil șoferul poate acționa în vederea obținerii unui consum cât mai optim raportat la distanta parcursa si la parametrii tehnici ai propulsorului. De asemenea având date despre consumul mediu se poate face o evaluare a distanței ce poate fi parcursă cu cantitatea de combustibil disponibilă.

Sistemul propus in continuare vine in sprijinul firmelor sau marilor companii de transport cu autobaze mari in care se simte nevoia contorizării cat mai exacte consumului de combustibil la fiecare mașina in parte . Sistemul se pretează atâta la firmele de transport in comun cat si la cele care operează transporturi de mărfuri pe distante mari.

Avantajul major al acestui sistem consta in versatilitatea lui . Fiind construit in jurul unei platforme cu uC 80C552 el poate fi modificat si adaptat in continuu in funcție de nevoile fiecărui client in parte . Un alt avantaj este citirea direct de la un PC a datelor privind consumul si posibilitatea de a le folosi intr-un sistem de contabilitate si evidenta integrat

1. Principii generale de funcționare

Acest sistem se compune din doua parți majore , o parte care se ocupa de măsurarea si afișare consumului de combustibil la bordul mașinii si o parte de transmisie si gestionare a datelor.

Cea de a doua parte de care ne vom ocupa in lucrarea acesta consta transmiterea datelor prin intermediul unor emițătoare si receptoare in infraroșu cuplate la portul serial al calculatorului respectiv la portul serial al uC. De notat este faptul ca transmisa se face după un protocol serial iar calea sau modalitatea fizica de transmisie este cu ajutorul luminii in spectru infraroșu. Circuitele care asigura transmisia in infraroșu sunt compatibile cu IRDA 1.2 ceia ce face ca citirea datelor despre consum sa se fac cu o gama mai larga de dispozitive care rulează sistem de operare Microsoft Windows (laptop , notebook , pda , smartphone) . Viteza de transmisie este foarte ridicata (pana la 115kb/s) pentru cantitatea datelor transmise .

Circuitele specializate care fac transmisia si recepția sunt TFDS4100 produse de firma Vishay , ele fiind folosite pe o gama larga de dispozitive care necesita transmisie in infraroșu (laptop , notebook , pda , smartphone).

Funcționarea sistemului se bazează pe citirea datelor de câtre PC la trecerea mașinii printr-un punct fix. Cererea de recunoașterea a mașini si implicit de transmitere a datelor se face la cererea operatorului pentru a putea avea si un factor de decizie uman si a preveni eventualele încercări de frauda . La cererea operatorului PC-ul va transmite un bit de recunoaștere a automobilului , iar acesta de la primirea acestui semnal începe sa comunice cu sistemul începe sa funcționeze . De asemeni transmisia la un moment dat nu este in mod duplex , când o componenta transmite receptorul atașat nu funcționează pentru a prevenii interferentele datorate reflexiilor

Un alt aspect important este faptul ca stocarea datelor se face atât la mașina cat si la punctul fix prevenind astfel o pierdere accidentala a datelor. De asemenea odată cu fiecare înregistrare se face si scrierea in fișierul respectiv a datei si orei efectuări operației. Citirea datelor din fișierele pe care acest soft le creează este ușoara putându-se efectua cu orice editor de text.

2.Prezentare instrumentelor hardware si software folosite

2.1. Hardware

2.1.1 Microcontrolerul 80C552

2.1.1.1 Performanțe și prezentare generală

80C552 este un microcontroler performant proiectat pentru utilizarea în aplicații în timp real cum ar fi controlul unor procese industriale sau managementul motorului și controlul transmisiei la automobile. Microcontrolerul 8C552 pe 8 biți este fabricat de firma Philips într-o tehnologie avansată CMOS și este derivat din familia de microcontrolere 8051. Versiunea folosită este fără memorie ROM internă.

80C552 prezintă un consum redus de energie datorită tehnologiei folosite precum și unor artificii selectabile prin soft:

– "Idle mode" – modul de așteptare – eliberează CPU permițând RAM- ului intern, timerelor, porturilor și sistemului de întreruperi să continue funcționarea. Modul de putere redusă – salvează conținutul RAM – ului dar eliberează oscilatorul, lucru care determină ca celelalte funcțiuni ale controlerului să fie neoperative.

Microcontrolerul 80C552 conține o memorie RAM de capacitate 256 octeți memorie de date, 6 porturi de intrare / ieșire de 8 biți, două temporizatoare / contoare de 16 biți, un temporizator adițional de 16 biți cuplat la latch-uri de captură și comparare, 15 întreruperi dintre care 6 externe pe două nivele, 8 intrări multiplexate la un convertor A/D de 10 biți, două ieșiri analogice de 8 biți modulate în durată (PWM), două interfețe seriale (UART) și I2C, un Watchdog programabil (mijloc de autodeblocare în cazul execuției eronate a programelor datorită perturbațiilor sau interferențelor).

Dispozitivul funcționează ca un procesor aritmetic având facilități atât pentru binar cât și pentru BCD aritmetic, iar în plus are capabilități de prelucrare pe bit. Pentru automobile a fost creată seria 80c552-5 cu gama de temperaturi de funcționare extinsă -25,+85 grade C.^

Organizarea memoriei

Memoria este împărțită în zone de memorie ce conțin codul programului și în zone ce conțin datele programului. Zona de memorie de cod este adresată clasic cu PC (Program Counter), iar zona de date poate fi adresată pe adrese pe 16 biți cu ajutorul DPTR (Data PoinTeR).

Microcontrolerul 80C552 are 256 octeți de RAM intern, iar în exterior poate adresa memorie până la 64 Kocteți în care poate scrie (WR) sau citi (RD) cu ajutorul a două semnale distincte. Selectarea memoriei intern/extern se face cu ajutorul unui semnal extern EA (Externai Access), iar stocarea programului în memoria RAM externă se face cu ajutorul unui semnal PSEN (Program Store Enable).

Memoria program

După RESET, CPU începe execuția de la adresa OOOOH. în cazul sistemului prezentat există 32Kocteți de memorie ROM în care este înscris programul MONITOR 51 al firmei FRANKLIN SOFTWARE. Acest program gestionează resursele sistemului, realizează comunicarea simplă și facilă cu un sistem de calcul de nivel înalt (Calculator personal) prin intermediu interfeței seriale. în această situație programul MONITOR 51 este plasat în primii octeți de memorie după reset programul fiind lansat automat.

Memoria RAM externă are o capacitate de 32Kocteți, iar adresarea ei începe de la adresa 8000H până la OFFFFH.

Pentru adresarea memoriei se folosesc porturile PO și P2 în execuția fetch-urilor pentru memoria externă. Portul PO este multiplexat în vederea generării octetului cel mai puțin semnificativ al adresei și scrierii/citirii de date din memoria externă (este bus de date). Portul P2 este dedicat generării octetului cel mai semnificativ al adresei locației de memorie.

Adresele de program vor avea 16 biți chiar în cazul când se utilizează mai puțină memorie (<64Kocteți).

Memoria de date

Memoria de date în cazul sistemului prezentat este de tip RAM 32Ko extern și 256 octeți intern.

Datele se vor încărca în memoria de date la orice adresă se dorește (este o facilitate a programului MONITOR). în memoria RAM internă se vor rula des date (imediat data ), iar în cea externă se va memora codul programului precum și datele aferente (exernal data). Este mai avantajos lucrul cu date în memoria RAM internă deoarece adresarea este mai rapidă (un ciclu mașină). în cazul adresării externe datele sunt mai greu de prelucrat, mutarea unui octet dintr-o locație de memorie externă în A este lentă (4 cicli mașină).

Memoria de date posedă un mecanism modern de adresare pe segment cu ajutorul registrului DPTR.

Observație: Se consideră memoria program ca fiind memoria ROM în care se află înscris programul MONITOR. în memoria RAM externă se va încărca codul programului și datele aferente. Codul programului utilizator va fi încărcat începând de la adresa 8000H, programul MONITOR executând comenzi asemănătoare unui microsistem de operare.

Organizarea memoriei RAM interne

Memoria RAM internă are 256 octeți, de la adresa 00H la FFH, împărțită în trei:

1. 00Hla7FH-Lower128

2. 80H la FFH – Upper 128

3. Spațiul SFR (Special Funcțion Register) 80H la FFH

Adresarea directă pentru RAM >7FH adresează un alt spațiu de memorie, iar adresarea indirectă pentru RAM – ui cu zona >7FH adresează un alt spațiu de memorie diferit de primul.

în figura următoare, Upper 128 și SFR space deși ocupă spațiul de memorie de la aceleași adrese

(80H la FFH) ele sunt din punct de vedere fizic entități diferite.

Spațiul de adrese a memoriei interne de date

Doi biți din -PSW (Program Status Word – registru ce conține Flag-urile)selectează bancul de regiștri care este utilizat. Selectarea bancului de regiștri utilizat se poate face si pe cale soft cu directiva USING x (unde x este numărul bancului folosit), directiva specifica programului MONITOR înscris in ROM.

Aceasta alocare este mai eficienta, deoarece instrucțiunile utilizate la adresarea directa (2 cicli mașina) sunt mai lungi decât instrucțiunile de registru (1 ciclu mașină).

Următorii 16 octeți de după bancurile de regiștri formează un spațiu de memorie adresabil la nivel de bit.

Toți octeții din zona Lower 128 pot fi adresați direct sau indirect.

Setul de instrucțiuni al familiei 8051 (in particular pentru 80c552) include o gamă larga de instrucțiuni a unui singur bit (facilitați de prelucrare pe bit) si cei 128 octeți pot fi adresați direct prin aceste instrucțiuni.

Spațiul de RAM Upper 128 poate fi adresat doar prin adresare indirecta si nu este adresabil la nivel de bit, excepție fac octeții care încep la adrese de tipul

xOH si x8H.

Structura sistemului de întreruperi

Circuitele 80C51 și variantele sale fără ROM și EPROM au 5 surse de întreruperi: 2 întreruperi externe, 2 întreruperi de timer și întreruperea portului serial.

Ceea ce urmează este o privire de ansamblu a structurii întreruperilor pentru dispozitiv. Informații mult mai detaliate se prezintă pentru membrii specifici ai familiei derivate din 80C51.

Activarea întreruperilor

Fiecare sursă de întrerupere poate fi activată sau dezactivată în mod individual prin setarea sau ștergerea unui bit în registrul de funcții speciale (SFR) numit IE (Interrupt Enable – activare întreruperi). Acest registru conține de asemenea un bit global de dezactivare ce poate fi șters pentru a dezactiva toate întreruperile deodată.

Registrul de activare a întreruperilor (IE)

Prioritățile întreruperilor

Fiecare sursă de întrerupere poate fi de asemenea programată pentru unul din cele două nivele de prioritate prin setarea sau ștergerea unui bit într-un registru de funcții speciale (SFR) numit IP (Interrupt Priority = prioritate întreruperi). Fig. 1.18 prezintă registrul IP. O întrerupere de nivel inferior poatuncții speciale (SFR) numit IE (Interrupt Enable – activare întreruperi). Acest registru conține de asemenea un bit global de dezactivare ce poate fi șters pentru a dezactiva toate întreruperile deodată.

Registrul de activare a întreruperilor (IE)

Prioritățile întreruperilor

Fiecare sursă de întrerupere poate fi de asemenea programată pentru unul din cele două nivele de prioritate prin setarea sau ștergerea unui bit într-un registru de funcții speciale (SFR) numit IP (Interrupt Priority = prioritate întreruperi). Fig. 1.18 prezintă registrul IP. O întrerupere de nivel inferior poate fi întreruptă de o întrerupere de nivel superior, dar nu și de o întrerupere de nivel inferior. O întrerupere de nivel superior nu poate fi întreruptă de nici o altă sursă de întreruperi.

În timpul funcționării, toate flagurile de întrerupere sunt încărcate în sistemul de control al înteruperilor pe durata stării S5 a fiecărui ciclu mașină. Eșantioanele sunt verificate pe durata următorului ciclu mașină. Dacă este găsit setat flagul (valoare 1) ce permite o întrerupere, sistemul de întrerupere generează o instrucțiune LCALL la locația corespunzătoare din memoria program, mai puțin pentru alte câteva condiții ce blochează întreruperile.

Anumite condiții pot bloca o întrerupere, printre care situația ce apare atunci când o întrerupere de prioritate egală sau superioară este încă în desfășurare.

LCALL generat hardware va determina salvarea în stivă a conținutului contorului de program PC și va reîncărca contorul de program PC cu adresa de început a rutinei de servire a întreruperii. Așa cum s-a precizat anterior (fig. 1.3), rutina de servire pentru fiecare întrerupere începe la o locație fixă.

Numai contorul de program este în mod automat salvat în stivă, nu însă și PSW sau oricare alt registru. Având salvarea numai pentru contorul de program în mod automat, programatorului îi este permis să decidă cât de mult timp trebuie cheltuit pentru a salva alte registre. Aceasta sporește timpul de răspuns a întreruperii, ceea ce crește responsabilitatea programatorului. Ca rezultat, mai multe funcții de întrerupere ce sunt tipice în aplicațiile de control: basculează pinul unui port, reîncarcă un timer sau descarcă un buffer serial, se completează adesea într-un timp mai scurt decât cel necesar altor arhitecturi.

2.1.1.2Circuitul serial I / O

Circuitul 8XC552 este echipat cu două porturi seriale independente: SIO0 și SIO1. SIO0 este un port UARTduplex complet și este identic cu portul serial de la 80C51. SIO1 realizează magistrala I2C.

SIO0. SIO0 este un port serial I / O duplex complet, identic cu cel de la 80C51. Funcționarea este aceași, incluzând folosirea timerului 1 ca generator pentru transfer (baud rate).

SIO1, port serial I2C. Magistrala I2C folosește două fire (SDA și SCL) pentru a transfera infomații între dispozitivele conectate la magistrală.

Principalele caracteristici ale magistralei sunt:

transfer de date bidirecțional între circuitele master și slave

magistrală multimaster (nu există un master central)

arbitrarea între transmisiile simultane de la circuitele master, fără afectarea datei seriale pe magistrală

sincronizarea clockului serial permit dispozitivelor cu diferite viteze de transfer să comunice pe o magistrală serială

sincronizarea clockului serial poate fi folosită ca un mecanism de stabilire a legăturii, pentru a suspenda și relua transferul serial

magistrala I2C poate fi folosită pentru scopuri de test și diagnostic.

Latchurile de ieșire P1.6 și P1.7 trebuie să fie setate la nivel logic "1" în vederea activării SIO1.

Logica I2C on-chip a circuitelor 8XC552 asigură o interfață serială care satisface specificațiile megistralei I2C și permite toate modurile de transfer (altele decât cele în modul viteză redusă) de la și către magistrala I2C. Logica SIO1 manipulează transferul serial octeții transferați în mod autonom. De asemenea supraveghează transferul serial, iar un registru de stare (S1STA) reflectă starea pentru SIO1 și magistrala I2C. Unitatea centrală de procesare (CPU) se interfațează către magistrala I2C prin următoarele patru registre de funcții speciale: S1CON (registrul de control SIO1), S1STA (registrul de stare SIO1), S1DAT (registrul de date SIO1) și S1ADR (registrul adresei SIO1). Logica SIO1 se interfațează spre magistrala externă I2C prin doi pini ai portului 1: P1.6 / SCL (linia de clock serial) și P1.7 / SDA (linia serială de date).

O configurație I2C tipică este prezentată mai jos iar in continuare se prezintă modul în care se realizează transferul de date pe magistrală.

Funcție de starea bitului de direcție (), sunt posibile două tipuri de transferuri de date pe magistrala I2C:

Configurație tipică de magistrală I2C

Transfer de date pe magistrala I2C

Transfer de date de la un transmițător master către un receptor slave. Prmul octet transmis de către master este adresa circuitului slave. Urmează apoi un anumit număr de octeți de date. Circuitul slave returnează un bit de confirmare după fiecare octet recepționat.

Transfer de date de la un transmițător slave către un receptor master. Primul octet (adresa slave) este transmis de către circuitul master. După aceasta, circuitul slave returnează un bit de confirmare. Urmează ocții de date transmiși de circuitul slave către

circuitul master. Circuitul master returnează un bit de confirmare după toți octeții recepționați, cu excepția ultimului octet. La sfârșitul ultimului octet recepționat se returnează un bit de neconfirmare.

Dispozitivul master generează toate impulsurile de clock serial și condițiile de START și STOP. Un transfer se termină cu o condiție STOP sau o condiție de START repetat. Deoarece o condiție de START repetat este de asemenea începutul următorului transfer serial, magistrala I2C nu va fi eliberată.

Moduri de funcționare. Logica on-chip SIO1 poate funcționa în următoarele patru moduri:

Modul master transmițător
Data serială este extrasă prin P1.7 / SDA, în timp ce P1.6 / SCL furnizează clockul serial. Primul octet transmis conține adresa slave a dispozitivului receptor (7 biți) și bitul de direcție a datelor. În acest caz, bitul de direcție a datelor va fi zero logic și spunem că se transmite un "W" (scrie). Astfel primul octet transmis este SLA + W (adresă slave + scrie). Data serială este transmisă sub forma a 8 biți. După fiecare octet transmis se recepționează un bit de confirmare. Condițiile START și STOP sunt aplicate la ieșire pentru a indica începutul sau sfârșitul unui transfer serial.

Modul master receptor
Primul octet transmis conține adresa slave a dispozitivului transmițător (7 biți) și bitul de direcție a datelor. În acest caz bitul de direcție a datelor () va fi 1 logic și spunem că se transmite un "R" (citește). Astfel primul octet transmis este SLA + R (adresă slave + citește). Datele seriale sunt recepționate sub forma a 8 biți. După ce fiecare octet este recepționat se transmite un bit de confirmare. Condițiile START și STOP sunt aplicate la ieșire pentru a indica începutul sau sfârșitul unui transfer serial.

Modul slave receptor
Datale seriale și clockul serial sunt recepționați prin P1.7 / SDA și P1.6 / SCL.. După ce se recepționează fiecare octet, se transmite un bit de confirmare. Condițiile START și STOP sunt recunoscute ca fiind începutul și sfârșitul transferului serial. Recunoașterea adresei se realizează de hardware după recepționarea adresei slave și a bitului de direcție.

Modul slave transmițător
Primul octet este recepționat și manevrat ca și în modul slave receptor.Totuși, în acest mod, bitul de direcție va indica faptul că direcția transferului este inversată. Data serială este transmisă prin P1.7 / SDA, în timp ce clockul serial este recepționat prin P1.6 / SCL. Condițiile START și STOP sunt recunoscute ca fiind începutul șu sfârșitul transferului serial.

Într-o aplicație dată, SIO1 poate funcționa ca un dispozitiv master sau slave. În modul slave, partea hardware SIO1 urmărește adresa propriului slave și adresa de apel general. Dacă este detectată una din aceste adrese, se solicită o întrerupere. Când microcontrolerul dorește să devină master pe magistrală, partea hardware așteaptă până când magistrala este liberă, înainte ca să fie introdus modul master, astfel că nu se întrerupe o eventuală activitate slave. Dacă arbitrajul este pierdut în modul master, SIO1 comută imediat în modul slave și poate detecta propria sa adresă slave în același control serial.

Schema bloc a interfeței seriale magistrală I2C

Implementarea și funcționarea SIO1. In figura se prezintă modul de implementare a magistralei on-chip I2C, iar textele ce urmează descriu blocurile individuale.

Generatorul de clock serial

Acest generator programabil de impulsuri de clock furnizează impulsuri de clock pentru SCL când SIO1 este în modul master transmițător sau master receptor. El este întrerupt când SIO1 este într-un mod slave. Secvențele clockului de ieșire programabil sunt fOSC / 120, fOSC / 9600 și rata de depășire a timerului 1 divizată prin 8. Impulsurile de clock de ieșire au un factor de umplere de 50%, atât timp cât generatorul de clock nu este sincronizată cu o altă sursă de clock SCL, așa cum se descrie în continuare.

Modul slave receptor

Modul slave transmițător

Modul slave transmițător.

În modul slave transmițător un număr de octeți de date este transmis unui master receptor (vezi fig. 4.20). Transferul de date este inițiat ca în modul slave receptor. ând au fost inițializate în S1ADR și S1CON, SIO1 așteatpă până când este adresat cu propria adresă slave, urmată de bitul de direcție a datelor, care trebuie sa fie un "1" (Read – citește) pentru ca SIO1 să funcționeze în modul slave transmițător. După ce s-au primit propria adresă slave și bitul R (de citire), flagul întrerupere serială (SI) este setat și din S1STA se poate citi un cod de stare valabil. Acest cod de stare este folosit pentru a vectoriza o rutină de servire a întreruperii, iar acțiunile corespunzătoare ce trebuie efectuate pentru fiecare din aceste coduri de stare sunt descrise în tabelul. În modul slave transmițător se poate de asemenea intra dacă s-a pierdut o arbitrare în timp ce SIO1 este în mdul master (vezi starea 80H).

Dacă bitul AA este resetat în timpul unui transfer, SIO1 va transmite ultimul octet al transferului și va intra într-una din stările 10H sau C8H. SIO1 este este comutat în modul slave neadresabil și va ignora masterul receptor, dacă acesta continuă transferul. Astfel masterul receptor recepționează ca dată serială numai "1". Când AA este resetat, SIO1 nu poate răspunde la propria adresă slave sau la o adresă de apel general. Totuși, magistrala I2C mai este monitorizată, iar recunoașterea adresei poate fi reluată în orice moment prin setarea bitului AA. Aceasta înseamnă că bitul AA poate fi folosit pentru izolarea temporată a lui SIO1 de magistrala I2C.

Stări diverse. Există două coduri S1STA care nu corespund unei stări hardware definite pentru SIO1 (vezi tabelul 4.7). Aceste stări vor fi discutate în continuare.

S1STA = F8H:

Acest cod de stare indică faptul că nu este disponibilă nici o informație relevantă, întrucât flagul întreruperii seriale SI nu este setat. Aceasta se petrece între alte stări și când SIO1 nu este implicat într-un transfer serial.

S1STA = 00H:

Acest cod de stare indică faptul că a avut loc o eroare de magistrală pe durata unui transfer serial SIO1. O eroare de magistrală este provocată atunci când condițiile START sau STOP au loc într-o poziție ilegală din formatul cadrului. Exemple de astfel de poziții ilegale sunt pe durata transferului serial al unui octet de adresă, al unui octet de date sau al unui bit de confirmare. O eroare de magistrală poate fi provocată atunci când o interferență exterioară perturbă semnalele interne SIO1. Când are loc o eroare de magistrală SI este setat. Pentru revenirea dintr-o eroare de magistrală, flagul STO trebuie setat, iar SI trebuie șters. Acesta determină intrarea SIO1 într-un mod slave neadresabil (o stare definită) și ștergerea flagului STO (alți biți din S1CON nu sunt afectați). Liniile SDA și SCL sunt eliberate (nu se transmite o condiție de STOP).

2.1.2 Portul serial PC

Portul serial al sistemelor de calcul compatibile IBM respecta standardul RS232 . Acest fapt duce la o compatibilitate cel puțin la nivel teoretic intre toate dispozitivele cu port serial .Comunicația si transmisia de informație intre aceste dispozitive se face după un anumit algoritm si cu respectarea protocolului impus .Controlul de trafic de date este necesar pentru a conveni asupra stării partenerilor de comunicație, pentru a preveni pierderea datelor prin imposibilitatea unei părți implicate de a urmări transferul. Este deci necesar un protocol de comunicație, problemă de fapt comună în orice transfer de date. Protocolul de comunicație poate fi implementat prin dialog între semnale sau prin schimb de mesaje: hard. respectiv soft. Ambele metode pot fi folosite la portul serial.

In comunicația de la uC si calculator in lucrarea de fata se face prin schimb de mesaje soft .

Conversația între calculator si echipamentul periferic conectat se poate desfășura și prin schimb de cuvinte; acestea își vor trimite coduri de control pentru a exprima diferitele stări.

Pentru a realiza legătura dintre echipamente care comunică în protocol soft simt necesare doar legăturile pe liniile de date, deoarece pe această cale se trimit și cuvintele de protocol: bineînțeles că mai este necesară și legătura pentru referința comuna a semnalelor

Legătura pentru protocolul software

Configurația pinilor la portul serial

Porturile seriale sunt apelate în sistem cu nume generice COM1, COM2, în ordine, în funcție de câte porturi seriale poate apela sistemul de operare respectiv. Sub DOS se pot apela pânã la 4 porturi seriale, Windows 3.1. poate apela pânã la 9 porturi seriale, sub UNIX pot fi apelate 10 porturi seriale sau chiar mai multe, iar sub Windows 95 pot fi apelate pânã la 128 de porturi seriale.

La pornire sunt inițializate doar douã porturi seriale, COM1 și COM2, la adresele:

COM1 3F8h (3FFh);

COM2 2F8h (2FFh).

Nu se poate ca 2 porturi seriale sã aibã alocate aceleași adrese.

Se poate lucra cu aceste porturi prin polling, dar și prin întreruperi generate în funcție de condițiile din Registrul de Validare a Întreruperilor (3F9h sau 2F9h). COM1 lucreazã cu întreruperea de nivel 4 (IRQ 4 este gestionatã de INT 0CH), iar COM2 lucreazã cu

întreruperea de nivel 3 (IRQ 3 este gestionatã de INT 0Bh).

2.1.3 Dispozitivul de transmisie in infraroșu

Pentru transmiterea datelor intre punctual fix de citire (calculatorul) si unitatea mobila mașina am ales un circuit specializat produs de firma VISHAY si anume TFDS4100 . Alegerea sa făcut ținând cont de mai multe criterii practice.

Circuitul care urma sa facă transmisia de date efectiva in infraroșu trebuia sa fie capabil sa aibă o raza de lucru in aer liber cat mai mare sa poată filtra zgomotele si sa separe in mod eficient semnalul util . Nu in ultimul rând sa ținut cont si de rata de transfer .

Circuitul integrat TFDS4100

Chema bloc a circuitului este prezentata mai jos

Descrierea circuitului

Circuitul TFDS4500 are înglobat un emițător si un receptor in infraroșu . Este compatibil cu standardele Irda actuale si suporta viteze de pana la 115.2Kbits/s. deasemeni este capabil sa se interconecteze cu o gama larga de porturi inclusiv cu cel serial(RS232). O alta caracteristica a lui este consumul redus de energie consumând la o tensiune de alimentare de 5 v numai 1,3 mA

Un alt avantaj al acestui integrat este acela ca in timpul transmisiei pinul de recepție este dezactivat astfel eliminând problema interferentelor.

Plasamentul pinilor

Valorile electrice de funcționare

Valorile date mai sus sunt cele furnizate de producător.

Schema electrica a montajului

Schema folosita este cea recomandata de producător. Performantele care se obțin cu acesta schema se încadrează in parametric circuitului . Datorita faptului ca la majoritatea sistemelor de calcul actuale tensiunile obținute pe pinul Tx al portului serial este de +9 V si ținând cont de specificațiile circuitului in cauza a trebuit făcuta o adaptare de tensiune de semnal .

Schema furnizata de producător

Acest circuit a fost făcut pentru a se interfața ușor cu porturile de infraroșu ale calculatoarelor iar pentru a fi interfața cu portul serial schema furnizata de producător trebuie adaptat in sensul adaptării tens de semnal. Circuitul suporta ca semnal de intrare maxim o tesiune de Vcc1+05 V iar portul serial generează pe pinul de Tx circa 9V ca semnal HIGH . Adaptarea propusa de mine consta in coborârea acestei tens pana la una tolerabila de circuit cu ajutorul unui circuit de stabilizare LM7804

Schema propusa de mine este următoarea:

Diagrama de comportare a circuitului LM7804 la semnal dreptunghiular de la portul serial

Tensiunea de alimentare coincide după schema propusa cu tens maxima admisa de stabilizatorul LM7805 si anume de la 6 la 35V cc

Valorile componentelor sunt :

C1 : 100uF

C2 : 100nF

R1 : 14 ohm /0.25W

R2 : 47 ohm /0.125W

2.2 Software

2.2.1 LabWindows/CVI 5.0

LabWindows/CVI este o unealta software puternica si fiabila capabila sa acopere o gama vasta de probleme de control al dispozitivelor calcul matematic si asigurară o interfața grafica prietenoasa produsului software finit

Librăriile incluse in CVI aduc un mare câștig la calitatea softului final fiind testate optimizate de producător . Timpul de dezvoltarea codului scade ducând un timp mai mic de dezvoltare si astfel un cost mai scăzut al programului.

Interfața grafica este ușor de creat si flexibile fiecărui control putându-se să i se atașeze o funcție de callback sau pur si simplu sa fie setat ca indicator . Acesta interfața este optimizata pentru a rula pe toate sisteme de operare Windows (9x-XPsp2) .

Codul dezvoltat este facil de citit si fiecare funcție implementata are un help ușor de înțeles .

Softul in sine este compus din trei parți principale .

fișierul .c care codul in sine

fișierul .h care conține funcțiile callback din interfața si care sunt folosite fișierul .c

Fișierul. .uir care este interfața grafica folosita

Pentru compilare se folosesc toate trei fișierele.

Ul alt facilitate a acestui program este aceea ca el poate crea un wizard de instalare care ce face ca produsul finit sa fie ușor de instalat si folosit.

3.Proectarea soft

Softul de comunicație si stocare a datelor

Dezvoltarea acestui soft a ponit de la stabilirea unui protocol de comunicație intre punctul fix si unitatea mobila . Acest protocol conține doua valori :

Când se transmite bitul 1 de către calculator , uC transmite codul(indicativul) mașinii.

Când se transmite bitul 5 de către calculator uC transmite consumul măsurat.

Cererea de transmisie o poate efectua numai calculatorul .

Interfața grafica

Softul conține patru părți majore fiecare având o funcție bine definita

Prima parte este cea care se ocupa de specificarea librăriilor folosite , declararea variabilelor si de inițializarea portului folosit precum si a interfeței grafice. Astfel linia de inițializare a setează ca port folosit portul com1 cu următoarele caracteristici de transmitere recepție

Rata de transfer BAUD a fost setata la 9600 , numărul de biți de transmisie 8si un bit de stop. Linia de cod este următoarea:

OpenComConfig (1, 0, 9600, 1, 8, 1, 8, 8);

In continuare sa setat timpul de time-out al portului la o valoare mare pentru a elimina in limite normale posibilitatea de eroare cauzata de o întârziere la recepție datorata unor factori independenți de sistem in special factorul uman. Linia de cod este următoarea.

SetComTime (1, 99);

De asemenea la închiderea interfeței grafice a programului pentru a elibera resursa hard folosita se închide portul si se golesc bufferele eferente lui

FlushInQ (1); – Ștergerea bufferului de intrare

FlushOutQ(1); – Ștergerea bufferului de intrare

CloseCom (1);

Cea de a doua parte a programului se executa la apăsarea butonului de pe interfața pentru recunoașterea mașinii. Se resetează indicatoarele de pe ecran se transmite bitul din protocolul de comunicație pentru recunoașterea mașinii , se semnalizează cu indicatorul aferent activarea transmisiei si se așteaptă transmiterea codului mașinii

FlushInQ (1);

FlushOutQ(1);

ResetTextBox (panelHandle, PANEL_TEXTBOX, ""); SetCtrlVal (panelHandle, PANEL_LED, 0);

SetCtrlVal (panelHandle, PANEL_LED_2, 0);

SetCtrlVal (panelHandle, PANEL_LED_3, 0);

SetCtrlVal (panelHandle, PANEL_LED_4, 0);

ComWrtByte (1, 1); – Se scrie in Com1 bitul 1

SetCtrlVal (panelHandle, PANEL_LED, 1);

In continuare se efectuează recepția datelor prin citirea portului se semnalizează recepționarea lor si se afișează indicativul mașinii. Datele recepționate se stochează in vectorul car de tip char de mărime 2

ComRd (1, car, 2); – citesc portul si stochez datele in vectorul car

SetCtrlVal (panelHandle, PANEL_LED_2, 1);

SetCtrlVal (panelHandle, PANEL_TEXTBOX, car);

SetCtrlVal (panelHandle, PANEL_LED_3, 2);

Cea de a treia parte a programului se ocupa de citirea valori consumului . La fel ca la partea a doua la apăsarea butonului de citire a consumului se resetează indicatoarele aferente se transmite bitul 5 conform protocolului si se așteaptă recepționarea datelor care se stochează in vectorul fuel. Astfel se poate citi consumuri de pana la 9999 unități (litri)

FlushInQ (1);

FlushOutQ(1);

ResetTextBox (panelHandle, PANEL_TEXTBOX_2, "");

ComWrtByte (1, 5);

SetCtrlVal (panelHandle, PANEL_LED, 1);

ComRd (1, fuel, 4);

In continuare se indica recepționarea datelor si se afișează pe ecran ce sa recepționat

SetCtrlVal (panelHandle, PANEL_LED_2, 1);

SetCtrlVal (panelHandle, PANEL_TEXTBOX_2, fuel);

Datele citite se scriu intr-un fișier a cărui nume este indicativul mașini pentru o folosire mai facila a datelor primite. Înainte de acest lucru se face o conversie a datelor citite din ascii in int .

fuel_int[0] = atoi (&fuel[0]);

Panoul de control al funcției care face scrierea fișierului

ArrayToFile(car,fuel_int,VAL_INTEGER,4,1,AL_GROUPS_TOGETHER, VAL_GROUPS_AS_ROWS, VAL_SEP_BY_TAB, 10, AL_ASCII,VAL_APPEND);

După cum se vede si mai sus datele se scriu pe coloana iar scrierea se face in mod append pentru a păstra înregistrările anterioare.

Pentru ca înregistrarea sa fie cat mai completa înaintea de scrierea fișierului in care se vor stoca datele se citește data si ora sistemului de calcul pentru introducerea si acestor date la fiecare citire

GetSystemDate (&month, &day, &year);

data[0] = day;

data[1] = month;

data[2] = year;

GetSystemTime (&hours, &minutes, &seconds);

timp[0] = hours;

timp[1] = minutes;

timp[2] = seconds;

ArrayToFile(car,timp,VAL_INTEGER,3,1,VAL_GROUPS_TOGETH ER,VAL_GROUPS_AS_ROWS , AL_SEP_BY_COMMA, 5,

VAL_ASCII, VAL_APPEND);

ArrayToFile(car,data,VAL_INTEGER,3,1,VAL_GROUPS_TOGETHER VAL_GROUPS_AS_ROWS, VAL_SEP_BY_COMMA, 5,

VAL_ASCII, VAL_APPEND);

Cea de a patra parte a softului este cea de resetare generala a interfeței , funcție folosita in caz de eroare . Se resetează fiecare control din program precum si portul com1

FlushInQ (1);

FlushOutQ(1);

SetCtrlVal (panelHandle, PANEL_LED, 0);

SetCtrlVal (panelHandle, PANEL_LED_2, 0);

SetCtrlVal (panelHandle, PANEL_LED_3, 0);

SetCtrlVal (panelHandle, PANEL_LED_4, 0);

SetCtrlVal (panelHandle, PANEL_TEXTBOX, 0 );

SetCtrlVal (panelHandle, PANEL_TEXTBOX_2,0 );

ResetTextBox (panelHandle, PANEL_TEXTBOX, "");

ResetTextBox (panelHandle, PANEL_TEXTBOX_2, "");

CloseCom(1);

OpenComConfig (1, 0, 9600, 1, 8, 1, 8, 8);

SetComTime (1, 99);

Exemplu de date stocate după efectuarea transmisiei:

In continuare vom prezenta programul de simulare a uC . Aceasta simulare se face numai din perspectiva transmisiei de date . La primirea comenzi din protocolul de comunicație acest soft va transmite datele care au fost introduse in prin interfața sa grafica.

Interfața grafica a programului de simulare

La fel ca si softul de citire a datelor si programul pentru simularea uC este compus din mai multe părți .

Prima parte asigura inițializarea portului serial declararea variabilelor si setarea timpului de time-out al portului .

OpenComConfig (2, 0, 9600, 1, 8, 1, 8, 8);

SetComTime (2, 99);

Partea a doua care efectuează recepția si transmisia efectiva a datelor si se activează la apăsarea butonului „ preia comanda ”. Este compusa dintr-o instrucțiune de citire a comenzii primite

si o instrucțiune de tip case in funcție de variabila command (switch in CVI) cu doua ramuri de transmisie de date in funcție de ce se primește pe port . daca se primește 1 se efectuează transmiterea indicativului mașinii iar daca se primește 5 se transmite consumul .

command = ComRdByte (2);

1. In cazul ramurii 1 se setează indicatorul de pe interfața pentru a semnaliza primirea comenzii de transmitere a indicativului mașinii , se citește valoarea acestuia din controlul destinat introducerii acestuia si se trimite respectiva valoare .In continuare se setează indicatoarele de pe interfața pentru a semnaliza încheierea transmisiei .

case 1:

/* recunostere mașina*/

SetCtrlVal (panelHandle, PANEL_LED, 1);

GetCtrlVal (panelHandle, PANEL_TEXTBOX, car1);

ComWrt (2, car1, 2);

SetCtrlVal (panelHandle, PANEL_LED_3, 1);

SetCtrlVal (panelHandle, PANEL_LED, 0);

FlushInQ (2);

FlushOutQ(2);

break;

2. In cazul celei de a doua ramuri se transmite consumul preluat de pe interfața iar pașii sunt identici ca la ramura 1

case 5 :

/* trimitere consum */

SetCtrlVal (panelHandle, PANEL_LED_2, 1);

GetCtrlVal (panelHandle, PANEL_TEXTBOX_2, consum1);

ComWrt (2, consum1, 4);

SetCtrlVal (panelHandle, PANEL_LED_4, 1);

SetCtrlVal (panelHandle, PANEL_LED_2, 0);

FlushInQ (2);

FlushOutQ(2);

Cea de a treia parte a softului este care asigura funcția de refresh a interfeței in caz de eroare. Este similara cu cea de la programul citire a consumului. FlushInQ (2);

FlushOutQ(2);

SetCtrlVal (panelHandle, PANEL_LED, 0);

SetCtrlVal (panelHandle, PANEL_LED_2, 0);

SetCtrlVal (panelHandle, PANEL_LED_3, 0);

SetCtrlVal (panelHandle, PANEL_LED_4, 0);

SetCtrlVal (panelHandle, PANEL_TEXTBOX, 0);

SetCtrlVal (panelHandle, PANEL_TEXTBOX_2,0);

ResetTextBox (panelHandle, PANEL_TEXTBOX, "");

ResetTextBox (panelHandle, PANEL_TEXTBOX_2, "");

In cele ce urmează se prezintă codurile sursele complete pentru soft-urile de citire a consumului si simulare a uC .

CarFuelReader – codul pentru citirea consumului.

#include <ansi_c.h>

#include <utility.h>

#include <rs232.h>

#include <formatio.h>

#include <cvirte.h> /* Needed if linking in external compiler; harmless otherwise */

#include <userint.h>

#include "CarFuelReader.h"

static int seconds; /* Declar variabilele care vor fi folosite */

static int minutes;

static int hours;

static int year;

static int day;

static int month;

static int data[3];

static int timp[3];

static char data_char[5];

static char timp_char[10];

static int panelHandle;

static int com;

static char car[3];

static char fuel[5];

static int fuel_int[5];

static int fuel_graph[100];

static int File_Date[4];

int main (int argc, char *argv[])

{ OpenComConfig (1, 0, 9600, 1, 8, 1, 8, 8); /* Setez si deschid portul COM1*/

SetComTime (1, 99); /* Setez timpul de time out al portului */

if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise */

return -1; /* out of memory */

if ((panelHandle = LoadPanel (0, "CarFuelReader.uir", PANEL)) < 0)

return -1;

DisplayPanel (panelHandle);

RunUserInterface ();

return 0;

}

int CVICALLBACK fpanel (int panel, int event, void *callbackData,

int eventData1, int eventData2)

{

switch (event)

{

case EVENT_GOT_FOCUS:

break;

case EVENT_LOST_FOCUS:

break;

case EVENT_CLOSE:

/*Sterg buferele I/O de la portul com1 */

FlushInQ (1);

FlushOutQ(1);

/* Inchid folositea portului pentru a elibera resursa alocata*/

CloseCom (1);

/* Iesire din GUI */

QuitUserInterface (0);

break;

}

return 0;

}

int CVICALLBACK f_rec (int panel, int control, int event,

void *callbackData, int eventData1, int eventData2)

{

switch (event)

{

case EVENT_COMMIT:

/* sterg buferele I/O com1 */

FlushInQ (1);

FlushOutQ(1);

ResetTextBox (panelHandle, PANEL_TEXTBOX, ""); /*resetez toate controlalele din interfata */

SetCtrlVal (panelHandle, PANEL_LED, 0);

SetCtrlVal (panelHandle, PANEL_LED_2, 0);

SetCtrlVal (panelHandle, PANEL_LED_3, 0);

SetCtrlVal (panelHandle, PANEL_LED_4, 0);

/* Trimit catre uC comanda din protocolul de comunicatie pt trimiterea indicativului masinii*/

ComWrtByte (1, 1);

/* Setez indicatorul de pe interfata in 1 pentru a indica transmiterea comnezii de recunoastere */

SetCtrlVal (panelHandle, PANEL_LED, 1);

/* Citesc indicativul trimis si il stochez in bufferul car */

ComRd (1, car, 2);

/* Setez in 1 indicatorul cu privire la cirirea indicativului masini*/

SetCtrlVal (panelHandle, PANEL_LED_2, 1);

/* afisez pe interfata indicativul masinii */

SetCtrlVal (panelHandle, PANEL_TEXTBOX, car);

SetCtrlVal (panelHandle, PANEL_LED_3, 2);

/*sterg buferele I/O com1 */

FlushInQ (1);

FlushOutQ(1);

break;

}

return 0;

}

int CVICALLBACK f_read (int panel, int control, int event,

void *callbackData, int eventData1, int eventData2)

{

switch (event)

{

case EVENT_COMMIT:

/*sterg buferele I/O com1*/

FlushInQ (1);

FlushOutQ(1);

ResetTextBox (panelHandle, PANEL_TEXTBOX_2, "");

/* Trimit comanda din protocol pentru trimiterea datelor de consum */

ComWrtByte (1, 5);

SetCtrlVal (panelHandle, PANEL_LED, 1);

/* Citesc datele trimise si le stochez in bufferul fuel */

ComRd (1, fuel, 4);

/* Indic Receptionarea datelor*/

SetCtrlVal (panelHandle, PANEL_LED_2, 1);

SetCtrlVal (panelHandle, PANEL_TEXTBOX_2, fuel);

/*transform vectorul in care au fost citit consumul intr-un vecror cu date de tip integer pe a se preta la scriere in fisier */

fuel_int[0] = atoi (&fuel[0]);

fuel_int[1] = atoi (&fuel[1]);

fuel_int[2] = atoi (&fuel[2]);

fuel_int[3] = atoi (&fuel[3]);

/* se face scrierea consumului in fisier */

ArrayToFile (car, fuel_int, VAL_INTEGER, 4, 1, VAL_GROUPS_TOGETHER,

VAL_GROUPS_AS_ROWS, VAL_SEP_BY_TAB, 10, VAL_ASCII,

VAL_APPEND);

/*se indica incheiera cicluli de citire a datelor si scrierea lor in fisier */

SetCtrlVal (panelHandle, PANEL_LED_4, 1);

/* se citeste data si ora la care a fost faut transferul de date */

GetSystemDate (&month, &day, &year);

data[0] = day;

data[1] = month;

data[2] = year;

GetSystemTime (&hours, &minutes, &seconds);

timp[0] = hours;

timp[1] = minutes;

timp[2] = seconds;

/* se scriu in acelasi fisier data si ora transferului */

ArrayToFile (car, timp, VAL_INTEGER, 3, 1, VAL_DATA_MULTIPLEXED,

VAL_GROUPS_AS_ROWS, VAL_SEP_BY_COMMA, 5, VAL_ASCII,

VAL_APPEND);

ArrayToFile (car, data, VAL_INTEGER, 3, 1, VAL_GROUPS_TOGETHER,

VAL_GROUPS_AS_ROWS, VAL_SEP_BY_COMMA, 2, VAL_ASCII,

VAL_APPEND);

/*sterg buferele I/O com1 */

FlushInQ (1);

FlushOutQ(1);

break;

}

return 0;

}

int CVICALLBACK f_refresh (int panel, int control, int event,

void *callbackData, int eventData1, int eventData2)

{

switch (event)

{

case EVENT_COMMIT:

/* se reseteaza toate controlalele din interfata grafica */

FlushInQ (1);

FlushOutQ(1);

SetCtrlVal (panelHandle, PANEL_LED, 0);

SetCtrlVal (panelHandle, PANEL_LED_2, 0);

SetCtrlVal (panelHandle, PANEL_LED_3, 0);

SetCtrlVal (panelHandle, PANEL_LED_4, 0);

SetCtrlVal (panelHandle, PANEL_TEXTBOX, 0 );

SetCtrlVal (panelHandle, PANEL_TEXTBOX_2,0 );

ResetTextBox (panelHandle, PANEL_TEXTBOX, "");

ResetTextBox (panelHandle, PANEL_TEXTBOX_2, "");

ResetTextBox (panelHandle, PANEL_TEXTBOX_3, "");

ResetTextBox (panelHandle, PANEL_TEXTBOX_4, "");

break;

}

return 0;

}

2. Softul pentru simularea uC

#include <formatio.h>

#include <rs232.h>

#include <utility.h>

#include <cvirte.h> /* Needed if linking in external compiler; harmless otherwise */

#include <userint.h>

#include "uC.h"

static int panelHandle;

int car[4];

int consum[4];

char car1[4];

char consum1[5];

int command;

int main (int argc, char *argv[])

{

/* initializez portul com 2 */

OpenComConfig (2, 0, 9600, 1, 8, 1, 512, 512);

SetComTime (2, 99);

if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise */

return -1; /* out of memory */

if ((panelHandle = LoadPanel (0, "uC.uir", PANEL)) < 0)

return -1;

DisplayPanel (panelHandle);

RunUserInterface ();

return 0;

}

int CVICALLBACK F_panel1 (int panel, int event, void *callbackData,

int eventData1, int eventData2)

{

switch (event)

{

case EVENT_GOT_FOCUS:

break;

case EVENT_LOST_FOCUS:

break;

case EVENT_CLOSE:

CloseCom(2);

QuitUserInterface (0);

break;

}

return 0;

}

int CVICALLBACK f_refresh (int panel, int control, int event,

void *callbackData, int eventData1, int eventData2)

{

switch (event)

{

case EVENT_COMMIT:

FlushInQ (2);

FlushOutQ(2);

SetCtrlVal (panelHandle, PANEL_LED, 0);

SetCtrlVal (panelHandle, PANEL_LED_2, 0);

SetCtrlVal (panelHandle, PANEL_LED_3, 0);

SetCtrlVal (panelHandle, PANEL_LED_4, 0);

SetCtrlVal (panelHandle, PANEL_TEXTBOX, 0);

SetCtrlVal (panelHandle, PANEL_TEXTBOX_2,0);

ResetTextBox (panelHandle, PANEL_TEXTBOX, "");

ResetTextBox (panelHandle, PANEL_TEXTBOX_2, "");

break;

}

return 0;

}

int CVICALLBACK f_comnada (int panel, int control, int event,

void *callbackData, int eventData1, int eventData2)

{

switch (event)

{

case EVENT_COMMIT:

command = ComRdByte (2);

switch (command)

{

case 1:

/* recunostere masina*/

SetCtrlVal (panelHandle, PANEL_LED, 1);

GetCtrlVal (panelHandle, PANEL_TEXTBOX, car1);

ComWrt (2, car1, 2);

SetCtrlVal (panelHandle, PANEL_LED_3, 1);

SetCtrlVal (panelHandle, PANEL_LED, 0);

FlushInQ (2);

FlushOutQ(2);

break;

case 5 :

/* trimitere consum */

SetCtrlVal (panelHandle, PANEL_LED_2, 1);

GetCtrlVal (panelHandle, PANEL_TEXTBOX_2, consum1);

ComWrt (2, consum1, 4);

Delay(2);

SetCtrlVal (panelHandle, PANEL_LED_4, 1);

SetCtrlVal (panelHandle, PANEL_LED_2, 0);

FlushInQ (2);

FlushOutQ(2);

default:

break;

}

break;

}

return 0;

}

Bibliografie:

1 . Dimitriu Laurentiu – Curs Microcontrolere

2 . Dobrea Dan-Marius – Lucrari Laborator EPIOC

3. www.NI.com – National Instruments

4. www.datasheetcatalog.com

Similar Posts