Ola. Estou a 3 dias tentando escrever e ler em uma eeprom 24LCxx usando protocolo I2C com a biblioteca Wire.h do Arduino ultima atualizacao.
Meu Amigo Ewerton me enviou o seguinte codigo:
Circuito eletrico da EEPROM
============================ inicio sketch =============================
#include <Wire.h>
#define disk1 0x50 //Endereço do 24LC256 eeprom , com o A0,A1 e A2 no GND
void setup(void)
{
Serial.begin(9600);
Wire.begin();
unsigned int address = 0;
writeEEPROM(disk1, address, 123); // primeiro escreve 123 com a função writeEEPROM
Serial.print(readEEPROM(disk1, address), DEC); // depois mostra na serial
}
void loop(){}
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data )
{
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write(data);
Wire.endTransmission();
delay(5);
}
byte readEEPROM(int deviceaddress, unsigned int eeaddress )
{
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}
============================ fim sketch =============================
Claro que nas funcoes wire.send e wire.received, tive que renomear para wire.write e wire.read, para que o programa compilasse.
Analisando o codigo e ligacao fisica, tudo está em sintonia. Ocorre que o ao esecutar o programa, na serial escreve o valor DEC 255, como se estivesse lendo esse valor da eeprom. Mesmo com a eeprom desconectada da placa, ao invez de retornar erro, ou um valor invalido, nulo, ou sei lá. retorna sempre 255.
Estou desconfiado que há algum erro de escrita no codigo devido a biblioteca wire.h ter passado por uma atualizacao recente.
Alguém tem alguma dica?????
Tags:
nao rodou tbm =/
Obrigado pela colaboração. O codigo acima esta funcionando. Era só minha memoria queimada.
Abraco
aparentemente , Wire.write(data) esta enviando o valor como string(chararray acho que é o nome tecnico correto).
converta a variavel data forçadamente pra int (se é assim que o seu dispositivo que o comando esta preparado pra receber).
Eu trabalhei com i2c recentemente e todo o problema que tive foi com tipos de variaveis... um exemplo de trecho do meu código:
Wire.beginTransmission(4); // transmitir pro slave #4
Wire.write("wtc=");
char thecommand[wtc.length() + 1];
wtc.toCharArray(thecommand, sizeof(thecommand));
Wire.write(thecommand);// envia o comando
Wire.write(" ");
Wire.endTransmission(); // fim de transmissao
note que meu dispositivo que recebe o comando escrito esta esperando o tipo chararray, entao tive que converter a minha variavel thecommand antes de coloca-la no wire.write.
vou ver isso ;)
Obrigado pela colaboração. O codigo que citei acima esta funcionando. Era só minha memoria queimada.
Abraco
Por favor, sabe se é simples conseguir no Brasil esta memória ou outra memória i2c? Encontro em São Paulo?
Você acha com facilidade memória do tipo 24Cxx aqui no Brasil e não são caras. Por exemplo, no soldafria.com.br uma 24C256 custa menos de R$3. No site da Mult Comercial (que tem uma loja física na Sta Efigência) uma 24LC256 custa a mesma coisa. (A principal diferença entre a 24Cxx e 24LCxx parece ser que a LC funciona em uma faixa mais larga de tensão).
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por