Evaluator de expresii aritmetice

Introducere

Scopul proiectului il reprezinta realizarea unui evaluator de expresii aritmetice, adica a unui dispozitiv care, primind ca input o expresie aritmetica sa fie capabil sa o evalueze si sa returneze rezultatul acesteia. Deasemenea, evaluatorul verifica daca expresia introdusa este corecta, in caz contrar generand un mesaj de eroare. Evaluarea expresiilor aritmetice ar putea fi necesara intr-un program interpretor BASIC, intr-un program de calcul tabelar sau in alte programe care admit ca intrari expresii (formule) si care trebuie sa furnizeze rezultatul acestor expresii.

Descriere generală

Schema bloc a proiectului este urmatoarea :

Asa cum se observa si din schema, proiectul se compune din trei parti : tastatura cu ajutorul careia se introduce expresia aritmetica de evaluat, microcontroller-ul Atmega16 care verifica corectitudinea expresiei si realizeaza evaluarea acesteia precum si display-ul pe care se afiseaza expresia introdusa si rezultatul acesteia.

1. Tastatura

Tastatura este asemanatoare cu cea a unui calculator de buzunar. Este compusa din 23 de taste dipuse astfel :

Dupa cum se observa si din tabel, tastatura contine :

  • 10 taste pentru cifre
  • 4 taste pentru cele patru operatii aritmetice de baza: adunare, inmultire, scadere, impartire
  • o tasta pentru stergerea completa a display-ului
  • o tasta pentru stergerea unui caracter
  • o tasta pentru adaugarea unui spatiu
  • 3 taste pentru lucrul cu memoria
  • tasta egal pentru afisare rezultat
  • doua taste pentru paranteze

Asadar, se pot introduce expresii aritmetice ce contin oricate paranteze, operanzii trebuie sa fie numere intregi, iar ca si operatori se pot folosi cei patru operatori de baza. Deasemenea, rezultatele pot fi stocate in memorie, iar la cerere, se poate afisa valoarea retinuta in memorie.

2. Dislay-ul

Display-ul folosit permite afisarea pe patru linii, fiecare din aceste linii permitand afisarea a 20 de caractere. De obicei, pe primele trei linii este afisata expresia aritmetica introdusa de la tastatura, iar pe cea de-a patra linie este afisat rezultatul acesteia sau un mesaj de eroare in caz ca expresia introdusa nu este corecta. Tot pe aceasta linie sunt afisate si alte mesaje : de exemplu, atunci cand o valoare este stocata in memorie sau cand se elibereaza memoria.

Hardware Design

Pe langa placuta din prima etapa a proiectului, mai trebuiesc adaugate urmatoarele componente:

  • display 4×20 LM044L
  • keypad
  • placa de test
  • doi conectori barete SIL de 40 pini

Schema electrica a proiectului realizata in Proteus 7 Professional este urmatoarea:

Asa cum se observa si din schema de mai sus:

1. interfatarea LCD-ului se efectueaza pin la pin cu microcontrollerul, in modul restrans, pe 4 biti de date. Este nevoie doar de 7 biti pentru controlul complet al LCD-ului. Toti cei 7 biti sunt mapati in registrul A al micontrollerului.

2. pentru interfatarea keypad-ului este necesara conectarea fiecarui pin de pe fiecare linie sau coloana la cate un pin al micontrollerului. In cazul de fata, keypad-ul este de tipul 4×6, astfel ca avem nevoie de 10 pini care nu vor incapea intr-un singur registru. Astfel, realizez conectarea pinilor corespunzatori liniilor in portul D (A:PD1, B:PD2, C:PD3, D:PD4) iar conectarea pinilor corespunzatori coloanelor in portul C (1:PC4, 2:PC0, 3:PC1, 4:PC2, 5:PC3, 6:PC5).

Rezultatele simularii

Simularea am realizat-o folosind programul Proteus. Am realizat mai multe simulari care pun in evidenta functionalitatea evaluatorului:

1. Mai inai am introdus o expresie aritmetica simpla pentru a vedea daca evaluatorul respecta ordinea efectuarii operatiilor

2. Apoi am complicat expresia aritmetica , introducand din ce in ce mai multi operanzi si mai multe paranteze:

3. Am introdus o expresie aritmetica gresita pentru a vedea daca evaluatorul sesizeaza greseala:

4. Urmatoarele doua imagini pun in evidenta memorarea unei valori, precum si afisarea valorii retinute in memorie:

Software Design

Modulul software de interfatare a LCD-ului se bazeaza pe API-ul din primul laborator:

