jueves, 8 de mayo de 2014

I2C Exercise with Arduino UNO

In this exercise we will write and read in an EEPROM memory by I2C interface with an Arduino UNO and we will simulate in Proteus.


In Proteus I’ve built the next scheme with the 24LC256 EEPROM memory of Microchip, the Arduino Uno and a LCD display to see the data stored in the memory:














The next step is build the program in Arduino software:

///////////////////////////////////////////////

#include <LiquidCrystal.h>
#include <Wire.h>

LiquidCrystal lcd(6, 7, 8, 9, 10, 11); //Declaro el nombre del objeto LCD, y configuro los pines

void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte *data, byte length )//Escribo una página (64 bytes) y declaro la dirección del dispoitivo i2c, la dirección de la página en la eeprom, así como el puntero "data" y el byte "lenght"
{
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddresspage >> 8)); // MSB
  Wire.write((int)(eeaddresspage & 0xFF)); // LSB
  byte c;//Declara "c" como un byte
  for ( c = 0; c < length; c++) // incrementa "c" siempre que esté entre 0 y "lenght"
  Wire.write(data[c]);
  Wire.endTransmission();
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) // Leo un byte y declaro la dirección del dispositivo i2c, así como la dirección de la eeprom donde voy a leer
{
  byte rdata = 0xFF; // Declaro el byte "rdata" como el primer byte del LSB
  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;
}
void setup() 
{
  char somedata[] = "Hola CIFPN1"; //cadena a escribir
  Wire.begin(); //es obligatorio inicializar la conexion
  Serial.begin(9600);
  i2c_eeprom_write_page(0x50, 0, (byte *)somedata, sizeof(somedata)); //escribir la cadena al principio de la EEPROM; comentar esta linea para probar que la memoria es no volatil
  delay(10); //pequeña pausa despues de escribir en la memoria
  lcd.begin(16, 2);
  lcd.print(somedata);
}
void loop() 
{
  int addr=0; //direccion a leer
  byte b = i2c_eeprom_read_byte(0x50, 0); //acceso a la primera posicion de memoria
  while (b!=0) 
  {
    
    Serial.print((char)b); //enviar al ordenador
    addr++; //siguiente direccion
    b = i2c_eeprom_read_byte(0x50, addr); //acceso a posicion de memoria
  } 
  Serial.println();
  delay(500);
}

///////////////////////////////////////////////

And now is time to run the simulation and check the results:













We can see the memory and virtual terminal is empty














And now we can see we write in the memory and LCD screen at the same time we read as we can see in the virtual terminal.

No hay comentarios:

Publicar un comentario