Hi-Tech C de i2c eprom okuma sorunum

Başlatan tyilgin, 05 Ocak 2008, 21:56:33

tyilgin

Arkadaşlar I2C epromdan veri okuma konusunda bir türlü sonuca ulaşamadım. 9.50 versiyonun içinde sample kodlar arasında 1 örnek var, microchipin sitesinde de 3 örnek buldum ancak tam olarak anlayamadım.
Forumda da 2 sörnek bulabildim. 1inde asm, diğerinde de CCS de yapılmış örnek buldum, Hi-Tech 'e göre düzeltmeye çalıştım, sonuç alamadım.

Özellikle http://www.antrak.org.tr/gazete/122003/ziya_erdemir.htm burada start için clk 1 iken data 0 a çekilince diyor ancak örneklerde kapının değeri değil, kapının yönü (giriş/çıkış) değiştirilmiş.

Ayrıca Ack için, örneklerde hiç beklenmemiş.

Daha önce basicte çalıştığım için I2CRead diyorduk iş bitiyordu.....

Hi-Tech C de çalışan bir örnek verebilirseniz çok sevinirim....

Teşekkür ederim..

arslan74

Alıntı yapılan: "tyilgin"Arkadaşlar I2C epromdan veri okuma konusunda bir türlü sonuca ulaşamadım. 9.50 versiyonun içinde sample kodlar arasında 1 örnek var, microchipin sitesinde de 3 örnek buldum ancak tam olarak anlayamadım.
Forumda da 2 sörnek bulabildim. 1inde asm, diğerinde de CCS de yapılmış örnek buldum, Hi-Tech 'e göre düzeltmeye çalıştım, sonuç alamadım.

Özellikle http://www.antrak.org.tr/gazete/122003/ziya_erdemir.htm burada start için clk 1 iken data 0 a çekilince diyor ancak örneklerde kapının değeri değil, kapının yönü (giriş/çıkış) değiştirilmiş.

Ayrıca Ack için, örneklerde hiç beklenmemiş.

Daha önce basicte çalıştığım için I2CRead diyorduk iş bitiyordu.....

Hi-Tech C de çalışan bir örnek verebilirseniz çok sevinirim....

Teşekkür ederim..

Merhaba,

I2C haberleşmeyi donamıla yaptırmak istiyorsun. Yoksa yazılımlamı yapacaksın? Birde hangi PIC kullanacaksın?

Selamlar

tyilgin

I2C haberleşmesinin donanımlada yapılabildiğini bilmiyordum.

kullanmak istediğim mcu 16F877.

cevabınız için teşekkür ederim...

arslan74

Alıntı yapılan: "tyilgin"I2C haberleşmesinin donanımlada yapılabildiğini bilmiyordum.

kullanmak istediğim mcu 16F877.

cevabınız için teşekkür ederim...

16F877 donımsal I2C haberleşmesinde bende düzgün bir şekilde yapamadım. Hatta bununla ilgili microchip'in sayfasıdan eğitim dökümanı bile var ama çalıtıramadım.
Ama yazılımla I2C cihazla haberleştirmeyi yapabildim. Gayette sorunsuz çalıştı. Örnek olarakta proteusta 16F877 ile 24CXX serisinin örnek haberleşme simulasyonunu vardı. Ben onun aynısını C de yazdım öyle çalıştırdım.

Selamlar

tyilgin

Alıntı yapılan: "arslan74"
16F877 donımsal I2C haberleşmesinde bende düzgün bir şekilde yapamadım. Hatta bununla ilgili microchip'in sayfasıdan eğitim dökümanı bile var ama çalıtıramadım.
Ama yazılımla I2C cihazla haberleştirmeyi yapabildim. Gayette sorunsuz çalıştı. Örnek olarakta proteusta 16F877 ile 24CXX serisinin örnek haberleşme simulasyonunu vardı. Ben onun aynısını C de yazdım öyle çalıştırdım.

Selamlar

Proteusun simülasyonunda da çalıştığına dair en ufak bir tepki görmediğim halde geceden beri uğraşarak buraya kadar gelebildim.
ama artık kafam çok karıştı. siz kendi kodunuzu paylaşabilirseniz çok sevinirim.

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

