i2c ile eproma yazma hakkında

Başlatan picman, 23 Ocak 2010, 12:03:36

picman

arkadaşlar 24c256 epromuna yazma okuma uygulaması yapmaya çalışıyorum yazdığım kodlar çalıştı da . yanlız kafama takılan bir soru var
eproma sıralı yazdırma işleminde belli bir karakterin ötesine geçemiyor ama sıralı okuma işleminde tüm hafızayı okuyabiliyor. bu bir problem midir yoksa epromun özelliğimi. birde stop verisini gönderdikten sonra başka bir okuma yada yazam yapmak için 10ms gibi bir bekleme süresine ihtiyaç duyuyor aksi halde eproma okuyup yaz mıyor . seri epromlarda sıralı yazma yaparken en fazla kaç byte gönderebiliriz. birde stop verisinden sonra neden beklemek gereklidir.
seri eprom hakkında bilgisi olan arkadaşlardan yardım bekliyorum ...
herkese iyi çalışmalar..
Bilgi paylaştıkça artar..

Macera

Bu eepromlara yazarken entegrenin özeliğine göre beli bir sayıda karakter yollayabilirsin vede kaydedebilirsin.(24C256 da 64 byte diye biliyorum)
Entegrenin ara hafızaya aldığı veriyi 5 ms yada 10 ms sürede eproma kaydeder.Bu süre içinde entegre hiç bir işlem yapmaz.Kaydetme işlemi bittikten sonra ancak ikinci 64 byte lık veriyi yollarsın.Kaydetme işlemi sırasında acknowledge döngüsü yaparsan daha hızlı cevap verir yani 5 ms kadar beklemezsin.
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

OptimusPrime

sıralı okumada da 64 byte ın fazlasını okuyamıyor. okuyor görününyor fakat dikkat edersen alakasız değerlerle geri dönüyor.

çipin belleğini sayfa sayfa düşün mesela 0 ila 63 arası adresler bir sayfa olsun. çip bir anda 64 byte okuyabiliyor fakat sayfa değişimi varsa yani adresin bir sonraki 64 byte a kayıyorsa yanlış okuyor.

mesela başlangıç adresini 60 verdin diyelim. sıralı olarak 10 byte okumak istiyorsun. adres 63 e kadar doğru değerlerle geri dönüyor fakat sonrasında sayfa değişimi söz konusu olduğundan yanlış veriler geri döndürüyor. o yüzden sıralı okuma veya yazma yaparken belleğin neresinde olduğunu ve ne kadar veriyi doğru okuyabileceğini hesaba katmalısın.

aynı şeyler yazma içinde geçerli.

yazmadaki bir sorunda stop dan sonra bir miktar beklemek gerekiyor. bu zaman zarfında aldığı verileri belleğine kaydediyor.

gibi.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

picman

arkadaşlar biraz geç oldu ama çok teşekkür ederim....
Bilgi paylaştıkça artar..

picman

arkadaşlar sürekli eprom ile alakalı sorular soruyorum kusura bakmayın. bir sorum daha olucak. ben seri epromla haberleşme işlemini mssp modulü ile yapmaya çalışıyorum. eproma yazma işleminde hiç bir hata yok , fakat okuma işleminde problemler var. sıralı okuma işleminde her byte ı ara vermeden okuduğumda doğru okuyor. fakat her byte arasına zaman gecikmesi koyduğumda hatalı okuyor. bu sorunu bir türlü çözemedim. ben devrede her byte ı bir hamle de değil belirli zaman aralıklarıyla okumam gerekli . bu konuda bana yardımcı olun lütfen ..
kodlar aşağıda ayrıca proteus dosyası ve mplab ile yazılmış c dosyalarıda aşağıdaki linkte

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

#define NULL '\0'
#define ack 0
#define nack 1

unsigned char i;
unsigned char veri;

void SSPIF_bekle(void){
	SSPIF=0;
	while(!SSPIF) NULL;
	SSPIF=0;
}

void i2c_basla(void){
	SEN=1;
	SSPIF_bekle();
}

void i2c_basla_tekrar(void){
	RSEN=1;
	SSPIF_bekle();
}

void i2c_dur(void){
	PEN=1;
	SSPIF_bekle();
}

bit i2c_byte_yaz(char veri){
	SSPIF=0;
	SSPBUF = veri;
	SSPIF_bekle();
	if(WCOL) WCOL=0;
	if(ACKSTAT){
		i2c_dur();
		return(1);
	}
	else
		return(0);
}

void ack_nack_gonder(char x){
	ACKDT=x;
	ACKEN=1;
	while(ACKEN) NULL;
}


char i2c_byte_oku(){
char veri;
	RCEN=1;
	while(RCEN);
	if(SSPOV) SSPOV=0;
	while(!BF);
	veri = SSPBUF;
	return(veri);
}

void _24c256_adres_yaz(int adres){
char adresH,adresL;
	adresH = (char)( (adres >> 8) & 0x00ff );
	adresL = (char)( adres & 0x00ff );
	i2c_byte_yaz(0b10100000);
	i2c_byte_yaz(adresH);
	i2c_byte_yaz(adresL);
}

void _24c256_byte_yaz(int adres, char veri){
	i2c_basla();
	_24c256_adres_yaz(adres);
	i2c_byte_yaz(veri);
	i2c_dur();
}

