Então, como o nome do título já diz, eu consigo escrever na eeprom pelo proteus mas no físico isso não acontece.
Escrevi um tópico pedindo ajuda pra galera de como escrever na eeprom e tal, depois de muita luta achei que tinha conseguido mas foi somente no proteus.
Quando eu joguei o programa no chip e fui testar pra ver se estava gravando, isso não aconteceu.
Ela entra em um estado e não sai mais ( por causa do while que tem na função write, mas sem ele não funciona.)
Eu estou utilizando uma at24c512, porém, a mesma coisa acontece se eu tentar trocar para uma 24lc00 ( no proteus).
Não faço ideia do que seja que está causando isso, sou novato.
Meu código é o seguinte:
cpp code
#include <at89x52.h>
#define scl P3_6
#define sda P3_7
unsigned char read_data=0;
void msdelay(unsigned int delay) {
int i,j;
for (i=0;i<delay;i++) {
for (j=0;j<115;j++){}
}
}
void start(){
sda=1;
scl=1;
msdelay(2);
sda=0;
}
void stop(){
sda=0;
scl=1;
msdelay(2);
sda=1;
}
void clk_i2c(){
scl=1;
msdelay(3);
scl=0;
msdelay(3);
}
void read_ack(){
while (sda==0);
sda=0;
clk_i2c();
sda=1;
}
void read_nack(){
while (P3_7==0);
clk_i2c();
}
void write(char value){
unsigned char i;
scl=0;
for(i=0;i<8;i++) {
if ((value & 0x80) == 0x80) {
sda=1;
}
else { sda= 0;}
value=value<<1;
clk_i2c();
}
sda=1;
while (sda==1);
clk_i2c();
}
void read(){
unsigned char i;
for (i=0;i<8;i++){
read_data=read_data<<1;
if (sda==1){read_data++;}
clk_i2c();
}
}
void send (char address_hb, char address_lb, char dataa) {
unsigned char x=0;
start();
write (0xa0);
write (address_hb);
write (address_lb);
write (dataa);
stop();
}
void receive1 (char address_hb, char address_lb) {
start();
write (0xa0);
write (address_hb);
write (address_lb);
start();
write (0xa1);
read();
P2=read_data;
read_nack();
stop();
}
void receive2 (char address_hb, char address_lb) {
start();
write (0xa0);
write (address_hb);
write (address_lb);
start();
write (0xa1);
read();
P1=read_data;
read_nack();
stop();
}
void main() {
char contador1=120;
char contador2=3;
P3=0;
P2=0;
P1=0;
P0=0;
receive2 (0x00, 1);
msdelay(1000);
send (0x00, 0x01, contador2);
msdelay(2000);
send (0x00, 0x00, contador1);
msdelay(2000);
receive2 (0x00, 1);
msdelay(1000);
contador2=120;
send (0x00, 0x01, contador2);
msdelay(2000);
receive2 (0x00, 1);
msdelay(1000);
receive1 (0x00, 0);
sda=0;
scl=0; }
Estou utilizando o SDCC
Grato desde já se puderam me ajudar!
Abraços,
Matheus S. Soares