#define i2c_dta	RE0
#define i2c_clk	RE1
#define i2c_dtayon	TRISE0
#define i2c_clkyon	TRISE1

unsigned char adress;
unsigned char value;
unsigned char byte;
unsigned char bitt;
unsigned char ack;
unsigned char lc1;
unsigned char lc2;
unsigned char lc3;

void set_sdo_high(void) {
	i2c_dta = 0;
	i2c_dtayon = 1;
}

void set_sdo_low(void) {
	i2c_dta = 0;
	i2c_dtayon = 0;
}

void set_clk_high(void) {
	i2c_clk = 1;
	i2c_clkyon = 0;
}

void set_clk_low(void) {
	i2c_clk = 0;
	i2c_clkyon = 1;
}

void wait_quarter_bit (void) {
	char lc1;
	for (lc1=0; lc1<6; lc1++);
}

void wait_half_bit(void) {
	char lc1;
	for (lc1=0; lc1<16; lc1++);
}

void init(void) {
	PORTC = 0xFF;
	TRISC = 0x00;
}

void wr_start(void) {
	set_clk_high();
	wait_half_bit();
	set_sdo_low();
	wait_half_bit();
	set_clk_low();
	wait_half_bit();
	wait_half_bit();
	wait_half_bit();
}

void wr_stop(void) {
	wait_half_bit();
	set_clk_low();
	wait_half_bit();
	set_sdo_low();
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_sdo_high();
	wait_half_bit();
}

void wr_restart(void) {
	set_clk_low();
	wait_half_bit();
	set_sdo_high();
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_sdo_low();
	wait_half_bit();
	set_clk_low();
	wait_half_bit();
}

void wr_ack(void) {
	set_clk_low();
	wait_half_bit();
	set_sdo_low();
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();
	wait_half_bit();
	set_sdo_high();
	wait_half_bit();
}

void wr_no_ack(void) {
	set_clk_low();
	wait_half_bit();
	set_sdo_high();
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();
	wait_half_bit();
	wait_half_bit();
}

void wr_reset(void) {
	unsigned char lc1;
	wait_half_bit();
	set_clk_low();
	wait_half_bit();
	set_sdo_low();
	wait_half_bit();
	set_clk_high();
	
	for (lc1=0; lc1<0x40; lc1++);
	set_sdo_high();
	for (lc1=0; lc1<0x40; lc1++);
	
	set_clk_low();
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();				// clk 1
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();				// clk 2
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();				// clk 3
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();				// clk 4
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();				// clk 5
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();				// clk 6
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();				// clk 7
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();				// clk 8
	wait_half_bit();
	set_clk_high();
	wait_half_bit();
}

void wr_bit(void) {
	wait_quarter_bit();
	if ((byte && bitt) > 0) {
		set_sdo_high();
	} else {
		set_sdo_low();
	}
	wait_quarter_bit();
	set_clk_high();
	wait_half_bit();
	set_clk_low();
}

void wr_byte(void) {
	unsigned char sayac;
	bitt = 0x80;
	for (sayac=0;sayac<8;sayac++) {
		wr_bit();
		bitt=(bitt>>1);
	}
	wait_quarter_bit();
	set_sdo_high();
	wait_quarter_bit();
	set_clk_high();
	wait_quarter_bit();
	/* movf  PORTC,W
	 * andlw (1<<SDO)
	 * xorlw (1<<SDO)
	 * movwf ack
	*/
	wait_quarter_bit();
	set_clk_low();
	wait_quarter_bit();
}

void wr_halfbyte(void) {
	unsigned char sayac;
	bitt=0x80;
	for (sayac=0;sayac<8;sayac++) {
		wr_bit();
		bitt=(bitt>>1);
	}
	wait_quarter_bit();
	set_sdo_high();
	wait_quarter_bit();
	set_clk_high();
	wait_quarter_bit();
	// movf  PORTC,W
	// andlw (1<<SDO)
	// xorlw (1<<SDO)
	// movwf ack
	wait_quarter_bit();
	set_clk_low();
	wait_quarter_bit();
}


	
	

