bonjours tous le monde .
je voudrai réaliser un datalogger ca veut dire stoker des donnés en temps reel dans une eeprom ;
et pour cela je voudrai utiliser l'horloge temps réel "PFC8583"
pour l'instant je voudrai juste programme PFC ca veut dire, lire les information de PCF et les afficher sur un LCD connctè au PORTD de 877.
j'ai lu son datasheet et j'ai écrié ce programme avec le langage c de Mikroc.
//////////////////////////////////////////////////////////////////////////////char seconds, minutes, hours, day, month, year; // Global date/time variables
char *text = "A";
char *text2 = "wait...";
char ps,mamas,ws,v,zs;
unsigned long t,m,ri,ka,zi,momy,rav,ram ;
unsigned long tt ;
unsigned long a ;
unsigned long b;
unsigned long k ;
unsigned long fe ;
unsigned long i,x;
//--------------------- Reads time and date information from RTC (PCF8583)
void Read_Time()
{
I2C_Start(); // Issue start signal
I2C_Wr(0xA0); // Address PCF8583, see PCF8583 datasheet
I2C_Wr(2); // Start from address 2
I2C_Start(); // Issue repeated start signal
I2C_Wr(0xA1); // Address PCF8583 for reading R/W=1
seconds =I2C_Rd(1); // Read seconds byte
minutes =I2C_Rd(1); // Read minutes byte
hours =I2C_Rd(1); // Read hours byte
day =I2C_Rd(1); // Read year/day byte
month =I2C_Rd(0); // Read weekday/month byte
Soft_I2C_Stop(); // Issue stop signal
}
//-------------------- Formats date and time
void Transform_Time()
{
seconds = ((seconds & 0xF0) >> 4)*10 + (seconds & 0x0F); // Transform seconds
minutes = ((minutes & 0xF0) >> 4)*10 + (minutes & 0x0F); // Transform months
hours = ((hours & 0xF0) >> 4)*10 + (hours & 0x0F); // Transform hours
year = (day & 0xC0) >> 6; // Transform year
day = ((day & 0x30) >> 4)*10 + (day & 0x0F); // Transform day
month = ((month & 0x10) >> 4)*10 + (month & 0x0F); // Transform month
}
/////////////////////foncion d'affichange////////////////////////////////////
void afflcd ( unsigned long t )
{
if (t>=100) //****************************** *****************************
{
if (t<1000) //:::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::
{
a=t;
do {
a=a-10;
}
while (a>=10);
v=a;
tt=t-v;
k=tt;
do{
k=k-100;
}
while (k>=100);
b=k;
ws=b/10;
fe=tt-b;
zs=fe/100;
mamas=0;ps=0;
}
else //:::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: ::::::
{
if (t<10000)
{
a=t;
do {
a=a-10;
}
while (a>=10);
v=a; //le premier chiffre a afficher
tt=t-v;
k=tt;
do{
k=k-100;
}
while (k>=100);
b=k;
ws=b/10; // le deuxiemme chiifre a afficher
zi=tt-b;
m=zi;
do{
m=m-1000;
}
while (m>=1000);
ka=m;
zs=ka/100; // le troisiemme chiffre
fe=zi-ka;
ps=fe/1000; // le quatriemme chiffre
mamas=0;
}
else
{
a=t;
do {
a=a-10;
}
while (a>=10);
v=a; //le premier chiffre a afficher
tt=t-v;
k=tt;
do{
k=k-100;
}
while (k>=100);
b=k;
ws=b/10; // le deuxiemme chiifre a afficher
zi=tt-b;
m=zi;
do{
m=m-1000;
}
while (m>=1000);
ka=m;
zs=ka/100; // le troisiemme chiffre
fe=zi-ka;
rav=fe;
do
{
rav=rav-10000;
}
while ( rav>=10000);
ram=rav;
ps=ram/1000; //le quatriemme chiffre
momy=fe-ram;
mamas=momy/10000; //le cinquiemme chiffre
}
}
}
else //****************************** ****************************** *************
{
if (t<10) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!
{ v=abs(t);
ws=0;
zs=0;
ps=0;
mamas=0;
}
else //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!
{
a=t;
do {
a=a-10;
}
while (a>=10);
v=a;
tt=t-v;
k=tt;
ws=k/10;
zs=0;
ps=0;
mamas=0;
}
}
TRISD = 0; // PORTB is output
Lcd_Config(&PORTD,2,3,0,7,6,5, 4); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, text); // Print text to LCD, 2nd row, 1st column
LCD_Chr_Cp(' ') ;
LCD_Chr_Cp('0' + mamas) ;
LCD_Chr_Cp('0' + ps) ;
LCD_Chr_Cp('0' + zs) ;
LCD_Chr_Cp('0' + ws) ;
LCD_Chr_Cp('0' + v) ;
}
//----------------- Main procedure
void main()
{
TRISB=0b00000001;
PORTB=0;
TRISD=0;PORTD=0;
I2C_Init(100000);
Delay_ms(2000);
for(;
{
Read_Time(); // Read time from RTC(PCF8583)
Transform_Time(); // Format date and time
afflcd(seconds);delay_ms(500);
afflcd(minutes);delay_ms(500);
afflcd(hours);delay_ms(500);
afflcd(day);delay_ms(500);
afflcd(month);delay_ms(500);
afflcd(year);delay_ms(500);
Delay_ms(1000); // Wait 1 second
}
}
////////////////////////////////////////////////////////////////////////////
je vais vous expliquer bravement mon programme ,
la fonction afflcd sert a afficher une variable de 5 chiffre sur les LCD connecté au PORTD de PIC
ps: j'ai tester cette fonction et elle marche très bien avec d'autre programme .
et les routines Read_Time et Transform_Time c''est pour lire et decodè les information de PCF ;
voila mon problème :
la routine Read_Time ne fonction pas :s
le programme lorsque il rentre ds cette fonnction et ne sort plus...
PS:je utilise le MIKROC .8.2
merciii d'avance...
-----