Haberler:

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

Ana Menü

i2c eeprom sorunu

Başlatan deserteagle, 14 Şubat 2009, 13:30:02

deserteagle

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[/URL][/img]

MURSEL

yanlışlık var sematikte epromun datashet bak

M_B

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.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

deserteagle

hocam bende dediğiniz kodları bi deneyeyim datsheete de detaylı bir inceleyim.ikinizde sağolun

deserteagle

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

arslan74

Merhaba,

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

Selamlar

deserteagle

Alıntı yapılan: arslan74Merhaba,

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

Selamlar
hocam sağolasın.

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);	
			}

	}
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

arslan74

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,

deserteagle

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.

deserteagle

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
}

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

tyilgin

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..

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
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

tyilgin

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..

tyilgin

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..

Benzer Konular (5)