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_P5
Table of contents
CITITOR COD DE BARE
Introducere
Proiectul isi propune sa interfateze un cititor de cod de bare cu placa EV/Z3 pentru a putea afisa pe display informatii despre codul citit.
Cititoarele de coduri de bare ofera interfete RS232 sau PS2 si uneori chiar USB. In general, cele din gama medie de preturi ofera toate cele trei interfete, realizand automat detectia tipului de interfata folosita.
Project Requirements
Veti conecta cititorul la interfata seriala a placii EV/Z3
La o citire placa va afisa pe LCD codul numeric citit.
In caz ca articolul se regaseste in baza de date interna se va afisa pretul dupa 1s "Pret="
In caz ca nu se regaseste se va afisa (dupa 1s) "Pret?" si utilizatorul va introduce pretul din tastatura (natural).
La o citire ulterioara a codulu se va afisa pretul introdus. Minim 5 preturi
Interfata cu utilizatorul
Programul ofera doua moduri de utilizare, modul normal si modul rafala.
Modul normal consta in citirea unui cod de bare si afisarea numelui produsului. Daca produsul nu se afla in baza de date, utilizatorul este rugat sa introduca pretul produsului. Dupa acest pas, produsul este introdus in baza de date.
Al doilea mod de functionare este modul rafala. In acest mod programul memoreaza pana la 16 coduri citite consecutiv, dupa care le afiseaza pe display-ul platformei EV/Z3.
Interfata este construita consecvent. Codurile si preturile se introducand folosind tastele numerice si se confirma cu tasta A.
Componente folosite
Deoarece cititorul de cod de bare se interfateaza direct la portul RS232 al platformei EV/Z3 nu am folosit hardware aditional.
In partea software, am folosit din platform_io.h functiile DisplayString, MemCpy, Wait, SerialInit si SerialRead.
Software Design
Aplicatia foloseste un design software clar si concis.
Designul este construit in jurul unei bucle, implementate in functia main. Structura acesteia urmareste indeaproape structura interfetei cu utilizatorul. Bucla incepe prin asteptarea unei taste care sa sugereze modul de folosire al aplicatiei. In functie de modul ales, bucla asteapta citirea interfetei seriale si prelucreaza codul primit.
Am implementat cateva functii auxiliare care convertesc numere intregi la sir de caractere deoarece nu avem acces la libraria standard C.
Rezultate [edit]
Screen de intampinare:
Scanare cod de bare: [edit]
Afisare rezultat [edit]
Cod [edit]
#include "platform_io.h"
#define NULL 0
//mesaje
const char* MSG_WELCOME="Bun venit!";
const char* MSG_ASTEAPTA_COD_SERIAL="Asteapta serial...";
const char* MSG_MENU= "A=MihM E=Scanner";
const char* MSG_MIHM="Modul MihM";
const char* MSG_AFISARE_CODURI="Afisare coduri";
const char* MSG_CLRSCR=" ";
const char* MSG_CITESTE_COD="Asteapta cod bare";
const char* MSG_COD_NOU="Tastati cod nou"
const char coduri[19]={'0','2','4','6','8','A','C','E','O','L','1','3','5','7','9','B','D','F','R'};
// O - RET/CHG
// L - <-
// R - ->
typedef struct {
char nume[16];
int pret;
int cod;
} produs_t;
//vector de produse si numarul de elemente din vector
produs_t produse[10];
unsigned short num_produse=0;
//pt seriala
static SerialConfig serialConf;
inline void clrscr(){
kIo.DisplayString(MSG_CLRSCR);
}
//determina dimensiunea unui string
inline unsigned int strlen(char* str){
unsigned int k=0;
if(str!=NULL)
while(str[k]!='\0'&&k<=20)
k++;
return k;
}
unsigned int int2str(int x,char* buf,unsigned int buf_len)
{
unsigned int i=0;
unsigned int k=0;
char aux;
//converteste numarul
while(x>0&&i<buf_len){
buf[i]=(x%10)+'0';
i++;
x/=10;
}
k=i;
//inverseaza ordinea
for(i=0;i<k/2;i++){
aux=buf[i];
buf[i]=buf[k-i-1];
buf[k-i-1]=aux;
}
buf[k]='\0';
//intoarce lungimea
return k;
}
//citeste o tasta de la tastatura
char getch_kbd()
{
return coduri[kIo.ReadKey()];
}
/*
Citeste un caracter de la seriala
*/
char getch_serial()
{
unsigned char buf[1];
kIo.SerialRead(COM1, &buf, 1);
return (char)buf[0];
}
//citeste un cod terminat cu CHG/RET
int getcode_kbd()
{
int code=0;
char key='0';
char buf[16];
while(key!='O') {
//citim tasta si o afisam pe ecran pt feedback
key=getch_kbd();
//actualizam codul
if(key>='0' && key<='9'){
code=code*10+key-'0';
//convertim numarul la buffer
int2str(code,&buf,16);
clrscr();
kIo.DisplayString(&buf);
}
}
return code;
}
//citeste un cod terminat cu enter de pe seriala
int getcode_serial(){
int code=0;
unsigned char serial_buf;
while(serial_buf!=0x0D&&serial_buf!=0x8D) {
//citim codul pe tastatura
kIo.SerialRead(COM1,&serial_buf,1);
kIo.SerialWrite(COM1,&serial_buf,1);
//actualizam codul
if(serial_buf>='0' && serial_buf<='9'){
code=code*10+serial_buf-'0';
}
//cod special de eroare
if(serial_buf=='x' || serial_buf=='X')
return -1;
}
serial_buf='K';
kIo.SerialWrite(COM1,&serial_buf,1);
return code;
}
void init_serial()
{
/* Serial Initialization */
serialConf.baudRate = b9600;
serialConf.parity = none;
serialConf.stopBits = one;
serialConf.wordLength = eight;
/* In order to check what EV/Z3 board is echoing on the serial port
* open Hyperterminal, create a new connection using the above parameters,
* Flow control: Hardware and Settings/Emulation: ANSI, connect and type some chars in it */
kIo.SerialInit(&serialConf);
}
void init_default_codes()
{
char* cod1="CocaCola Light 0.5";
char* cod2="Fanta 2L";
kIo.MemCpy((unsigned char*)cod1,strlen(cod1)+1,(unsigned char*)&produse[0].nume);
produse[0].pret=2;
produse[0].cod=1000;
kIo.MemCpy(cod2,strlen(cod2)+1,&produse[1].nume);
produse[1].pret=1;
produse[1].cod=1005;
num_produse=2;
}
int main(){
int code;
char key;
int i;
char flag;
int codes[10];
int num_codes=0;
char buf[16];
//afiseaza un mesaj
kIo.DisplayString(MSG_WELCOME);
kIo.Wait(400);
//porneste seriala
init_serial();
init_default_codes();
//asteapta comenzi pe seriala
for(;;){
//afiseaza meniul
clrscr();
kIo.DisplayString(MSG_MENU);
key=getch_kbd();
//modul de operare la seriala
if(key=='8'){
clrscr();
kIo.DisplayString(MSG_CITESTE_COD);
code=getcode_serial();
if(code!=-1)
{
//parcurge vectorul sa vada daca exista produsul
flag=0;
for(i=0;i<num_codes&&flag==0;i++)
if(codes[i]==code)
{
kIo.DisplayString(&(codes[i].nume));
kIo.Wait(2000);
flag=1;
}
//codul nu a fost gasit
if(flag==1)
{
clrscr();
kIo.DisplayString(MSG_COD_NOU);
code=getcode_kbd();
//salveaza codul si numele sau
codes[num_codes].code=code;
int2str(code,&(codes[num_codes].nume),15);
num_codes++;
}
}
}
//modul de operare mihai matei
//citim coduri de pe seriala cat timp nu se primeste x
if(key=='6'){
return 0;
}
if(key=='2'){
clrscr();
kIo.DisplayString(MSG_MIHM);
num_codes=0;
while(code!=-1&&num_codes<10){
code=getcode_serial();
//daca a primit un cod valid, il adauga in vector
//altfel a primit X si termina afisarea
if(code!=-1){
codes[num_codes]=code;
int2str(codes[num_codes],&buf,16);
clrscr();
kIo.DisplayString(&buf);
num_codes++;
} else {
kIo.DisplayString(MSG_AFISARE_CODURI);
kIo.Wait(1000);
//afisam
for(i=0;i<num_codes;i++){
int2str(codes[i],&buf,16);
clrscr();
kIo.DisplayString(&buf);
kIo.Wait(1000);
}
}
}
}
}
return 0;
}