terça-feira, 31 de dezembro de 2013

Escrever e Ler Memórias EEPROM I2C no Arduino


Palavras-chave: EEPROM, Microchip, 24LC256, I2C, Arduino.

Neste post, vamos escrever e ler em duas memórias EEPROM (Electrically Erasable Programmable Read-Only Memory) utilizando o barramento I2C (Inter-Integrated Circuit) do Arduino.

MATERIAIS

- Arduino Uno r2;
- 2 EEPROM Microchip 24LC256;
- 2 Resistores de 10kΩ;
- Fios para ligação;
- Protoboard.

PROGRAMAÇÃO

Copie o código abaixo integralmente e faça o upload.
/*------------------------------------------------------------------
 * ESCREVER E LER EM 2 EEPROMS - I2C
 *
 * (2x) Microchip 24LC256
 *
 * www.binarycodec.blogspot.com
 * Data: 10/12/2013, 16/12/2013
 * v.1.2
 *-----------------------------------------------------------------*/
#include <Wire.h> 

#define memoria1 0x51  // Endereço para a primeira memoria
#define memoria2 0x52  // Endereço para a segunda memoria

void setup(void)
{
  Serial.begin(9600);
  Wire.begin();  

  unsigned int address = 0;

  for (address = 0; address < 4096; address++) {

    writeEEPROM(memoria1, address, 0x51); // 51 sera escrito na memoria 1
    writeEEPROM(memoria2, address, 0x52); // 52 sera escrito na memoria 2
    
    Serial.print("Endereco: ");
    Serial.print(address);  
    Serial.print("\tMemoria 1: ");  
    Serial.print(readEEPROM(memoria1, address), HEX); // DEC, OCT, HEX
    Serial.print("\tMemoria 2: ");
    Serial.print(readEEPROM(memoria2, address), HEX); // DEC, OCT, HEX
    Serial.println();  

  } 
}

void loop(){
}

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) 
{
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8));   // MSB - Bit mais significativo
  Wire.write((int)(eeaddress & 0xFF)); // LSB - Bit menos significativo
  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 - Bit mais significativo
  Wire.write((int)(eeaddress & 0xFF)); // LSB - Bit menos significativo
  Wire.endTransmission();

  Wire.requestFrom(deviceaddress,1);

  if (Wire.available()) rdata = Wire.read();

  return rdata;
 
}

Note que estamos escrevendo os endereços 0x51 e 0x52 nas memórias. Assim, estas serão as informações apresentadas no teste. Ainda, pode-se modificar a saída de HEX (hexadecimal) para OCT (octal) ou DEC (decimal), alterando a apresentação dos dados.

MONTAGEM

A Figura 1 mostra o diagrama elétrico para a montagem das memórias no protoboard.
Fig. 1 - Diagrama elétrico.
Com o Arduino desligado, faça a ligação:

Arduino - Protoboard
Pino 5V - Vcc
Pino A4 - SDA
Pino A5 - SCL
Pino Gnd - Gnd

TESTE

Para ver o resultado, conecte o Arduino na USB e abra o Serial Monitor, Figura 2.
Fig. 2 - Escrita e gravação das memórias.
Como dito anteriormente, as informações lidas são os endereços das memórias 0x51 e 0x52.

MATERIAIS/LINKS RELACIONADOS

[1]. EEPROM - http://en.wikipedia.org/wiki/EEPROM 
[2]. Datasheet 24LC256 - http://www.microchip.com/TechDoc.aspx?type=datasheet&product=24lc256 
[3]. I2C - http://en.wikipedia.org/wiki/I%C2%B2C 
[4]. Arduino Wire Library - http://www.arduino.cc/en/Reference/Wire

Nenhum comentário: