PİC16F877 SAAT,TAR,HTE SORUN VAR C YAZILIMIYLA İLGİLİ SORUN OLABİLİRMİ

Başlatan xlante, 11 Mayıs 2010, 00:34:52

xlante

arkadaşlar ben PIC16F877 Entegresiyle digital lcd ekrandasaat,tarih ve sıcaklık gösteren bir proje yapıyorum...proteusda çalışan aşağıdaki kodum benim baskı devremde saat ve tarhite sorun yaratıyor ama sıcaklığı gösteriyor...saat ve tarih proteusda düzgün bie şekilde gösterirken simulasyon yaptığım zaman...baskı devrede saat: 00:00:00 'dan başlıyor ve tek tek artıyor..tarih ise 01/01/2010 dan başlıyor...elektriği kesince ve tekrardan elektrik verince baskı devreye tekrar saat ve tarih yukarıda yazdığım gibi baştan başlıyor...ben saat ve tarihh entegresine bağladığım 32.768 hz lik crystalimi oscilloscope ile ölçtüm onda signal var başka neyden kaynaklanabilir, bunun nedeni ne olabilir,bana yardımcı olursanız çok sevinirim..
 
#define backlight PORTC.F0
#define sistemled portb.f1
#define outled    portc.f2
//buttons definitions
#define   btnEnter porte.f2
#define   btnEsc   porta.f2
#define   btnUp    porte.f0
#define   btnDown  porta.f4
#define   btnLeft  porta.f5
#define   btnRight porte.f1
unsigned short sec;
unsigned short minute;
unsigned short hour;
unsigned short day;
unsigned short date;
unsigned short month;
unsigned short year;
////////////////
unsigned long temperature=0;
unsigned int sicaklik=0;
unsigned int isi=0;
unsigned char isidegeri[6];
unsigned char setdegeri[6];
unsigned int isideger=0;
unsigned int setdeger=0;
unsigned char offset=20;
unsigned char mode=0;
//////////////
void initial_time();
void   read_time();
void       setting_time();
void    display_time();
void Transform_Time();
void sicaklikoku(unsigned char kanal,unsigned char* dizi);
void timemode();
void temperaturemode();
void main(){

initial_time();

while(1)
{
      while(1){
        switch (mode){
           case 1:  timemode(); mode=2;break;
           case 2:  temperaturemode(); mode=1;break;
           default:   mode=1; break;
        }
     }
}
}
void read_time()
{
  I2C_Start();               // Issue start signal
  I2C_Wr(0xA0);           // Address PCF8583, see PCF8583 datasheet
  I2C_Wr(2);              // Start from address 2
  I2C_Repeated_Start();               // Issue repeated start signal
  I2C_Wr(0xA1);           // Address PCF8583 for reading R/W=1

  sec= I2C_Rd(1);       // Read seconds byte
  minute= I2C_Rd(1);       // Read minutes byte
  hour   = I2C_Rd(1);       // Read hours byte
  day     = I2C_Rd(1);       // Read year/day byte
  month   = I2C_Rd(0);       // Read weekday/month byte
            I2C_Stop();        // Issue stop signal

}
void Transform_Time() {
  sec =  ((sec & 0xF0) >> 4)*10 + (sec & 0x0F);  // Transform seconds
  min=  ((minute & 0xF0) >> 4)*10 + (minute & 0x0F);  // Transform months
  hour   =  ((hour & 0xF0)  >> 4)*10  + (hour & 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
}
void Display_Time() {

   Lcd_Out(1, 1,"Date:");
   Lcd_Chr(1, 6, (day / 10)   + 48);    // Print tens digit of day variable
   Lcd_Chr(1, 7, (day % 10)   + 48);    // Print oness digit of day variable
   Lcd_Chr(1, 8,47);
   Lcd_Chr(1, 9, (month / 10) + 48);
   Lcd_Chr(1,10, (month % 10) + 48);
   Lcd_Chr(1, 11,47);
   Lcd_Out(1,12,"2010");
   Lcd_Out(2, 1,"Time:");
   Lcd_Chr(2, 6, (hour / 10)   + 48);
   Lcd_Chr(2, 7, (hour % 10)   + 48);
   Lcd_Chr(2, 8,':');
   Lcd_Chr(2, 9, (minute / 10) + 48);
   Lcd_Chr(2,10, (minute % 10) + 48);
   Lcd_Chr(2,11,':');
   Lcd_Chr(2,12, (sec / 10) + 48);
   Lcd_Chr(2,13, (sec % 10) + 48);
}
void initial_time()
{
I2C_Init(100000); //DS1307 I2C is running at 100KHz
Lcd_Init(&PORTD); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
}
void timemode(){
    tekrar1:
       read_time();
       Transform_Time();
       Display_Time();
       Delay_ms(10);
      if(!btnEnter)             goto tekrar1;

}
void temperaturemode(){
unsigned char temp=0;
     Lcd_Cmd(LCD_CLEAR);                // Clear display
     Lcd_Cmd(LCD_CURSOR_OFF);           // Cursor off
     Lcd_Out(1,1,"Set : ");
     Lcd_Out(2,1,"Temp: ");
tekrar:
     isideger=setdeger=0;
  //  sicaklikoku(0,isidegeri);
  // sicaklikoku(1,setdegeri);
     if(outled==1)if(isideger<=(setdeger-(unsigned int)offset))outled=0;
     if(outled==0) {if(isideger>=setdeger)outled=1;}

     Lcd_Out(1,7,setdegeri);
     Lcd_Out(2,7,isidegeri);
   if(!btnEnter) goto tekrar;   //enter tuşuna basılana kadar işlemi tekrarla

}

void sicaklikoku(unsigned char kanal,unsigned char* dizi){
       unsigned char i;
        sicaklik=ADC_Read(kanal);
         for(i=0;i<10;i++)
         {
              sicaklik+=ADC_Read(kanal);
              sicaklik=sicaklik/2;
         }
        if(kanal==0) {temperature = (long)sicaklik*1000;}
        else if(kanal==1){ temperature = (long)sicaklik*100;}
        temperature=(temperature/1023)*5;
        sicaklik = (unsigned int)temperature;
        if(kanal==0)isideger=sicaklik;else setdeger=sicaklik;
       // sicaklik = 4999;
        isi = sicaklik/1000;
        if(isi==0) dizi[0]=32;else dizi[0]=48+isi;

        isi = sicaklik-(isi*1000);
        isi = isi/100;
        if(isi==0){ if(dizi[0]==32)dizi[1]=32;else dizi[1]=48;}
        else if(isi>0){dizi[1]=48+isi;}

        sicaklik = sicaklik%100;
        isi = sicaklik/10;
        dizi[2]=48+isi;dizi[3]='.';

        isi=sicaklik%10;
        dizi[4]=48+isi;dizi[5]=0;

     }//