18F45K22 İLE DS 1307 okuma yazma için donanımsal I2C nasıl kurulur?

Başlatan F.T, 02 Haziran 2013, 00:06:09

F.T

arkadaşlar yazılımsal olarak  ds1307 okuma yazmasını yapıyorum.fakat bu entegrede donanımsal modül var görünüyor ve donanımsal olarak kullanmak istiyorum.çünkü zaman sıkıntım var.bu şekilde bazı işlerin hafiflemesini düşünüyorum.. donanımsal çalışmasının ne kadar uygun olduğunu bilemiyorum.nasıl kurulacağını pdf sinde çok uğraşmama rağmen bitürlü ayarlayamadım.deneyimi olan arkadaşlardan rica ediyorum.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

F.T

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

F.T

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.


F.T

Hocam sagolun.zaten bu tanimlama ile okuma yazma yapiyorum
ben İ2C modulunu donanimsal kullanmak istiyorum.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mr.Java

Merhaba.

ı2c iletişimi oldukça kolaydır.Aşağıdaki kodu denermisiniz.

void main() {
   I2C_Init(100000);     // Master Mod aç
   I2C_Start();          // i2c modülünü Başlat
   I2C_Wr(0xD0);         // DS1307 adresi
   I2C_Wr(0);            // adres (REG0)
   I2C_Wr(0x80);         // Saniye
   I2C_Wr(0);            // Dakika (REG1)
   I2C_Wr(0x09);         // Saat(REG2)
...
..
..
// istenilen bilgilerin adres kodları yazılır.
   I2C_Stop();           // issue stop signal

   I2C_Start();          // start sinyali tekrar gönderilir.
   I2C_Wr(0xD0);         // DS1307 adres bilgisi alınır.
   I2C_Wr(0);            // 0 adresi gönderilir.
   I2C_Wr(0);            // REG0 yazılır.
   I2C_Stop();           // Stop sinyan gönderilir..
   
   ////////////////////////////////////////////////////////////7
   DS1307.C Hazır fonksyon
   ////////////////////////////////////////////////////////////7
   
   unsigned char sec, min1, hr, week_day, day, mn, year;
char *txt, tnum[4];

void Zero_Fill(char *value) {    
  if (value[1] == 0) {       
    value[1] = value[0];
    value[0] = 48;
    value[2] = 0;
  }
}//~

//---------------------Bilgiler Okunuyor-------------------------
void Read_Time(char *sec, char *min, char *hr, char *week_day, char *day, char *mn, char *year) {
  I2C_Start();
  I2C_Wr(0xD0);
  I2C_Wr(0);
  I2C_Repeated_Start();
  I2C_Wr(0xD1);
  *sec =I2C_Rd(1);
  *min =I2C_Rd(1);
  *hr =I2C_Rd(1);
  *week_day =I2C_Rd(1);
  *day =I2C_Rd(1);
  *mn =I2C_Rd(1);
  *year =I2C_Rd(0);
  I2C_Stop();
}//~

//-------------------- Dönüştürülme Safhası----------------------
void Transform_Time(char  *sec, char *min, char *hr, char *week_day, char *day, char *mn, char *year) {
  *sec  =  ((*sec & 0x70) >> 4)*10 + (*sec & 0x0F);
  *min  =  ((*min & 0xF0) >> 4)*10 + (*min & 0x0F);
  *hr   =  ((*hr & 0x30) >> 4)*10 + (*hr & 0x0F);
  *week_day =(*week_day & 0x07);
  *day  =  ((*day & 0xF0) >> 4)*10 + (*day & 0x0F);
  *mn   =  ((*mn & 0x10) >> 4)*10 + (*mn & 0x0F);
  *year =  ((*year & 0xF0)>>4)*10+(*year & 0x0F);
}//~

//-------------------- Veriler LCD'ye yazılıyor--------------------------
void Display_Time(char sec, char min, char hr, char week_day, char day, char mn, char year) {
   switch(week_day){
     case 1: txt="Sun"; break;
     case 2: txt="Mon"; break;
     case 3: txt="Tue"; break;
     case 4: txt="Wed"; break;
     case 5: txt="Thu"; break;
     case 6: txt="Fri"; break;
     case 7: txt="Sat"; break;
   }
   LCD_Out(1,1,txt);

   ByteToStr(day,tnum);
   txt = rtrim(tnum);
   Zero_Fill(txt);
   LCD_Out(1,6,txt);
   
   ByteToStr(mn,tnum);
   txt = rtrim(tnum);
   Zero_Fill(txt);
   LCD_Out(1,9,txt);
   
   ByteToStr(year,tnum);
   txt = rtrim(tnum);
   Zero_Fill(txt);
   LCD_Out(1,14,txt);
   
   ByteToStr(hr,tnum);
   txt = rtrim(tnum);
   Zero_Fill(txt);
   LCD_Out(2,6,txt);
   
   ByteToStr(min,tnum);
   txt = rtrim(tnum);
   Zero_Fill(txt);
   LCD_Out(2,9,txt);
   
   ByteToStr(sec,tnum);
   txt = rtrim(tnum);
   Zero_Fill(txt);
   LCD_Out(2,12,txt);
}//~

//------------------ Performs project-wide init
void Init_Main() {
  ADCON1|=0x0F;
  CMCON|=7;
  Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); //
  I2C_Init(100000);                        // I2C iletişim hızı belirleniyor.
  LCD_Chr(1,8,'.');
  LCD_Chr(1,11,'.');
  txt = "Time:";
  LCD_Out(2,1,txt);
  LCD_Chr(2,8,':');
  LCD_Chr(2,11,':');
  txt = "20";
  LCD_Out(1,12,txt);
  LCD_Cmd(LCD_CURSOR_OFF);
}//~

