Picproje Elektronik Sitesi

DERLEYİCİLER => Hi-Tech => Konuyu başlatan: deserteagle - 14 Şubat 2009, 13:30:02

Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 14 Şubat 2009, 13:30:02
merhabalar.
birkaç gündür 24lc01 e veri kaydetmeye çalışıyorum fakat bir türlü başaramadım.acaba atladığım bir şeymi var.
kod

#include <htc.h>
#include <delay.c>
#include <i2c.c>

void WriteByte(unsigned char addr, unsigned char byte)
{
i2c_PutByte(addr);
   i2c_PutByte(byte);
}



void main()
{
TRISB=0;
TRISE=0b011;
PORTB=0;




i2c_Start();
i2c_PutByte(0xa2);
               WriteByte(0x00,0x0f);
i2c_Stop();
DelayMs(250);
DelayMs(250);
for(;;);



}





devre ise(//%5BURL=http://img12.imageshack.us/my.php?image=adszcy9.jpg%5D%5Bimg%5Dhttp://img12.imageshack.us/img12/6792/adszcy9.th.jpg)[/URL][/img]
Başlık: i2c eeprom sorunu
Gönderen: MURSEL - 14 Şubat 2009, 13:42:51
yanlışlık var sematikte epromun datashet bak
Başlık: i2c eeprom sorunu
Gönderen: M_B - 14 Şubat 2009, 15:46:36
Oncelıkle 24CXX türü epromlara bilgi yazmak ve okuma sekli aşağıdaki şekilde


i2c_Start()
i2c_WriteByte(0xA0)   // Eepromun adresi Datasheet te yazıyor
i2c_WriteByte(adres1)
i2c_WriteByte(adres2)
i2c_WriteByte(data)   // Yazmak istedigin veri
i2c_Stop()

Okuma kısmı :
i2c_Start()
i2c_WriteByte(0xA0)   // Eepromun adresi Datasheet te yazıyor
i2c_WriteByte(adres1)
i2c_WriteByte(adres2)
i2c_Rstart()
i2c_WriteByte(0xA1)  
i2c_Read(data)
i2c_Stop()

Not:  
Yukarda yazdıklarım da  hata veya yanlısım olabilir.
Su an bende bu konu uzerınde calısıyorum
Yapıp çalıştırabilirsem buraya koyacagım.
Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 14 Şubat 2009, 19:50:08
hocam bende dediğiniz kodları bi deneyeyim datsheete de detaylı bir inceleyim.ikinizde sağolun
Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 14 Şubat 2009, 20:39:48
dediğinzi kodları denedim .dediğiniz gibi eepromun adresini falan gönderdim ama halen somut bir şey elime geçmedi.yeni yanıtlarınızı bekliyorum.
teşekkürler
Başlık: i2c eeprom sorunu
Gönderen: arslan74 - 16 Şubat 2009, 20:28:38
Merhaba,

Ben 24c512 ile ilgili örnek kod yayınlamıştım. o kodları deneyin.

Selamlar
Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 16 Şubat 2009, 22:34:16
Alıntı yapılan: arslan74Merhaba,

Ben 24c512 ile ilgili örnek kod yayınlamıştım. o kodları deneyin.

Selamlar
hocam sağolasın.
Başlık: i2c eeprom sorunu
Gönderen: M_B - 18 Şubat 2009, 15:53:08
Alıntı yapılan: arslan74Merhaba,

Ben 24c512 ile ilgili örnek kod yayınlamıştım. o kodları deneyin.

Selamlar


Merhaba hocam ;

https://www.picproje.org/index.php/topic,18861&highlight=i2c
linkteki kodunuzu kullanarak bir seyler yapmaya calıstım ama malesef
yazdıgım veriyi okuyamadım.
kodum aşagıdadır.
Acaba nerde hata yapmış olabilirim.

Not: SCL yi pul up da denedım pull upsızda degısen bır sey olmadı.
Yoksa hocam kutuphanenizi mi yanlış kulladım.
simülasyon devresi olarak proteus taki PİCDEM2 yi kullanıyorum.

#include <pic.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"
#include "877-i2c.h"

#define  yaz RA4
#define  oku RB0

unsigned char outString[17];
unsigned char veri;
unsigned char adres;

void main(void)
{
ADCON1 = 0x06; // ADC iptal.
TRISB=0b00000001;
TRISA4=1;
PORTB=0;
veri =64;
adres=50;

i2c_init();


lcd_init(FOURBIT_MODE);

lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazilak ");
lcd_goto(S2_1); // 1. satırının 1.cü sütününa git
sprintf (outString, "veri= %d  ", veri );
lcd_puts(outString);

lcd_goto(S2_10); // 2. satırının 1.cı sütününa git
sprintf (outString, " adres = %d  ", adres );
lcd_puts(outString);
veri=0;

while(1){
if(!yaz)
{ DelayUs(180);
lcd_clear();
i2c_write(50,64);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazildi");

}
if(!oku)
{ DelayUs(180);
lcd_clear();
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Okunan Veri=");
veri=i2c_read(50);
sprintf (outString, " %d  ", veri );
lcd_puts(outString);
}

}
}

Başlık: i2c eeprom sorunu
Gönderen: arslan74 - 18 Şubat 2009, 19:54:53
Merhaba,

Bu proje ile ilgileneli cok zaman gecti. Şimdi bir cok şeyi hatırlamiyorum.
Haberleşmeyi yazılımsal olarak yaptığım için OSC frekansı cok önemli. Ben 4Mhz ile PIC i kullaniyorum. Örnek kod tekrar yayınlıyorum.

Herader dosyası:
http://rapidshare.com/files/199586564/877-i2c.h.html

Kod Dosyası:
http://rapidshare.com/files/199660242/877-i2c.c.html


Selamlar,
Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 18 Şubat 2009, 21:15:24
aslan hocam iki gündür verdiğiniz kodu deniyorum.bir kaç kere denedim.yazdı.fakat hiçbirşey değiştirmememe  rağmen artık yazmamıyorum.biraz daha uğraşıyım bakalım ne çıkacak.somut birşy elde edebilirsem tartışalım.
Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 18 Şubat 2009, 22:32:20
bu kodları bir internet sitesinde buldum.
877_i2c

/*===========================================================================
Written in HI-TEC PIC C COMPILER                                       8.6.01


this program is using the hardware i2c on the pic 16f877 to write

to 24LC01B configured for a x8 org  I used the  PICDEM 2 demo board from MICROCHIP


===========================================================================

the project contains 2 files:

877_i2c.h this is the header file all functions are in it include it in your project

877_i2c.c this is a demo program to illustrate using this header


 to use the files :

 init_i2c();               Call before the other functions are used
 
 write_ext_eeprom(a, d);   Write the byte "d"  to the address" a"
 
 d = read_ext_eeprom(a);   Read the byte "d" from the address" a"

===========================================================================

the demo program is writing 10  numbers (0 to 10) to 10 first pleases in the eeprom memory

and showing it on leds on PORTB on PICDEM 2,

after it lights all the leds once to indicate moving to read state,

and then it lights on the leds of the address it is going to read, waiting a while

and sends to leds the data it read from that address an so on,  10 times for  the 10 read addresses

(attention!! THE ADDRESS AND THE DATA IT READ should be the SAME if not check the pin connection or

the 820 ohm pull up resistors).

I used 24LC01B that was on the board:

pin 1 to 4 connected to VSS
pin 5 "SDA" connected to  RC4 PIN 23 on PIC (do not forget to connect to this point a 820 ohm pull up resistor to VCC)
pin 6 "SCL" connected to  RC3 PIN 18 on PIC (do not forget to connect to this point a 820 ohm pull up resistor to VCC)
pin 7 "WP"  connected to  VSS
pin 8 connected to VCC

you can watch the eeprom connection drawings in PICDEM 2 MANUEL on microchip site WWW.MICROCHIP.COM

the PICDEM 2 is using 2 pull up resistors of 820 ohm on the board.


*/

/******************************************************************************************/

#include <pic18.h>
#include "delay.h"
#include "delay.c"
#include  "877_i2c.h"

/******************************************************************************************/

void write_ext_eeprom(unsigned char address, unsigned char data)
{
  i2c_start();
  i2c_write(0xa0);
  i2c_write(address);
  i2c_write(data);
  i2c_stop();
  DelayMs(11);
}

/******************************************************************************************/

unsigned char read_ext_eeprom(unsigned char address)
{
  unsigned char data;

  i2c_start();
  i2c_write(0xa0);
  i2c_write(address);
  i2c_repStart();
  i2c_write(0xa1);
  data=i2c_read(0);
  i2c_stop();
  return(data);
}

/******************************************************************************************/

void main()
{
unsigned char i=0;

PORTB=0x00;    // port
PORTC=0x00;    // port

TRISB=0x00;    //portb out
TRISC=0x00;    //portc out

i2c_init();    // init i2c

while(i<=10)   /* write 10 numbers to eeprom */
 {        
 PORTB=i;                  // the value of i on leds i is the curent address and also the data
 write_ext_eeprom(i,i);   // it to eeprom
 i++;
 DelayMs(255);
 }


PORTB=0xff;         // some leds
DelaySec(1);
PORTB=0x00;
DelaySec(1);

i=0;

while(i<=10)
 {
 PORTB=i;                 // the address will read from the EEprom on the leds
 DelayMs(255);
 PORTB=0x00;      // leds off
 DelayMs(255);
 PORTB=read_ext_eeprom(i);   // the memory and show it on leds,it shoaled be the same like the address
 DelayMs(255);
 i++;
 }
}
/******************************************************************************************/



877_i2c.h





/******************************************************************************************/
// Hardware I2C single master routines for PIC16F877
// for HI-TEC PIC C COMPILER.
//
// i2c_init  - initialize I2C functions
// i2c_start - issue Start condition
// i2c_repStart- issue Repeated Start condition
// i2c_stop  - issue Stop condition
// i2c_read(x) - receive unsigned char - x=0, don't acknowledge - x=1, acknowledge
// i2c_write - write unsigned char - returns ACK
//
// modified from CCS i2c_877 demo
//
//
/******************************************************************************************/

void i2c_init()
{
TRISC3=1;           // set SCL and SDA pins as inputs
TRISC4=1;

SSPCON = 0x38;      // set I2C master mode
SSPCON2 = 0x00;

//SSPADD = 0x6;     // 400kHz bus with 10MHz xtal - use 0x0C with 20MHz xtal
SSPADD = 10;            // 100k at 4Mhz clock

STAT_CKE=0;     // use I2C levels      worked also with '0'
STAT_SMP=1;     // disable slew rate control  worked also with '0'

PSPIF=0;      // clear SSPIF interrupt flag
BCLIF=0;      // clear bus collision flag
}

/******************************************************************************************/

void i2c_waitForIdle()
{
while (( SSPCON2 & 0x1F ) | STAT_RW ) {}; // wait for idle and not writing
}

/******************************************************************************************/

void i2c_start()
{
i2c_waitForIdle();
SEN=1;
}

/******************************************************************************************/

void i2c_repStart()
{
i2c_waitForIdle();
RSEN=1;
}

/******************************************************************************************/

void i2c_stop()
{
i2c_waitForIdle();
PEN=1;
}

/******************************************************************************************/

int i2c_read( unsigned char ack )
{
unsigned char i2cReadData;

i2c_waitForIdle();

RCEN=1;

i2c_waitForIdle();

i2cReadData = SSPBUF;

i2c_waitForIdle();

if ( ack )
 {
 ACKDT=0;
 }
else
 {
 ACKDT=1;
 }
 ACKEN=1;               // send acknowledge sequence

return( i2cReadData );
}

/******************************************************************************************/

unsigned char i2c_write( unsigned char i2cWriteData )
{
i2c_waitForIdle();
SSPBUF = i2cWriteData;

return ( ! ACKSTAT  ); // function returns '1' if transmission is acknowledged
}

/******************************************************************************************/



Başlık: i2c eeprom sorunu
Gönderen: tyilgin - 19 Şubat 2009, 12:43:23
Arkadaşlar ben çalışmalarımın simülasyonu sırasında proteusun i2c debuggerından çok faydalanmıştım.

bence en önemli yardımcınız olacaktır.

o günlerde bayağı bir tırmalamıştım. yeri gelmişken arslan_74'e tekrar teşekkür ederim.

kolay gelsin..
Başlık: i2c eeprom sorunu
Gönderen: M_B - 19 Şubat 2009, 13:04:02
Alıntı yapılan: tyilginArkadaşlar ben çalışmalarımın simülasyonu sırasında proteusun i2c debuggerından çok faydalanmıştım.

bence en önemli yardımcınız olacaktır.

o günlerde bayağı bir tırmalamıştım. yeri gelmişken arslan_74'e tekrar teşekkür ederim.

kolay gelsin..

Hocam proteusun i2c debuggerın nasıl kullanıldıgını tam olarak bılmıyorum denedım ama basaramadım.
mumkunse kullanımını tarif edebilirmisinız
Başlık: i2c eeprom sorunu
Gönderen: tyilgin - 20 Şubat 2009, 17:25:52
Alıntı yapılan: M_B
Alıntı yapılan: tyilginArkadaşlar ben çalışmalarımın simülasyonu sırasında proteusun i2c debuggerından çok faydalanmıştım.

bence en önemli yardımcınız olacaktır.

o günlerde bayağı bir tırmalamıştım. yeri gelmişken arslan_74'e tekrar teşekkür ederim.

kolay gelsin..

Hocam proteusun i2c debuggerın nasıl kullanıldıgını tam olarak bılmıyorum denedım ama basaramadım.
mumkunse kullanımını tarif edebilirmisinız

üzerinden hayli zaman geçtiği için debuggerin monitör ekranının görüntüsünü hatırlıyamıyorum ama şöyle bir yol izleyebileceğinizi düşünüyorum ;

proteusta debuggerın nasıl bağlanacağını bildiğinizi düşünerek (blimiyorsanız belirtin yardımcı olurum) önce çalıştığını bildiğiniz bir hex ve şema bularak proteusta simüle edin. debuggeri de i2c eeprom pinlerine paralel bağlayın. i2c eepromda pull-up direnci olarak sakın "res" tipi herhangi bir direnç koymayın çalışmaz. Mutlaka PULL-UP direnci olmalı. sonra hexi çalıştırarak debuggerın monitöründe neler geçtiğini görün. son olarakta sizin programınızı simüle ettiğinizde nelerin eksik gittiğine bakın.

umarım faydası olur..

kolay gelsin..
Başlık: i2c eeprom sorunu
Gönderen: tyilgin - 20 Şubat 2009, 18:25:20
dayanamayıp size birkaç şey hazırladım.

bu çalışmada üstteki butona basınca eprom üzerinden 10 karakter okuyor, alttaki butona basınca ise epromun 0. adresine 0x90 değerini yazıyor. üğstteki buton okuma sonrası 0. adresten 0x90 okudu ise C portu 0xFF oluyor aksi durumda 0x00. zamanım kısıtlı olduğu için lcd falan koyamadım.
gelelim debuggere;

resimdek
çıktı yazma sırasında geçen paket. önce (S) start sonra klasik başlangış komutu 0xA0 sonra ise 256bytettan daha büyük bir eprom olduğu için 2 adet adres karakteri sonrasında da "90" değeri görülüyor.

okuma sırasında ise birinci karakter olan 90'ı ve sonrasını gözlemleyebiliyorsunuz.

daha fazla zaman ayıramayacağım. eksiğim veya noksanım varsa forumdaki diğer arkadaşlarda gözden geçirirse iyi olur.

kolay gelsin

ana porogram:

#include <htc.h>
#include <delay.c>
#include "i2c.h"

__CONFIG(UNPROTECT & WDTDIS & PWRTEN & XT & LVPDIS);

char dizi[20];

#define Buton1 RB0
#define Buton2 RB4

//***************************************************************************************
void I2C_oku(void) {
i2c_read2(0x0, 10, dizi);
if(dizi[0]==0x90) PORTC=0xFF; else PORTC=0;
}
//***************************************************************************************
void I2C_yaz(void) {
i2c_write2(0x0, 0x90);
}
//***************************************************************************************
void main(void) {
unsigned char byte;
unsigned char SeriKomut, araci;
RBPU = 0;
ADCON1=6;

OPTION=0;
TRISA = 0b11111111;
TRISB = 0b11111111;
TRISC = 0b00000000;
TRISD = 0b11111111;
TRISE = 0b111;

DelayMs(250); DelayMs(250); DelayMs(250);

PORTC=0;

i2c_init();

while(1) {
if (!Buton1) {
I2C_oku();
DelayMs(250); DelayMs(250);
}

if (!Buton2) {
I2C_yaz();
DelayMs(250); DelayMs(250);
}
}
}
//***************************************************************************************


kendi yazdığım i2c.c;
#include <pic.h>
#include <delay.h>
#include "i2c.h"

void gecikme(void) {
unsigned char sayac;
//for (sayac=0;sayac<5;sayac++);
}

void i2c_init(void) {
i2c_clk = 1;
i2c_dta = 1;
i2c_dtayon = 0;
i2c_clkyon = 0;
i2c_clk = 1;
i2c_dta = 1;
}

void i2c_start(void) {
i2c_dta = 1;
i2c_clk = 1;
gecikme();
i2c_dta = 0;
gecikme();
i2c_clk = 0;
}

void i2c_stop(void) {
i2c_dta = 0;
gecikme();
i2c_clk = 1;
gecikme();
i2c_dta = 1;
}

unsigned char i2c_write_int(unsigned char veri) {
unsigned char bits, sayac, sonuc;
bits=0x80;
for (sayac=0; sayac<8; sayac++) {
i2c_clk=0;
if (veri & bits) i2c_dta=1; else i2c_dta=0;
gecikme();
i2c_clk=1;
gecikme();
i2c_clk=0;
bits=bits>>1;
}
i2c_clk = 0;
i2c_dtayon = 1;
gecikme();
i2c_clk = 1;
gecikme();
sonuc = i2c_dta;
//if (i2c_dta==1) {
i2c_clk = 0;
i2c_dtayon = 0;
return sonuc;
}

unsigned char i2c_read_int(void) {
unsigned char bits, sayac, veri;
bits=0x80;
veri=0;
i2c_clk = 0;
i2c_dtayon = 1;
gecikme();
for (sayac=0; sayac<8; sayac++) {
i2c_clk = 1;
if ( i2c_dta==1 ) veri |= bits;
i2c_clk = 0;
gecikme();
bits = bits >> 1;
}
i2c_dtayon  = 0;
i2c_dta = 0;
i2c_clk = 1;
gecikme();
i2c_clk = 0;
return veri;
}

unsigned char i2c_readson(void) {
unsigned char bits, sayac, veri;
bits=0x80;
veri=0;
i2c_clk = 0;
i2c_dtayon = 1;
for (sayac=0; sayac<8; sayac++) {
i2c_clk = 1;
gecikme();
if ( i2c_dta==1 ) veri |= bits;
i2c_clk = 0;
gecikme();
bits = bits >> 1;
}
i2c_dtayon  = 0;
i2c_dta = 1;
i2c_clk = 1;
gecikme();
i2c_clk = 0;
return veri;
}

unsigned char i2c_write(unsigned char adres, unsigned char veri) {
unsigned char hata;
i2c_start();
hata=i2c_write_int(0xA0);
if (hata) goto Cik;
hata=i2c_write_int(adres);
if (hata) goto Cik;
hata=i2c_write_int(veri);
i2c_stop();
Cik:
return hata;
}

unsigned char i2c_write2(unsigned int adres, unsigned char veri) {
unsigned char adresh, adresl, hata;
adresh = (adres >> 8) & 0x00FF;
adresl = adres & 0x00FF;
i2c_start();
hata=i2c_write_int(0xA0);
if (hata) goto Cik;
hata=i2c_write_int(adresh);
if (hata) goto Cik;
hata=i2c_write_int(adresl);
if (hata) goto Cik;
hata=i2c_write_int(veri);
i2c_stop();
Cik:
return hata;
}

unsigned char i2c_read(unsigned char adres, unsigned char uzunluk, unsigned char *veri) {
unsigned sayac, hata;
i2c_start();
hata=i2c_write_int(0xA0);
if (hata) goto Cik;
hata=i2c_write_int(adres);
if (hata) goto Cik;
i2c_start();
hata=i2c_write_int(0xA1);
if (hata) goto Cik;
for (sayac=0; sayac<(uzunluk-1); sayac++) *(veri+sayac) = i2c_read_int();
*(veri+uzunluk-1) = i2c_readson();
i2c_stop();
*(veri+uzunluk) = '\0';
Cik:
return hata;
}

unsigned char i2c_read2(unsigned int adres, unsigned char uzunluk, unsigned char *veri) {
unsigned char sayac, hata, adresh, adresl;
adresh = (adres >> 8) & 0x00FF;
adresl = adres & 0x00FF;
i2c_start();
hata=i2c_write_int(0xA0);
if (hata) goto Cik;
hata=i2c_write_int(adresh);
if (hata) goto Cik;
hata=i2c_write_int(adresl);
if (hata) goto Cik;
i2c_start();
hata=i2c_write_int(0xA1);
if (hata) goto Cik;
for (sayac=0; sayac<(uzunluk-1); sayac++) *(veri+sayac) = i2c_read_int();
*(veri+uzunluk-1) = i2c_readson();
i2c_stop();
*(veri+uzunluk) = '\0';
Cik:
return hata;
}


ve ic2.h :

#ifndef I2C_H_
 #define I2C_H_
#endif /*I2C_H_*/

#ifndef i2c_clk
 #define i2c_clk RA2
#endif

#ifndef i2c_dta
 #define i2c_dta RA3
#endif

#ifndef i2c_clkyon
 #define i2c_clkyon TRISA2
#endif

#ifndef i2c_dtayon
 #define i2c_dtayon TRISA3
#endif

extern void i2c_init(void);

extern unsigned char i2c_write(unsigned char adres, unsigned char veri);

extern unsigned char i2c_write2(unsigned int adres, unsigned char veri);

extern unsigned char i2c_read(unsigned char adres, unsigned char uzunluk, unsigned char *veri);

extern unsigned char i2c_read2(unsigned int adres, unsigned char uzunluk, unsigned char *veri);


umarım faydası olur.

kolay gelsin..
Başlık: i2c eeprom sorunu
Gönderen: tyilgin - 20 Şubat 2009, 18:29:22
dosyaları unutmuşum.

burada da proteus simülasyonu, i2c ekran görüntüsü, ve diğer kodlar mevcut.




(http://www.loadtr.com/resimekle.php?r=z1.341790)

dosyalar burada (http://rapidshare.com/files/200420481/i2c.rar.html)
Başlık: i2c eeprom sorunu
Gönderen: M_B - 20 Şubat 2009, 19:20:06
@tyilgin hocam;
Allah razı olsun.
Elinize sağlık simdi indirip inceleyecegim
vakit ayırıp yardımcı olmanız bile yeter

Tekrar Teşekkürler

M_B
Başlık: i2c eeprom sorunu
Gönderen: tyilgin - 20 Şubat 2009, 19:51:27
Alıntı yapılan: M_B@tyilgin hocam;
Allah razı olsun.
Elinize sağlık simdi indirip inceleyecegim
vakit ayırıp yardımcı olmanız bile yeter

Tekrar Teşekkürler

M_B

yardımcı olabildiysem ne mutlu.

iyi akşamlar dilerim.
Başlık: i2c eeprom sorunu
Gönderen: ahmet2004 - 20 Şubat 2009, 20:11:05
Bu FULL kodlu Animasyonlu projeyi'de çalıştırıp incelermisiniz?

(http://img4.imageshack.us/img4/4620/2002nh5.png)

(http://img23.imageshack.us/img23/2553/2102su0.png)

http://www.4shared.com/file/88659788/110ce0ff/I2C_24LC01B_ahmet2004.html (http://www.4shared.com/file/88659788/110ce0ff/I2C_24LC01B_ahmet2004.html)
Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 20 Şubat 2009, 22:20:23
tüm hocalarım yardımlarınız için teşekkür ederim.tüm kodları denedim ama sonuç sıfır.bende en baştan alayım dedim.önce i2c nini philipsin döküman larını inceledim ve en temel kaynak olan hi -tech in içindeki demo yu çalıştırdım ve bişi farkettim i2c debuggerden gördüğüm kadarıyla picden  eproma tüm veriler gönderiliyor fakat sanırım eprom yazmıyor.halbuki onay falan var.acaba proteusda bu similasyondamı sorun varki?burada hardware i2c olduğundan her iki bittede direnç var.

bunu sizler kendiniz derleseniz ve proteusla bi similisayon yapsanız belki bizim programda hata vardır.
yardımlarınız için teşekkürler
demo:::/* I2C test program that writes & reads data to an I2C EEPROM device. */

#include <pic18.h>
#include "delay.h"
#include "i2c.h"

#define ROM 0xA0        /* I2C EEPROM */

void flashled(void) {           /* flash a led on RB0 */
while(1) {
           RB0 = 1;
           DelayMs(200);
           RB0 = 0;
           DelayMs(200);
}
}


void WriteByte(unsigned char addr, unsigned char byte) {
i2c_WriteTo(ROM);
if (i2c_PutByte(addr)==I2C_ERROR)
           flashled();
if (i2c_PutByte(byte)==I2C_ERROR)
           flashled();
}

int ReadByte(unsigned char addr) {
i2c_WriteTo(ROM);
if (i2c_PutByte(addr)==I2C_ERROR)
           flashled();
       i2c_ReadFrom(ROM);
return i2c_GetByte(I2C_LAST);
}

void main(void) {
unsigned char count,val;

TRISB=0;        /* use a led on RB0 - set as output */
PORTB=0;
RB0=0;

/* initialize i2c */
#ifdef I2C_MODULE
   SSPMode(MASTER_MODE);
   SSPEN = 1;
   CKP = 1;
#else
   SCL_DIR = I2C_OUTPUT;
   SDA_DIR = I2C_OUTPUT;
   SDA = 0;
   SCL = 0;
#endif


while(1) {
   for(count=0; count < 10; ++count) {
       WriteByte(count,count);           /* write to I2C EEPROM */
       val = ReadByte(count);            /* read back value */
       if (val != count)                 /* verify */
           flashled();
   }
   DelayMs(200);
}
}




i2c debugger da çıkan noise ifadesi ne gürültüsüdürki anlamadım.
(http://img5.imageshack.us/img5/7162/adsz1z.th.jpg) (http://img5.imageshack.us/my.php?image=adsz1z.jpg)

bu ise proteus
(http://img15.imageshack.us/img15/4010/adsz2k.th.jpg) (http://img15.imageshack.us/my.php?image=adsz2k.jpg)
Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 25 Şubat 2009, 01:25:21
baya uğraştım fakat hep aynı sonuç.acaba hi-tech in demo dosyasındaki programda çalışmazsa biz ne yapalım.
Başlık: eprom sorunu
Gönderen: nuray - 26 Şubat 2009, 01:48:14
merhaba  matristeki engelleri sharp sensörle görerek eprom hafızaya kaydetme işlemi yapan proje  tasarlıyoruz.
16f877A pic kullanıyoruz engeli hafızaya nasıl aldırırız, engeli hafızaya alıp engeli yerinden kaldırdığımızda engelin bulunduğu yere gitmeyecek
Başlık: i2c eeprom sorunu
Gönderen: M_B - 07 Mart 2009, 10:21:49
Sonunda i2c ile ilgili calısmamda eproma yazıp okuya bildim.
Su an kutuphane seklıne getırmedım. Eksıklerım var ama en azından calısır duruma geldı. En azından baskalarına yol gosterır.


simülasyon devresi olarak proteus taki PİCDEM2 yi kullanıyorum.


#include <pic.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"


#define  yaz RA4
#define  oku RB0

#define i2c_scl RC3
#define i2c_sda RC4

#define i2c_scl_direction TRISC3
#define i2c_sda_direction TRISC4

unsigned char outString[17];
unsigned char veri;
unsigned char adres;

void i2c_init(void)
{
i2c_scl= 0;
i2c_sda= 0;
i2c_scl_direction = 1;
i2c_sda_direction = 1;
}

void i2c_start(void)
{
DelayUs(10);
i2c_sda_direction = 1;
DelayUs(10);
i2c_scl_direction = 1;
DelayUs(10);
i2c_sda_direction = 0;
DelayUs(10);
i2c_scl_direction = 0;
DelayUs(10);
}

void i2c_stop(void)
{
DelayUs(10);
i2c_sda_direction = 0;
DelayUs(10);
i2c_scl_direction = 0;
DelayUs(10);
i2c_scl_direction = 1;
DelayUs(10);
i2c_sda_direction = 1;
DelayUs(10);
}



bit i2c_tx(unsigned char d )
{
char x;
static bit b;
for(x=8;x; x--){
if(d&0x80) i2c_sda_direction = 1;
else
i2c_sda_direction = 0;
i2c_scl_direction = 1;
d<<=1;
i2c_scl_direction = 0;
}
i2c_sda_direction = 1;
i2c_scl_direction = 1;
DelayUs(10);
b = i2c_sda;
i2c_scl_direction = 0;
return b;
}

unsigned char i2c_rx(char ack )
{
char x,d = 0;
i2c_sda_direction = 1;
for(x=0; x<8; x++) {
d<<=1;
do {
i2c_scl_direction = 1;
}
while(i2c_scl==0);
DelayUs(10);
if(i2c_sda) d|=1;
i2c_scl_direction = 0;
}
if(ack) i2c_sda_direction =0;
else
i2c_sda_direction = 1;
i2c_scl_direction =1;
DelayUs(10);
i2c_scl_direction =0;
i2c_sda_direction =1;
return d;
}

i2c_write( char address, char data )
{    
i2c_start();
i2c_tx(0xA0);
i2c_tx(0x00);
i2c_tx(address);
i2c_tx(data);
i2c_stop();
}
i2c_read(unsigned char adres)
{
unsigned int ee_data;
i2c_start();
i2c_tx(0xA0);
i2c_tx(00);
i2c_tx(adres);
i2c_start();
i2c_tx(0xA1);
ee_data = i2c_rx(adres);
i2c_stop();
return ee_data;
}

void main(void)
{
ADCON1 = 0x06; // ADC iptal.
TRISB=0b00000001;
TRISA4=1;
TRISC=0;
PORTB=0;
veri =65;
adres=10;
i2c_init();


lcd_init(FOURBIT_MODE);

lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazilak ");
lcd_goto(S2_1); // 1. satırının 1.cü sütününa git
sprintf (outString, "veri= %d  ", veri );
lcd_puts(outString);

lcd_goto(S2_10); // 2. satırının 1.cı sütününa git
sprintf (outString, " adres = %d  ", adres );
lcd_puts(outString);
veri=0;

while(1){
if(!yaz)
{ DelayUs(180);
lcd_clear();
i2c_write(10,65);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazildi");

}
if(!oku)
{ DelayUs(180);
lcd_clear();
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Okunan Veri=");
veri=i2c_read(10);
sprintf (outString, " %d  ", veri );
lcd_puts(outString);
}

}
}




Not: eksiklerim var.
Başlık: i2c eeprom sorunu
Gönderen: deserteagle - 07 Mart 2009, 23:38:11
Alıntı yapılan: M_BSonunda i2c ile ilgili calısmamda eproma yazıp okuya bildim.
Su an kutuphane seklıne getırmedım. Eksıklerım var ama en azından calısır duruma geldı. En azından baskalarına yol gosterır.


simülasyon devresi olarak proteus taki PİCDEM2 yi kullanıyorum.


#include <pic.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"


#define  yaz RA4
#define  oku RB0

#define i2c_scl RC3
#define i2c_sda RC4

#define i2c_scl_direction TRISC3
#define i2c_sda_direction TRISC4

unsigned char outString[17];
unsigned char veri;
unsigned char adres;

void i2c_init(void)
{
i2c_scl= 0;
i2c_sda= 0;
i2c_scl_direction = 1;
i2c_sda_direction = 1;
}

void i2c_start(void)
{
DelayUs(10);
i2c_sda_direction = 1;
DelayUs(10);
i2c_scl_direction = 1;
DelayUs(10);
i2c_sda_direction = 0;
DelayUs(10);
i2c_scl_direction = 0;
DelayUs(10);
}

void i2c_stop(void)
{
DelayUs(10);
i2c_sda_direction = 0;
DelayUs(10);
i2c_scl_direction = 0;
DelayUs(10);
i2c_scl_direction = 1;
DelayUs(10);
i2c_sda_direction = 1;
DelayUs(10);
}



bit i2c_tx(unsigned char d )
{
char x;
static bit b;
for(x=8;x; x--){
if(d&0x80) i2c_sda_direction = 1;
else
i2c_sda_direction = 0;
i2c_scl_direction = 1;
d<<=1;
i2c_scl_direction = 0;
}
i2c_sda_direction = 1;
i2c_scl_direction = 1;
DelayUs(10);
b = i2c_sda;
i2c_scl_direction = 0;
return b;
}

unsigned char i2c_rx(char ack )
{
char x,d = 0;
i2c_sda_direction = 1;
for(x=0; x<8; x++) {
d<<=1;
do {
i2c_scl_direction = 1;
}
while(i2c_scl==0);
DelayUs(10);
if(i2c_sda) d|=1;
i2c_scl_direction = 0;
}
if(ack) i2c_sda_direction =0;
else
i2c_sda_direction = 1;
i2c_scl_direction =1;
DelayUs(10);
i2c_scl_direction =0;
i2c_sda_direction =1;
return d;
}

i2c_write( char address, char data )
{    
i2c_start();
i2c_tx(0xA0);
i2c_tx(0x00);
i2c_tx(address);
i2c_tx(data);
i2c_stop();
}
i2c_read(unsigned char adres)
{
unsigned int ee_data;
i2c_start();
i2c_tx(0xA0);
i2c_tx(00);
i2c_tx(adres);
i2c_start();
i2c_tx(0xA1);
ee_data = i2c_rx(adres);
i2c_stop();
return ee_data;
}

void main(void)
{
ADCON1 = 0x06; // ADC iptal.
TRISB=0b00000001;
TRISA4=1;
TRISC=0;
PORTB=0;
veri =65;
adres=10;
i2c_init();


lcd_init(FOURBIT_MODE);

lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazilak ");
lcd_goto(S2_1); // 1. satırının 1.cü sütününa git
sprintf (outString, "veri= %d  ", veri );
lcd_puts(outString);

lcd_goto(S2_10); // 2. satırının 1.cı sütününa git
sprintf (outString, " adres = %d  ", adres );
lcd_puts(outString);
veri=0;

while(1){
if(!yaz)
{ DelayUs(180);
lcd_clear();
i2c_write(10,65);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazildi");

}
if(!oku)
{ DelayUs(180);
lcd_clear();
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Okunan Veri=");
veri=i2c_read(10);
sprintf (outString, " %d  ", veri );
lcd_puts(outString);
}

}
}




Not: eksiklerim var.

hocam elinize sağlık
Başlık: i2c eeprom sorunu
Gönderen: M_B - 26 Mart 2009, 17:44:43
Alıntı yapılan: M_B
Alıntı yapılan: arslan74Merhaba,

Ben 24c512 ile ilgili örnek kod yayınlamıştım. o kodları deneyin.

Selamlar


Merhaba hocam ;

https://www.picproje.org/index.php/topic,18861&highlight=i2c
linkteki kodunuzu kullanarak bir seyler yapmaya calıstım ama malesef
yazdıgım veriyi okuyamadım.
kodum aşagıdadır.
Acaba nerde hata yapmış olabilirim.

Not: SCL yi pul up da denedım pull upsızda degısen bır sey olmadı.
Yoksa hocam kutuphanenizi mi yanlış kulladım.
simülasyon devresi olarak proteus taki PİCDEM2 yi kullanıyorum.

#include <pic.h>
#include <stdio.h>
#include "lcd.h"
#include "delay.h"
#include "877-i2c.h"

#define  yaz RA4
#define  oku RB0

unsigned char outString[17];
unsigned char veri;
unsigned char adres;

void main(void)
{
ADCON1 = 0x06; // ADC iptal.
TRISB=0b00000001;
TRISA4=1;
PORTB=0;
veri =64;
adres=50;

i2c_init();


lcd_init(FOURBIT_MODE);

lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazilak ");
lcd_goto(S2_1); // 1. satırının 1.cü sütününa git
sprintf (outString, "veri= %d  ", veri );
lcd_puts(outString);

lcd_goto(S2_10); // 2. satırının 1.cı sütününa git
sprintf (outString, " adres = %d  ", adres );
lcd_puts(outString);
veri=0;

while(1){
if(!yaz)
{ DelayUs(180);
lcd_clear();
i2c_write(50,64);
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Eproma yazildi");

}
if(!oku)
{ DelayUs(180);
lcd_clear();
lcd_goto(S1_1); // 1. satırının 1.cü sütününa git
lcd_puts("Okunan Veri=");
veri=i2c_read(50);
sprintf (outString, " %d  ", veri );
lcd_puts(outString);
}

}
}



arslan74 hocam size yukardaki soruyu sormus ve sizin kodu çalıştıramıştım. Hocam sizin kodda ufak bir hata buldum ve düzelltim sorunsuz olarak çalısıyor.

Hem size bilgi vermek hemde diğer yararlanmak isteyen arkadaşlara yardımı olsun birde  https://www.picproje.org/index.php/topic,18861&highlight=i2c  
yerdeki kaynak koddaki hatalı yeri editleyip düzelmeniz için bilgi vermek istedim.  

Teşekkürler
M_B


düzeltiğim noktalar:

void set_clk_low ( void ){
   
  SCL = 0;    
  SCL_TRIS = 0;
   
}

void set_clk_high ( void ){
   
   
  SCL = 1;    
  SCL_TRIS = 1;
     
   
}

void set_sdo_low ( void ){
   
  SDA = 0;    
  SDA_TRIS = 0;
   
}

void set_sdo_high ( void ){
   
  SDA = 1;    
  SDA_TRIS = 1;
   
}
Başlık: i2c eeprom sorunu
Gönderen: arslan74 - 26 Mart 2009, 20:13:42
Merhaba,

Sen koda yaptığın değişikliğin bir önemi yok yapsanda olur yapmasan da. Ama sen yine benim yaptığım gibi çalıştır daha sağlıklı olur. Benim verdiğim kod çalışmiyorsa Kullandığın Pullup dirençin değerini değiştir.

Selamlar