void rd_bit(void) {
	set_sdo_high();
	set_clk_low();
	wait_half_bit();
	set_clk_high();
	wait_quarter_bit();
	if (i2c_dta==0) {
		byte = (byte && bitt);
	}
	wait_quarter_bit();
	set_clk_low();
}

void rd_byte(void) {
	unsigned char sayac;
	byte = 0x00;
	bitt = 0x80;
	for (sayac=0;sayac<8;sayac++) {
		rd_bit;
		bitt = (bitt>>1);
	}	
}



void main (void)
{
	TRISA = 0b00000000;
	
	init();
	wr_reset();
	wr_start();
	byte=0xA7;
	wr_byte();
	
	
	
Bekle:
	goto Bekle;
	
}

arslan74

Merhaba,

Eğer yazılımla kullanmka isiyorsan CLK bacağında direnc bağlı olmamalı. Sadece Data bacağına 4.7k direnc bağla. Bende ilk başlarda böyle sorunlarla karılaşmıştım, Sonra clk'a bağlı direnci cıkartığımda sorunsuz çalıştı.

Bir dene belki başarırsın. Eğer yinede başarılı olamassan yardımcı olurum.

Selamlar

tyilgin

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

Eğer yazılımla kullanmka isiyorsan CLK bacağında direnc bağlı olmamalı. Sadece Data bacağına 4.7k direnc bağla. Bende ilk başlarda böyle sorunlarla karılaşmıştım, Sonra clk'a bağlı direnci cıkartığımda sorunsuz çalıştı.

Bir dene belki başarırsın. Eğer yinede başarılı olamassan yardımcı olurum.

Selamlar

Proteusta i2c lerle ilgili sorun olduğunu biliyorum. yeni versiyonlarda 4K7 yerine pullup direnc kullanmak gerekiyor. yaptığım simülasyon testi picbasicteki denemde sorunsuz çalışıyor. sorun benim halen hi-tech c altında çalıştığına emin olduğum  bir  kod bulamamam.

Antraktaki http://www.antrak.org.tr/gazete/122003/ziya_erdemir.htm ve http://www.antrak.org.tr/gazete/022006/ali-karakas.html kaynaklarından yola çıkarak kendim kod yazmayı deniyorum. Ancak start tan sonra ilk byte olan 0x0A gönderdikten sonra nack alıyorum.

arslan74

Merhaba,

Proteus'un samples örnek simulasyon programları var.

Alıntı YapC:\Program Files\Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM for PIC16\PIC Serial Memory Example

klasörünün içinde 3 tane örnek simulasyon var. Bunları incele aradığın cevab bunların içinde bulacaksın.

Selamlar

arslan74

Merhaba,

Proteus'un samples örnek simulasyon programları var.

Alıntı YapC:\Program Files\Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM for PIC16\PIC Serial Memory Example

klasörünün içinde 3 tane örnek simulasyon var. Bunları incele aradığın cevab bunların içinde bulacaksın.

Selamlar

tyilgin

Merhaba,

Belirttiğiniz klasörde bende 1 tek örnek var. Ekran resmide aşağıda. 2 butonunda tüm kombinasyonlarını denediğim halde çalıştığına dair en ufak bir görüntü olmadığı halde içinde bulunan asm kodu cuma gecesi sabaha kadar uğraşarak C'ye çevirmeye çalıştım olmadı.  Hi-tech c forumd bulduğum örneklerde eksik alt kod hatası veriyor (belki onlar standart kütüphanelerde vardır da bende yoktur). Microchip/sourcode dakilerde cabası.

Bana çalıştığını bildiğiniz bir kaynak varsa lütfen onu verin.

Cevaplarınız için teşekkürler.

tyilgin

Bu arada hi-tech in içinde gelen örneği kullanmaya çalışıyorum.

i2c_Open() fonksiyonunu mu yoksa i2c_ReadFrom() ilemi başlamalıyım her ikisinide denedim ancak epromdan sürekli FF okuyorum.

en azından bu kütüphane ile 0. adresteki veriyi okumak için nasıl bir yol izleyeceğim konusunda yardım edebilirseniz sevinirim.

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

/*
 *	I2C functions for HI-TECH PIC C - master mode only
 */

/*
 * 	TIMING - see Philips document: THE I2C-BUS SPECIFICATION
 */


