Proiect MAP

9
Proiect la disciplina Microcontrolere si automate programabile Tema de proiectare Proiectarea unui calculator binar 1

description

microcontrolere si automate programabile

Transcript of Proiect MAP

Proiect la disciplinaMicrocontrolere si automate programabile

Tema de proiectareProiectarea unui calculator binar

1. Descrierea problemeiPentru implementarea programului am folosit:- ca mediu de dezvoltare MPLAB v8.20a- ca limbaj am folosit Assembler- ca mediu fizic de implementare am folosit microcontrolerul PIC18F4520 impreuna cu 5 leduri pentru afisare numere + 1 led de stare + 2 butoane de selectie2. Schema electrica a sistemului fizicFig.13. Descrierea schemei electriceLedurile ce sunt folosite in afisarea numerelor sunt conectate pe porturile GPIO A1, A2, A3, A5 si E0, in aceasi ordine logica ca enumerarea anterioara.Ledul rosu pentru afisarea starii curente este conectat pe portul GPIO A0 al microcontrolerului.Butonul de incrementare a numerelor este conectat pe portul D.0, iar cel pentru selectare numar, afisare rezultate si iesire din erori este conectat pe portul E.2.4. Ce se vrea a fi programul?Acest program isi propune sa demonstreze o modalitate de a confectiona un calculator folosind un microcontroler si cu ajutorul a doar doua butoane si 6 leduri sa poate aduna doua numere si sa le poata afisa rezultatul, folosind doar 5 leduri, reprezentand numerele in format binar.Datorita faptului ca avem la dispozitie numai 5 leduri, rezultatul final precum si numere de adunat nu pot depasi numarul 31 corespunzator lui 2n-1, unde n este numarul de biti/leduri.5. Cum functioneaza aplicatia?

Descriere pe scurtLED rosu arata starea: luminare continua => stare initiala luminare intermitenta scurta => marime numar depasita luminare intermitenta medie => asteptare numar luminare intermitenta lunga => afisare rezultatLED-uri verzi ne arata numarul in binarButonul mic ne ajuta la incrementarea numerelorButonul mare ne ajuta la selectarea lor si iesirea din diferite stari

Intructiuni de utilizareOdata pornit sistemul vom observa ca s-a aprins un led rosu pe placutza, ce ne semnaleaza ca programul a inceput rularea si functioneaza.Pentru a putea incepe calcularea va fi nevoie sa apasam pe butonul mare din stanga-sus. Vom observa imediat ca ledul rosu a inceput sa se aprinda intermitent, ceea ce ne semnaleaza ca asteapta un numar.Primul numar va putea fi ales folosind butonul mic situat in dreapta-jos, cu acesta vom incrementa valoarea pana ajungem la numarul dorit. Pentru a alege numarul vom apasa odata pe butonul mare. Pentru confirmare, vom observa ca ledurile corespunzatoare numarului se vor stinge.Al doilea numar va putea fi ales la fel folosind butonul mic situat in dreapta-jos, cu acesta vom incrementa valoarea pana ajungem la numarul dorit. Pentru a alege numarul vom apasa odata pe butonul mare, odata cu aceasta apasare, se va afisa si rezultatul adunarii celor doua numere. Iar pentru a stii ca acesta este rezultatul, ledul rosu va incepe sa lumineze intermitent dar mai rar.Pentru un nou calcul vom apasa odata pe butonul mare, ledul rosu va ramane aprins pana la o noua apasare a butonului, dupa care ciclul se reia.In cazul in care numarul a depasit valoarea ce poate fi afisata, ledul rosu va incepe sa lumineze intermitent la intervale foarte scurte de timp. Pentru a putea iesi din aceasta stare va fi nevoie sa fie apasat butonul mare odata, dupa care ciclul se va relua de la cel in care ledul este aprins in continuu.

6. Descrierea implementarii pe baza codului

Fig.2In figura 2 vedem un exemplu de incrementare a unui numar si afisarea lui prin leduri. Fiecare linie de cod este explicata pentru a putea intelege ce face fiecare instructiune. Se observa ca in aceasta structura am folosit testN si astept_B2_ridicat. Functia testN este utilizata pentru a testa in ce stadiu a ajuns incrementarea si afiseaza numarul pe leduri. Functia astept_B2_ridicat asteapta ca utilizatorul sa ridice mana de pe butonul mare de selectare numar. Cele doua functii sunt prezentate in continuare in figurile 3 si 4.1/4.2, cu exceptia celei de testare ce este truchiata din cauza marimii.Fig.3

Fig.4.1

Fig.4. 2

In figura 5 este prezentat modul in care se face achizitia celor doua numere si se aduna, rezultatul fiind pus prin intermediul registrului de lucru intr-o variabila comuna pentru a putea fi afisat.Fig.5In aplicatia noastra am folosit 3 intarzieri soft, de 1 secunda, 0.5 secunde si 0.2 secunde. Cea de o secunda este corespunzatoare starii in care este afisat rezultatul, cea de 0.5 secunde este corespunzatoare starii de asteptare incrementare numar, iar cea de 0.2 secunde este corespunzatoare starii de eroare, in care numarul a depasit limita maxima. Intarzierea de 0.2 secunde a fost utilizata si pentru a evita regimul tranzitoriu al butonului.Ca exemplu am ales intarzierea de 1 secunda, in care folosim 3 cicluri de numarare, ce sunt notate in formula cu T1,T2,T3. Numerele intregi ce sunt inmultite/adunate reprezinta numarul de cicluri de ceas in functie de instructiuni si numarul acestora. Numarul 0.4 reprezinta timpul necesar efectuarii unei instructiuni.Toate acestea sunt calculate si sunt specifice frecventei microcontrolerului nostru. In figura urmatoare vedem un exemplu de astfel de intarziere, si anume cea de o secunda.Astfel in cazul intarzierii de 1 secunda avem T1=255, T2=200 si T3=15.Conform formulei =>Timp = (((3*15+4)*200+5)*255)*0.4) = 1000100 microsecundeTimpul in secunde = 1 secunda

Fig.61