CCS ile I2C(24c512) kontrolu

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

MURSEL

peki ziya hocam pic için neyazmam gerekiyor i2c bus  ile picler haberleştirebiliyoruz 1 tanesi master digerleri slave olarak bende böle bişey yapmak istiyorum
i2c_write(0x?0); burda ? ne olucak  adres belirtirken sadece 1-2-3- gibi  yazmam yeterlimi  i2c_write(1); i2c_write(2);  vb.

Ziya

Daha önce denemediğim için tam olarak bilmiyorum. O adresi siz veriyorsunuz diye bir yerde gözüme çarpmıştı. Yani #use i2c tanımlarında slave olduğunu ve adresi girebiliyor olmanız lazım. 0xb2 olarak girip deneyin. lsb okuma ve yazma için kullanıldığını unutmayın.
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 hocam helpine baktııgmda  
#use I2C(master, sda=PIN_B0, scl=PIN_B1)



#use I2C(slave,sda=PIN_C4,scl=PIN_C3     //slave için

               address=0xa0,FORCE_HW)
bu sekilde tanımlama yapmış  master isen yukarıdakini  slave ise asagıdaki yazılacak benim kafamda şu alttaki komutların tam işleyişi
i2c_start();    // Start condition

i2c_write(0xb0);// Device address  en son biti  evet okuma yazma işlemini yapıyor o zamn 128 farklı adresleme yapabilirm anlamına mı geliyor

i2c_write(data);//  data yı gönder

i2c_stop();     // Stop condition

bunlar
peki bunun ack yani adresi veri yoluna yolladıgımda   adres kimin ise o pic ack biti göndermesi lazım onu nasıl yapıcam ? aklımda şu sekilde yazım var ama ne kadr dogru