char _24c256_byte_oku(int adres){
char veri;
	i2c_basla();
	_24c256_adres_yaz(adres);
	i2c_basla_tekrar();
	i2c_byte_yaz(0b10100001); //yazma bilgisi..
	veri = i2c_byte_oku();
	ack_nack_gonder(nack);
	i2c_dur();
	return(veri);
}

char _24c256_sonraki_byte_oku(char ack_dt){
char veri;
	veri = i2c_byte_oku();
	ack_nack_gonder(ack_dt);
	return(veri);
}

void main(void){
	SMP=1; 
	SSPADD=40;
	SSPCON2=0;
	PORTC =  0b11100111;      //SCL ve SDA Clear edildi 
  	TRISC =  0b00011000;      //i2c için SLC ve SDA pinleri giriş yapıldı 
	SSPCON = 0B00101000; 		//İ2C MASTER MODU SSPEN AKTİF;
	SSPIF=0;
i=0;

DelayMs(20);
/*
//------128 byte veri yazılıyor-----------------
i2c_basla();
_24c256_adres_yaz(0x00);
for(i=0; i<64; i++){
	i2c_byte_yaz(i);
}
i2c_dur();
DelayMs(20);
i2c_basla();
_24c256_adres_yaz(64);
for(i=64; i<128; i++){
	i2c_byte_yaz(i);
}
i2c_dur();
//---------------------------------------------
*/

//---------------sıralı bir byte okuma---------
DelayMs(10);
i2c_basla();
_24c256_adres_yaz(0x00);
i2c_basla_tekrar();
i2c_byte_yaz(0b10100001);
for(i=0; i<128; i++){
	veri = i2c_byte_oku();
	if(i!=127)
		ack_nack_gonder(0);
	else
		ack_nack_gonder(1);
}
i2c_dur();

//----------------------------------------------
/*
//----------her byte ı adresleyerek okuma-------------
for(i=0; i<10; i++){
	veri[i] = _24c256_byte_oku(i);
	DelayMs(1);
}
//-----------------------------------------------------
*/
for(;;); //programı durdur..
}

dosya linki:
proteus ve c dosyaları
Bilgi paylaştıkça artar..

picman

arkadaşlar bilgisahibi olan biri rica ediyorum şu problemle bir ilgileni versin. i2c ile uğraşmış bunun gibi bir problemle karşılaşmış olanınız yok mu hiç. yardımlarınızı bekliyorum....
Bilgi paylaştıkça artar..

picman

arkadaşlar yeni açtığım konu kilitlenmiş biraz daha ilgi görsün diye açmıştım oysaki. anlaşılan benim bu problemim içi bir ceavp gelmeyecek  :cry:
Bilgi paylaştıkça artar..

Macera

Proteus un içinde devreni simule ederken i2c debugger denen vede i2c sinyallerini kontrol eden bir hata bulucu var.
Bu debugger ile problemini çözebilirsin.
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

picman

arkadaşım onu kullanıyorum. benim problemim sıralı okuma işleminde okuma yaparken neden her byte arasına gecikme koyduğumda hatalı okuyor da zaman gecikmesi koymadıkğımda düzgün okujyor. ben her byte veriyi okuduğumda pic ile ack gönderiyorum. yanlışlık nerede mssp modülün de bilmediğim birşey mi var acaba. sıralı okuma işlemi tam olarak nasıl olur. basitce anlatırsanız sevinirim. problem sıralı okumada her byte arasına gecikme koyduğumda oluyor. diğer türlü okumada ve yazmada problem yok.....
Bilgi paylaştıkça artar..

picman

bu forumda i2c ile bir yığın proje yapmış bir sürü adam var ama bu benim problemime kimse yardımcı olmadı. neden böyle oldu bir türlü anlamadım .....................  :cry:  :cry:  :cry:  :cry:  :cry:  :(  :(  :(  :(
Bilgi paylaştıkça artar..

M_B

sıralı okuma işlemi tam olarak nasıl olur. basitce anlatırsanız sevinirim.

picman hocam detaylı bilgi için entegrenin datasheetini incelemek lazım.
Bildiğim kadarı ile eepromun yapısı bu şekilde. Her gördüğüm uygulamalarda sıralı okuma da gecıkme yok.

problem sıralı okumada her byte arasına gecikme koyduğumda oluyor. diğer türlü okumada ve yazmada problem yok.

picman hocam neden sıralı okumada her byte arasına gecikme koyuyorsun. Buna ihtiyac mı var ?
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

picman

arkadaşım öncelikle ilgin için teşekkürler bende bu problemi çözemeyince araya gecikme koymadan verileri önce pic in ram hafzasına yükledim karakterleri oradan okuyarak gösteriyorum. 877 de yeterli alanım kalmadı 18f452 kullanıcaz artık.. ama birde şunu keşfettim sıralı okumada
adres verisini yazdıktan sonra restart-A1-ack-byte oku-nack şeklinde veriyi okuduğumda araya gecikme koysakta nispeten doğru okuma yaptı.  buna "current read" okuma deniyormuş diğeri ise tam bir sıralı okuma araya gecikme koymadan bir hamlede verileri okumak gerekli sanırım.  ama yinede epromdan verileri okurken taramada bozulma olduğu için verileri epromdaki karakter bilgilerini önce ram deki bir dizi değişkene aldım karakterleri oradan okuyarak ekranda gösterdim gerçekten  kayan yzı uygulamalarında bu nasıl yapılıyor bilgisi olan var mı
Bilgi paylaştıkça artar..