/*
 * 	Send stop condition
 * 	  - data low-high while clock high
 */

void
i2c_Stop(void)
{
	/* don't assume SCL is high on entry */

	SDA_LOW();					/* ensure data is low first */
	SCL_HIGH();
	
	DelayUs(I2C_TM_DATA_SU);
	SCL_DIR = I2C_INPUT;		/* float clock high */
	DelayUs(I2C_TM_STOP_SU);
	SDA_HIGH();					/* the low->high data transistion */
	DelayUs(I2C_TM_BUS_FREE);	/* bus free time before next start */
	SDA_DIR = I2C_INPUT;		/* float data high */

	return;
}

/*
 * 	Send (re)start condition
 * 	  - ensure data is high then issue a start condition
 * 	  - see also i2c_Start() macro
 */

void
i2c_Restart(void)
{
	SCL_LOW();					/* ensure clock is low */
	SDA_HIGH();					/* ensure data is high */

	DelayUs(I2C_TM_DATA_SU);

	SCL_DIR = I2C_INPUT;		/* clock pulse high */
	DelayUs(I2C_TM_SCL_HIGH);

	SDA_LOW();					/* the high->low transition */
	DelayUs(I2C_TM_START_HD);
	return;
}

/*
 * 	Send a byte to the slave
 * 	  - returns true on error
 */
unsigned char
i2c_SendByte(unsigned char byte)
{
	signed char i;

	for(i=7; i>=0; i--)
	{
		SCL_LOW();					/* drive clock low */
		
		/* data hold time = 0, send data now */
        SDA_DIR = ((byte>>i)&0x01);
        if ((byte>>i)&0x01) {		/* bit to send */
			SDA_HIGH();
        }else {
			SDA_LOW();
        }
		DelayUs(I2C_TM_DATA_SU);
		SCL_DIR = I2C_INPUT;		/* float clock high */

		if(i2c_WaitForSCL())		/* wait for clock release */
			return TRUE;			/* bus error */

		DelayUs(I2C_TM_SCL_HIGH);	/* clock high time */
	}
	
	return FALSE;
}

/*
 * 	send an address and data direction to the slave
 * 	  - 7-bit address (lsb ignored)
 * 	  - direction (FALSE = write )
 */
unsigned char
i2c_SendAddress(unsigned char address, unsigned char rw)
{
	return i2c_SendByte(address | (rw?1:0));
}

/*
 * 	Check for an acknowledge
 * 	  - returns ack or ~ack, or ERROR if a bus error
 */
signed char
i2c_ReadAcknowledge(void)
{
	unsigned char ack;

	SCL_LOW();						/* make clock is low */
	SDA_DIR = I2C_INPUT;			/* disable data line - listen for ack */
	DelayUs(I2C_TM_SCL_TO_DATA);	/* SCL low to data out valid */
	SCL_DIR = I2C_INPUT;			/* float clock high */
	DelayUs(I2C_TM_DATA_SU);
	ack = SDA;						/* read the acknowledge */

	/* wait for slave to release clock line after processing byte */
	if(i2c_WaitForSCL())
		return I2C_ERROR;
	return ack;
}

/*
 * 	Read a byte from the slave
 * 	  - returns the byte, or I2C_ERROR if a bus error
 */
int
i2c_ReadByte(void)
{
	unsigned char i;
	unsigned char byte = 0;

	for(i=0; i<8; i++)
	{
		SCL_LOW();					/* drive clock low */
		DelayUs(I2C_TM_SCL_LOW);	/* min clock low  period */
		SDA_DIR = I2C_INPUT;		/* release data line */

		SCL_DIR = I2C_INPUT;		/* float clock high */
		if(i2c_WaitForSCL())
			return I2C_ERROR;
		DelayUs(I2C_TM_SCL_HIGH);
		byte = byte << 1;		/* read the next bit */
		byte |= SDA;
	}
	return (int)byte;
}

/*
 * 	Send an (~)acknowledge to the slave
 * 	  - status of I2C_LAST implies this is the last byte to be sent
 */
