Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Bu uyarının sebebi nedir ?

Başlatan baran123, 11 Mayıs 2014, 16:18:23

baran123

Merhaba ds1302 ile yaptığım bir devrede daha doğrusu bu entegreyi kullandığım tüm devrelerde aynı uyarıyı görüyorum çalışmayı etkilemiyor ama sürekli gözüme çarpıyor bir sorun olur mu veya nasıl çözülür.Kütüphaneden kaynaklanıyor olabilir yardımcı olursanız sevinirim.

Aldığım uyarı : "Logic Contention(s) detected on net #00050." Ds1302'nin data pinin gösteriyor.

#ifndef RTC_SCLK

#define RTC_SCLK PIN_B6
#define RTC_IO   PIN_B7
#define RTC_RST  PIN_B5

#endif

void write_ds1302_byte(BYTE cmd) {
   BYTE i;

   for(i=0;i<=7;++i) {
      output_bit(RTC_IO, shift_right(&cmd,1,0) );
      output_high(RTC_SCLK);
      output_low(RTC_SCLK);
   }
}

void write_ds1302(BYTE cmd, BYTE data) {

   output_high(RTC_RST);
   write_ds1302_byte(cmd);
   write_ds1302_byte(data);
   output_low(RTC_RST);
}

BYTE read_ds1302(BYTE cmd) {
   BYTE i,data;

   output_high(RTC_RST);
   write_ds1302_byte(cmd);

   for(i=0;i<=7;++i) {
      shift_right(&data,1,input(RTC_IO));
      output_high(RTC_SCLK);
      delay_us(2);
      output_low(RTC_SCLK);
      delay_us(2);
   }
   output_low(RTC_RST);

   return(data);
}

void rtc_init() {
   BYTE x;
   output_low(RTC_RST);
   delay_us(2);
   output_low(RTC_SCLK);
   write_ds1302(0x8e,0);
   write_ds1302(0x90,0xa4);
   x=read_ds1302(0x81);
   if((x & 0x80)!=0)
     write_ds1302(0x80,0);
}

int get_bcd(BYTE data)
{
   int nibh;
   int nibl;

   nibh=data/10;
   nibl=data-(nibh*10);

   return((nibh<<4)|nibl);
}

int rm_bcd(BYTE data)
{
   int i;

   i=data;
   data=(i>>4)*10;
   data=data+(i<<4>>4);

   return data;
}

void rtc_set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) {

   write_ds1302(0x86,get_bcd(day));
   write_ds1302(0x88,get_bcd(mth));
   write_ds1302(0x8c,get_bcd(year));
   write_ds1302(0x8a,get_bcd(dow));
   write_ds1302(0x84,get_bcd(hr));
   write_ds1302(0x82,get_bcd(min));
   write_ds1302(0x80,get_bcd(0));
}

void rtc_get_date(BYTE& day, BYTE& mth, BYTE& year, BYTE& dow) {
   day = rm_bcd(read_ds1302(0x87));
   mth = rm_bcd(read_ds1302(0x89));
   year = rm_bcd(read_ds1302(0x8d));
   dow = rm_bcd(read_ds1302(0x8b));
}

void rtc_get_time(BYTE& hr, BYTE& min, BYTE& sec) {
   hr = rm_bcd(read_ds1302(0x85));
   min = rm_bcd(read_ds1302(0x83));
   sec = rm_bcd(read_ds1302(0x81));
}

void rtc_write_nvr(BYTE address, BYTE data) {
   write_ds1302(address|0xc0,data);
}

BYTE rtc_read_nvr(BYTE address) {
    return(read_ds1302(address|0xc1));
}

Salih

Bu mesaj CCS ile ilgili değil. Isis'de ilgili ucun bağlı olduğu net'le alakalı gibi.

baran123

Yaptığım projede DS1302'nin I/O pini 16F84A'nın B7 ucuna bağlı

Kabil ATICI

Burada İşlemci master, D1302 slave konumunda yazma ve okuma işlemi işlemci tarafından kontrol ediliyor.

Şimdi DS1302'den veri okuyacaksın, önce bir komut gönderiyorsun sonra okuma yapıyorsun, eğer işlemci I/O olarak kullanılan bacak yazma (çıkış)  konumunda iken, DS1302 I/O bacağı çıkış konumuna geçerse ne olur? Bu durumda iken her ikisi lojik 1 konumunda ise bir sorun olmaz, ama biri lojik 0 konumunda olursa ne olur? Bu durum verinin son bitinin yazılmasından sonra oluşuyor. (Bu belirtilen hatanın sebebi) İsis'deki sanal osilaskop ile bakabilirsiniz ve son yazma bitinin kenarındaki bozulmayı görebilirsiniz.

Bu arada yazma işlemi yükselen kenarda oluyor. Bunu önlemek için işlemcinin I/O olarak kullanılan bacağı bu andan itibaren giriş olarak tanımlanması gerekir.

DS1302'nin akım akıtma kapasitesi (-1 ile 4 mA) düşük olduğu için işlemci kurtarıyor.
ambar7