shor b;
int data;
do
{

i2c_start();      //başlat
i2c_write(0xb0);  //adresi  yolladım
b = i2c_read();    // hemen arkasından arc biti geldimi diye hattı kontrol ettim
while(b!=0);      // eger ack varsa yani 0 oluyor ( ack oldugunda ) yoksa başa dön tekrar adress yolla

i2c_write(data);// datayı gönder

burda data nın gittigini nasıl anlıcam yine ack biti beklicem ama nasıl
b = i2c_read();  //tekarr hattı kontrolet ack bitini slave durumda olan pic gönderdimi
if(b==1)
i2c_write(data2);  // evet 2.datayı gönder  BU sekilde sürekli yapmam mı gerekiyor  :oops:  tam olarak bilmiyorsanız bile yardımcı olmak için fikir üretin ARKADAŞLAR selametle

Ziya

128 adresleme olur mu bilmiyorum. Komut karakterindeki yüksek değerli 4 bit (0xA0 daki) yani A haberleşilen çipin tipini belirliyor. 0 kısmının en düşük değerli biti hariç diğer üç biti kontrol komutundan sonra gelen adresle birlikte (24c16 ya kadar) 11 bit yani en fazla 2 k lık adresi adresleyebiliyor. 24c32 ve üstünde kontrol komutundaki üç bit çip adresini belirliyor,.... Antrak gazetesinde benim bir yazım vardı, gerisini oradan okuyun. Baya uzundur. google da i2c copier kelimeleri ile aratın çıkacaktır.
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

hocam evet o notunuzu elimde cıktısı sürekli inceliyorum sizin oldugunuzu sanmıyordum  cok begendim içimden saygı duyup bi teşekkür msj için mail atmıştım   ellerinize saglık cok güzel ama gel gelelim eepromlara yönelik  :oops:  :oops:  :oops:  sorunumda o picler arası heberleştirme ı2c prot. ile  ı2c bus denilen olay var o kadar arıyorum picleri haberleştirmek için adam akıllı ccs ile proje yok zaten yapınca  direk koyucam  ögrensin herkes  bu konuda kaynaklar bulursanız paylaşırsanız sevinirim ziya hocam  ilginiz içinde teşekkürler

MURSEL

i2c_poll()

i2c_poll(stream)  bu komutların görevi nedir??*

örnek;;;;

_start();     // Start condition

i2c_write(0xc1); // Device address/Read

count=0;

while(count!=4) {

  while(!i2c_poll()) ;

  buffer[count++]= i2c_read();  //Read Next

}

i2c_stop();      // Stop condition



ingilizcem  iyi olmadıgı için helpindeki acıklamayı bir cevrici proglamla türkce ye su sekilde ceviriyor ama anlamadım;

"""""""
I2C _ oylama() Fonksiyon gömme SSP kullanılan olunca, kullanılmış yalnızca olmalı. Eğer donanımın  tamponda alınmış bir baytı var bu fonksiyon, doğruya  geri döner. I2C _a bir bağırma, doğru birin, ne zaman geri döndüğünü  okur()
Alılan bayta hemen  geri dönecek mi
""""""""
bu sekilde bi cevrim yaptı  bu konuda ugraşanlarmı az cok önemli oldugu halde yoksa paylaşım yapmakmak isteyen lermi ?  :?:  :?:  :?:  :oops:

Ziya

polling slave birimin işini bitirip bitirmediğini denetlemektir. İlk polling, yazma işleminin bitip bitmediğini denetlemek için start + kontrol komutu göndererek ack sinyali beklemektir. Diğer polling ne anlama gelir bilmiyorumj. Zira okuma işleminde polling olmaz, okuyan master slave'e ack sinyali gönderir. Okumanın bittiğini göstermek için de nack+stop gönderir.
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

ahmet2004

Sana önerim 1 adet daha 16f877 al

donanım kontrollü i2c uygulamalarına bak

ve ordan devam et.

16f628 de yazılım ile i2c yapıyorsun.

MURSEL

Alıntı yapılan: "Ziya"polling slave birimin işini bitirip bitirmediğini denetlemektir. İlk polling, yazma işleminin bitip bitmediğini denetlemek için start + kontrol komutu göndererek ack sinyali beklemektir.
1.DURUM
i2c_start()
i2c_write(0xa1) // adres bundan sonra adresi aldmı diye kontroletmeme gerek yok sanırım i2c_start(); while( i2c_poll())
2.DURUM
veri gönderirken yapılacak
i2c_start();
i2c_write(0xa1) ;
i2c_write(data) ;
i2c_start();
while( i2c_poll()); aldınmı verimi  evlat  :lol:  aldıysan komutu atla

hocam sizide cok yordum ama örnek verirseniz benim yazım gibi daha rahat anlama oluşacak

@ahmet2004 hocam evet aldım  1 tane daha ama temelini anlamadan yapamıcam galiba bi sorun olunca yoksa direk takılıp kalıyorum  sizde varmı donanım kontrollü i2c uygulamaları  örnek alabilcegim birkac yazılım olsa  bulamıyorum  :oops:

ahmet2004

Şöyle bir çalışma yaptım.Belki yardımı olur arkadaşım.




*** Master ***
Alıntı Yap
#include <16f877a.h>
#fuses NOWDT,HS, NOPROTECT, BROWNOUT, NOPUT, NODEBUG, NOLVP
#use delay(clock=20000000)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, FORCE_HW)

#byte PORTD = 0x08

void main()
{
set_tris_D(0xb11111111);
OUTPUT_d(0xff);
     delay_ms(250);
     
   while(1)
   {
     i2c_start();
     delay_ms(100);
     i2c_write(0xa0);
     delay_ms(100);
     i2c_write(PORTD);
     delay_ms(100);
     i2c_stop();
   }
}

*** Slave ***
Alıntı Yap
#include <16f877a.h>
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPROTECT, BROWNOUT, NOPUT, NODEBUG, NOLVP

#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0, FORCE_HW)
#use rs232(baud=9600,parity=N,bits=8,xmit=PIN_C6,rcv=PIN_C7)

#byte PORTD = 0x08

char DEGER2;
int DEGER1;

#INT_SSP
void ssp_interupt ()
{
  //i2c_start();
  DEGER2 = i2c_read();
  delay_ms( 100 );
  DEGER1 = i2c_read();
  delay_ms( 100 );
  //i2c_stop();
}

void main()
{
     set_tris_D(0x00);

     enable_interrupts(GLOBAL);
     enable_interrupts(INT_SSP);
     DEGER1 = 0;
     
     while(1)
     {
        OUTPUT_D(DEGER1);
        printf("DEGER1: %x\r\n",DEGER1);
        printf("DEGER2: %02x\r\n\r\n",DEGER2);
        delay_ms( 100 );
     }

}

Proje...

MURSEL

@ahmet2004 arkadaşım ALLAH razı olsun  süper örnek tam istedigim gibi basit , sade ve güzel  bunu geliştirmeye calışıcam  1 haftanın sonunda işe yarar bişeyler buldum    :D  :D  :D  :D

MURSEL

@ahmet2004 bunun 3 piclisini yapabiliriymiyiz asıl  istedigim bu birden fazla pici  ı2c ile haberleştirmek sonrada  en son master pici   pc ile haberleşistirecem  master pic  verileri topluyacak ve veri yazacak  ben biraz  cırpınayım yapamassam yardımınızı isterim

CaFFeiNe





Proteus versiyonu 7.1 SP2 (Build 3692) bunundamı eepromlarında problem var? yukarıdaki gibi basit bir örnek bile çalışmadı

elinde 6.7 versiyon kurulu birisi hayrına deneyebilirmi?