segunda-feira, 11 de janeiro de 2010

E que tal falar um pouco mais sobre EEPROMs?

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