Micro C ile termometreli alarmlı saniye göstergeli dijital saat

Başlatan dmrlp, 04 Nisan 2011, 10:27:08

microsi

hocam benim devrem de alarmlı saat devreyi kurdum ds1307 entegresiyle saat bilgisini lcd ye yazsdırabiliyorum
fakat saniye ikişer ikişer artıyor ve 1 saniye geç artıyo. acaba simülasyondan mı kaynaklanan bi sorun mu bu
kodu veriyorum.. microc ile yazılmıstır. saat çalısıyor fakat saniye yavaş ilerliyo

unsigned short hh;
unsigned short mm;
unsigned short ss;

void write_DS1307(unsigned short address, unsigned short data)
{
   unsigned short status;
   I2C_Start();
   I2C_Wr(0xd0);
   I2C_Wr(address);
   I2C_Wr(data);
   I2C_Stop();
}

unsigned short read_DS1307(unsigned short address)
{
   unsigned short data;
   I2C_Start();
   I2C_Wr(0xd0);
   I2C_Wr(address);
   I2C_Repeated_Start();
   I2C_Wr(0xd1);
   data=I2C_Rd(0);
   while (!I2C_Is_Idle()) asm nop;
   I2C_Stop();
   return(data);
}

void main(){
  PORTB = 0;
  TRISB = 0;
  TRISC.F3=1;
  TRISC.F4=1;
  PORTD=0;
  TRISD=0X0F;
  hh = 0;
  mm = 0;
  ss = 0;
  sa=0;
  da=0;
 




  Lcd_Init(&PORTB);
  Lcd_Out(1,1,"saat:");
  Lcd_Cmd(LCD_CURSOR_OFF);
  I2C_Init(100000); //DS1307 operates at 100Khz only


 
  ss=read_ds1307(0);
  write_ds1307(0, ss & 0x7F); // enable oscillator(bit 7 =0)

  ss=read_ds1307(2);
  write_ds1307(2, ss & 0b10111111); // set 24H mode

 



   while(1)
   {
     ss=read_ds1307(0);   // read second
     mm=read_ds1307(1);   // read minute
     hh=read_ds1307(2);  // read hour
     /*
     day=read_ds1307(3);   // read day
     date=read_ds1307(4);  // read date
     month=read_ds1307(5); // read month
     year=read_ds1307(6);  // read year
     */

     Lcd_Chr(1,6, 48+ ((hh & 0b00110000) >> 4));
     Lcd_Chr(1,7, 48+ (hh & 0b00001111) );

     Lcd_Chr(1,8, ':');

     Lcd_Chr(1,9, 48+ ((mm & 0b01110000) >> 4));
     Lcd_Chr(1,10, 48+ (mm & 0b00001111) );

     Lcd_Chr(1,11, ':');

     Lcd_Chr(1,12, 48+ ((ss & 0b01110000) >> 4));
      Lcd_Chr(1,13, 48+ (ss & 0b00001111) );
   delay_ms(1000);
  }
}