2012_332AC_P2

Project Name [edit]

 Calculator de buzunar [edit]

Implementat pe EV Z3

I. Descrierea proiectului

 Aplicatia implementata reprezinta un calculator avand functionalitati de baza.

Calculatorul realizeaza operatii cu numere pozitive pe 16 biti in virgula fixa, cu o singura zecimala, denumite in continuare ShortFloat. 

Operatiile implementate sunt: adunare, scadere, inmultire, impartire, modul dupa impartire (mod).

 Aplicatia a fost dezvoltata pentru placa educationala Elettronica Veneta Z3

http://www.elettronicaveneta.com/education/

Intrarile aplicatiei se introduc de la tastatura placii de dezvoltare.

Iesirile aplicatiei sunt afisate pe display-ul 16x1 al placii de dezvoltare.

O poza face cat 1000 de cuvinte.

  

 

Functionalitatea tastaturii este prezentata in tabelul de mai jos

 C

 NULL

 .
 *  /  %  =
 8  9  +  -
 4  5  7
0 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

II. Cerintele proiectului

  1. Implementarea unei arhitecturi de tip automat cu numar finit al starilor, de tip Moore
  2. Reprezentarea numerelor ca obiecte ale structurii "shortfloat" : un intreg pentru partea stanga a virgulei, pe 16 biti, si un intreg in partea dreapta a virgulei, limitat totusi intre 0 si 9 . Numerele reprezentate sunt pozitive.
  3. Implementarea unor functii de prelucrare a datelor introduse, in scopul returnarii unor siruri de caractere afisabile pe LCD.
  4. Afisarea unor mesaje de eroare in cazul operatiilor nepermise : Impartire la 0, restul impartirii la 0
Propunerile profesorului:
  • folosesti template-ul C
  • operatii + - / * mod
  • emulezi calculatorul din windows - dai 2 numere intregi + operatia - sa continui cu rezultatul
  • emulezi operatii float cu o zecimala  - adunare scadere inmultire
  • inmultirea sa fie realizata cu inline assembly.

III. Mod de utilizare

Aplicatia afiseaza un mesaj de inceput, apoi asteapta apasarea unei taste pentru initializarea modului de calcul. 

La initializare este afisat pe LCD valoarea 0.

Utilizatorul poate introduce:

  1. o cifra, reprezentand LSD-ul numarului 1
  2. o virgula, considerandu-se astfel ca numarul 1 este subunitar
  3. o operatie, considerandu-se astfel ca numarul 1 este 0
Dupa introducerea unei virgule si a caracterului de dupa virgula, utilizatorul poate continua calculul alegand o operatie, apoi introducand numarul 2, dupa o schema similara cu cea de la numarul 1.
 
Pentru a afisa rezultatul unui calcul, utilizatorul poate apasa tasta '=' . Din acel punct, introducerea unei cifre reseteaza totalul cumulat, iar introducerea unei operatii salveaza rezultatul in variabilele numarului 1, si se asteapta introducerea numarului 2.
Aplicatia este conceputa sa ruleze la infinit. Pentru o eventuala oprire a executiei se poate apasa butonul RESET, sau se poate impinge sursa de alimentare de pe masa de lucru, conform metodelor invatate in laborator. 
In cazul executiei unei instructiuni nepermise ( impartire la 0, restul impartirii la 0) , pe display va fi afisat un mesaj corespunzator
("Divide by 0 err" ; "Result undefined"). Utilizatorul poate apasa orice tasta pentru a trimite automatul in starea initiala.
 
 
 

IV. Componente necesare

Hardware:

  • placa de dezvoltare EV Z3
  • conexiune seriala PC - placa
Software:
  • fisier binar + modZ3 pentru incarcarea programului pe placa
sau
  • compilator OpenWatcom + template laborator SMP Mihai Matei
  • Windows 3.1

V. Proiectare software

Aplicatia are la baza o arhitectura de tip automat Moore. Din fiecare stare se poate realiza o tranzitie catre alta stare atunci cand sunt indeplinite conditiile impuse. Fiecare stare are asociate iesiri, materializate prin imprimarea de siruri de caractere pe LCD-ul placii de dezvoltare.

Functii folosite din template-ul de laborator:

  1. kIo.ReadKey() - returneaza codul tastei apasat
  2. kIo.DisplayBuffer(char*) - imprima pe LCD un sir de caractere terminat cu 0_ascii.
Descriere functii implementate:
  • void make_string(char* returned_string, struct shf* sf,int dec_active); 
    Converteste un numar de tip ShortFloat ( int left; int right; ) intr-un sir de caractere si intoarce acest rezultat in returned_string. dec_active este doar un indicator de prezenta a virgulei.
  • char convert (int key) - intoarce codul ascii al tastei returnate de catre kIo.ReadKey()
make_string() utilizeaza alte doua functii implementate:
  • void arrayReverse ( char* arr) - inverseaza ordinea caracterelor din sirul specificat
  • int arraySize ( char* arr) - intoarce numarul de caractere din sirul specificat

Numerele folosite sunt obiecte de tip shortfloat, structura fiind prezentata mai jos

struct shf{
int left;
int right;
};

 

Trebuie observat faptul ca partea stanga a unui numar se reprezinta ca un intreg pe 16 biti, cu bit de semn, numerele calculate vor merge pana la 32767. Overflow-ul nu va fi tratat in cazul acestei aplicatii, programul permitand returnarea celei mai putin semnificative parti.

Operatiile implementate:

  • Adunare
  • Scadere
  • Inmultire
  • Impartire
  • Modul dupa impartire
Adunarea / Scaderea a doua numere de tip shortfloat este destul de simpla. Se aduna/scad elementele din partea stanga , respectiv din partea dreapta a virgulei, apoi rezultatul este ajustat in functie de necesitatea aparitiei unui imprumut in/din ordinul superior.
Impartirea si modulul dupa impartire se bazeaza pe normalizarea numerelor respective (inmultirea cu 10 pentru eliminarea virgulei), efectuarea calculelor si readucerea rezultatului la forma ne-normalizata.
Inmultirea este implementata in inline assembly. Avand in vedere faptul ca si registrele procesorului au o dimensiune de 16 biti, inmultirea a fost realizata mai simplu decat daca am fi avut variabile pe 64 de biti ( lansez aceasta provocare celor interesati). Principiul este asemanator cu cel de la impartire, anume normalizarea numerelor, efectuarea calculelor si denormalizarea rezultatului.

VI. Rezultate

  • La o sesiune de debug
  • Mod real -  %TBA 16 mai 2012

VII. Cod Sursa

After you have presented your project at the laboratory (week 13-14) you will add all your sources here. Any hardware simulation used, code archive and so on.

VIII. Stare proiect

12 aprilie 2012
  • Am citit documentatia placii de dezvoltare
  • Am studiat template-ul C folosit in laborator

 4-12 mai 2012

  • Dezvoltatea propiu-zisa a aplicatiei
  • 500 de linii de cod (~90% din numarul total de linii)
In cazul acest proiect software nu este prea relevanta o situatie actualizata a starii sale, din moment ce codul a fost scris intr-o seara si a fost testat / imbunatatit timp de  o saptamana.

Arhitectura de tip automat Moore, impartita in doua blocuri ce se ocupa de logica iesirilor respectiv logica starii urmatoare, mi-a permis sa adaptez destul de usor tipul operanzilor , de la integer (proiectarea initiala) la shortfloat.