Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

CCS ile I2C(24c512) kontrolu

Başlatan XX_CİHAN_XX, 30 Nisan 2006, 22:31:23

XX_CİHAN_XX

Arkadaşlar ben ccs c ile 16f877 kullanarak 24c512 ye yazma okuma yaptırmak ıstıyorum.Yazdıgım kodlarda bı turlu calıstıramadım devamlı 0xFF datası okudum.Bu konuda yardıma ıhtıyacım var sımdıden herkese teşekkürler. Yazdıgım kodlar:

0. adrese 0xAA kodunu yazdırmayı denedım
     address = 0;
      data = 0xAA;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();

olmadı : (

0. adresı okumayı denedım
     address = 0;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_start();
   i2c_write(0xa1);
   data=i2c_read(0);
   i2c_stop();

yine olmadı :(

address i yukarıda long olarak tanımladım
data yıda int olarak tanımladım
long      address;
int         data;

seklınde
ayrıca en ustede :
#use I2C(master, sda=PIN_C4, scl=PIN_C3)

yazmayı ıhmal etmedım. Acaba hatam yada eksıgım nerede olabılır:(  
programın tamamını yazmamamın sebebı eeprom ıle ılgılı baska bır yer yok ve tamamını vererek gereksız bır kalabalık yapmak ıstemedım hem forumun saglıgı hemde kafaların karısmaması acısından...
neyse umarım ı2c kontrolu yada yazma okuma ıslevlerı ıcın en azından yardım beklıyorum sımdıden teşekkürler arkadaslar..
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Arkadaşlar sorunu cozdum artık seri eeproma yazma  ve okuma yapabılıyorum.
write_ext_eeprom(long int address, BYTE data)
{
   short int status;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0);
   while(status==1)
   {
      i2c_start();
      status=i2c_write(0xa0);
   }
}

read_ext_eeprom(long int address) {
   BYTE data;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_start();
   i2c_write(0xa1);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}

Ccs nın kendı ıcınde bulunan 24512.c dosyasından alarak bu ısı hallettım esasında ılk once dırek olarak o dosyayı ınclude yaparak kullandım basarılı oldum ama o dosyayı ınclude etmek ıstemedım dırek dosyanın ıcınde bulunan yazma ve okuma (yukarıdakı kodlar) fonksıyonlarını kendı programıma kopyaladım o sekılde deneme yaptım ve yıne ıstedıgım sonucu aldım.Umarım bu kodlardan baska arkadaslarda faydalanır.
Herkese başarılar...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

MURSEL

CİHAN hocam ı2c ile eeprom kullanılması ile yaptıgınız  birkac dosyayı eklermisiniz basit birkaç örnek yeni başlıyorum  mümkünse saygılar

init_ext_eeprom();

write_ext_eeprom(adress, volue);

k=read_ext_eeprom(adress);

bu komutlar ile eepromu kullanmaya calıştım   ama olmadı  yukaridaki   ı2c  protokülü ile eeprom kullanmaya uygulanmış birkaç örnek verirseniz sevinirim

MURSEL

#include<16f877.h>
#use delay(clock=4000000)
#include<lcd.c>
#use i2c(master, sda=PIN_C4, scl=PIN_C3)
#include<2416.c>

void main()

{

int a,b,c,k;
a=0;
b=5;
lcd_init();
init_ext_eeprom();
tek:
 
write_ext_eeprom(0, b);// 0 cı adrese b nin degerini yi yaz
delay_ms(500);

k=read_ext_eeprom(0);   //0 adresi oku k degişkenine yaz
printf(lcd_putc,"gelen=%03u",k); lcd degişken olarak göster

goto tek;  
   }


sürekli ugraşıyorum tık yok hatayı nerde yapıyorum lcd  sacma sacma degerler ve sürekli degişiyor nedenini  anlamıyorum gelen=255  gelen=117 ama benim istedigim sadece 0  adresteki veriyi okumak   neden sürekli degişiyor  :cry:  :cry:  :cry:

Ziya

2432 surucusunu ekle. sen 2416'yi eklemişsin. 2416 ve altı tek adres baytı kabul eder.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

XX_CİHAN_XX

Yukarıda verdiğim yazma ve okuma kodlarını kullanırken herhangi bir dosyayı(2432,2416,vs...) include etmenize gerek yoktur.
Benzer bir ornek
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

MURSEL

iclude dosyasını  degiştirdim olmadı ( 2432)     includeyi  silersem  yazma okuma komutlarında hata veriyor  o sekildde olmadı
#define EEPROM_SDA  PIN_C4
#define EEPROM_SCL  PIN_C3
başında bunları yazdım yok
dosyam burda inceleyebilirmisiniz
http://www.dosyaupload.net/download.php?file=156203     :cry:  :cry:
asıl amacım ı2c  haberleşmesini ögrenmek ama daha eepromu bile okuyamadım :cry:

XX_CİHAN_XX

C kullanmıylı çok uzun zaman oldu şuan c derleyicimde yüklü olmadığı için kodalrında gerekli değişikliği yapmadım ancak söylediğim ifade yanlış anlaşılmış.Ben 2432.c gibi dosyaları include etmene gerek yok derken yukarıda benim verdiğim kodları kullanırsan gerek yok anlamında söylemiştim.Oysa sen hazır fonksiyon kullanmışsın bu durumda gerek var ve kaldırırsan hata verir.Ancak yukarıdaki kodları kullanırsan programın herhangi bir sorun yaşamazsın çünkü zamanında ben o kodları kullanmıştım.

Birde mevcut programında bir eksik gördüm.I2c pinlerini programda belirtmemişsin.Bu komutun kullanılışını helpinden incelemende fayda var.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

MURSEL

#include<16f877.h>
#use delay(clock=4000000)
#include<lcd.c>
#include<2432.c>   //  kaldırsam bile birsey degişmiyor
#use I2C(master, sda=PIN_C4, scl=PIN_C3)
void main()
{
long a,b,k;   //

 
tek:
a=1;
b=4;

  i2c_start();
  i2c_write(0xa0);
  i2c_write(a>>8 );   //1 adres
  i2c_write(a);     //1 adres
  i2c_write(b);     // b degişkenini  yaz
  i2c_stop();
delay_ms(20);
  i2c_start();
  i2c_write(0xa0);
  i2c_write(a>>8 );
  i2c_write(a);
  i2c_start();
  i2c_write(0xa1);
  k=i2c_read(1);  // 1 adresi oku  k ya yaz
  i2c_stop();

lcd_putc(k);// göster

delay_ms(500);
goto tek;  
   }



böylede yaptım yine tık yok  bu sefer hiççççç   :cry:  :cry:  :cry:

Ziya

Simulatorun 6.7SP3 sürümünde dene.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

MURSEL

evet dediginiz gibi hocam 6.9 yüklü hepsinde mi sorun vardır sizce

Ziya

6.9 sürümlerinin seri eeprom modüllerinde problem var. 6.7SP3 te bu modüllerde sorun yoktu. Gerçek devre üzerinde dene.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

MURSEL

selam arkadaşlar ben beceremedim bunu ya sorun ne anlamıyorum acemilikten sanırım yaptıgım calışmayı inceleme zahmetinde bulunup beni bilgilendirirseniz sevinirim  
:D
 
iki picin tx den tx rx den rx e bagladım fakat ı2c protokulunu kullanacagım için pinleri tx leri sda rx leri scl olarak pinleri tanıttım
gelelim yaxılıma
master olarak 16f877 kullandım  


#include<16f877.h>
#device ADC=8
#use delay(clock=4000000)
#use fast_io(b)
#include<lcd.c>
#use I2C(master, sda=PIN_C6, scl=PIN_C7)//tx ucu sda olarak rx ucu scl olark tanıttım
void main(void)
{

int data1,data2,cmd,d;
lcd_init();
while(1)
{
cmd=30;      // gönderecegim degerler
d=15;           // gönderecegim degerler
i2c_start();    //  başla

i2c_write(0xa0);//  yazma

i2c_write(cmd);//     1. gönderecegim degerler

i2c_write(d);//  2. gönderecegim degerler


i2c_stop();     // dur
i2c_start();

i2c_write(0xa1);

data1 = i2c_read();   //16f628  ,16f877'den aldıgı degerleri tekrar gönderecegi için
                     //data1=cmd
data2 = i2c_read();   //data2=d

i2c_stop();
printf(lcd_putc,"1=%03u",data1); //degişkenleri göster
delay_ms(100);
lcd_gotoxy(8,1);
printf(lcd_putc,"2=%03u",data2); //degişkenleri göster
while(1);                        // sadece 1 döngü var sonrası  sonsuz döngüye girib deger alıp vermiyor
}
}

************************************************************
slave pic durumda olan pic16f628 için yazılım
*************************************************************
#include<16f628.h>
#use delay(clock=4000000)
#use i2c(slave,sda=PIN_B2,scl=PIN_B1)   //tx ucu sda olarak rx ucu scl olarak kullandım

void main()
{
int a,b,c,g;
while(1)
{
i2c_start();             // başla
i2c_write(0xa1);        //oku
b = i2c_read();          //ilk 1ci baytı al
c = i2c_read();         //2.ci baytı al
i2c_stop();               // dur
i2c_start();    //       // başla
i2c_write(0xa0);//    // yaz
i2c_write(b);//         // b yi gönder  877 den gelen cmd degişkenin degeri tekrar gönderiliyor
i2c_write(c);//         // c gönder  877 den gelen d degişkenin degeri tekrar gönderiliyor
while(1);
}
}



NOT:tx ve rx ucları yani sda ve scl uclarını 10k ile +5v bagladım

NEDEN 628İLE 877;elimde şuan ikisi var :D
PROTEUS=versiyon 7.1 sp2

SONUÇ: :oops:  :oops:  :oops:  :oops: lcd gönderdigim degerler cıkmıyor  farklı degerler cıkıyor    bu konuda picleri haberleştirme vb ı2c ile yapılmış basit düzenekte giriş yazılımlarınız yokmu yada benim yanlışım nerde 1 haftadır ugraşıyorum daha verimli sonuç alamadım yardım edin kardeşinize yahu    (selametle) (a.e.o)

MURSEL

peki arkadaşlar  i2c_write(0xa0);//  adrese yazma  komutunda eepromlara yazerken A0  piclere veri gönderirken ne yapıcaz  c filan mı bu konuda bilgisi olan arkadasımız?????????????? :evil: mesala  DS1307'nin de adresi D0h ve D1h. yardım bekliyorum arkadaşlar ?

Ziya

Alıntı yapılan: "MURSEL"peki arkadaşlar  i2c_write(0xa0);//  adrese yazma  komutunda eepromlara yazerken A0  piclere veri gönderirken ne yapıcaz  c filan mı bu konuda bilgisi olan arkadasımız?????????????? :evil: mesala  DS1307'nin de adresi D0h ve D1h. yardım bekliyorum arkadaşlar ?
i2c_write(0xd0);
0xD0 ve 0xD1 gibi iki farklı i2c modulü kontrol kodu olmaz. Kontrol komutu seri eepromlar için 0xA dır ve philips 8583 için de aynısını kullanmış (içerisinde 240 bayt Ram olduğu için herhalde). 1307 için 0xd olabilir. Sonuna eklediğiniz 0 ve 1 okuma ve yazma kontrolü içindir.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey