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

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

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

Mensagempor RaioLaser » 29 Ago 2014 18:35

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
RaioLaser
Bit
 
Mensagens: 11
Registrado em: 07 Ago 2014 16:55

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

Mensagempor tcpipchip » 29 Ago 2014 19:00

Colocou os PULLUPS ?
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

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

Mensagempor tcpipchip » 29 Ago 2014 19:02

outra coisa, na 512 o pacote que contem o endereço é de 16 bits.
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

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

Mensagempor tcpipchip » 29 Ago 2014 19:07

tua memoria não A0,A1 e A2 que devem ser aterradas ?
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

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

Mensagempor andre_luis » 29 Ago 2014 19:20

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.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

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

Mensagempor RaioLaser » 01 Set 2014 13:35

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.
Editado pela última vez por RaioLaser em 01 Set 2014 14:21, em um total de 1 vez.
RaioLaser
Bit
 
Mensagens: 11
Registrado em: 07 Ago 2014 16:55

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

Mensagempor Jairo15 » 01 Set 2014 14:12

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 ...
Jairo15
Nibble
 
Mensagens: 52
Registrado em: 06 Fev 2009 12:59

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

Mensagempor RaioLaser » 01 Set 2014 14:24

Dei uma editada no meu ultimo post.

Vou dar uma olhada no start and stop conditions, muito obrigado!
RaioLaser
Bit
 
Mensagens: 11
Registrado em: 07 Ago 2014 16:55

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

Mensagempor RaioLaser » 01 Set 2014 21:27

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!
RaioLaser
Bit
 
Mensagens: 11
Registrado em: 07 Ago 2014 16:55

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

Mensagempor tcpipchip » 01 Set 2014 22:12

Address bus tamanho
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x