PROIECTE 2011
Proiectele realizate in cadrul Laboratorului de SMP, 2011, le gasiti mai jos, Fiecare echipa are de completat in pagina WIKI corespunzatoare proiectului sau capitolele existente.
Punctaj Proiect
-
2p Pagina Wiki in format HTML cu capitolele create - poze(diferite stadii ale proiectului) + schema hardware + listing software (microcontroller + OpenWatcom la Z3)
-
5p Functionalitate proiect - punctaj in functie de cerintele cerute/realizate
-
1p Calitatea proiectului - cat de organizati ati fost in realizarea acestuia, cod format frumos, optimizari etc...
-
2p Nota individuala - participarea voastra in proiect, raspunsul vostru la intrebarile laborantului la presentarea proiectului
Cerinte general valabile:
- Toate proiectele se vor integra software si/sau hardware cu placa EV/Z3. Pentru integrarea hardware se va folosi portul serial al placii EV/Z3
- Logica software de baza se va regasi pe placa EV/Z3 si va fi realizata în C + inline assembly folosind template-ul OpenWatcom de la laborator
- Pagina de wiki trebuie sa contina o descriere a ce a realizat fiecare student in cadrul proiectului
- Daca nu puneti pe site alta schema de proiectare hardware se va folosi cea cu PIC16F628A pusa la dispozitie
- Wiki-ul trebuie updat ca sa vad stadii intermediare ale proiectului
Elemente de electronica
-
Pentru a vedea/comanda un pret estimativ a componentelor va propun www.conexelectronic.ro . Mi-a fost recomandat si mie de ceilalti laboranti.
-
Pentru conectarea la porturile de I/O trebuie sa izolati galvanic folosind optocuploare, ex LTV817 - puteti sa cautati pe site, si rezistente sa limiteze curentul maxim la 5mA U=R*I si trebuie avut in vedere ca rezistentele sa reziste la puterea la care e proiectat circuitul P=U*I...
-
Pentru alte elemente elecronice puteti folosi diode 1N4007, tranzistori BD139/140 de putere mare. Binenteles ca nu sunteti limitati la folosirea acestora, e doar o propunere.
-
Letconul ar trebui sa aiba cam 40W , nu mai mult de 60 oricum , iar fludorul la 1mm-1.5mm. Sa aveti si un voltmetru cu voi.
-
Va recomand inainte sa alegeti proiectul sa cititi cateva elemente de electronica de AICI.
2011_P9
(Restore this version)
Modified: 6 April 2010, 9:54 PM User: Soponariu Alexandru → SA
PROJECT NAME
Project Description
Proiectul consta in simularea calculatorului din sistemul de operare Windows Xp. Simularea acestui calculator se va putea realiza cu programul Open Watcom. Proiectul se va integra cu ajutorul placii EV/Z3.
Project Requirements
Proiectul consta in implementarea calculatorului din windows.Acesta presupune crearea unui program in Open Watcom pentru efectuarea operatiilor:
- adunarea a doua numere naturale
- scaderea a doua numere naturale
- inmultirea a doua numere naturale
- restul impartirii (mod) a doua numere naturale
- impartirea a doua numere naturale cu o precizie de o singura zecimala
User Flow
Modalitatea de rulare a acestui proiect :
- partea de cod se va scrie in Open Watcom Text Editor
- se ruleaza codul si se verifica eventualele erori
- se va rula MODZ3.exe prezent pe Desktop din masina virtuala
- se va incarca un fisier dummy de tip .asm (SMP.asm)
- pentru a putea fi incarcat programul pe placuta EV/Z3 se apasa butonul de load (tasta 6), se selecteaza Comm->Serial Transmission; se va selecta COM1 Baud Rate "9600" pentru a incarca mai repede pe seriala, Parity "None", Stop Bits "1" si se verifica ca File Name si Directory sa fie in regula, TX File Extension ".exe" si Jump first nn bytes: "32", dupa care se va apasa butonul 'OK'
Din acest moment se va astepta sa se incarce pe seriala. Dupa ce proiectul a fost incarcat utilizator este pregatit sa testeze acest proiect. Pasii pe care va trebui sa-i urmeze un utilizator sunt urmatorii :
- va introduce primul operand (numarul va fi format din caractere de la 0 pana la 9)
- va introduce operatia matematica dorita
- va introduce al doilea operand (numarul va fi format din caractere de la 0 pana la 9)
- va apasa de butonul de afisare
Pentru operatii matematice utilizatorul va trebui sa apese pe urmatoarele taste:
- pentru operatia de adunare, se va apasa tasta 'B' de pe placuta EV/Z3;
- pentru operatia de scadere, se va apasa tasta 'C' de pe placuta EV/Z3;
- pentru operatia de inmultire, se va apasa tasta 'D' de pe placuta EV/Z3;
- pentru operatia de impartire cu o prezie de o zecimala, se va apasa tasta 'E' de pe placuta EV/Z3;
- pentru operatia de afisare a restului impartirii (mod), se va apasa tasta 'F' de pe placuta EV/Z3;
- pentru butonul de afisare (egal), se va apasa tasta 'A' de pe placuta EV/Z3;
Tastatura si ecranul LCD prezente pe placuta:
Required components
Implementarea tastelor pentru proiect :
Din platform_io.h am folosit urmatoarele functii :
- functia int (*ReadKey) (void) pentru a putea citi caracterele
- functia void (*DisplayString) (const char *) pentru a putea afisa datele prelucrate
- void (*Wait) (const unsigned int) am pus aceasta conditie suplimentara pentru ca doresc sa astept un anumit interval de timp pentru a scrie operandul al doilea dupa ce am scris primul operand si operatia matematica
Software Design
Fiind un proiect software am editat codul sursa in Open Watcom Text Editor.
Pentru usurinta am facut pentru inceput niste define-uri :
#define SCADERE 'C'
#define IMPARTIRE 'E'
#define ADUNARE 'B'
#define INMULTIRE 'D'
#define REST 'F'
#define EGAL 'A'
#define DISPLAY_SIZE 20
Dupa care am conceput o functie in care atribui fiecarei tasta valoarea inscriptionata pe ea.
char convert (int key)
{
static char cod[19]={'0','2','4','6','8','A','C',
'E','~','<','1','3','5','7','9','B','D','F','>'};
return cod[key];
}
Dupa ce se incarca programul respectiv pe placuta si utilizatorul doreste sa scrie primul operand a trebuit sa sterg scrisul de pe ecran pentru ca el sa poata avea o vizibilitate mult mai buna. Pentru acest lucru am facut o functie. Am considerat ca lungimea ecranului este de 20 caractere.
void eraseScreen()
{
char eraser[DISPLAY_SIZE];
int i;
for (i = 0; i < DISPLAY_SIZE - 1; i ++)
eraser[i] = ' ';
eraser[DISPLAY_SIZE - 1] = 0;
kIo.DisplayString(eraser);
}
Primul pas este sa se scrie primul operand, datorita faptului ca operandul se scrie caracter cu caracter a trebuit la finalul scrierii primului operand sa salvez tot operandul intr-un integer. Operanzii vor lua valoari de la 0 pana la 9.
numar[0][i] = convert (key);
if ((numar[0][i] >= '0') && (numar[0][i] <= '9'))
{
a = a * 10 + numar[0][i] - '0';
kIo.DisplayString(numar[0]);
}
Dupa ce am scris primul operand si doresc sa scriu primul operator matematic, am facut treaba asta in jurul unui switch-case care evalueaza daca tastei apasate ii corespunde o operatie sau nu; in caz ca e adevarat se va efectua operatia respectiva. Iar dupa ce am scris operatorul matematic va trebui sa astept 2 secunde, se va sterge tot ecranul pentru a putea scrie cel de-al doilea operand.
switch (operator)
{
case SCADERE :
{
numar[0][i] = '-';
} break;
case IMPARTIRE :
{
numar[0][i] = '/';
} break;
case ADUNARE :
{
numar[0][i] = '+';
} break;
case INMULTIRE :
{
numar[0][i]= '*';
} break;
case REST :
{
numar[0][i]= '%';
} break;
}
kIo.DisplayString(numar[0]);
kIo.Wait(2000);
eraseScreen();
numar[0][i] = 0;
i = -1;
do
{
i ++;
key = kIo.ReadKey();
numar[1][i] = convert (key);
if ((numar[1][i] >= '0') && (numar[1][i] <= '9'))
{
b = b * 10 +numar[1][i] - '0';
kIo.DisplayString(numar[1]);
}
else
{
operator1 = numar[1][i];
break;
}
} while (1);
Am declar doi operatori de tip char. Operator va fi operatorul matematic, iar operator1 va reprezenta afisarea (egal). Programul este bazat in jurul unui switch-case care evalueaza daca tastei apasate ii corespunde o operatie sau nu; in caz ca e adevarat se va efectua operatia respectiva.
switch (operator)
{
case SCADERE :
{
c = a - b;
} break;
case IMPARTIRE :
{
c = a / b;
zecimala = ((a % b) * 10) / b;
} break;
case ADUNARE :
{
c = a + b;
} break;
case INMULTIRE :
{
c = a * b;
} break;
case REST :
{
c = a % b;
} break;
La partea de afisare am decratat un buffer in care pe pozitiile respective voi pune caracter cu caracter. In cazul in care un utilizator a efectuat operatia de scadere iar rezultatul este negativ am folosit urmatorul algoritm:
daca e negativ, restul impartirii nu va merge corect asa ca-l fac pozitiv si tin minte ca era negativ si daca e negativ pun '-' in fata, j-ul va ramane ca valoare pe prima pozitie care nu e umpluta daca e mai mica ca 0, inseamna ca minusul nu va mai incapea.
if (operator1 == EGAL)
{
int negativ = 0;
char buf[5];
int j;
int pos = 3;
buf[0] = buf[1] = buf[2] = buf[3] = ' ';
if (operator == IMPARTIRE)
{
buf[4] = '.';
buf[5] = zecimala + '0';
buf[6] = 0;
}
else
buf[4] = 0;
j = c;
if (j < 0)
{
j = -j;
negativ = 1;
}
while (j)
{
buf[pos] = j % 10 +'0';
pos--;
j = j / 10;
}
if (negativ && pos >= 0)
buf[pos] = '-';
kIo.DisplayString(buf);
}
} while(1);
key = kIo.ReadKey();
return 0;
}
Results
Am luat de exemplu o adunare intre doua numere naturale :
Pasul 1 : - scrierea primului operand si a operatorului matematic
Pasul 2 : - scrierea al doilea operand
Pasul 3 : - afisarea rezultatului obtinut dupa operatie
Download
Template-ul folosit pentru acest proiect in Open Watcom a fost incarcat pe site la sectiunea Proiecte 2011.
Status
27 Aprilie - Inceperea lucrului la proiect
3 Mai - Corectarea erorilor si testarea codului
10 Mai - Terminarea proiectului si gasirea unor solutii optimale
17 Mai - Testarea proiectului final