Página 1 de 1

Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 29 Ago 2014 18:35
por RaioLaser
Boa tarde galera!

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

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 29 Ago 2014 19:00
por tcpipchip
Colocou os PULLUPS ?

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 29 Ago 2014 19:02
por tcpipchip
outra coisa, na 512 o pacote que contem o endereço é de 16 bits.

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 29 Ago 2014 19:07
por tcpipchip
tua memoria não A0,A1 e A2 que devem ser aterradas ?

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 29 Ago 2014 19:20
por andre_luis
Se funciona no simulador e não funciona na montagem, o palpite classico seria a verificação das possiveis diferenças no circuito, como por exemplo existencia de resistores de pull-up e etc...No ambito do programa, uma dica seria eliminar o while. No meu programa, não lembro o motivo, mas simplesmente não utilizava a leitura desse ack do dispositivo.

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 01 Set 2014 13:35
por RaioLaser
Eu tenho um hardware já pronto que consta simplesmente uma memoria 24lc00/24lc04 com os pinos scl e sda ligados diretamente nos pinos 3.6 e 3.7 do 89s52, sem nenhum resistor. Os termnais A0, A1 e A2 da memória não estão aterrados no hardware.

No programa desenvolvido para ele, a memoria funciona normalmente, mas tive que refazer o programa porque não tinha acesso ao mesmo, o programa está funcionando corretamente mas a única coisa que estou tendo problemas é a escrita/leitura na memória EEPROM, achei que tinha conseguido quando simulei no Proteus.
Estou montando no Proteus igual está no hardware.
Quando fui testar no físico não funcionou, então troquei a memoria para a at24c512 para ver se funcionava, mas não deu certo.

O meu objetivo é escrever na 24lc00 e na 24lc04, mas nessas eu não consegui nem no Proteus.

No Proteus funciona todas as memorias at24cxx, a 24lc512, algumas "travam" no while e outras não (mas mesmo assim não escrevem ou não lêem).

tcpipchip, essa parte do pacote ser de 16bits mudaria algo no programa? Ou no físico (no circuito)? Não entendi muito bem. ;/

andre_teprom, quando vou simular com o programa sem o while, não tem resultados em nenhuma memoria :/
O que sugere para eu fazer essa alteração?
[edit]
Desculpa, andre_teprom, na verdade funciona sim sem o while, agora vou testar no físico.
Agora, quando vou testar na 24lc00 no Proteus, ela até chega a escrever mas acho que meio desordenado, algo assim.
Eu coloco 120 escrever na eeprom e depois ler e enviar para o P1, só que quando vejo o resultado aparece como se estivesse escrito o numero 1. ( só a porta P1_0 fica nível lógico 1 e o resto em zero)

Em algumas memórias aparece o erro (24c04A):
Start hold time violated. Start was at 11.323246623, hold time is 4.u, min. hold time is 999,996.

Em outras (24lc00):
Stop condition was expected but negative clock edge has been detected.

Na 24lc004B não aparece nenhum erro, porém escreve "desordenado/errado".

Na at24c512 funciona normalmente.

Esses erros das outras memorias têm a ver com a 512 ser de pacote 16bit?

Muito obrigado pelas repostas, e me desculpem pela redação, é que realmente estou empolgado para fazer funcionar hahaha.

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 01 Set 2014 14:12
por Jairo15
O datasheet aconselha aterrar os pinos A0,A1 e A2 ... verifique também o detalhes de "Start and Stop conditions" :

START CONDITION: A high-to-low transition of SDA with SCL high is a start condition
which must precede any other command (see Figure 5 on page 8 ).

STOP CONDITION: A low-to-high transition of SDA with SCL high is a stop condition.
After a read sequence, the stop command will place the EEPROM in a standby power
mode (see Figure 5 on page 8 ).

Outro detalhe, já usei uma memoria parecida, mas foi na porta P0, e não usei nenhum resistor, não sei se a porta P3 tem alguma diferença ...

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 01 Set 2014 14:24
por RaioLaser
Dei uma editada no meu ultimo post.

Vou dar uma olhada no start and stop conditions, muito obrigado!

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 01 Set 2014 21:27
por RaioLaser
Consegui escrever no físico, muito obrigado a todos! O problema estava no while mesmo.
Escrevi na at24c64 e na 24lc512.
Agora a única dúvida é sobre as 24lc00/24lc04 que ao serem escritas ou lidas o resultado parece ser desordenado.
Ao escrever 120 a memória entende como se fosse o número 1.

Muito Obrigado, aguardo mais informações!

Re: Escrevo Na EEPROM Pelo Proteus Mas No Físico Não

MensagemEnviado: 01 Set 2014 22:12
por tcpipchip
Address bus tamanho