//----------------- Ana Fonksyonumuz------------------------
void main() {
  Init_Main();                                             
  while (1) {
    Read_Time(&sec,&min1,&hr,&week_day,&day,&mn,&year);      // Bilgiler okunuyor.
    Transform_Time(&sec,&min1,&hr,&week_day,&day,&mn,&year); // Okunan bilgilerin formatları düzenleniyor.
    Display_Time(sec, min1, hr, week_day, day, mn, year);    // Finish  = ) 
    Delay_ms(1000);                                          // wait 1s
  }
}//

F.T

Hocam sagolun.fafat bu C ile bana proton yada pic basic
kodu lazim
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mr.Java

Tamam hiç farketmez.

Algoritması basittir.Protonda DS1307 okuma fonksyonu yazın kendiniz.Sonra i2c'de donanımsal haberleşme için şu basamaklar sırasıyla uygulanır ;
- SSPCON kaydedicisinden I2C birimi master olarak ayarlanır.
SSPEN=1
- SDA, SCL portları tanımlanır.
CKP=1
- IDLE seviyesi 1 olacak
SSPM3:SSPM0=0b1000
- I2C master mode, clock=Fosc/[4(SSPAD+1)]
- SSPCON2 kaydedicisinin tüm birimleri sonraki kontroller için sıfırlanır.
- SSPAD ile standart olan ve şekil -67'de görülen hızlardan biri seçilir (Örn: SSPAD=0x0A).
- SMP ayarlanarak slow rate kullanılıp kullanılmayacağı bildirilir.
- CKE ile yükselen veya düşen kenar seçimi yapılır.
- Kullanılacaksa kesme bayrakları temizlenir (PSPIF=0, BCLIF=0).

Herhangi bir slave adresinden veri okuyacak durumda ise;
Öncelikle I2C startı verilir.
Daha sonra slave address olarak slava adresi datasheetten bakılarak gönderilir,
daha sonrasında ise okunacak adres bilgisi gönderilerek I2C tekrar başlatılır. İkinci kez slave address olarak bu
sefer okuma yapacağımızı belirten ilgili komutu gönderilerek, istenen adresteki bilgi alınır
ve I2C stop komutu ile iletişim sonlandırılır.

F.T

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.