LusoRobótica - Robótica em Português

Electrónica => Electrónica Geral => Tópico iniciado por: vicardosof em 24 de Abril de 2013, 19:01

Título: EEPROM maluca
Enviado por: vicardosof em 24 de Abril de 2013, 19:01
Boas!
Estou a programar um sistema com PIC que guarda dados numa eeprom (24LC256).
Quando leio os dados pela primeira vez, todos retornam certos. Quando os leio novamente, alguns vem errados :o e se tentar ler uma terceira vez o PIC trava.

Alguém tem alguma ideia do que possa ser? Preciso terminar este projecto até o fim da semana.
Título: Re: EEPROM maluca
Enviado por: Njay em 24 de Abril de 2013, 19:36
E se esperares algum tempo e só depois fizeres a 1ª leitura, os dados vêm bem?
Título: Re: EEPROM maluca
Enviado por: vicardosof em 24 de Abril de 2013, 19:40
se espero muito tempo, tornam-se 255
Título: Re: EEPROM maluca
Enviado por: dropes em 24 de Abril de 2013, 20:40
Isso cheira-me a mau sincronismo do relógio, pode haver uma alteração do estado de clock (SCL) entre cada leitura ou escrita.
A configuração I²C também pode não estar muito correcta...
A leitura começa por uma condição de estado, depois vem o endereço e a seguir os dados, também tem que se dar o estado de terminado; podes baixar a velocidade ou mesmo fazer a leitura em software para detectar onde está o erro.
Na ficha técnica descreve melhor a comunicação.

Também é fácil criar uma interface com a porta paralela e ler pelo ponyprog:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.lancos.com%2Fe2p%2FeasyI2Cbus.gif&hash=77e3e153e006164379b1908d016802cc0bedd1a2)
http://www.lancos.com/prog.html (http://www.lancos.com/prog.html)

Sempre daria para confirmar se a eeprom estava boa.
Título: Re: EEPROM maluca
Enviado por: Njay em 24 de Abril de 2013, 21:23
se espero muito tempo, tornam-se 255

Ou seja, a EEPROM vai-se desprogramando até ficar toda desprogramada. Essa EEPROM não será já muito velha (muitos ciclos de escreve/apaga)?
Outra hipótese que me ocorre é estares a alimentá-la com uma tensão muito baixa ou não teres condensadores de desacoplamento.
Título: Re: EEPROM maluca
Enviado por: vicardosof em 25 de Abril de 2013, 14:55
Boas!
Hoje reescrevi os códigos de comunicação usando uma biblioteca confiável e nada mudou. Ontem troquei a eeprom e o problema se manteve o mesmo.
Hoje estive a estudá-lo melhor e acho que já o percebi.

Quando coloco-a a gravar até 64 bytes, tudo é feito sem nenhum problema e os dados são conservados.
Se a coloco a gravar mais de 64 (no meu caso preciso de 1584), parece-me que é feita uma paginação (embora esteja programada para gravar byte e byte) e somente a última página é mostrada na leitura.
Algo interessante: Se a coloco para gravar os 1584 bytes e depois gravo 64 bytes a começar da posição 0x00, consigo ler os outros 1520 bytes  :o Se a gravo somente com 0, não tenho esse poblema

Segue meu código de leitura gravação:

Código: [Seleccione]
void Write_eeprom(long address, byte data){
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   delay_ms(5);
}

byte Read_eeprom(long int address)
{
   byte data;
   i2c_start();
   i2c_write(0xa0);
   i2c_write((address >> 8));
   i2c_write(address);   
   i2c_start();
   i2c_write(0xa1);
   data = i2c_read(0); 
   i2c_stop();
   return data;
}
Título: Re: EEPROM maluca
Enviado por: vicardosof em 25 de Abril de 2013, 18:27
Passei toda a tarde a fazer testes e cheguei a conclusões interessantes:

1) Existe algum problema na hora de determinar o endereço. Exemplo: Se a mando gravar em 0x00 0x00, ela gravará em 0x00 0x00, 0x01 0x00 e assim por diante, ou seja, grava várias vezes a mesma coisa em diferentes posições!

2) quando corto a alimentação o dado é mantido, mas basta retirar o PIC do lugar e tudo é apagado  :o
Título: Re: EEPROM maluca
Enviado por: senso em 25 de Abril de 2013, 19:39
Ou tens algo mal ligado, ou então deves ir ler a datasheet com atenção.
Título: Re: EEPROM maluca
Enviado por: vicardosof em 26 de Abril de 2013, 02:20
Li o datasheet para mais de 500 vezes  ??? Meu prazo é até amanhã. Vou tenta usar um driver que achei na internet para gravar/ler, minha última esperança  :'(




--- EDIT ---
Consegui resolver o problema. Ele estava em parte das rotinas de gravar/ler. Ainda não sei exatamente onde ele estava, mas estou com o código funcionando então está tudo certo  ;D