void LCD_init();           //Initializare modul LCD.. trebuie apelata inainte de a se face orice operatie cu LCD-ul
void LCD_writeInstruction(unsigned char _instruction);   // Trimite o instructiune catre lcd 
void LCD_writeData(unsigned char _data);                 // Trimite date catre LCD pentru afisare
void LCD_write(unsigned char _byte);                     // trimite un byte catre LCD la modul general 
void LCD_waitNotBusy();	                          // Asteptam pana cand lcd-ul devine disponibil pt o noua comanda
void LCD_waitInstructions(unsigned char _instructions);	// Asteapta un numar de cicli de tact
void LCD_print(char* _msg);                    // Afiseaza imformatia pe LCD (doar 1 linie, primele 16 caractere)
void LCD_gotoXY(unsigned char x, unsigned char y);        // Trimite curosul LCD-ului la pozitia (x, y)

In ceea ce priveste keypad-ul, am folosit 2 functii :

void key_init()     // functie care initializeaza keypad-ul
unsigned char get_key() // functie care intoarce tasta care a fost apasata

Pentru a determina care tasta a fost apasata, microcontrollerul va scana continuu keypad-ul. Mai intai, toti pinii, sunt setati pe high. Cand se apasa o tasta, microcontrollerul va detecta o valoare low pe doi din pinii de intrare - ce corespund unei linii si unei coloane. In acest mod este determinata tasta apasata - tasta aflata la intersectia liniei si coloanei respective.

In ceea ce priveste implementarea propriu-zisa a evaluatorului :

Pentru evaluarea unei expresii aritmetice sunt necesare doua etape :

  • transformarea expresiei in forma postfixata folosind o stiva de operatori
  • evaluarea expresiei postfixate folosind o stiva de operanzi

Exemplu de expresii infixate si postfixate:

Expresii infixate Expresii postfixate
1+2 1 2 +
1+2+3 1 2 + 3 +
1+ 4/2 1 4 2 / +
(5-6/2)*(1+3) 5 6 2 / - 1 3 + *

Comparând cele douã forme ale unei expresii se observã cã ordinea operanzilor se pãstreazã în sirul postfixat, dar operatorii sunt rearanjati în functie de importanta lor si de parantezele existente. Deci operanzii trec direct din sirul infixat in sirul postfixat, iar operatorii trec in sirul postfixat numai din stiva. Stiva memoreaza temporar operatorii pana când se decide scoaterea lor în sirul postfixat

Stiva am implementat-o sub forma unei liste inlantuite. Am realizat o serie de functii care efectueaza operatiile de initializare stiva, adaugare/stergere element din stiva, afisare stiva, afisare element din varful stivei.

Pentru implementarea evaluatorului am folosit trei functii principale :

void transform (char * in, char * out); // functie care transforma un sir infixat intr-unul postfixat
int eval (char * in); // functie care evalueaza o expresie aflata in forma postfixata si returneaza valoarea ei.
int validate(char * expr); // functie care verifica daca o expresie este corecta

Functia principala a programului se numeste “run” . In aceasta functie se asteapta apasarea unei taste:

  • la apasarea tastei ON/C se curata intreg display-ul
  • la apasarea tastei ”=” se evalueaza expresia aritmetica si se afiseaza rezultatul
  • la apasarea tastei ”+/-” se sterge un caracter de pe display
  • la apasarea tastelor MRC, M+, M- se efectueaza operatii cu memoria
  • la apasarea celorlalte taste, caracterul corespunzator acestora este afisat pe display

Programul a fost scris in limbajul C folosind AvrStudio.

Pentru compilare am folosit WinAvr.

Rezultate Obţinute

Din pacate nu am reusit sa realizez si partea hardware a acestui proiect. Am avut o problema cu placuta de baza, lucru care m-a descurajat oarecum. Am decis sa realizez mai intai partea de soft, sa simulez programul in Proteus, iar apoi, daca totul mergea OK, sa realizez si partea hardware. Desi programul merge OK n-am mai reusit sa termin proiectul, in primul rand datorita lipsei timpului.

Download

evaluator_expresii_aritmetice.zip

Arhiva contine fisierul sursa “Evaluator.c”, schema pentru realizarea simularii in Proteus “Evaluator.DSN”, precum si un fisierul “Makefile” pentru compilarea programului. In urma copilarii rezulta fisierul “Evaluator.hex” care se incarca pe placuta folosind comanda “avrusbboot Evaluator.hex”.

Bibliografie/Resurse

pm/prj2011/ascurei/evaluator.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0