Quase todos devem saber o que são e o que acontece quando começamos a ficar sem espaço no nosso microcontrolador e temos a necessidade de migrar dados, ou então quando queremos fazer muitos registros e os míseros bytes de memória que o nosso microcontrolador tem não são suficientes.

EEPROM 24LC256
Pois bem as EEPROMs são mesmo nossas amigas e então as i2c são tão fáceis de implementar que ao fim de algum tempo nem nos lembramos que as temos na protoboard. Estas ocupam apenas os pinos 4 e 5 analógicos do Arduino, ocupando um endereço no BUS (leia post I2C), ou seja, podemos continuar com todos os outros dispositivos i2c que lá tinhamos ligados anteriormente.
A EEPROM que vou usar neste tutorial é uma 24LC256 da Microchip. Esta EEPROM tem 32K endereços a 8 bits fazendo dela uma EEPROM com 256 Kbits memória!
A Atmel, assim como outras marcas, também têm estas EEPROMS. A da Atmel é a 24C256, mas as memórias da Microchip são bem melhores! As da Microchip aguentam os dados por mais de 200 anos, na Atmel é só 40; As da Microchip vão para mais de um milhão de ciclos escrita, as da Atmel só vão para 100 mil. A Microchip dá 3 pinos para endereço, a Atmel só dá dois.
As ligações são estas:

Os pinos A0 a A2 servem para indicar o endereço da EEPROM no bus i2c, se estiverem todos ligados ao GND o endereço no Arduino é 0x50. Assim, conseguimos ter até 8 EEPROMS no mesmo bus fazendo 2Mbit de memória!
O pino WP é o pino que indica se a EEPROM está protegida contra escita, se ligarem este pino a VCC não podem escrever na EEPROM e se o ligarem ao GND já podem, é como o botão nos cartões de memória.
Depois de ligar isto tudo vamos lá testar! Para o teste liguem o WP a GND.
Sketch:
#include // Para a EEPROM 24LC256, assim chamamos as bibliotecas i2c
#define eeprom 0x50 // endereço da eeprom já shiftado
void setup(void){
Wire.begin(); // Iniciar ligações i2c
Serial.begin(9600); // Assim podemos ver qualquer coisa no console serial
unsigned int address = 0; //endereçamento a 2 bytes
Serial.println("A escrever o melhor numero de sempre nos 10 primeiros bytes!");
for(address = 0; address<10; address++)
writeEEPROM(eeprom, address, '3');
Serial.println("Vamos ler se esta tudo ok, deve ver 33, 33, 33, 33... 10x 33");
for(address = 0; address<10; address++) {
Serial.print(readEEPROM(eeprom, address), HEX);
Serial.print(", ");
}
}
void loop(){}
//-------Rotinas para EEPROMS i2c por Daniel Gonçalves------
// Podem usar estas rotinas à vontade para projectos particulares.
// Para fins comerciais entrar em contato com we_real_cool@hotmail.com
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) {
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.send(data);
Wire.endTransmission();
}
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.receive();
return rdata;
}
0 comentários:
Postar um comentário