void
i2c_SendAcknowledge(unsigned char status)
{
	SCL_LOW();
	if ( status & 0x01) {
		SDA_LOW();				/* drive line low -> more to come */
	}else { 
		SDA_HIGH();
	}
	DelayUs(I2C_TM_DATA_SU);
	SCL_DIR = I2C_INPUT;		/* float clock high */
	DelayUs(I2C_TM_SCL_HIGH);
	return;
}

/*
 * 	Send a byte to the slave and acknowledges the transfer
 * 	  - returns I2C_ERROR, ack or ~ack
 */
signed char
i2c_PutByte(unsigned char data)
{
	if(i2c_SendByte(data))
		return I2C_ERROR;
	return i2c_ReadAcknowledge();	/* returns ack, ~ack */
}

/*
 * 	Get a byte from the slave and acknowledges the transfer
 * 	  - returns true on I2C_ERROR or byte
 */
int
i2c_GetByte(unsigned char more)
{
	int byte;

	if((byte = i2c_ReadByte()) == I2C_ERROR)
		return I2C_ERROR;

	i2c_SendAcknowledge(more);

	return byte;
}

/*
 * 	Send an array of bytes to the slave and acknowledges the transfer
 * 	  - returns number of bytes not successfully transmitted
 */
int
i2c_PutString(const unsigned char *str, unsigned char length)
{
	signed char error;

	while(length)
	{
		if((error = i2c_PutByte(*str)) == I2C_ERROR)
			return -(int)length;					/* bus error */
		else
			if(error)
				return (int)length;					/* non acknowledge */
		str++;
		length--;
	}

	return FALSE;									/* everything OK */
}

/*
 * 	Reads number bytes from the slave, stores them at str and acknowledges the transfer
 * 	  - returns number of bytes not successfully read in
 */
unsigned char
i2c_GetString(unsigned char *str, unsigned char number)
{
	int byte;

	while(number)
	{
		if((byte = i2c_GetByte(number-1)) == I2C_ERROR)
			return number;								/* bus error */
		else
			*str = (unsigned char)byte;
		str++;
		number--;
	}

	return FALSE;										/* everything OK */
}

/*
 * 	Opens communication with a device at address. mode
 * 	indicates I2C_READ or I2C_WRITE.
 * 	  - returns TRUE if address is not acknowledged
 */
unsigned char
i2c_Open(unsigned char address, unsigned char mode)
{
	i2c_Start();
	i2c_SendAddress(address, mode);
	if(i2c_ReadAcknowledge()) 
		return TRUE;

	return FALSE;
}

/*
 * 	wait for the clock line to be released by slow slaves
 * 	  - returns TRUE if SCL was not released after the
 * 	    time out period.
 * 	  - returns FALSE if and when SCL released
 */
unsigned char
i2c_WaitForSCL(void)
{
	/* SCL_DIR should be input here */
	if(!SCL)
	{
		DelayUs(I2C_TM_SCL_TMO);
		/* if the clock is still low -> bus error */
		if(!SCL)
			return TRUE;
	}
	return FALSE;
}

void
i2c_Free()
{
	unsigned char ucI;

	SDA_DIR=I2C_INPUT;
	for(ucI=0;ucI!=9;ucI++)
	{
		SCL_HIGH();
		DelayUs(5);
		SCL_LOW();
		DelayUs(5);
	}
}

unsigned char i2c_read(unsigned char ucAdr)
{
	unsigned char ucDat;

	if (i2c_ReadFrom(ucAdr)==0)
	{
		ucDat=i2c_GetByte(I2C_MORE);
		i2c_Stop();

	}

	return(ucDat);
}


i2c.h
#ifndef	_I2C_H_
#define _I2C_H_

/*
 *	SDA (data) and SCL (clock) bits
 *	
 *	Special note!!!
 *	
 *	If the clock and data lines are in the same port, you will need
 *	to beware of the Read/Modify/Write issue in the PIC - since
 *	a bit set or clear on any one bit in a port will read and write
 *	back all other bits. 
 */


/* Uncomment the next line to use the PIC's SSP Module*/
#define I2C_MODULE 1

