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
-
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.
-
E se esperares algum tempo e só depois fizeres a 1ª leitura, os dados vêm bem?
-
se espero muito tempo, tornam-se 255
-
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.
-
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.
-
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:
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;
}
-
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
-
Ou tens algo mal ligado, ou então deves ir ler a datasheet com atenção.
-
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