2011_P15

Table of contents

1. Download [edit]

CEAS DIGITAL

Project Description

Proiectul presupune implementarea unui ceas digital pe placa EV/Z3. Proiectul este software, display-ul si interfata cu utilizatorul fiind cele de pe placa EV/Z3, si are urmatoarele functionalitati:

  • afisare ora si data in formatul mm:hh:ss  dd/mm/yyyy
  • setare ora si data
  • setare timezone
  • cronometru
  • alarma

 

Project Requirements

Data(yyyy:mm:dd) + Timezone + Ora (hh:mm:ss) + Cronometru(rezolutie milisecunde)

Trebuie sa aveti posibilitatea sa setati Data + Ora curenta si timezone-ul curent. Ma intereseaza cum generati milisecundele.

Pentru timezone trebuie sa aveti in vedere cum se schimba data + ora odata setat (cel putin 5 timezone-uri)

User Flow

Initial ceasul este oprit si trebuie apasata tasta “0” pentru pornite.

Utilizatorul are posibilitatea de a seta timezone-ul prin tastele "1"-"5" si stearea orei si datei folosind tastele “3” si “7” pentru incrementarea respectiv decrementarea unitatilor selectate cu tastele:

“C” –tasta pentru setare ora

“D” –tasta pentru setare minute

“E” –tasta pentru setare secunde

“A” –tasta pentru setare zi

“B” –tasta pentru setare luna

“F” –tasta pentru setare an

Required components

Fiind un proiect software, nu am folosit alte componente hardware inafara de piesele care sunt in incluse in placa EV/Z3.

In codul OpenWatcom am folosit urmatoarele functii din interfata “platform_io.h” :

ReadKey –pentru citirea tastei apasate, folosit la pornirea ceasului si setarea orei/datei

DisplayString –pentru afisarea formatului de data si ora pe display sub forma de string

Software Design

Codul a fost compilat cu OpenWatcom si este format din urmatoarele functii si algoritmi:

//functie pentru preluarea codului tastei apasate

char convertkey(int key){
static char cod[19]={'0','2','4','6','8','A','C','E','c','l','1','3','5','7','9','B','D','F','r'};
return cod[key];
}

 

//functie pentru convertire din int in char pentru afisare pe display-ul placii

char *convert (char *c, int n)
{c[0]=n/10+'0';
c[1]=n%10+'0';
return c;
}

 

//Algoritm pentru ceas si data

while(b=1)
{
kIo.Wait(1000);
sec=sec+1;
if(sec == 60)
{
sec = 0;
min=min+1;
if(min == 60)
{
min = 0;
hour=hour+1;
if(hour == 24)
{
hour = 0;
d=d+1;
if((d > 31)&&(m==1))
{d=1;
m=2;}
if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
bisect=1 else bisect=0;
if ((bisect==1)&&(d>29)&&(m==2))
{d=1;
m=3;}
if ((bisect==0)&&(d>28)&&(m==2))
{d=1;
m=3;}
if((d > 31)&&(m==3))
{d=1;
m=4;}
if((d > 30)&&(m==4))
{d=1;
m=5;}
if((d > 31)&&(m==5))
{d=1;
m=6;}
if((d > 30)&&(m==6))
{d=1;
m=7;}
if((d > 31)&&(m==7))
{d=1;
m=8;}
if((d > 31)&&(m==8))
{d=1;
m=9;}
if((d > 30)&&(m==9))
{d=1;
m=10;}
if((d > 31)&&(m==10))
{d=1;
m=11;}
if((d > 30)&&(m==11))
{d=1;
m=12;}
if((d > 31)&&(m==12))
{d=1;
m=1;
y=y+1;}
}
}
}

 

//algoritm pentru setarea ceasului si a datei

while(1)
{

key=kIo.ReadKey();
c=convertkey(key);
if(c=='1') b=1; //pornire ceas
if(c=='0') b=0; //oprire ceas
if(c=='C') set=1; //tasta pentru setare ora
if(c=='D') set=2; //tasta pentru setare minute
if(c=='E') set=3; //tasta pentru setare secunde
if(c=='A') set=4; //tasta pentru setare zi
if(c=='B') set=5; //tasta pentru setare luna
if(c=='F') set=6; //tasta pentru setare an   
if(set==1)
{if(c=='7') h=h-1; //tasta "7" ("DEC(-)") decrementeaza unitatea selectata de "set"
else
if(c=='3') h=h+1;} //tasta "3" ("INC(+)") incrementeaza unitatea selectata de "set"
if(set==2)
{if(c=='7') m=m-1;
else
if(c=='3') m=m+1;}
if(set==3)
{if(c=='7') s=s-1;
else
if(c=='3') s=s+1;}
if(set==4)
{if(c=='7') d=d-1;
else
if(c=='3') d=d+1;}
if(set==5)
{if(c=='7') m=m-1;
else
if(c=='3') m=m+1;}
if(set==6)
{if(c=='7') y=y-1;
else
if(c=='3') y=y+1;}

}

//Algoritm pentru setare timezone

if(c=='1')
{hour=hour+10;
sir1[9]='T'; sir1[10]='Z'; sir1[11]='1';
if(hour>24) {hour=hour-24;}
if(hour<0) {hour=hour*(-1);}
}

//Algoritm pentru afisarea orei si datei in formatul “hh:mm:ss  dd/mm “

char *sir="hh:mm:ss dd/mm  ";

convert(&sir[0],hour);
convert(&sir[3],min);
convert(&sir[6],sec);
convert(&sir[9],d);
convert(&sir[12],m);
kIo.DisplayString(sir);

Download [edit]

 

Arhiva cu schema hardware + cod microcontroller + tot proiectul OpenWatcom.

 

Status

Saptamana 7 28martie-1aprilie: Intocmirea codului pentru ceas.

Saptamana 8 4-8aprilie:  In cadrul laboratorului nu am reusit sa afisam ceasul pe display-ul   placii.

Saptamana 9 11-15aprilie: Intocmirea codului pentru metoda de afisare pe display .

Saptamana 10 18-22aprilie: Testarea cu succes in cadrul laboratorului a metodei de afisare.

Saptamana 11 25-29aprilie: Intocmirea codului pentru pentru data si tentative de implementare a functionalitatii butoanelor.

Saptamana 13 9-13mai: Testarea cu succes a codului pentru data si buton de pornire ceas.

Intocmirea codului pentru setare data si ora .

Saptamana14 16-20mai: Prezentarea finala a proiectului.