i2c eeprom sorunu

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

tyilgin

dosyaları unutmuşum.

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






dosyalar burada

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
İ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"@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.

ahmet2004

Bu FULL kodlu Animasyonlu projeyi'de çalıştırıp incelermisiniz?





http://www.4shared.com/file/88659788/110ce0ff/I2C_24LC01B_ahmet2004.html

deserteagle

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.


bu ise proteus

deserteagle

baya uğraştım fakat hep aynı sonuç.acaba hi-tech in demo dosyasındaki programda çalışmazsa biz ne yapalım.

nuray

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
İnşallah derse yakaran inşa eder Yaradan!!

M_B

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

deserteagle

Alıntı yapılan: "M_B"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.

hocam elinize sağlık

M_B

Alıntı yapılan: "M_B"
Alıntı yapılan: "arslan74"Merhaba,

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

arslan74

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