DS1307 ve 877 i2c haberleşme sorun!!!

Başlatan 3ddark, 22 Temmuz 2009, 11:05:37

3ddark

Kendi yazmış olduğum kodlar i2c haberleşme protokolu üzerinden 24c02 kodunu board üzerine kurup denedim çalıştı simülatorde çalıştı hatta 24c32 için de çalıştı. Benim sorunum DS1307 için ufak bir kod yazdım sadece okuma ve yazma yaptıgını görmek amacıyla. Acaba nerede yanlış yaptım yardımcım olurmusunuz.
DS1307 ile board üzerinde çalışmayan kod proteus ile çalışıyor.
Uygulamada board üzerinde pickit2 ile debug moduna alınca ilk start sonra D0 bilgisi gidiyor sonra ACK test işleminde takılıp kalıyor.
Simulatorde SQW çıkışını aktif ediyorum çalışıtğını görüyorum.
void main()
{
	lcd_init();
	lcd_goto(8,1);
	lcd_puts("SAAT");
	lcd_goto(1,2);
	_24cxx_init();		//iic_init yapıyor MSSP modül kurulumu

	iic_start();
	iic_send_byte(0xd0);
	iic_ack_test();		//Board üzerinde burada takılıp kalıyor.
	iic_send_byte(0x07);
	iic_ack_test();
	iic_send_byte(0x10);
	iic_ack_test();
	iic_stop();
	DelayMs(250);
while(1)
{
unsigned char sn,sn10;
sn=sn10=0;

	iic_start();
	iic_send_byte(0xd0);
	iic_ack_test();
	iic_send_byte(0x00);
	iic_ack_test();
	iic_restart();
	iic_send_byte(0xd1);
	iic_ack_test();
	iic_rx();
	iic_nack_test();
	iic_stop();
	sn=SSPBUF;
	lcd_data(0x30+(sn & 0x0f));

	DelayMs(250);
}
}

I2C 16f877 için modül kurulumu
//-----IIC INIT-----
void iic_init(){
	TRISC3 = 1;
	TRISC4 = 1;
	SSPCON = 0x28;
	SSPSTAT = 0x80;
	SSPADD = 0x09;
}

//------START GÖNDER-----
void iic_start(){
SEN=1;
while(!SSPIF);
SSPIF=0;
}

//------RESTART------
void iic_restart(){
RSEN=1;
while(!SSPIF);
SSPIF=0;
}

//------BYTE GÖNDER-----
iic_send_byte(unsigned char x){
SSPBUF = x;
while(!SSPIF);
SSPIF=0;
}

//-----ACK TEST ET-----
void iic_ack_test(){
while(ACKSTAT);
}

//-----ACK GÖNDER-----
void iic_ack(){
ACKDT=0;
ACKEN=1;
while(!SSPIF);
SSPIF=0;
}

//--------RECIEVE MOD-------
void iic_rx(){
RCEN=1;
while(!SSPIF);
SSPIF=0;
}

//------NACK GONDER---------
void iic_nack_test(){
ACKDT=1;
ACKEN=1;
while(!SSPIF);
SSPIF=0;
}

//------STOP GÖNDER-----
void iic_stop(){
PEN=1;
while(!SSPIF);
SSPIF=0;
}


void _24cxx_init()
{
	iic_init();
}

void _24cxx_yaz (unsigned int adres, unsigned char data)
{
#if	EEPROM == 16
	iic_start();
	iic_send_byte(0xa0);
	iic_ack_test();
	iic_send_byte(adres);
	iic_ack_test();
	iic_send_byte(data);
	iic_ack_test();
	iic_stop();
#endif

#if	EEPROM == 32
	unsigned char adresl,adresh;
	adresh = (adres & 0xff00) > 8;
	adresl = adres & 0x00ff;

	iic_start();
	iic_send_byte(0xa0);
	iic_ack_test();
	iic_send_byte(adresh);
	iic_ack_test();
	iic_send_byte(adresl);
	iic_ack_test();
	iic_send_byte(data);
	iic_ack_test();
	iic_stop();
#endif
}

unsigned char _24cxx_oku (unsigned int adres)
{
#if	EEPROM == 16
	iic_start();
	iic_send_byte(0xa0);
	iic_ack_test();
	iic_send_byte(adres);
	iic_ack_test();
	iic_restart();
	iic_send_byte(0xa1);
	iic_ack_test();
	iic_rx();
	iic_nack_test();
	iic_stop();
	return(SSPBUF);
#endif

#if	EEPROM == 32
	unsigned char adresl,adresh;
	adresh = (adres & 0xff00) > 8;
	adresl = adres & 0x00ff;

	iic_start();
	iic_send_byte(0xa0);
	iic_ack_test();
	iic_send_byte(adresh);
	iic_ack_test();
	iic_send_byte(adresl);
	iic_ack_test();
	iic_restart();
	iic_send_byte(0xa1);
	iic_ack_test();
	iic_rx();
	iic_nack_test();
	iic_stop();
	return(SSPBUF);
#endif
}


Hazır I2C ile yazmışken aynı bu kod ile 24c02 çalışıyor denedim ama 24c32 için simülatorde 1ff adresine kadar seri bir şekilde yazabiliyorum ondan sonraki adreslere veya direk adresini girip yazmak istedigimde yine yazamıyorum sorun nerede acaba MSSP modülünü iic için tam ayarlayamadım mı acaba özellikle ACK kısmında problem oluyor uygulamada ve birde bu DS1307 direk ilk açılışta okuma yapabilirmiyiz ? Yoksa başka bir ayar yapmak gerekir mi
http://www.2shared.com/file/6794338/f0ffaa2b/Proje_Web.html
Çalışan simülator Proteus7,5 ile yapıldı
Yapılacak çok şey var

Okan AKÇA


3ddark

Alıntı yapılan: "cyclone"baska driverlerden yararlan
Amacım hazır kullanmak değil. Kendim yaparak ve yaptığım ile öğrenmek. Yoksa hazır kod bulunur o sorun değil.
Yapılacak çok şey var

3ddark

Arkadaşlar sorun çözülmüştür.
2 gündür uğraşıyorum pickit2 programlayıcı ile beslemeyi sağlıyorum çalışmıyordu
Parazit için bir kondansatör atınca sorun düzeldi ilk yazdığım kod çalışıyormuş ama kondansatörden dolayı çalışmıyormuş. Bütün bunların sebebi yokluk elimde kondansatör yoktu bende sorun olmaz diye takmadım USB power ama her türlü problem oluşturdu.
Kolay gelsin
Yapılacak çok şey var

Okan AKÇA

amerikayı keşfetmeye gerek yok   ama kolay gelsin

3ddark

Alıntı yapılan: "cyclone"amerikayı keşfetmeye gerek yok   ama kolay gelsin

Tercih meselesi olayı anlamak lazım nasıl olduğunu.

Kolay gelsin
Yapılacak çok şey var