Realizarea Unui Computer de Bord Auto cu Microcontrollerul Pic16f887
PROIECT DE LICENTA
– computer de bord –
Realizarea unui computer de bord auto cu microcontrollerul PIC16F887
Computer de bord pentru automobil cu afișare pe LCD alfanumeric și monitorizare pentru tensiunea de încărcare a acumulatorului , temperatura din interiorul autovehiculului în grade celsius, intensitatea luminoasă și comanda aprinderii automate a farurilor la scăderea intensității luminoase.
Cuprins
Obiectiv
Caracteristici / referințe tehnice
1. Criteriile pentru alegerea unui microcontroller
2. Schema bloc a unui microcontroller
2.1 PARTICULARIZARE. Diagrama bloc a microcontrollerului PIC16F887 .
2.2 Dispozitive I/O
2.3 Module Timer.
2.4 Microcontrollerul PIC16F887
2.5 Pinul MCLR/Vpp
2.6 Convertoarele ADC
2.7Considerente software legate de convertorul ADC
3 Sistemele senzoriale
4. Programarea memoriei microcontrolerului PIC16F887A
5. LCD-ul alfanumeric 16×2 caractere
6. Schema electronică generală
7.1. Senzorul de temperatură
7.2.Senzorul de lumină
7. Întreruperile pe TIMER1
8. Descrierea software a sistemului (MIKROC)
9. Calculul fiabilității
10. CODUL SURSA C
Bibliografie
Scopul proiectului
Obiectiv
Tema acestui proiect o constituie realizarea unui computer de bord destinat autovehiculelor, care are la bazã microcontrollerul pe 8 biți PIC16F887 cu rol principal de procesor digital de semnale. Afișarea datelor de interes se realizează pe un LCD alfanumeric de 16×2 caractere în funcție de tensiunea de alimentare, temperatura din interiorul autovehiculului și intensitatea luminoasă ambiantã cu aprinderea automatã a farurilor. Proiectul de fațã reprezintã un modul electronic ce vine în completarea sistemelor electronice ale autovehiculului și totodată în ajutorul șoferului prin automatizarea unor procese care în condiții normale s-ar realiza manual. Având în vedere că la majoritatea automobilelor tensiunea de încărcare a acumulatorului nu este afișată în nici un mod (analogic/digital), iar în momentul în care a apărut defecțiunea la încarcare, se acționează un martor în bord, poate reprezenta o problemă. Acest lucru poate fi prevenit prin monitorizarea permanentă a tensiunii de încãrcare și verificarea acumulatorului / sistemului electronic de încărcare / atunci când valoarea de interes monitorizatã (tensiunea) nu se aflã în parametri normali de lucru (13.7 – 14.4V) . O tensiune de încarcare mai micã de 13.7V ar duce la o funcționare ieșită din parametri, iar o încărcare mai mare de 14.4V ar putea avea consecințe mai grave printre care se numară și fenomenul de fierbere al bateriei precum și defectarea anumitor sisteme electronice.
Prima funcție a computerului de bord realizat îndeplinește această cerință monitorizând în permanență tensiunea de încarcare a acumulatorului și generând pe LCD-ul alfanumeric mesaje de atenționare la neîndeplinirea condițiilor de lucru mai sus expuse. Computerul de bord realizat monitorizează temperatura din interior și afișează pe LCD-ul alfanumeric valoarea acesteia exprimată în grade celsius, senzorul utilizat fiind un senzor analogic cu gradientul ieșirii direct proporțional cu temperatura de contact. O a treia funcție implementată în computerul de bord este aceea de aprindere automată a farurilor atunci când intensitatea luminoasă scade sub un anumit prag, comanda farurilor realizându-se automat iar acestea fiind simulate cu ajutorul unui LED de culoare albă.
Această funcție este foarte utilă în contextul în care atenția șoferului nu mai este solicitată în procesul de aprindere a farurilor, iar comanda acestora se realizează în mai puțin de 9 ms de la detecția scăderii intensității luminoase. Funcția de aprindere automată a farurilor este foarte utilă pentru siguranța șofatului (ex. la trecerea pe sub un pod) dar și pentru sistemul electric al mașinii.O scădere a consumului de curent absorbit de elementele electrice/electronice auxiliare induce implicit o scădere a consumului de carburant.
Senzorii utilizați în sistem sunt de tipul analogic, semnalele generate de aceștia fiind achiziționate prin intermediul convertorului analog-numeric (ADC) al microcontrollerului și ulterior procesate și afișate pe LCD. Senzorul de tensiune este integrat pe ramura de alimentare a modulului electronic împreună cu un rezistor de 10 k , senzorul de temperatură poate fi plasat în interiorul autovehiculului, iar senzorul de lumină poate fi montat pe parbriz pentru ca valoarea citită să fie cât mai apropiată de valoarea reală a intensității luminoase ambiante.
Caracteristici / referințe tehnice
Întreg modulul electronic funcționează la o tensiune de 5V, tensiune obținută prin intermediul circuitului integrat stabilizator de 5V IC7805, sistemul electronic fiind protejat totodată și la tensiune inversă cu ajutorul unei diode de tipul 1N4007. Senzorii utilizați în acest proiect sunt de tipul analogic și constau într-un divizor rezistiv cu un factor de divizare de 0.319 montat pe ramura tensiunii de intrare cu o tensiune maximă de intrare acceptată de maxim 15V, un senzor de temperatură cu un range de 0-150 grade Celsius și o sensibilitate la ieșire de 10mV / grad Celsius și un fotorezistor de tipul LDR ce monitorizează intensitatea luminoasă ambiantă. Un rol important în cadrul acestui proiect îl constituie elementul de afișare a datelor provenite de la senzorii sistemului electronic, semnale ce sunt mai intâi convertite, procesate și apoi afișate pe LCD-ul alfanumeric de 16×2 caractere. LCD-ul funcționează la tensiunea de 5V, iar protocolul de comunicare cu elementul central de procesare al datelor (microcontrollerul) este pe 8 biți. Întreg montajul electronic s-a realizat pe placa de test cu lipituri realizate din aproape în aproape, alegerea fiind facută în mare masură datorită ușurinței și flexibilității în proiectare.
Programarea microcontrolerului se realizează prin intermediul conexiunii de tipul ICSP, conexiune ce utilizează pinii de MCLR, ICSP-DAT, VDD, Vss si ICSP-CLK ai microcontrolerului.În ceea ce privește partea de senzoristică, convertorul ADC al microcontrolerului are o rezoluție de 1024 biți, deci o sensibilitate de 4.88mV/bit și este utilizat în regim multiplexat pentru toți senzorii sistemului. Acest lucru înseamnă că singurul convertor ADC poate prelua semnalele analogice de pe pinii de interes ce înglobează această funcție prin setarea regiștrilor corespunzători ANSEL și ANSELH, rezultând astfel o funcționare multiplexată pe canalele analogice.
Produse similare:
Un calculator de bord este prevazut cu un display ce afiseaza diferite informatii legate de sistemele masinii. Calculatoarele de bord au evoluat in decurs de câțiva ani de la sisteme simple, care estimau numai distanța care mai poate fi parcursă, până la sisteme mult mai complicate care oferă mai multe informații cum ar fi: viteză medie, viteză instantanee, cantitate de combustibil rămasă , cantitate de combustibil consumată, consumul mediu și instantaneu, ora și data, timpul de la începutul deplasării, timpul până la destinație, temperatură interioară și exterioară. Prezenta unor astfel de dotari usureaza calculele de ordin financiar legate de exploatarea automobilului, ofera informatii in cazul unor deplasari mai lungi sau atunci cand sunt necesare anumite reglaje.
Un astfel de produs este un computer de bord pt Logan care are urmatoarele functii: luminozitate reglabila a display-ului, kilometraj total, kilometraj partial, carburant consumat consum mediu, consum instantaneu, distanta parcursa, viteva medie.Un display pt un Peugeot 206 afiseaza consumul, consumul instat, data/ora, temperatura, autonomie, erori, nr. liti in rezervor)
Sistemul pe care eu l-am dezvoltat va fi numit in continuare asistent de bord auto, deoarece varietatea functiilor pe care o ofera nu este la fel de mare ca cea a unui computer de bord dezvoltat de marii producatori de masini.
1. CRITERIILE PENTRU ALEGEREA UNUI MICROCONTROLER
Sunt multe aspecte de care trebuie ținut seama la alegerea unui MC pentru o anumită aplicație. Alegerea unui MC potrivit poate duce la succesul proiectului, așa cum o alegere nepotrivită poate duce la eșecul proiectului. Fiecare cititor trebuie să adapteze aceste criterii nevoilor sale și scalei proprii de valori. Obiectivul urmărit în alegerea unui MC este obținerea calității dorite cu un cost cât mai scăzut.
Calitățile dorite înseamnă performanță, fiabilitate, calități EMC (de compatibilitate electromagnetică cu mediul), iar costul total include costurile cercetării, proiectării, construcției, testării, reparării produsului. În primul rând se pune problema stabilirii funcției pe care MC trebuie s-o îndeplinească în sistem. Alegerea din catalog a unui MC trebuie făcută în ideea a cât mai puțin hardware suplimentar (din motive economice). Procesul de căutare este dificil din cauza numărului foarte mare de tipuri de MC disponibile pe piață.
După stabilirea MC optim se verifică prețurile, dacă este disponibil, suportul acordat de fabricant, existența uneltelor de dezvoltare, stabilitatea firmei constructoare. Un criteriu important este posibilitatea de a fi găsit pe piață (optenabilitatea), mai ales în zone în care circulația mărfurilor este destul de greoaie. Criteriile pentru alegerea unui MC sunt, în ordinea importanței:
1.Posibilitatea folosirii în aplicația dată este suficient un MC sau sunt necesare circuite suplimentare;
2. liniile I/O sunt suficiente (un număr prea mic înseamnă că aplicația nu se poate face cu acest MC, iar un număr prea mare înseamnă un cost excesiv);
3. există toate interfețele solicitate de aplicație: I/O serial, convertoare A/D, D/A și nu există interfețe în plus;
4. există capacitatea de memorare suficientă: RAM, ROM;
5. MC are viteza suficientă pentru această aplicație. Se verifică timpulnecesar rulării programului care trebuie să fie mai mic decât intervalul de timp în care trebuie să reacționeze MC;
Un argument pentru alegerea unui tip de MC este existența unui modul de evaluare. Pentru a promova propriile MC, mulți furnizori au creat Kit-uri de evaluare care conțin plăci de evaluare și un soft minimal cu care se poate învăța utilizarea MC și se pot pune la punct aplicații. Un kit conține de regulă un program monitor pentru calculator PC, un program de transfer al datelor spre placa de evaluare (prin interfața RS232 sau CENTRONICS), un asamblor și un compilator C. Toate kiturile sunt însoțite de documentație.
2. SCHEMA BLOC A UNUI MICROCONTROLLER
Schema este în continuare o reprezentare generalizată :
FIG.1 Schema bloc microcontroler
Se poate observa că un microcontroller este organizat în jurul unei magistrale interne pe care se vehiculează date, adrese și semnale de comandă și control între blocurile funcționale.
Unitatea centrală execută instrucțiunile pe care le primește prin magistrala de date din memoria program. Structura Harvard este posibilă și răspândită la microcontroller pentru că de regulă instrucțiunile sunt stocate în memoria ROM, iar datele în cea RAM.
Memoria RAM este o memorie cu caracter volatil care poate fi scrisa si citita de unitatea centrala iar locatiile adreselor din aceasta memorie pot accesate in orice ordine. Pe chip, memoria RAM ocupă mult loc și implicit costurile de implementare sunt mari. De aceea un microcontroller include de obicei puțin RAM.
Memoria ROM (Read Only Memory) este cea mai ieftină și cea mai simpla memorie și se folosește la stocarea programelor în faza de fabricație. Unitatea centrală poate citi informațiile, dar nu le poate modifica.
Memoria PROM (Programmable Read Only Memory) este similară cu memoria ROM, dar ea poate fi programată de către utilizator. După posibilitățile de ștergere, această memorie poate fi de mai multe feluri:
Memoria EPROM (Erasable PROM) care se poate șterge prin expunere la raze ultraviolete. Microcontrollerele cu EPROM au un mic geam de cuarț care permite ca chip-ul să fie expus la radiația ultravioletă. Ștergerea este nese și implicit costurile de implementare sunt mari. De aceea un microcontroller include de obicei puțin RAM.
Memoria ROM (Read Only Memory) este cea mai ieftină și cea mai simpla memorie și se folosește la stocarea programelor în faza de fabricație. Unitatea centrală poate citi informațiile, dar nu le poate modifica.
Memoria PROM (Programmable Read Only Memory) este similară cu memoria ROM, dar ea poate fi programată de către utilizator. După posibilitățile de ștergere, această memorie poate fi de mai multe feluri:
Memoria EPROM (Erasable PROM) care se poate șterge prin expunere la raze ultraviolete. Microcontrollerele cu EPROM au un mic geam de cuarț care permite ca chip-ul să fie expus la radiația ultravioletă. Ștergerea este neselectivă, adică se poate șterge doar întreaga informație și nu numai fragmente. Memoria poate fi ștearsă și reînscrisă de un număr finit de ori. Programarea EPROM-ului necesită o procedură specială, iar MC cu EPROM au nevoie de regulă pentru înscrierea EPROM-ului de o tensiune auxiliară, de 12 V de exemplu. Unele microcontrollere au incluse circuite de programare a memoriei EPROM, cu ajutorul cărora unitatea centrală poate programa memoria EPROM. În timpul programării memoria EPROM nu este conectată la magistrala de date și adrese. Unele microcontrollere sunt prevăzute cu mod special de lucru, în care sunt văzute din exterior ca niște memorii EPROM obișnuite și pot fi astfel programate cu orice programator.
OTP (One Time Programmable PROM) se folosește pentru multe serii de microcontrollere . Memoria OTP este de fapt o memorie EPROM, dar chip-ul a fost capsulat într-o capsulă de material plastic fără fereastră, care este mult mai ieftină. Memoria nu se poate șterge sau reprograma. Prețul unui MC cu OTP este mic, viteza este bună, dar aplicațiile sunt lipsite de flexibilitate.
Memoria EEPROM (Electrically Erasable Programmable Read Only Memory) poate fi ștearsă electric de către unitatea centrală, în timpul funcționării. Ștergerea este selectivă, iar pentru reînscriere trebuie parcurși mai mulți pași. Memoria EEPROM echipează multe MC, fiind ieftină. În memoria EEPROM se memorează un mic număr de parametri care se schimbă din timp în timp. Memoria este lentă și numărul de ștergeri/scrieri este limitat (tipic 10 000).
Memoria FLASH este o memorie asemănătoare EPROM și EEPROM în sensul că poate fi ștearsă și reprogramată în sistemul în care este folosită (fără a fi necesar un sistem dedicat). Are capacitatea unui EPROM, dar nu necesită fereastră pentru ștergere. Ca și EEPROM, memoria FLASH poate fi ștearsă și programată electric. Memoria FLASH nu permite ștergerea individuală de locații, utilizatorul poate să șteargă doar întregul conținut.
Din punct de vedere al locului și modului de programare a memoriilor de tip PROM există două concepte:
• ICP (In Circuit Programming) – programarea memoriei când microcontrollerul se află pe placa de cablaj imprimat a aplicației;
• ISP (In System Programming) – presupune posibilitatea de reprogramare în funcționare a sistemului. De exemplu la autovehiculele comandate de microcontroler, schimbarea tipului benzinei sau schimbarea unei legi privitoare la poluare pot fi actualizate în programul microcontroller fără ca acesta să fie scos din autovehicul.
Tipul de memorie și capacitatea memoriei din echiparea unui microcontroler sunt caracteristici particulare fiecărui tip de circuit.
Magistrala de date și cea de adrese pot fi separate sau multiplexate. Fiecare MC are un controller de întreruperi care admite atât intrări din exterior cât și de la modulele interne. Unele MC dispun de un controller DMA propriu.
Modulele I/O pot fi seriale sau paralele. Fiecare modul transferă date cu exteriorul
prin intermediul registrului de date (RD). Modulul este programat (configurat) de unitatea centrală prin intermediul unui registru de comenzi (RC) și se poate citi starea modulului prin registrul de stare (RS). Prin RS se pot genera întreruperi către unitatea centrală. Registrele modulelor I/O pot fi văzute de UC ca locații de memorie sau ca dispozitive de I/O într-un spațiu de adresare separat. Sub numele de dispozitiv I/O, într-o abordare generalizată, sunt cuprinse principalele interfețe ale MC (timer, canal serial UART) și linii I/O grupate în porturi paralele de uz general. Același nume generic poate acoperi și interfețele speciale întâlnite în configurații particulare de MC (convertor A/D, interfață serială sincronă, interfață LCD, interfață USB, etc.)
2.1 PARTICULARIZARE. Diagrama bloc a microcontrollerului PIC16F887
FIG.2 Diagrama bloc a microcontrollerului PIC16F887
2.2 Dispozitive I/O
Dispozitivele I/O reprezintă un aspect de mare interes atunci când este vorba de microcontroller, interes rezultat din însăși particularitatea unui MC aceea de a interacționa cu mediul în procesul de control pe care îl conduce.
Dispozitivele I/O implementează funcții speciale degrevând unitatea centrală de toate aspectele specifice de comandă și control în funcția respectivă.Există o varietate mare de dispozitive I/O; dispozitivele I/O conduc operații generale de comunicație (transfer serial sau paralel de date), funcții generale de timp (numărare de evenimente, generare de impulsuri), operații de conversie analog/numerică, funcții de protecție, funcții speciale de comandă, și enumerarea poate continua. Parte din resurse acoperă funcțiile de control propriu-zis, iar o parte asigură funcțiile necesare aplicațiilor în timp real (sistemul de întreruperi, timer). Din această mare varietate, parte din dispozitive se găsesc în configurația tuturor MC sau sunt foarte des întâlnite, iar o altă parte de dispozitive o regăsim doar în MC construite pentru a optimiza aplicații cu un grad mare de particularitate. În acest capitol, în continuare, vor fi prezentate dispozitive des întâlnite în echiparea MC. Dispozitivele I/O sunt “văzute” de unitatea centrală ca porturi. Există două filozofii de alocare a adreselor (mapare) pentru apelarea porturilor de către unitatea centrală. Porturile sunt mapate fie în spațiul de memorie, fie într-un spațiu propriu.
Avantajele mapării în spații separate:
• Metoda nu este susceptibilă de a provoca erori soft deoarece se folosesc instrucțiuni diferite pentru a accesa memoria și dispozitivele I/O;
• Dispozitivele I/O nu ocupă spațiu de memorie;
• Decodificatorul de adrese pentru dispozitivele I/O este mai simplu deoarece spațiul de adresare al dispozitivelor I/O este mai mic.
Dezavantaje ale mapării în spații separate:
• instrucțiunile I/O sunt mai puțin flexibile în comparație cu instrucțiunile de lucru cu memoria;
• instrucțiunile I/O nu permit folosirea modurilor de adresare folosite în lucrul cu memoria.
Avantajul mapării în spațiu comun:
• toate instrucțiunile de lucru cu memoria și toate modurile de adresare sunt utilizabile și în tratarea dispozitivelo I/O (programarea operațiilor I/O este foarte flexibilă);
Dezavantajele mapării în același spațiu:
• este susceptibil la erori software;
• spațiul de adresare disponibil pentru memorie este mai mic.
Avantajul mapării într-un spațiu comun este acela că se poate opera cu porturile la fel ca și cu o locație de memorie; multe operații aritmetice și logice folosesc operanzi direct de la port, datele pot fi mutate între porturi cu o singură instrucțiune, conținutul unui port poate fi citit, incrementat și rezultatul scris din nou la port de asemenea cu o singură instrucțiune.
2.3 Module Timer
Natura aplicațiilor pentru care s-a născut microcontroller-ul implică o multitudine de funcții de timp puse la dispoziția utilizatorului prin module de timp numite timer. Un MC este echipat în mod obligatoriu cu un astfel de modul mai mult sau mai puțin complex. Un sistem timer obișnuit pune la dispoziție un set de funcții implementate pe baza unui numărător liber central și a unor blocuri funcționale pentru fiecare funcție în parte.
Timer-ul are în structura sa, dintre toate celelalte subsisteme, cele mai multe registre. Toate funcțiile unui timer pot genera întreruperi independente; fiecare are controlul propriu și propriul vector de întrerupere. Modulele timer complexe sunt construite cu arii de numărare programabile (PCA). Pentru aplicații speciale în timp real
s-au construit module timer cu unitate aritmetică și logică proprie. Timer-ul este folosit pentru a măsura timpul și pentru a genera semnale cu perioade și frecvențe dorite. Timer-ele nu sunt doar circuite cu funcții detemporizare; în modulul timer sunt implementate câteva mecanisme care pun la dispoziția utilizatorului funcții specifice.
Mecanismul de comparare permite controlul unor semnale de ieșire; mecanismul de captură permite monitorizarea unor semnale de intrare; numărătoarele interne permit generarea de referințe de timp interne, necesare în bucle de întârziere, multiplexarea diferitelor sarcini software, ș.a. Timer-ul poate fi folosit practic pentru orice funcție de timp, inclusiv generarea unor forme de undă sau conversii D/A simple. Funcțiile oferite de un timer sunt:
1. Captură la intrare (IC – input capture) – această funcție se bazează pe posibilitatea de a stoca valoarea numărătorului principal la momentul apariției unui front activ al unui semnal extern. Facilitatea permite măsurarea lățimii unui impuls sau a perioadei unui semnal. Facilitatea poate fi folosită și ca referință de timp pentru declanșarea altor operații.
2. Comparare la ieșire (OC – output compare) – se compară la fiecare impuls de ceas valoarea numărătorului principal cu cea a unui registru. Dacă se constată egalitate, în funcție de programarea anterioară pot avea loc următoarele evenimente: declanșarea unei acțiuni la un pin de ieșire (opțional), setarea unui flag într-un registru sau generarea unei întreruperi pentru unitatea centrală (opțional). Funcția este folosită pentru a genera întârzieri sau pentru a genera o
formă de undă cu valori dorite pentru frecvență și pentru factorul de umplere .
3. Întreruperi în timp real (RTI – real-time interrupt) – într-un sistem există sarcini care trebuiesc executate periodic sau care nu permit depășirea unui interval limită între doua execuții. Aceste sarcini sunt lansate ca rutine de tratare a întreruperii generate de timer.
4. COP (computer operating properly) watchdog – această funcție este folosită pentru a reseta sistemul în cazul în care din erori de programare (bugs) sau erori în desfășurarea programului datorate perturbațiilor mediului, registrul COP nu este accesat într-un interval de timp prescris.
5. Acumulare de pulsuri (pulse accumulator) – este funcția folosită pentru a număra evenimentele ce apar într-un interval de timp determinat sau pentru a măsura durata unui impuls.
2.4 Microcontrollerul PIC16F887
FIG.3
Microcontrollerul utilizat pentru acest proiect este PIC16F887 si are reprezentarea pinilor ca in figura 1. Asa cum se poate observa si din figura nr.1 pinii microcontrollerului inglobeaza mai multe functii , asfel , pinii corespunzatori port-ului PORTA pot fi setati si ca pini analogici de intrare dar si ca pini digitali de intrare/iesire. De asemenea pinii Vpp , RB7 si RB6 sunt utilizati in programarea memoriei microcontrollerului prin conexiune ICSP , dar pinii RB7 , RB6 pot fi utilizati si ca pini digitali de intrare/iesire. PIC16F887 contine un numar de 14 canale analogice si pot fi folosite in regim multiplexat, independent unul de celalalt avand. Microcontrollerul are la baza arhitectura de tipul Harvard si un numar de 35 de instructiuni, putand opera la o frecventa maxima a oscilatorului de 20 Mhz , reprezentand o viteza propriuzisa de lucru de F(clock)/4= 200 nanosecunde.
FIG.4
Un aspect important legat de acest tip de arhitectura este acela ca memoria program este separata de memoria de date , in acest fel fiind posibila citirea unei date si a unei instructiuni in acelasi timp( memoria de date si memoria program se afla pe BUS-uri diferite). Tehnica pipeline este cea prin intermediul careia o instructiune se executa corect iar in cazul de fata , o instructiune este corect realizata in 4 perioade de clock, astfel , la o frecventa a oscilatorului de 20 Mhz, frecventa reala de lucru a microcontrolerului va fi de 20/4 = 5 Mhz, sau altfel spus, 5 mips (5 milioane de de instructiuni pe secunda) Aceasta tehnica se regaseste si la procesoare si ajuta la cresterea vitezei propriuzise de lucru. Fiecare etapa din cele 4 din procesul pipeline este executata de catre o unitate functionala a microcontrollerului. Segmentele pipeline sunt conectate intre ele intr-un mod analog asamblarii unei conducte din segmente de teava. Segmentele tipice de executie ale unei instructiuni masina pe microcontroller sunt :
F- fetch – se refera la un ciclu special in care procesorul citeste din memorie
codul instructiunii ce urmeaza a fi executata.
D-decode – se refera la procesul de decodare , proces in care instructiunea
este recunoscuta si procesul are tot ce ii trebuie pentru executia instructiunii.
E-execute- reprezinta procesul propriuzis de executie a instructiunii
W-write-back- scrierea rezultatului inapoi in memorie.
FIG.5
Referitor la microcontrollerul PIC16F887, acesta, pe langa oscilatorul extern ce poate fi adaugat din punct de vedere hardware, mai contine si un oscilator intern fiind posibila selectarea unei frecvente cuprinse intre 31kHz-8Mhz. In cazul de fata frecventa la care opereaza microcontrolerul este de 20 Mhz si a fost ales pentru ca are integrat in constructia sa o platforma ADC multicanal, platforma ce a corespuns standardelor de design digital alese la inceputul constructiei acestui proiect.O serie de caracteristici ce descriu microcontrollerul PIC16F877A sunt prezentate in figura urmatoare :
FIG.6
• Power-Saving modul Sleep
• Gamă largă de tensiune gama de operare (2.0V-5.5V)
• Power-on Reset (POR)
• Power-up Temporizator (PWRT) și Oscilator Start-up Temporizator (OST)
• Brown-out Reset (BOR)
• low-curent watchdog timer (WDT)
• anduranță mare in scrierea Flash-ului / EEPROM-ului pe celulă:
– 100.000 cicluri Flash
– 1.000.000 cicluri EEPROM
– Flash / date EEPROM de retenție:> 40 ani
• Memoria program de citire / scriere în cursul timpului de funcționare
• In-Circuit Debugger
Functiile pinilor pentru microcontrolerul PIC16F887:
FIG.7
2.5 Pinul MCLR/Vpp
Acest prin are rolul de MASTER CLEAR OR RESET .
– MCLR and VPP sunt doua functii reprezentate prin acelasi pin;
– MCLR reprezinta Master Clear, iar functia de reset pe microcontroller va determina ca microcontrollerul sa stea intr-o stare de reset atat timp cat MCLR este conectat la GND . Datorita acestui fapt, pentru a se evita eventualele resetari ale microcontrollerului, se utilizeaza un rezistor de tipul pull-up care mentine in permanenta pinul de MCLR la Vdd. Cand MCLR e conectat ls Vdd , atunci microcontrollerul incepre sa execute prima instructiune din memoria program.
VPP se traduce ca fiind Voltage for Programming si este utilizat in procesul scrierii memoriei . Atunci cand amplitudinea tensiunii de pe pinul Vpp este cuprinsa intre 9-13v microcontrollerul intra intr-o stare speciala de reset unde acesta nu functioneaza , dar poate fi programat.
FIG.8
2.6 Convertoarele ADC
Intrările/ieșirile analogice și convertoarele A/D nu sunt considerate ca parte definită în contextul unui calculator; aceste elemente sunt importante în schimb atunci când considerăm un microcontroller. Prezența modulelor A/D și D/A în structura unui MC contribuie la “puterea”acestuia în aplicații deoarece interfațarea cu mediul presupune necesitatea de a prelucra sau de a elabora mărimi analogice. Convertoarele A/D sunt des întâlnite printre perifericele on-chip. Convertoarele D/A nu sunt întâlnite în mod uzual printre unitățile componente deoarece sunt relativ ușor implementate în exterior. Un convertor D/A simplu poate fi realizat folosind un timer în mod PWM și integrând pulsul în exterior cu un simplu circuit RC.
Convertoarele A/D integrate pe chip sunt convertoare cu aproximații succesive sau mai rar, convertoare cu integrare. Însușirile convertoarelor nu sunt deosebite; sunt convertoare lente în comparație cu cele implementate în circuite independente. Timpii de conversie obișnuiți sunt plasați în intervalul 10μs-25μs. Rezoluția este de 8, 10 sau 12 biți iar precizia de +/-1/2LSB. Modulul de conversie este prevăzut și cu un multiplexor analogic, astfel sunt disponibile mai multe canale de intrare. Unele MC sunt echipate și cu circuit de eșantionare/memorare. În cazul în care circuitul de eșantionare/memorare lipsește, semnalul analogic trebuie menținut constant pe durata unei conversii. Tensiunea de referință necesară convertorului poate fi generată în circuit sau dacă nu, este necesar să fie furnizată din exterior. În continuare, este prezentată o schemă bloc simplă a unui modul de conversie A/D. Circuitul analogic de intrare constă într-un multiplexor analogic, un circuit de eșantionare/memorare și un convertor A/D cu aproximații
succesive. Tensiunea de referință pentru convertor și masa analogică sunt furnizate
din exterior la pini speciali. Clock-ul necesar convertorului este generat intern din
clock-ul unității centrale.
FIG.9
In proiectul de fata , PORTA al microcontrolerului este utilizat pe post de convertor cu intrari analogice,intrari ce preiau semnalele generate de senzorii cu care este echipat sistemul .Canalele ADC folosite in conversia analog-numerica sunt pe 10 biti si sunt utilizate astfel :
Canalul AN0 este utilizat in achizitia semnalului corespunzator senzorului de tensiune;
Canalul AN1 pentru preluarea semnalului analogic corespunzator temperaturii interioare ;
Canalul AN2 pentru senzorul ce monitorizeaza intensitatea luminoasa si in functie de care se comanda aprinderea automata a farurilor ; Asa cum a fost mentionat si anterior in proiect, pentru achizitia semnalelor analogice provenite de la senzorii sistemului, se utilizeaza un singur convertor analog-numeric cu reprezentare a semnalului analogic de intrare in format digital pe 10 biti si rezolutie de 4.88 mV / bit. Convertorul lucreaza in regim muliplexat sau altfel spus este utilizat pentru toate semnalele analogice de intrare prin setarea corespunzatoare a registrilor ANSEL , ANSELH. Legatura dintre PORTA, PORTB si registri ANSEL si ANSELH pentru setarea canalelor de intrare analogice este urmatoarea :
FIG.10
Pentru a seta un canal in modul de intrare analogic , de exemplu pentru pinul RA0/AN0, trebuie ca, in prima faza sa se seteze bitul 0 din registrul TRISA cu 1L ( pinul RA0 se face pin de intrare) iar apoi sa se seteze bitul 0 din registul ANSEL cu 1L pentru ca pinul RA0 sa aiba functia de intrare analogic. Daca nu se seteaza bitul din registrul ANSEL, atunci intrarea va avea functia d doar intrare digitala.
Un aspect important legat de acesti doi registri (ANSEL si ANSELH) este acela ca setarea valorilor bitilor din continutul lor nu afecteaza iesirile digitale.
Configuratia arhitecturala a registrilor ANSEL si ANSELH este urmatoarea :
FIG.11
2.7 Considerente software legate de convertorul ADC
In ceea ce priveste partea de procesare a semnalelor analogice si tinand cont de formatul , rezolutia , registrii implicati in procesul de achizitie a datelor ,partea software este baza procesarii semnalelor. In cazul de fata, daca se face referire la semnalul analogic de pe intrarea RA/AN0, iesirea divizorului rezistiv are o plaja de valori cuprinsa intre 0-5000mV . Valoarea amplitudii de pe canalul de intrare AN0 este citita si convertita in format digital pe 10 bit de catre convertorul ADC, deci pentru valoarea maxima a tensiunii din intrare (~5V) , convertorul ADC va genera un cuvant pe 10 biti de valoare maxima , adica de 1024 (2^10). De aici se poate deduce intr-un mod simplu rezolutia, dupa formula :
Rez = Valoarea in fizic (5V) / Valoarea in hex (1024) = 4.88 mv/bit.
In cod, achizitia si procesarea semnalului analogic s-a realizat astfel :
val_digitala = Adc_Read(0);
mv= 4*val_digitala + 8*val_digitala/10+ 8*val_digitala/100;
mv_f=3*mv + 1*mv/10 + 9* mv/100;
In prima faza se citeste semnalul de pe canalul analogic de intrare RA0/AN0 iar rezultatul se salveaza in variabila “val_digitala” cu o reprezentare pe 10 bit sau altfel spus cu valoare maxima preluata egala cu 1024 (reprezentare in format zecimal).
Utilizand formula rez = Valoarea in fizic / Valoarea in hex si stiindu-se totodata valoarea rezolutiei (4.88 mV/bit) se poate deduce usor valoarea in fizic. Spre exemplu, daca se va genera un cavant cu valoarea 1024 la iesirea convertorului, atunci valoarea din intrarea sa va fi de 1024 * 4.88 = ~ 5V. Acest mecanism s-a utilizat si in partea software, asa cum se poate observa si in structura de cod C expusa mai sus. In ultima parte a codului , variabila temporara mv ce contine acum amplitudinea semnalului din intrarea convertorului este transformata in valoarea din intrarea divizorului rezistiv (ce are iesirea conectata la pinul RA0/AN0) cu factorul de divizare de 0.319. Valoarea maxima a amplitudinii corespunzatoare tensiunii din intrarea convertorului AD nu trebuie sa depaseasca valoarea de 5V in scopul de a se evita defectarea ireversibila a microcontrolerului.
4. Sistemele senzoriale
Pentru majoritatea sarcinilor atribuie unui robot, cel mai comun tip de intrare este cel reprezentat de semnalul electric provenit de la sistemul senzorial. Se poate spune faptul că există o gamă largă de sisteme senzoriale de la foarte simple la foarte complexe, toate acestea utilizate cu un sigur scop și anume de a oferi robotului semnalul pe baza căruia să poată lua decizii inteligente. Spre exemplu un senzor de temperatura poate oferi robotului informația necesară în scopul de a continua sau nu o anumită acțiune.
Senzorii se pot grupa în două mari categorii, și anume:
– Senzori digitali care oferă rezultate la ieșire numai de valori 1 sau 0, on/off sau true/false. Un simplu exemplu în acest sens este un comutator oferind informația necesară în momentul în care acesta este închis sau deschis.De asemenea un sensor sonar sau ultrasonic range finder returnează valori binare, semnalul din ieșire fiind compus dintr-un anumit număr de biți și furnizând informații referitoare la distanță. Senzorii digitali pot fi conectați direct la blocul de procesare și control fără alte blocuri electronice de interfațare.
– Senzorii analogici care oferă la ieșire de obicei o tensiune. În multe cazuri, acest tip de senzori oferă la ieșire o rezistență sau un curent variabil care este convertit mai apoi de către un circuit intermediar într-o tensiune. Un exemplu foarte bun este acela în care un element LDR (foto-rezistor) este expus la lumină.În acest caz, prin construcția unui simplu divizor de tensiune, tensiunea din ieșire variază direct cu lumina care intră în contact cu foto-celula. În cazul senzorilor analogici este deseori nevoie de un bloc de conversie analog-digital care să convertească variația tensiunii de la ieșirea senzorului într-o formă în care unitatea centrală de procesare o poate utiliza. În ceea ce privește tipul senzorilor, se pot enumera:
-Sonar ultrasonic range finder în care undele reflectate sunt folosite pentru a aproxima distanța sau pentru determina dacă robotul este în apropiere de un obiect. Raza de acțiune are o valoare maximă în jur de 10 metri.
-Senzorul cu infraroșu în care undă în infraroșu reflectată este utilizată în scopul de a determina distanța. Raza tipică de acțiune este de la 0 la 2 metri.
-Senzorul de lumină este utilizat în scopul de a detecta prezența sau absența luminii.
-Senzorul piroelectric în infraroșu poate detecta diferențe de temperatură și este foarte utilizat în senzorii de mișcare. Raza de acțiune este cuprinsă de la 0 până în jurul valorii de 15 metri.
-Senzorul de sunet cu ajutorul căruia sursele de sunet pot fi detectate.Se poate regla astfel încât să fie sensibil la anumite frecvente și amplitudini ale semnalului sonor.
-Accelerometrul care este folosit pentru a detecta schimbări de viteză sau deviații de la axa orizontală, cel mai des fiind utilizat pentru a determina viteza de deplasare a robotului.
-Senzorul de temperatura poate fi utilizat pentru a monitoriza temperatura ambiantă sau căldura aplicată.
5. Programarea memoriei microcontrolerului PIC16F887A
Programarea de tip ISP (In-System Programming) este o tehnică pentru programarea unui microcontroler după ce acesta a fost dispus pe placa de circuit. TehnicaICSP (In-Circuit Serial Progrmming) reprezintă o evoluție a tehnicii ISP dezvoltatăde către firma Microchip în scopul programării microcontrolerelor PICmicro TM OTP șiFlash. Utilizarea a doar doi pini de intrare/ieșire pentru transferul serial al datelor este mult mai ușoară și mai puțin intruzivă decât operarea normală a microcontroleru-lui.
Programatorul reprezintă instrumentul hardware care permite transferul un program într-un microcontroler. Acesta poate fi întîlnit într-o varietate de tipuri și forme.
Procesul de scriere al unui program începe din momentul în care asamblorul generează codul hex compus din instrucțiuni în cod mașină. Codul hex este preluat intr-un fișier și transferat direct în memoria microcontrolerului. Pentru acesta este necesar dispozitivul hardware (programatorul) care este conectat atât la computerul generator alcodului hex (prin interfață serială RS232 sau USB), cât și la un număr de pini specifici ai microcontrolerului. Fiecare serie de microcontrolere sau de capsulă are un set diferit de pini care poartă denumirea de interfață/conector ICSP. Circuitul electronic al modulului contine o conexiune de tipul ICSP pentru a facilita scrierea memoriei microcontrolerului.Conectorul este plasat intr-o zona degajata a circuitului pentru a nu se afecta componentele electronice sensibile .
Conexiunea ICSP contine 6 pini corespunzatori microcontrollerului:
VPP(MCLRn) –reprezinta valoarea tensiunii de programare care este de obicei de 13V;
Vcc-tensiunea de alimentare de 5V;
GND- masa circuitului;
PGD- conexiune de date (RB7);
PGC- conexiune de clock (RB6);
PGM- low voltage programming enable;
Conectorul ICSP sprecum si conexiunea acestuia cu microcontrolerul PIC16F887A sunt descrise in figurile urmatoare :
FIG.12
Scrierea memoriei microcontrolerului PIC16F887A s-a facut cu ajutorul programatorului PICKIT2 ce a fost realizat cu microcontrolerul PIC18f2550 si conectare pe portul USB iar programul utilizat in acest proces a fost software-ul “PICKIT2”, software destinat microcontrolerelor din familia PIC.
6. LCD-ul alfanumeric 16×2 caractere
LCD-ul utilizat in acest proiect este unul de tip alfanumeric cu 2 linii si 16 coloane iar comunicarea cu microcontrollerul se realizeaza printr-o interfata de 8 biti. Alimentarea modulului LCD se face cu 5V, iar intensitatea luminoasa a pixelilor poate fi ajustata prin intermediul unei intrari de control. Aceasta intrare de control accepta o tensiune variabla, tensiune obtinuta prin intermediul unui divizor rezistiv ce are la baza un semireglabil de 50 kohm .Pinii de interfatare ai LCD-ului conform datasheet-ului sunt :
FIG.13
Caracteristici electrice:
FIG.14
Diagrama bloc a modulului LCD :
FIG.15
Caracterul afisor :
FIG.16
Protocolul de comunicare cu microcontrolerul PIC16f887 este stabilit in conformitate cu timpii de intarziere si semnalele de control/date descrise in datasheet-ul LCD-ului.
7. Schema electronica generala
FIG.17
Dupa cum se observa din figura nr.20 , microcontrollerul pe 8 biti PIC16F887 reprezinta principalul element de procesare digitala a semnalelor analogice provenite de la senzorii cu care este echipat sistemul. Asa cum a fost mentionat si anterior in proiect, senzorii utilizati sunt toti de tipul analogic si genereaza o tensiune la iesire cuprinsa intre 0-5V, mai putin senzorul de temperatura a carui amplitudine a semnalului de iesire se incadreaza in plaja de valori de 0-1500mV. Tensiunea de alimentare a intreg modulului electronic nu trebuie sa depaseasca valoarea maxima de 15V pentru ca astfel ar putea duce la defectarea elementului stabilizator de 5V (circuitul integrat 7805) dar si a microcontrollerului prin simplul fapt ca pe intrarea analogica a ADC-ului corespunzatoare citirii tensiunii de alimentare, diferenta de potential fata de masa va fi mai mare de 5V.
Condensatorii c95 si c94 integrati in partea de alimentare a modulului electronic in intrarea si de iesirea circuitului electronic stabilizator 7805 sunt utilizati in scopul filtrarii eventualeleor perturbatii ce pot aparea pe ramura de alimentare datorita defazarii curentului fata de tensiune (alimentarea unor motoare electrice de la 220V) dar si datorita modulului electronic care poate introduce la randul sau perturbatii pe tensiunea de alimentare de 5V prin actionarea unor dispozitive actuatoare, relee, motoare dar si prin simpla functionare a micoroontrollerului unde generarea frecventei de lucru de catre elementul oscillator (quartz-ul) de 8Mhz perturba tensiunea de alimentare. LED-ul alimentat cu tensiunea de 5V din iesirea elementului stabilizator 7805 prin intermediul unui resistor de 100 ohm care are rolul de limitare a curentului de polarizare, este utilizat in scopul evidentierii functionarii partii de alimentare a modulului electronic. O eventuala defectiune la partea de alimentare a circuitului va determina stingerea acestui LED.
Rezistorul R180 pozitionat in pinul 1 MCLR al microcontrollerului este utilizat ca resistor de pull-up in scopul evitarii unei posibile resetari. Atunci cand pinul de MCLR este conectat la masa sau tensiunea de pe acesta scade sub o anumita valoare minima , se declanseaza mecanismul de resetare a sistemului, proces in care registri interni vor fi setati la valori initiale de startare. Divizorul rezistiv de tensiune format din rezistorii de 10 k si respectiv 4.7k si pozitionat pe ramura de alimentare a circuitului are rolul de senzor in contextul in care valoarea amplitudinii tensiunii de alimentare a circuitului variaza in plaja de valori 5-15V. Factorul de divizare este de 0.319 , acest lucru insemnand ca la o tensiune maxima aplicata in intrarea divizorului rezistiv de
aproximativ 15V , iesirea acestuia va avea valoarea de 15 * 0.319 = 4.875 V. Asa cum a fost mentionat anterior in proiect, se recomanda sa nu se depaseasca valoarea maxima de 15V de alimentare a modulului electronic deoarece este posibila generarea unei defectiuni iremediabile a convertorului ADC ce face parte din design-ul digital intern al microcontrollerului.Conversia semnalului provenit din iesirea senzorului de tensiune LM35 este aplicat pe canalul analogic AN0 al microcontrollerului ce lucreaza in regim multiplexat si are o rezolutie de 5000 mV/ 2^10 = 4.88mv / bit determinata dupa formula de calcul a unui sistem ADC (rezolutia = Valoarea in fizic / Valoarea in hex(valoarea de calcul)). Senzorul de tensiune este utilizat in procesul de determinare a temperaturii interioare si are o rezolutie de 10 mv / grad Celsius , sau altfel spus, o crestere de 1 grad Celsius va dermina cresterea tensiuni de iesire cu 10 mV. Alimentarea circuitului termosensibil se realizeaza cu 5V si avand in vedere faptul ca poate masura temperaturi cuprinse in plaja de 0-150 grade Celsius , valoarea maxima a tensiunii de iesire va avea valoarea de 10 mV * 150 = 1500 mV.
Referinta de tensiune utilizata pentru convertorul ADC (pe 10 bit) in achizitia semnalului corespunzator temperaturii motorului este de 5V , deci ADC-ul va avea o rezolutie de 4.88mV / bit. Rezistorul de 10K integrat in iesirea senzorului de temperatura are rolul de a elimina perturbatiile ce pot aparea din cauza firului de comunicare (senzor-intrare pin ADC) cu o lungime mai mare de 1m. Acesta rezolvare a problemei legate de lungimea firului de comunicare si perturbatiile introduse in sistem este specificata si in datasheet-ul componentei LM35 de catre producator.
Quart-ul sau generatorul de frecventa a circuitului electronic este principalul element care detemina frecventa de lucru a microcontrollerului, in cazul de fata 8Mhz / 4 = 2Mhz. Frecventa generata de oscilator este divizata cu 4 doarece o instructiune necesita 4 perioade de clock corespunzatoare fazelor :
F- fetch – se refera la un ciclu special in care procesorul citeste din memorie codul instructiunii ce urmeaza a fi executata.
D-decode – se refera la procesul de decodare , proces in care instructiunea este recunoscuta si procesul are tot ce ii trebuie pentru executia instructiunii.
E-execute- reprezinta procesul propriuzis de executie a instructiunii
W-write-back- scrierea rezultatului inapoi in memorie.
Astel o instructiune va fi executata la fiecare 0.5 us (500 ns). Condensatorii pozitionati pe pinii oscilatorului cu quart au rolul de a filtra semnalul generat de acesta prin procesul de eliminare a frecventelor nedorite de lucru din jurul frecventei fundamentale de 8 Mhz necesare corectei functionari a microcontrollerului.
Senzorul de lumina este realizat cu un element fotosensibil de tipul LDR (light detector resistor) a carui rezistenta electrica scade proportional cu cresterea intensitatii luminoase. Pentru a se face uz de aceasta caracteristica esentiala de functionare a elementului fotosensibil, acesta s-a utilizat intr-o configuratie de divizor rezistiv impreuna cu un resistor de 10K ce are rolul de pull-down. Functionarea senzorului se bazeaza pe caracteristica sa esentiala anterior descrisa, in sensul ca , atunci cand intensitatea luminoasa de pe suprafata fotosensibila a elementului este redusa , rezistenta sa electrica va avea deasemnea o valoare mare, fapt ce va determina o tensiune de pe intrarea convertorului ADC apropiata de valoarea 0V. Atunci cand intensitatea luminoasa creste, rezitenta electrica a senzorului va scadea si astfel , pe intrarea convertorului ADC tensiunea va creste catre valoarea de 5V. Acest parametru (intensitatea luminoasa) este exprimat in procente si afisat pe LCd-ul alfanumeric.
Principiu al divizorului rezistiv este:
FIG.18
7.1. Senzorul de temperatura
Senzorul de temperatura are la baza circuitul integrat LM35 ce genereaza la iesie o tensiune analogica proportionala cu variatia temperaturii de pe elementul termo-sensibil.Iesirea senzorului de temperatura este conectata la intrarea analogical AN1 a microcontrolerului iar in urma analizei si procesarii semnalelor in cauza, valoarile rezultate sunt convertite si afisate pe LCD-ul alfanumeric in grade celsius.
Caracteristici electrice LM35DZ :
Calibrated directly in ° Celsius (Centigrade)
– Linear + 10.0 mV/°C scale factor
– 0.5°C accuracy guaranteeable (at +25°C)
– Rated for full −55° to +150°C range
– Suitable for remote applications
– Low cost due to wafer-level trimming
– Operates from 4 to 30 volts
– Less than 60 μA current drain
– Low self-heating, 0.08°C in still air
– Nonlinearity only ±1⁄4°C typical
– Low impedance output, 0.1 for 1 mA load
Dispunere pini:
FIG.19
Caracteristici electrice:
FIG.20
FIG.21
Utilizarea rezitorului de 2k-10k pe iesirea de semnal pentru eliminarea perturbatiilor :
FIG.22
Procesul software prin intermediul caruia se achizitioneaza si proceseaza semnalul analogic generat de elementul termosensibil LM35DZ este urmatorul :
temp = Adc_Read(1);
temp= 4*temp + 8*temp/10+ 8*temp/100;
if (temp>=1000)
{
st=temp/1000;
while (temp>=1000)
{
temp-=1000;
}
}
else
{
st=0;
}
if (temp>=100)
{
zc=temp/100;
while (temp>=100)
{
temp-=100;
}
}
else
zc=0;
if (temp>=10)
{
ut=temp/10;
while (temp>=10)
{
temp-=10;
}
}
else
ut=0;
zml=temp;
In prima faza se citeste semnalul analogic de pe pinul RA1/AN1 si se calculeaza valoarea reala reprezenata in fizic (mV). Siindu-se faptul ca LM35DZ poate genera o tensiune maxima la iesire de aproximativ 1500mV , valoarea de pe convertorul ADC anterior procesata se va imparti la 1000 pentru aflarea sutelor de grade Celsius, apoi la 100 pentru aflarea zecilor de grade Celsius , apoi la 10 pentru aflarea unitatilor de grade Celsius, restul calculului reprezentand zecimalele in grade Celsius. Aceste valori sunt apoi convertite si afisate pe LCD-ul alfanumeric de 16×2 caractere.
7.2.Senzorul de lumina
Senzorul de lumina consta intr-un fotorezistor si un resistor de 10Kohm conectate intr-o configuratie de divizor de tensiune, senzorul de lumina (LDR) fiind conectat pe ramura pozitiva de tensiune.Procesul ce sta la baza functionarii senzorului de lumina se axeaza pe capabilitatea elementului fotosensibil de a-si modifica rezistenta in functie de lumina ce cade pe suprafata sa.Astfel, daca intensitatea luminoasa este semnificativa , atunci rezistenta interna a fotorezistorului va scadea , iar tensiunea de iesire de pe divizorul rezistiv va creste . Daca intensitatea luminoasa ce cade pe suprafata fotosensibila este scazuta atunci procesul este invers celui descris anterior. Senzorul de lumina ese conectat la intrarea AN2 a convertorului ADC al microcontrollerului.
FIG.23
FIG.24
8. Intreruperile pe TIMER1
Modulul de TIMER1 este un timer/numerator format din 2 registri de 8 biti TMR1H si TMR1L ce pot fi scrisi si cititi. Pentru a se putea utiliza acest timer, se foloseste in proces si registrul INTCON cu setari pe bitii INTCON.GIE si INTCON.PEIE. Bitul PIE1.TMR1IE este setat pentru inceperea intreruperilor iar PIR1.TMR1IF este resetat ,valoarea de start a counter-ului modului TRIMER1 fiind stabilita prin valorile celor 2 registri:
TMR1H = 0b11111111;
TMR1L = 0b10110000;
Aceast lucru insemnand inceperea numararii de la valoarea counter-ului 65456 pana la 65535 , deci generarea unei intreruperi la fiecare 79 x 0.2us=15.8 us.
9. Descrierea software a sistemului (MIKROC)
Partea software a sitemului a fost realizata in cod C prin intermediul compilatorului Mikroc iar codul inscris in memoria flash a microcontrollertului prin intermediul programului software PICkit2. In ceea ce proveste strict partea software , au fost utilizate variabile globale, functii si proceduri de intrerupere. LCD-ul contine un processor propriu dar si memorie CGROM, CGROM, iar programarea microcontrollerului s-a realizat tinand cont de aceste lucruri si utilizand functii predefinite de afisare si control. Functiile corespunzatoare LCD-ului utilizate in proiect sunt :
Lcd8_Config(&PORTD,&PORTC,7,5,6,0,1,2,3,4,5,6,7);
unde se seteaza pinii de date si de control corespunzatori functionarii LCD-ului;
Lcd8_Cmd(Lcd_CLEAR) ; se sterg caracterele de pe LCD
strConstCpy(text,mesg1);
Lcd8_Out(1,1,text); se afiseaza un mesaj pe LCD de la pozitia : linia 1,
coloana1;
In prima faza a inceperii programarii se seteaza pinii I/O ce vor fi ulterior folositi in proiect. Astfel, in cazul de fata :
ANSEL = 0b00000111; // setare intrari analogice
ANSELH =0b00000000;
TRISA = 0b00000111; // set as inputs
TRISB = 0b00000000; // set PORTB as OUTPUT
TRISC = 0b00000000;
TRISD = 0b00000000; // trisd.f1 = contact portbagaj (IN); trisd.f0 = sound;
TRISE = 0b00000000; // RE0 = analog input
Se utilizeaza RA0, RA1, RA2 ca inputuri analogice responsabile cu achizitia semnalelor provenite de la senzori.Concomitent cu setare pinilor din PORTA ca pini de intrare (care momentan sunt pini de intrare digitali), se seteaza si registrul ANSEL cu aceleasi valori atribuite port-ului PORTA pentru ca sa se produca modificarea din pini de intrare digitali in pini de intrare analogici.
PORTA = 0;
PORTB = 0; // set PORTB as OUTPUT // reset on PORT's
PORTC = 0;
PORTD = 0;
PORTE = 0; // set PORTB as OUTPUT
Tensiunea de iesire generata pe port-urile anterior setate ca port-uri cu pini de intrare/iesire este 0 la alimentarea microcontrollerului. In proiectul de fata s-a utilizat sistemul de intreruperi pe TIMER1 al microcontrollerului pentru preluarea semnalelor digitale de la panel-ul de meniu. Intruperea pe acest timer s-a realizat in modul urmator :
INTCON.GIE = 1; //enable all un-masked interrupts
INTCON.PEIE = 1; //Set PEIE
T1CON = 0; //enable Timer1
PIR1.TMR1IF = 0; // clear TMR1IF
TMR1H = 0b11111111; // setat la 500*0.5u = 250us
TMR1L = 0b10110000;
PIE1.TMR1IE = 1; // enable Timer1 interrupt
Registri care intra in alcatuirea mecanismului de intrerupere (intrerupere periferica) pentru TIMER1 sunt:
FIG.25
Registrul T1CON :
FIG.26
Registru PIR1 :
FIG.27
Registrul PIE1 :
FIG.28
Interpretarea semnalelor provenite de la microswitch-urile meniului se realizeaza in functia de intrerupere astfel :
//////////////////inrerupere generata pe TIMER1////////////////////////////////
void interrupt ()
{
cntr = cntr + 1;
if(cntr >= 3000)
cntr = 0;
if (!PORTB.f3 && !PORTB.f4 && !check ) // meniu idle
{
meniu_1 = 1;
meniu_2 = 0;
}
if (PORTB.f3 && check == 0) // meniu 0-1
{
cntr = 0;
check = 1;
meniu_1 = 0;
meniu_2 = 1;
}
if (PORTB.f4 && check == 1 && cntr>= 1400) // meniu 1-0
{
cntr = 0;
check = 0;
meniu_1 = 1;
meniu_2 = 0;
}
if (PORTB.f3 && check == 1 && cntr>= 1400) // meniu 1-2
{
cntr = 0;
check = 3;
meniu_1 = 1;
meniu_2 = 1;
}
if (PORTB.f4 && check == 3 && cntr>= 1400) // meniu 2-1
{
cntr = 0;
check = 1;
meniu_1 = 0;
meniu_2 = 1;
}
//////////////////////////meniu 3
if (PORTB.f3 && check == 3 && cntr>= 1400) // meniu 2-3
{
cntr = 0;
check = 4;
meniu_1 = 2;
meniu_2 = 2;
}
if (PORTB.f4 && check == 4 && cntr>= 1400) // meniu 3-2
{
cntr = 0;
check = 3;
meniu_1 = 1;
meniu_2 = 1;
}
//////////////////////////meniu 3-4
if (PORTB.f3 && check == 4 && cntr>= 1400) // meniu 3-4
{
cntr = 0;
check = 7;
meniu_1 = 3;
meniu_2 = 3;
}
if (PORTB.f4 && check == 7 && cntr>= 1400) // meniu 4-3
{
cntr = 0;
check = 4;
meniu_1 = 2;
meniu_2 = 2;
}
//
//
/////////////////////////////////////////////////////// reset if, set value
PIR1.TMR1IF = 0;
TMR1H = 0b11111110; // setat la 500*0.5u = 250us
TMR1L = 0b00001011;
}
///////////////////////////////////////////////////////
Atat timp cat nu se actioneaza nici un microswitch programul ramane in bucla din programul principal unde se face conditionarea :
if(meniu_1 == 1 && !meniu_2) // meniu 1
{
//
lumina();
f1(); // fara afisare pe LCD
In urma conditionarii if(meniu_1 == 1 && !meniu_2) , pe LCD-ul alphanumeric se va afisa doar functia functia f1() responsabila cu citirea tensiunii de alimentare. Functia lumina() este functia prin care se realizeaza citirea luminii ambiante fara a se afisa in schimb nimic referitor la aceasta pe LCD-ul alfanumeric. In momentul in care se actioneaza microswitch-ul conectat pe intrarea digitala PORTB, bitul 3 :
if (PORTB.f3 && check == 0) // meniu 0-1
{
cntr = 0;
check = 1;
meniu_1 = 0;
meniu_2 = 1;
}
Pe LCD , comform interpretarii din programul principal :
if( !meniu_1 && meniu_2 == 1) // meniu 2
{
temperatura_in();
lumina();
}
Se va afisa temperatura interioara prin apelul functiei temperatura_in(). Pe langa afisarea datelor corespunzatoare temperaturii interioare se va apela si functia lumina() care va citi intensitatea luminii ambiante fara a afisa-o pe LCD dar va aprinde LED-ul alb in cazul incare intensitatea luminoasa scade sub un anumit prag. Trecerea la afisarea celei de-a treia date de interes se realizeaza :
if (PORTB.f3 && check == 1 && cntr>= 1400) // meniu 1-2
{
cntr = 0;
check = 3;
meniu_1 = 1;
meniu_2 = 1;
}
Iar in programul principal se executa secventa :
if( meniu_1 == 1 && meniu_2 == 1) //meniu 3
{
lumina_f();
}
In care se afiseaza prin intermediul unui bargrapf si in procente intensitatea luminoasa .
Pentru functia de citire a tensiunii de alimentare a modulului electronic prin intermediul divizorului rezisitv , procesul de achizitie se realizeaza prin canalul analogic AN0 astfel :
val_digitala = Adc_Read(0);
mv= 4*val_digitala + 8*val_digitala/10+ 8*val_digitala/100;
mv_f=3*mv + 1*mv/10 + 9* mv/100;
In prima faza se apeleaza functia de citire ADC_Read de pe canalul 0 al convertorului ADC iar mai apoi, aceasta valoare citita , care, in acest moment este in format digital reprezentat pe 10 biti, este transformata in valoarea reala a tensiunii de intrare de pe pinul convertorului ADC AN0 prin calculul :
mv= 4*val_digitala + 8*val_digitala/10+ 8*val_digitala/100;
unde , stiut fiind faptul ca rezolutia este Valoarea fizica / Valoarea hex(cod), se poate afla valoarea fizica reala prin inmultirea rezolutiei cu Valoarea hec(cod). Astfel , in urma acestui calcul , daca spre exemplu, valoarea semnalului analogic in format digital va fi de 512 , atunci valoarea reala a tensiunii de pe pinul analogic de intrare AN0 al convertorului ADC va fi de 512 * 4.88 mv = 2.498 ~ 2.5v. Ultima parte a calculului :
mv_f=3*mv + 1*mv/10 + 9* mv/100;
tine cont de factorul de divizare care este de 0.319 si se calculeaza astfel valoarea tensiunii de alimentare a modulului electronic, deci tensiunea de incarcare a acumulatorului. Dupa ce aceasta valoare a fost determinata prin calculele de mai sus, se face o analiza comparativa cu valorile tensiunii la care incarcarcarea acumulatorului este optima sau nu. In urmatoarea secventa de cod se determina cifra zecilor, unitatilor si prima zecimaa din valoarea tensiunii de alimentare in scopul utilizarii acestora in afisarea pe LCD-ul alphanumeric.
if (mv_f >= 10000)
{
zeci=mv_f/10000;
while(mv_f>=10000)
{
mv_f=mv_f-10000;
}
}
else
zeci=0;
if (mv_f >= 1000)
{
unitati=mv_f/1000;
while(mv_f>=1000)
{
mv_f=mv_f-1000;
}
}
else
unitati=0;
if (mv_f >= 100)
{
zcm=mv_f/100;
while(mv_f>=100)
{
mv_f=mv_f-100;
}
}
else
zcm=0;
Afisarea pe LCD se realizeaza prin secventa de cod :
if (zeci==0)
Lcd8_Chr(1, 12, ' '); // caracterul liber
else
Lcd8_Chr(1, 12, 0b00110000+zeci); // caracterul 0 din CGROM+val.din coonversie
Delay_ms(1);
Lcd8_Chr(1, 13, 0b00110000+unitati);
Delay_ms(1);
Lcd8_Chr(1, 14,'.');
Delay_ms(1);
Lcd8_Chr(1, 15, 0b00110000+zcm);
Delay_ms(100);
Lcd8_Chr(1, 16, 'V');
Delay_ms(1);
unde byte-ul reprezentat in format digital : 0b00110000 reprezinta caracterul 0 codat din memoria CGROM a LCD-ului alphanumeric .
La aceasta valoare se adauga cifra zecilo, unitatilor si zecimaleleor si fiecare este afisata la cate o locatie de pe LCD ( cifra zecilor la linia 1/coloana 12, cifre unitatilor la linia 1/coloana 13 iar cifra zrcimalelor la linia 1, coloana 16 ). Dupa ce acest proces de afisare a fost realizat, urmeaza cel de afisare al erorilor in cazul in care tensiunea de incarcare are valori diferite de cele normale. Procesul ce consta in analiza comparativa cu tensiuni de referinta ale incarcarii acumulatorului se realizeaza prin urmatoarea secventa de cod :
if ((zeci==1) && (unitati == 4) && (zcm > 4))
{
CustomChar(character17,0,1,8); //hi
CustomChar(character18,1,1,9);
for(i=10; i<=11; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati == 4) && (zcm <= 4))
{
CustomChar(character6,0,1,8);
CustomChar(character7,1,1,9); //ok
for(i=10; i<=11; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati == 3) && (zcm > 8))
{
CustomChar(character6,0,1,8); //ok
CustomChar(character7,1,1,9);
for(i=10; i<=11; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati == 3) && (zcm <= 8))
{
CustomChar(character15,0,1,8); //att
CustomChar(character16,1,1,9);
CustomChar(character16,1,1,10);
for(i=11; i<=11; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati == 2))
{
CustomChar(character15,0,1,8); //att
CustomChar(character16,1,1,9);
CustomChar(character16,1,1,10);
for(i=11; i<=11; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati <= 1) )
{ // lo
CustomChar(character14,0,1,8);
CustomChar(character6, 1,1,9);
for(i=10; i<=11; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if (zeci == 0)
{ //err
CustomChar(character8,0,1,8);
CustomChar(character9,1,1,9);
CustomChar(character9,1,1,10);
for(i=11; i<=11; i++)
{
Lcd8_Chr(1, i,' ');
}
}
Daca valoarea tensiunii de incarcare se afla intre anumite limite, atunci se va afisa un mesaj corespunzator (ERR, ATT, OK, LO, HI) pe LCD pornind de la linia 1, coloana 8.
In ceea ce priveste parte de achizitie a semnalului analogic corespunzator valorii temperaturii interioare, procesul software a fost realizat in aceeasi masura, cu deosebirea ca , citirea valorii tensiunii de pe intrarea convertorului ADC s-a realizat prin canalul analogic AN1, astfel :
temp = Adc_Read(1);
temp= 4*temp + 8*temp/10+ 8*temp/100;
In variabila temporara temp se salveaza valoarea reala a tensiunii generate de elementul termosensibil la intrarea AN1 , valoare ce va fi ulterior procesata (aflarea sutelor, zecilor, unitatilor si zecimalelor) pentru afisarea pe LCD astfel :
if (temp>=1000)
{
st=temp/1000;
while (temp>=1000)
{
temp-=1000;
}
}
else
{
st=0;
}
if (temp>=100)
{
zc=temp/100;
while (temp>=100)
{
temp-=100;
}
}
else
zc=0;
if (temp>=10)
{
ut=temp/10;
while (temp>=10)
{
temp-=10;
}
}
else
ut=0;
zml=temp;
Procesul de achizitie a semnalului analogic corespunzator valorii intensitatii luminoase se realizeaza in mod asemnator, cu prezizarea ca citirea se realizeaza de pe canalul 2 al convertorului ADC :
lum = Adc_Read(2);
transfr =lum/10;
Afisarea pe LCD se face in mod asemantor functiilor anterior descrise , iar atunci cand intensitarea luminoasa scade sub o anumita valoare, se comanda aprinderea automata a faurilor :
if (sute_l==0 && check_temp == 0)
{
Lcd8_Chr(2,5,' ');
Lcd8_Chr(2,6,' ');
Lcd8_Chr(2,7,' ');
Lcd8_Chr(2,8,' ');
Lcd8_Chr(2, 4, '%');
Lcd8_Chr(2, 1, ' '); // caracterul liber
Delay_ms(1);
Lcd8_Chr(2, 2, 0b00110000+zeci_l);
Delay_ms(1);
Lcd8_Chr(2, 3, 0b00110000+unitati_l);
Delay_ms(1);
}
else {
if (check_temp == 0)
{
Lcd8_Chr(2, 1, '1');
Lcd8_Chr(2, 2, '0');
Lcd8_Chr(2, 3, '0');
}
}
if(zeci_l<=3)
PORTD.f0 = 1; // LED avertizare
else
PORTD.f0 = 0; // LED avertizare
}
Modulul de TIMER1 este un timer/numerator format din 2 registri de 8 biti TMR1H si TMR1L ce pot fi scrisi si cititi. Pentru a se putea utiliza acest timer, se foloseste in proces si registrul INTCON cu setari pe bitii INTCON.GIE si INTCON.PEIE. Bitul PIE1.TMR1IE este setat pentru inceperea intreruperilor iar PIR1.TMR1IF este resetat ,valoarea de start a counter-ului modului TRIMER1 fiind stabilita prin valorile celor 2 registri:
TMR1H = 0b11111111;
TMR1L = 0b10110000;
Aceast lucru insemnand inceperea numararii de la valoarea counter-ului 65456 pana la 65535 , deci generarea unei intreruperi la fiecare 79 x 0.2us=15.8 us. Astfel segmentarea / esantionarea timpului de lucru se va realiza cu un pas/rezolutie de 15.8 us.
10. CALCULUL FIABILITATII
Fiabilitatea este o disciplina din domeniul ingineriei care utilizeaza cunostinte stiintifice pentru asigurarea unor performante ridicate ale functiilor unui echipament, într-un anumit interval de timp si conditii de exploatare bine precizate. Aceasta include proiectarea, abilitatea de a întretine, de a testa si a mentine echipamentul la parametri acceptabili pe toata durata ciclului de viata. Fiabilitatea unui echipament este descrisa cel mai bine de pastrarea performantelor acestuia în timp. Performantele de fiabilitate ale unui echipament sunt concretizate în faza de proiectare prin alegerea judicioasa a arhitecturii echipamentului, a materialelor, a procesului de fabricatie, a componentelor – atât soft cât si hard – urmate de verificarea rezultatelor obtinute în urma simularilor si a testelor de laborator.
Fiabilitatea este un atribut al echipamentelor care nu trebuie ignorat. Caracteristicile de fiabilitate reprezinta ”ingredientele” critice pentru orice activitate de proiectare a echipamentelor industriale. Este de preferat sa se tina cont de aspectele legate de fiabilitate înca din faza de proiectare decât sa nu se faca acest lucru în speranta ca lucrurile vor merge bine.
Aparitia unei teorii a fiabilitatii a fost determinata de cresterea complexitatii echipamentelor si de caracterul de masa al productiei moderne. Domeniul care a impulsionat dezvoltarea acestei discipline a fost, ca si în alte cazuri, cel militar întrucât în timpul celui de-al doilea razboi mondial s-a constatat ca echipamentele electronice complexe (echipamente de radiocomunicatii, sonare etc.) se aflau în stare de defectare un timp sensibil mai mare decât timpul de functionare normala. Pe baza solutiilor oferite de catre aceasta noua disciplina – fiabilitatea – au fost posibile progrese mari si în alte domenii de activitate, precum centralele nucleare, transporturile (navale, terestre, aeriene si în ultimul timp spatiale), prelucrarea si transmisia datelor, productia bunurilor de larg consum etc.
Dupa trecerea de la productia manufacturiera la productia de masa s-a constatat o marire a dispersiei parametrilor echipamentelor datorata atât cresterii complexitatii cât si micsorarii posibilitatilor de control interfazic pe liniile de productie. În cazul productiei de masa, datorita modificarilor rapide ale cerintelor tehnice, se constata ca nu este necesar întotdeauna sa se obtina un nivel maxim posibil de fiabilitate, ci este esential sa se cunoasca cu precizie care este nivelul real de fiabilitate, luându-se masuri pentru deplasarea acestuia catre o valoare optima. În decursul timpului s-a constat ca, în cazul sistemelor si echipamentelor complexe, oricât s-ar investi pentru a obtine o fiabilitate ideala, nu se poate obtine un echipament care sa nu se degradeze în timp. Din aceasta cauza este util sa se cunoasca nivelul real al fiabilitatii, astfel încât, în functie de acesta, sa se stabileasca durata misiunii, intervalele de revizie, structura echipamentului etc.
Fiabilitatea este unul dintre parametrii determinanti pentru competitivitatea unui produs, întrucât gradul de vandabilitate creste semnificativ pentru produsele fiabile. Este de subliniat faptul ca în programul de actiuni lansate de Guvernul României la sfârsitul lunii august 2001 pentru cresterea exporturilor (si reducerea deficitului comercial al tarii), una dintre masurile propuse se refera la cresterea fiabilitatii produselor
Din punct de vedere economic, cu cât un echipament prezinta o fiabilitate mai
ridicata, în conditii tehnologice date, costul de investitie Cî este mai ridicat; costurile de mentenanta CM sunt însa mici întrucât defectiunile sunt rare si de intensitate redusa. Invers, un echipament ieftin si putin fiabil implica niste costuri de mentenanta mai mari.
FIG.29
Un sistem est de tip paralel daca functionarea unui singur component este suficienta pentru functionarea sistemului. În acest caz, sistemul va fi în pana (defect) daca toate elementele sunt defecte. Cum S este evenimentul sistemul functioneaza, vom spune ca S este evenimentul sistemul nu functioneaza. Vom avea:
FIG.30
In cazul de fata modulul electronic face parte din clasa sistemelelor serie-paralel (mixte), deoarece , la o defectare a unei componente, exista probabilitatea ca sistemul sa nu mai functioneze(de exemplu, la defectarea microcontrollerului sau a stabilizatorului de tensiune 7805 sau a quartz-ului). In acelasi timp , in ceea ce proveste partea de senzoristica, defectarea unui senzor nu i-ar pune probleme sistemului deoarece acesta va functiona normal cu semnalele provenite de la ceilalti senzori, lucru ce face ca sistemul sa fie de tipul mixt.
Fiabilitatea sistemului electronic depinde in foarte mare masura de calitatea si specificatiile componentelor alese in procesul de dezvoltare hardware-software. Calitatea componentelor difera de la producator la producator si este de cele mai multe ori proportionala cu pretul acestora.
11. CODUL SURSA C
int set_t=0, set_t1 =0, autonom =0, tempr =0, temprr =0;
int mii_turo = 0, unit_turo=0, sute_turo = 0, zeci_turo=0, unitati=0, zeci =0, zcm=0,val_digitala=0,mv=0, mv_f=0,temp=0;
int zml=0,zc=0,st=0,ut=0,portb_on=0,cntrp=0, k=0, ks = 10;
int test0=0,test1=0,test2=0, cntr0 =0, setat_s=0, setat_f=0;
int transf=0,sute_l=0, zeci_l=0, unitati_l=0, lum=0, valc =0, chech_serv=0;
int i=0, j=0,termen=0, contr=0, meniu_1=0, meniu_2=0, check =0, cntr = 0 , cntr_rb0 = 0,cntr_rb0cpy =0;
char text[20], contor_serv = 0, setare = 0, cntr1 = 0;
//////////////////////////////////////////////////mesaje
const char *mesg1="AUTOMOTIVE";
const char *mesg2="PROJECT";
const char *mesg3="Loading signals";
const char *mesg4=" scanning done ";
const char *mesg5="-ALL SYSTEMS OK-";
const char *mesg6="interior";
const char *mesg10="-LOW VISIBILITY-";
const char *mesg11="ROT/MIN";
const char *mesg12="LITRI";
const char *mesg13="AUTONOM";
const char *mesg14=" !!!LOW FUEL!!! ";
//////////////////////////////////////////////////mesaje tensiune
const char *mesg01="supra";
const char *mesg02="optimum";
const char *mesg03="OK";
const char *mesg04="caution";
const char *mesg05="low";
const char *mesg06="under";
const char *mesg07="defect";
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
const char character0[] = {31,31,31,31,31,31,31,31};
const char character1[] = {28,20,28,0,7,4,4,7};
const char character2[] = {4,4,4,4,4,4,4,4}; //V
const char character3[] = {7,3,5,12,2,4,8,16};// 4
const char character4[] = {8,4,2,4,8,5,3,7};// jos
const char character5[] = {14,14,31,31,31,31,31,31}; //bat plina 14.4 v
const char character6[] = {14,10,27,31,31,31,31,31}; //bat 14v
const char character7[] = {14,10,17,17,31,31,31,31}; //bat 13v
const char character8[] = {14,10,17,17,17,17,31,31}; //bat 12v
const char character9[] = {14,10,17,17,17,17,17,31}; //bat <12v
const char character10[] = {0,0,0,0,12,6,2,1}; // sageata ok stanga
const char character11[] = {3,3,3,3,6,12,8,16}; // sageata ok dreapta
const char character12[] = {31,17,17,17,17,17,17,31}; // loading ch empty
const char character13[] = {24,24,24,24,24,0,24,24}; // exclamare
////////////////////////////////////////////////////////////// functii
void benzina ();
void lumina_f();
void temperatura_ulei();
void temperatura_apa();
void temperatura_out();
void regl_turatie();
void f1();
void loading();
void temperatura_in();
void lumina();
void umidity();
void sparcare_fata();
void sparcare_spate();
void servo_ask();
void strConstCpy(char *dest, const char *source);
//////////////////////////////////////////////////////////////copiere rom-ram pentru eliminare eroare
void strConstCpy(char *dest, const char *source) {
while(*source)
*dest++ = *source++ ;
*dest = 0 ;
}
////////////////////////////////////////////////////////////////////////////////// creare caracter custom
void CustomChar(const char *def, unsigned char n, char pos_row, char pos_char)
{
char i ;
LCD8_Cmd(64 + n * 8) ;
for(i = 0 ; i<=7 ; i++)
{
LCD8_Chr_Cp(def[i]) ;
}
LCD8_Cmd(LCD_RETURN_HOME) ;
LCD8_Chr(pos_row, pos_char, n) ;
}
//////////////////////////////////////////////////////////////////////////////////
void main()
{
ANSEL = 0b00000111; // setare intrari analogice
ANSELH =0b00000000;
TRISA = 0b00000111; // set as inputs
TRISB = 0b00011000; // set PORTB as OUTPUT
TRISC = 0b00000000;
TRISD = 0b00000000; // trisd.f1 = contact portbagaj (IN); trisd.f0 = sound;
TRISE = 0b00000000; // RE0 = analog input
PORTA = 0;
PORTB = 0; // set PORTB as OUTPUT
PORTC = 0;
PORTD = 0;
PORTE = 0; // set PORTB as OUTPUT
////////////////////////-INTRERUPERE PE TIMER1-////////////////
INTCON.GIE = 1; //enable all un-masked interrupts
INTCON.PEIE = 1; //Set PEIE
T1CON = 1; //enable Timer1
PIR1.TMR1IF = 0; // clear TMR1IF
TMR1H = 0b11111110; // setat la 500*0.5u = 250us
TMR1L = 0b00001011;
PIE1.TMR1IE = 0; // enable Timer1 interrupt
/////////////////////////////////////////////////////
Lcd8_Config(&PORTD,&PORTC,7,5,6,0,1,2,3,4,5,6,7);
Lcd8_Cmd(Lcd_CLEAR) ;
PIE1.TMR1IE = 1;
strConstCpy(text,mesg1);
Lcd8_Out(1,3,text); //automotive
strConstCpy(text,mesg2);
Lcd8_Out(2,5,text); // project
Delay_ms(4000);
Lcd8_Cmd(Lcd_CLEAR) ;
Delay_ms(600);
////////////////////////////////////////////////////////////////////////////////// end designed
loading();
////////////////////////////////////////////////////////////////////////////////// complete , all systems ok
//strConstCpy(text,mesg4);
//Lcd8_Out(1,1,text);
//Delay_ms(3000);
//Lcd8_Cmd(Lcd_CLEAR) ;
//strConstCpy(text,mesg5);
//Lcd8_Out(1,1,text);
//Delay_ms(1000);
//Lcd8_Cmd(Lcd_CLEAR) ;
//////////////////////////////////////////////////////////////////////////////////
for (;;)
{
if(meniu_1 == 1 && !meniu_2) // meniu 1
{
//
lumina();
f1(); // fara afisare pe LCD
}
if( !meniu_1 && meniu_2 == 1) // meniu 2
{
temperatura_in();
lumina();
}
//
if( meniu_1 == 1 && meniu_2 == 1) //meniu 3
{
lumina_f();
}
if( meniu_1 == 2 && meniu_2 == 2) //meniu 4
{
// benzina ();
// lumina();
}
}
}
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////tensiune
void f1()
{
Lcd8_Chr(1,2, ' ');
Lcd8_Chr(1,15, ' ');
Lcd8_Chr(1,14,' ');
val_digitala = Adc_Read(0);
mv_f=14*val_digitala + 8* val_digitala/10 + 4*val_digitala/130;
if (mv_f >= 10000)
{
zeci=mv_f/10000;
while(mv_f>=10000)
{
mv_f=mv_f-10000;
}
}
else
zeci=0;
if (mv_f >= 1000)
{
unitati=mv_f/1000;
while(mv_f>=1000)
{
mv_f=mv_f-1000;
}
}
else
unitati=0;
if (mv_f >= 100)
{
zcm=mv_f/100;
while(mv_f>=100)
{
mv_f=mv_f-100;
}
}
else
zcm=0;
if (zeci==0)
Lcd8_Chr(1, 10, ' '); // caracterul liber
else
Lcd8_Chr(1, 10, 0b00110000+zeci); // caracterul 0 din CGROM+val.din coonversie
Delay_ms(1);
Lcd8_Chr(1, 11, 0b00110000+unitati);
Delay_ms(1);
Lcd8_Chr(1, 12,'.');
Delay_ms(1);
Lcd8_Chr(1, 13, 0b00110000+zcm);
Delay_ms(100);
Lcd8_Chr(1, 16, 'V');
Delay_ms(1);
if ((zeci==1) && (unitati == 4) && (zcm > 4))
{
CustomChar(character5,0,1,1);
strConstCpy(text,mesg01);
Lcd8_Out(1,3,text);
for(i=8; i<=9; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati == 4) && (zcm <= 4))
{
CustomChar(character5,0,1,1); // CGRM 0
strConstCpy(text,mesg02);
Lcd8_Out(1,3,text);
for(i=8; i<=9; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati == 3) && (zcm >= 7))
{
CustomChar(character5,0,1,1);
strConstCpy(text,mesg03);
Lcd8_Out(1,3,text);
for(i=5; i<=9; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati == 2) && (zcm >= 5))
{
CustomChar(character6,0,1,1);
strConstCpy(text,mesg04);
Lcd8_Out(1,3,text);
}
if ((zeci==1) && (unitati == 2) && (zcm < 5))
{
CustomChar(character7,0,1,1);
strConstCpy(text,mesg05);
Lcd8_Out(1,3,text);
for(i=6; i<=9; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if ((zeci==1) && (unitati == 0))
{
CustomChar(character8,0,1,1);
strConstCpy(text,mesg06);
Lcd8_Out(1,3,text);
for(i=8; i<=9; i++)
{
Lcd8_Chr(1, i,' ');
}
}
if (zeci == 0)
{
CustomChar(character9,0,1,1);
strConstCpy(text,mesg07);
Lcd8_Out(1,3,text);
for(i=9; i<=9; i++)
{
Lcd8_Chr(1, i,' ');
}
}
}
////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
void lumina()
{
lum = Adc_Read(2)/10;
if (lum <= 12)
PORTB.f0 = 1;
else
PORTB.f0 = 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////temperatura interior///////////////////////////////////
void temperatura_in()
{
Lcd8_Chr(1,14,' ');
Lcd8_Chr(1,15,' ');
CustomChar(character1,1,1,16); // caracter grade celsius CGRAM 1
strConstCpy(text,mesg6);
Lcd8_Out(1,1,text);
temp = Adc_Read(1)-102;
temp= 4*temp + 8*temp/10+ 8*temp/100;
if (temp>=1000)
{
st=temp/1000;
while (temp>=1000)
{
temp-=1000;
}
}
else
{
st=0;
}
if (temp>=100)
{
zc=temp/100;
while (temp>=100)
{
temp-=100;
}
}
else
zc=0;
if (temp>=10)
{
ut=temp/10;
while (temp>=10)
{
temp-=10;
}
}
else
ut=0;
zml=temp;
if (st==0)
Lcd8_Chr(1, 9, ' '); // caracterul liber
else
Lcd8_Chr(1, 9, 0b00110000+st); // caracterul 0 din CGROM+val.din coonversie
Delay_ms(1);
Lcd8_Chr(1, 10, 0b00110000+zc);
Delay_ms(1);
Lcd8_Chr(1,11, 0b00110000+ut);
Delay_ms(1);
Lcd8_Chr(1, 12,'.');
Delay_ms(1);
Lcd8_Chr(1, 13, 0b00110000+zml);
Delay_ms(100);
}
//////////////////////////////////////////////////////////////////////////////////////
void lumina_f()
{
Lcd8_Chr(1,5,' ');
Lcd8_Chr(1, 4, '%');
lum = Adc_Read(2);
transf =lum/10;
if (transf >=100)
sute_l=1;
else
sute_l=0;
if (transf>=10)
{
zeci_l=transf/10;
while (transf>=10)
{
transf-=10;
}
}
else
{
zeci_l=0;
}
unitati_l=transf;
if (sute_l==0)
{
Lcd8_Chr(1, 1, ' '); // caracterul liber
Delay_ms(1);
Lcd8_Chr(1, 2, 0b00110000+zeci_l);
Delay_ms(1);
Lcd8_Chr(1, 3, 0b00110000+unitati_l);
Delay_ms(1);
}
else {
Lcd8_Chr(1, 1, '1');
Lcd8_Chr(1, 2, '0');
Lcd8_Chr(1, 3, '0');
}
termen=zeci_l+6;
for (i=6;i<=termen;i++)
{
if ((!zeci_l) && (!unitati_l))
CustomChar(character12,2,1,i); // caracter 0 loading empty
else
CustomChar(character0,3,1,i);
}
for (i=termen+1;i<=16;i++)
{
CustomChar(character12,2,1,i);
}
if(zeci_l<=2)
{
strConstCpy(text,mesg10);
Lcd8_Out(2,1,text);
PORTB.f0 = 1; // LED avertizare
}
else
{
PORTB.f0 = 0; // LED avertizare
for (i=1; i<=16; i++)
Lcd8_Chr(2,i,' ');
}
}
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////loading
void loading()
{
strConstCpy(text,mesg3);
Lcd8_Out(1,1,text);
CustomChar(character0,0,2,1);
Delay_ms (80);
CustomChar(character0,0,2,2);
Delay_ms (80);
CustomChar(character0,0,2,3);
Delay_ms (380);
CustomChar(character0,0,2,4);
Delay_ms (500);
CustomChar(character0,0,2,5);
Delay_ms (260);
CustomChar(character0,0,2,6);
Delay_ms (150);
CustomChar(character0,0,2,7);
Delay_ms (200);
CustomChar(character0,0,2,8);
Delay_ms (160);
CustomChar(character0,0,2,9);
Delay_ms (115);
CustomChar(character0,0,2,10);
Delay_ms (280);
CustomChar(character0,0,2,11);
Delay_ms (500);
CustomChar(character0,0,2,12);
Delay_ms (500);
CustomChar(character0,0,2,13);
Delay_ms (200);
CustomChar(character0,0,2,14);
Delay_ms (80);
CustomChar(character0,0,2,15);
Delay_ms (80);
CustomChar(character0,0,2,16);
Delay_ms (530);
Lcd8_Cmd(Lcd_CLEAR) ;
}
//////////////////////////////////////////////////////////////////////////////// test finished
//
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////inrerupere generata pe TIMER1////////////////////////////////
void interrupt ()
{
cntr = cntr + 1;
if(cntr >= 3000)
cntr = 0;
if (!PORTB.f3 && !PORTB.f4 && !check ) // meniu idle
{
meniu_1 = 1;
meniu_2 = 0;
}
if (PORTB.f3 && check == 0) // meniu 0-1
{
cntr = 0;
check = 1;
meniu_1 = 0;
meniu_2 = 1;
}
if (PORTB.f4 && check == 1 && cntr>= 1400) // meniu 1-0
{
cntr = 0;
check = 0;
meniu_1 = 1;
meniu_2 = 0;
}
if (PORTB.f3 && check == 1 && cntr>= 1400) // meniu 1-2
{
cntr = 0;
check = 3;
meniu_1 = 1;
meniu_2 = 1;
}
if (PORTB.f4 && check == 3 && cntr>= 1400) // meniu 2-1
{
cntr = 0;
check = 1;
meniu_1 = 0;
meniu_2 = 1;
}
//////////////////////////meniu 3
if (PORTB.f3 && check == 3 && cntr>= 1400) // meniu 2-3
{
cntr = 0;
check = 4;
meniu_1 = 2;
meniu_2 = 2;
}
if (PORTB.f4 && check == 4 && cntr>= 1400) // meniu 3-2
{
cntr = 0;
check = 3;
meniu_1 = 1;
meniu_2 = 1;
}
//////////////////////////meniu 3-4
if (PORTB.f3 && check == 4 && cntr>= 1400) // meniu 3-4
{
cntr = 0;
check = 7;
meniu_1 = 3;
meniu_2 = 3;
}
if (PORTB.f4 && check == 7 && cntr>= 1400) // meniu 4-3
{
cntr = 0;
check = 4;
meniu_1 = 2;
meniu_2 = 2;
}
//
//
/////////////////////////////////////////////////////// reset if, set value
PIR1.TMR1IF = 0;
TMR1H = 0b11111110; // setat la 500*0.5u = 250us
TMR1L = 0b00001011;
}
///////////////////////////////////////////////////////
Bibliografie
[1] Shuzhi Sam Ge & Frank L. Lewis ,Autonomous Mobile Robots, 2006,ISBN 0-8493-3748-8
[2] Gordon Mccomb, The Robot Builder’s Bonaza, , 2006, ISBN 0-8306-2800-2
[3] Roland Siegwart & Illah R. Nourbakhsh, Introduction to Autonomous Robots,2004, ISBN 0-262-19502-2
[4] John Iovine, PIC Robotics ,2004,ISBN 0-071-37324-1
[5] Karl Williams, Amphibionics-Build Your Own Biologically Inspired Reptilian Robot,
2003,ISBN 0-07-142921-2
[6] Karl Williams, Insectronics—Build Your Own Walking Robot, , 2003, ISBN 0-07-141241-7
[7] CHARLES M. BERGREN,Anatomy of a robot,2003,ISBN 0-07-141657-9
[7] Pete Miles &Tom Carroll,Build your own combat robot,2002,ISBN 0-07-219464-2
[8] John Holland, Designing Autonomous Robots,2004, ISBN: 0-7506-7683-3
[9] Cynthia L. Breazeal, Designing Sociable Robots,2002, ISBN 0-262-02510-8
[10] Stan Gibilisco, Concise Encyclopedia of Robotics,2003, ISBN 0-07-141010-4
Adrese de internet utilizate:
[1]
http://www.cybercity-online.net/CCEN/Robotics.html
[2]
http://www.arrickrobotics.com/resources.html
[3]
http://users.frii.com/dlc/robotics/projects/botproj.htm
[4]
http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2002/yy66/yy66_nt49%20Final%20Proje
ct%20Page%20Files/MoviePicture_Frame.html
[5]
http://home.silverstar.com/~graben/Bots.htm#Stomper
[6]
http://www.bobandeileen.com/gallery2/main.php?g2_itemId=1570
Forumuri:
[7]
http://www.robotbuilder.co.uk/forum/http://www.robotbuilder.co.uk/forum/default.asphttp://www.robotbuilder.co.uk/forum/default.aspefault.asp
[8]
http://www.societyofrobots.com/robotforum/index.php?board=5.0
Bibliografie
[1] Shuzhi Sam Ge & Frank L. Lewis ,Autonomous Mobile Robots, 2006,ISBN 0-8493-3748-8
[2] Gordon Mccomb, The Robot Builder’s Bonaza, , 2006, ISBN 0-8306-2800-2
[3] Roland Siegwart & Illah R. Nourbakhsh, Introduction to Autonomous Robots,2004, ISBN 0-262-19502-2
[4] John Iovine, PIC Robotics ,2004,ISBN 0-071-37324-1
[5] Karl Williams, Amphibionics-Build Your Own Biologically Inspired Reptilian Robot,
2003,ISBN 0-07-142921-2
[6] Karl Williams, Insectronics—Build Your Own Walking Robot, , 2003, ISBN 0-07-141241-7
[7] CHARLES M. BERGREN,Anatomy of a robot,2003,ISBN 0-07-141657-9
[7] Pete Miles &Tom Carroll,Build your own combat robot,2002,ISBN 0-07-219464-2
[8] John Holland, Designing Autonomous Robots,2004, ISBN: 0-7506-7683-3
[9] Cynthia L. Breazeal, Designing Sociable Robots,2002, ISBN 0-262-02510-8
[10] Stan Gibilisco, Concise Encyclopedia of Robotics,2003, ISBN 0-07-141010-4
Adrese de internet utilizate:
[1]
http://www.cybercity-online.net/CCEN/Robotics.html
[2]
http://www.arrickrobotics.com/resources.html
[3]
http://users.frii.com/dlc/robotics/projects/botproj.htm
[4]
http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2002/yy66/yy66_nt49%20Final%20Proje
ct%20Page%20Files/MoviePicture_Frame.html
[5]
http://home.silverstar.com/~graben/Bots.htm#Stomper
[6]
http://www.bobandeileen.com/gallery2/main.php?g2_itemId=1570
Forumuri:
[7]
http://www.robotbuilder.co.uk/forum/http://www.robotbuilder.co.uk/forum/default.asphttp://www.robotbuilder.co.uk/forum/default.aspefault.asp
[8]
http://www.societyofrobots.com/robotforum/index.php?board=5.0
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Realizarea Unui Computer de Bord Auto cu Microcontrollerul Pic16f887 (ID: 163325)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