#ifdef I2C_MODULE
/* I2C module uses PORT C */
#define SCL             RC3             /* clock on port C bit 2 */
#define SCL_DIR         TRISC3
#define SDA     		RC4             /* data on port C bit 1 */
#define SDA_DIR         TRISC4
#define I2CTRIS			TRISC
#define MASTER_MODE     0B1011          /* I2C firmware controlled Master Mode (slave idle) */
#define SSPMode(val)	SSPCON &=0xF0; SSPCON|=(val & 0xf)

#else
/* Change port as required - defaults to port b */
#define	SCL			RB2				/* clock on port B bit 2 */
#define	SCL_DIR		TRISB2

#define SDA			RB1             /* data on port B bit 1 */
#define	SDA_DIR		TRISB1
#define I2CTRIS		TRISB

#endif

#define M_SDA_INP	0x02
#define M_SDA_OUT   0xFD
#define M_SCL_INP   0x04
#define M_SCL_OUT	0xFB

#define I2C_INPUT	1		/* data direction input */
#define I2C_OUTPUT	0		/* data direction output */

#define I2C_READ	0x01		/* read bit used with address */
#define I2C_WRITE	0x00		/* write bit used with address */

#define FALSE		0
#define TRUE		!FALSE

#define I2C_ERROR	(-1)
#define I2C_LAST	FALSE		/* SendAck: no more bytes to send */
#define I2C_MORE	TRUE		/* SendAck: more bytes to send */

#define i2c_Start()				i2c_Restart()
#define i2c_WriteTo(address)	i2c_Open((address), I2C_WRITE)
#define i2c_ReadFrom(address)	i2c_Open((address), I2C_READ)

#ifdef I2C_MODULE
#define SCL_HIGH() SCL_DIR = I2C_INPUT
#define SCL_LOW()  SCL_DIR = I2C_OUTPUT
#define SDA_HIGH() SDA_DIR = I2C_INPUT
#define SDA_LOW()  SDA_DIR = I2C_OUTPUT
#else
#define SCL_HIGH() SCL = 1; SCL_DIR = I2C_OUTPUT
#define SCL_LOW()  SCL = 0; SCL_DIR = I2C_OUTPUT
#define SDA_HIGH() SDA = 1; SDA_DIR = I2C_OUTPUT
#define SDA_LOW()  SDA = 0; SDA_DIR = I2C_OUTPUT
#endif

/*
 * Timings for the i2c bus. Times are rounded up to the nearest
 * micro second.
 */

#define I2C_TM_BUS_FREE		5
#define	I2C_TM_START_SU		5
#define I2C_TM_START_HD		4
#define I2C_TM_SCL_LOW		5
#define	I2C_TM_SCL_HIGH		4
#define I2C_TM_DATA_SU		1
#define I2C_TM_DATA_HD		0
#define I2C_TM_SCL_TO_DATA	4	/* SCL low to data valid */
#define	I2C_TM_STOP_SU		4
#define I2C_TM_SCL_TMO		10	/* clock time out */

extern signed char		i2c_ReadAcknowledge(void);
extern unsigned char	i2c_SendAddress(unsigned char, unsigned char);
extern unsigned char	i2c_SendByte(unsigned char);
extern int				i2c_ReadByte(void);
extern void				i2c_Restart(void);
extern void				i2c_Stop(void);
extern void				i2c_SendAcknowledge(unsigned char);
extern signed char		i2c_PutByte(unsigned char);
extern int				i2c_GetByte(unsigned char);
extern unsigned char	i2c_Open(unsigned char, unsigned char);
extern unsigned char	i2c_GetString(unsigned char *, unsigned char);
extern int				i2c_PutString(const unsigned char *, unsigned char);
extern unsigned char	i2c_WaitForSCL(void);
extern void				i2c_Free(void);
extern unsigned char	i2c_read(unsigned char);
#endif			/* _I2C_H_ */

tyilgin

Simülasyonda kullandığım eprom 24C02.

İçinde 0. adresten itibaren ismimi koydum. Ancak sürekli FF okuyunca birde önce yazdırıp sonra okumayı deneyeyim dedim. Sonuç yine FF ler geldi...

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

unsigned char dizi[] = "ABC";

void main() {
	
	lcd_init();
	lcd_puts("Deneme");
	DelayMs(250);
	
	i2c_WriteTo(0);
	i2c_PutString(dizi, 4);
	
	DelayMs(100);
	
	i2c_ReadFrom(0);
	i2c_GetString(dizi, 4);
	
	lcd_goto(0x40);
	lcd_puts(dizi);
	
	for (;;);
}


