Ynt: CCS DE DS1307 nin Sout ucundan 1 sn aralıklarla çıkış bilgisi nasıl alınır.

Başlatan Murat Mert, 05 Eylül 2012, 10:03:08

Murat Mert

CCS de DS1307 den B4 portuna 1 sn aralıkla SOUT ucundan bilgi almak istiyorum nasıl yapabilirim?

mesaj birleştirme:: 05 Eylül 2012, 16:46:32

S.A.
i2c_write(0x08);     // Disable squarewave output pin  YERİNE
i2c_write(0x01);     // Disable squarewave output pin  YAPTIM

Simülasyonda bir çıkış alamadım

Şöyle basit bir progda yaptım.

#include <18F4580.h>
#device adc=10
#FUSES HS                                    
#use delay(clock=20000000)

#include "wh1604.c"
#include "ds1307cc.c" 



void main() 
{ 
  BYTE sec; 
  BYTE min; 
  BYTE hrs; 
  BYTE day; 
  BYTE month; 
  BYTE yr; 
  BYTE dow; 
  
  ds1307_init(); 
  lcd_init();
  // Set date for -> 15 June 2005 Tuesday 
  // Set time for -> 15:20:55 
  ds1307_set_date_time(05,9,12,2,21,10,00); //tarih ve saatin ilk ayarı ilk yükledikten sonra burayı de-aktif edip tekrar yükledim
  output_high(pin_d0);

  
  while(1) 
  { 
    delay_ms(100); 
    
    ds1307_get_date(day,month,yr,dow); 
    ds1307_get_time(hrs,min,sec); 
    lcd_gotoxy(1,1);
    printf(lcd_putc,"%02d/\%02d/\%02d",day,month,yr); 
    lcd_gotoxy(1,2);
    printf(lcd_putc,"\%02d:\%02d:\%02d", hrs,min,sec); 
  } 
}
mert07

necati


Murat Mert

S.A.
Yazılımın ds1307 driveri altta

//////////////////////////////////////////////////////////////////////////////// 
///                               DS1307.C                                   /// 
///                     Driver for Real Time Clock                           /// 
///                                                                          /// 
/// ds1307_init() - Enable oscillator without clearing the seconds register -/// 
///                 used when PIC loses power and DS1307 run from 3V BAT     /// 
///               - Disable squarewave output                                /// 
///                                                                          /// 
/// ds1307_set_date_time(day,mth,year,dow,hour,min,sec)  Set the date/time   /// 
///                                                                          /// 
/// ds1307_get_date(day,mth,year,dow)               Get the date             /// 
///                                                                          /// 
/// ds1307_get_time(hr,min,sec)                     Get the time             /// 
///                                                                          /// 
//////////////////////////////////////////////////////////////////////////////// 

#define RTC_SDA  PIN_C4 
#define RTC_SCL  PIN_C3 

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL) 

BYTE bin2bcd(BYTE binary_value); 
BYTE bcd2bin(BYTE bcd_value); 

void ds1307_init(void) 
{ 
   BYTE seconds = 0; 

   i2c_start(); 
   i2c_write(0xD0);      // WR to RTC 
   i2c_write(0x00);      // REG 0 
   i2c_start(); 
   i2c_write(0xD1);      // RD from RTC 
   seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307 
   i2c_stop(); 
   seconds &= 0x7F; 

   delay_us(3); 

   i2c_start(); 
   i2c_write(0xD0);      // WR to RTC 
   i2c_write(0x00);      // REG 0 
   i2c_write(bin2bcd(seconds));     // Start oscillator with current "seconds value 
   i2c_start(); 
   i2c_write(0xD0);      // WR to RTC 
   i2c_write(0x07);      // Control Register 
   //i2c_write(0x08);     // Disable squarewave output pin 
   //i2c_write(0x10);     // Disable squarewave output pin --bunu yaptım oda olmadı
    i2c_write(0x92);     // Disable squarewave output pin --burasını değiştirdim
   i2c_stop(); 

} 

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec) 
{ 
  sec &= 0x7F; 
  hr &= 0x3F; 

  i2c_start(); 
  i2c_write(0xD0);            // I2C write address 
  i2c_write(0x00);            // Start at REG 0 - Seconds 
  i2c_write(bin2bcd(sec));      // REG 0 
  i2c_write(bin2bcd(min));      // REG 1 
  i2c_write(bin2bcd(hr));      // REG 2 
  i2c_write(bin2bcd(dow));      // REG 3 
  i2c_write(bin2bcd(day));      // REG 4 
  i2c_write(bin2bcd(mth));      // REG 5 
  i2c_write(bin2bcd(year));      // REG 6 
  i2c_write(0x80);            // REG 7 - Disable squarewave output pin 
  i2c_stop(); 
} 

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow) 
{ 
  i2c_start(); 
  i2c_write(0xD0); 
  i2c_write(0x03);            // Start at REG 3 - Day of week 
  i2c_start(); 
  i2c_write(0xD1); 
  dow  = bcd2bin(i2c_read() & 0x7f);   // REG 3 
  day  = bcd2bin(i2c_read() & 0x3f);   // REG 4 
  mth  = bcd2bin(i2c_read() & 0x1f);   // REG 5 
  year = bcd2bin(i2c_read(0));            // REG 6 
  i2c_stop(); 
} 

void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec) 
{ 
  i2c_start(); 
  i2c_write(0xD0); 
  i2c_write(0x00);            // Start at REG 0 - Seconds 
  i2c_start(); 
  i2c_write(0xD1); 
  sec = bcd2bin(i2c_read() & 0x7f); 
  min = bcd2bin(i2c_read() & 0x7f); 
  hr  = bcd2bin(i2c_read(0) & 0x3f); 
  i2c_stop(); 

} 

BYTE bin2bcd(BYTE binary_value) 
{ 
  BYTE temp; 
  BYTE retval; 

  temp = binary_value; 
  retval = 0; 

  while(1) 
  { 
    // Get the tens digit by doing multiple subtraction 
    // of 10 from the binary value. 
    if(temp >= 10) 
    { 
      temp -= 10; 
      retval += 0x10; 
    } 
    else // Get the ones digit by adding the remainder. 
    { 
      retval += temp; 
      break; 
    } 
  } 

  return(retval); 
} 


// Input range - 00 to 99. 
BYTE bcd2bin(BYTE bcd_value) 
{ 
  BYTE temp; 

  temp = bcd_value; 
  // Shifting upper digit right by 1 is same as multiplying by 8. 
  temp >>= 1; 
  // Isolate the bits for the upper digit. 
  temp &= 0x78; 

  // Now return: (Tens * 8) + (Tens * 2) + Ones 

  return(temp + (temp >> 2) + (bcd_value & 0x0f)); 
}


yukarıdaki değişiklikleri yaptım ama olmadı.



mesaj birleştirme:: 06 Eylül 2012, 14:33:03

S.A.
Yeni bir dosya oluşturup yeni başka isimli proje oluşturdum yukarıdaki kodlar çalıştırdı.
Allah Allah ccs de bu bazen oluyor ilginç. Neyse kullanacaklara kolay gelsin.
mert07

Benzer Konular (5)