Microcontroller › 8051 › serial EEPROM (AT24C02B)accessing problem
- This topic has 1 reply, 1 voice, and was last updated 13 years, 6 months ago by Rajesh Vadarevu.
-
AuthorPosts
-
May 18, 2011 at 7:57 am #4739Rajesh VadarevuParticipant
with reference to the above post, I forget to put the code. Please see the code which is given below for your reference.
Tell me what could be the problem either in circuit or code? I am able to write into eeprom succeessfully but naot able to read. Please help me in this regard. I am using AT89C55WD instead of AT89C51 and AT24C02B instead of AT24C02 which are shown in circuit .
#include<reg51.h>
#include<intrins.h> //For using [_nop_()]
sbit sda=P1^0;
sbit scl=P1^1;
sbit led=P0^3;
bit ack;
sbit led1=P0^1;
sfr lcd_data_pin=0xA0;//p2 port
sfr output=0x80;//p0 port
sbit rs=P3^0;
sbit rw=P3^1;
sbit en=P3^6;
unsigned char reead,write,write2,i,j;
unsigned int temp;
void delay(unsigned int count)
{
int i,j;
for(i=0;i<count;i++)
for(j=0;j<1275;j++);
}
void lcd_command(unsigned char comm)
{
lcd_data_pin=comm;
en=1;
rs=0;
rw=0;
delay(1);
en=0;
}
void lcd_data(unsigned char disp)
{
lcd_data_pin=disp;
en=1;
rs=1;
rw=0;
delay(1);
en=0;
}
lcd_dataa(unsigned char *disp)
{
int x;
for(x=0;disp[x]!=0;x++)
{
lcd_data(disp[x]);
}
}
void lcd_ini()
{
lcd_command(0x38); // for using 8-bit 2 row LCD
delay(5);
lcd_command(0x0F); // for display on, cursor blinking
delay(5);
lcd_command(0x80);
delay(5);
}
void aknowledge() //acknowledge condition
{
scl=1;
_nop_();
_nop_();
scl=0;
}
void start() //start condition
{
sda=1;
scl=1;
_nop_(); //No operation
_nop_();
sda=0;
scl=0;
}
void stop() //stop condition
{
sda=0;
scl=1;
_nop_();
_nop_();
sda=1;
scl=0;
}
void send_byte(unsigned char value) //send byte serially
{
unsigned int i;
unsigned char send;
send=value;
for(i=0;i<8;i++)
{
sda=send/128; //extracting MSB
send=send<<1; //shiftng left
scl=1;
_nop_();
_nop_();
scl=0;
}
ack=sda; //reading acknowledge
sda=0;
}
unsigned char read_byte() //reading from EEPROM serially
{
unsigned int i;
sda=1;
reead=0;
for(i=0;i<8;i++)
{
reead=reead<<1;
scl=1;
_nop_();
_nop_();
if(sda==1)
reead++;
scl=0;
}
sda=0;
return reead; //Returns 8 bit data here
}
void save() //save in EEPROM
{
start();
send_byte(0xA0); //device address
aknowledge();
send_byte(0x00); //word address
aknowledge();
send_byte(5); //send data
aknowledge();
send_byte(65);
aknowledge();
stop();
if(ack==0)
{
led1=1;
delay(100);
led1=0;
delay(100);
lcd_command(0x86);
lcd_data(‘5’);
lcd_command(0x87);
lcd_data(‘A’);
}
else
led1=1;
aknowledge();
}
void Read()
{
start();
send_byte(0xA0);
aknowledge();
send_byte(0x00);
aknowledge();
start();
send_byte(0xA1); //device address
aknowledge();
i=read_byte();
aknowledge();
j=read_byte();
aknowledge();
stop();
if(i==5)
{
led=0;
delay(100);
led=1;
delay(100);
write=i+48;
lcd_command(0xC6);
lcd_data(write);
}
else
led=1;
if(j==65)
{
lcd_command(0xC7);
lcd_data(j);
}
aknowledge();
}void main()
{
lcd_ini();
lcd_dataa(“Sent :”);
lcd_command(0xC0);
lcd_dataa(“Read :”);
temp=0;
while(1)
{
save();
Read();
}
}Circuit:
May 19, 2011 at 4:10 am #6278Rajesh VadarevuParticipantI am able to write the data into eeprom successfully without pullup resistors, then how pullup can help while reading back from eeprom. I verified the write data with universal programmer.
-
AuthorPosts
- You must be logged in to reply to this topic.