Ekran görüntüsü :




Bu arada Eepromun 7. bacapı olan WP 0 kenmi yoksa 1 kenmi protekleniyor hatırlamıyorum ama testlerde bu bacağı her iki durumda da denedim sonuç değişmiyor...

Ayrıca proteusun yeni versiyonlarında i2c lerin data hattına konan 4K7 dirençlerinde sorun çıkardığını 1 yıl kadar önce basic te çalışırken keşfetmiş, yerine pullup direnci koyarak sorun çıkarmadığını bulmuştum. i2c deki dirençler pullup dirençleri ve simülasyon basicte sorunsuz çalışıyor..

Macera

Proteusda Virtual Intruments Mode düğmesine tıkladığında
instruments kısmında I2Cdebugger çıkıyor.
Simulasyonda bunu kulanarak hata tespiti yapabilirsin.
"Art without engineering is dreaming; engineering without art is calculating." -- Steven K. Roberts

tyilgin

Alıntı yapılan: "Macera"Proteusda Virtual Intruments Mode düğmesine tıkladığında
instruments kısmında I2Cdebugger çıkıyor.
Simulasyonda bunu kulanarak hata tespiti yapabilirsin.

Hay Allah razı olsun. Kendi kodumu yazdım ve saat gibi çalışıyor.

Sonsuz teşekkürler.........

:D   :D   :D   :D   :D   :D

arslan74

Alıntı yapılan: "tyilgin"
Alıntı yapılan: "Macera"Proteusda Virtual Intruments Mode düğmesine tıkladığında
instruments kısmında I2Cdebugger çıkıyor.
Simulasyonda bunu kulanarak hata tespiti yapabilirsin.

Hay Allah razı olsun. Kendi kodumu yazdım ve saat gibi çalışıyor.

Sonsuz teşekkürler.........

:D   :D   :D   :D   :D   :D

Merhaba,

öncelikle bizden yardım istiyorsunuz ama bizim dediklerimizi yapmiyorsunuz.
Alıntı Yap
Merhaba,

Eğer yazılımla kullanmka isiyorsan CLK bacağında direnc bağlı olmamalı. Sadece Data bacağına 4.7k direnc bağla. Bende ilk başlarda böyle sorunlarla karılaşmıştım, Sonra clk'a bağlı direnci cıkartığımda sorunsuz çalıştı.

Bir dene belki başarırsın. Eğer yinede başarılı olamassan yardımcı olurum.

Selamlar

Belirmeme rağmen siz CLK ucununa PULLUP direnci koymuşsunuz. Öncelikle bunu cıkartın öyle deneyin.

Alıntı Yap
Merhaba,

Belirttiğiniz klasörde bende 1 tek örnek var. Ekran resmide aşağıda. 2 butonunda tüm kombinasyonlarını denediğim halde çalıştığına dair en ufak bir görüntü olmadığı halde içinde bulunan asm kodu cuma gecesi sabaha kadar uğraşarak C'ye çevirmeye çalıştım olmadı. Hi-tech c forumd bulduğum örneklerde eksik alt kod hatası veriyor (belki onlar standart kütüphanelerde vardır da bende yoktur). Microchip/sourcode dakilerde cabası.

Bana çalıştığını bildiğiniz bir kaynak varsa lütfen onu verin.

Cevaplarınız için teşekkürler.

Proteusun hangi versiyonunu kullandığınız bilmiyorum ama benim kullandığım 7.1 SP4 de örnek 3 tane simulasyon var.
Örneğin, "i2cmem3" simulasyonunu ac biraz incele. Oradan, program neler yapiyor, onu anlamaya çalış. Program önce EEPromun 100 nolu adresinden itibaren sirayla bilgi yazmaya balşiyor. Sonra bu yazdıkları okuyub doğru yazmışmı diye kontrol ediyor.

Tıpkı senin işleme örnek. Sana ben hazır kodu veririm ama niyetim sana balik tutmasını öğretmek olduğu için bu yolu gösteriyorum.

Selamlar