Diferencia entre revisiones de «EEPROM»

De ArduWiki
Saltar a: navegación, buscar
(Vea también)
(Referencias)
 
(No se muestran 20 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
Es una memoria no volátil para mantener datos después de apagado nuestro Arduino. Se puede grabar constantes desde un [[boceto]] con algunas instrucciones especiales. Al igual que la memoria [[Flash]] tiene una vida util de unas 100,000 ciclos de escritura. Esta memoria solo puede leerse byte a byte y su uso puede se un poco incómodo. También es algo más lenta que la [[SRAM]].
+
Es una memoria no volátil para mantener datos después de apagado nuestro Arduino. Se puede grabar constantes desde un [[boceto]] con algunas instrucciones especiales. Al igual que la memoria [[flash]] tiene una vida útil de unas 100,000 ciclos de escritura. Esta memoria solo puede leerse byte a byte y su uso puede se un poco incómodo. También es algo más lenta que la [[SRAM]].
  
 
{|class="wikitable col2cen col3cen col4cen"
 
{|class="wikitable col2cen col3cen col4cen"
Línea 13: Línea 13:
 
|-
 
|-
 
|EEPROM||1K||4K||-
 
|EEPROM||1K||4K||-
 +
|}
 +
 +
Es una libreria [https://github.com/thijse/Arduino-EEPROMEx EEPROM] de Thijs Elenbaas...
 +
 +
== Sintaxis ==
 +
<pre>
 +
#include <EEPROM.h>
 +
EEPROM.write(dirección, dato);
 +
EEPROM.read(dirección);
 +
</pre>
 +
 +
== Parametros ==
 +
;dirección:Es la dirección entre 0 y el total de memoria EEPROM de tu placa.
 +
;dato:Es un valor de un [[byte]].
 +
 +
 +
== Metodos ==
 +
 +
{| class="wikitable"
 +
|+Metodos de EEPROM
 +
|-
 +
! Metodo !! Descripciom
 +
|-
 +
| read() ||
 +
|-
 +
| readByte() ||
 +
|-
 +
| readInt() ||
 +
|-
 +
| readLong() ||
 +
|-
 +
| readDouble() ||
 +
|-
 +
| readBlock() ||
 +
|-
 +
| writeByte() ||
 +
|-
 +
| writeInt() ||
 +
|-
 +
| writeLong() ||
 +
|-
 +
| writeDouble() ||
 +
|-
 +
| writeFloat() ||
 +
|-
 +
| writeBlock() ||
 +
|-
 +
| update() ||
 +
|-
 +
| updateByte() ||
 +
|-
 +
| updateInt() ||
 +
|-
 +
| updateLong() ||
 +
|-
 +
| updateBouble() ||
 +
|-
 +
| updateFloat() ||
 +
|-
 +
| updateBlock() ||
 +
|-
 +
| isReady() ||
 +
|-
 +
| setMemPool() ||
 +
|-
 +
| setMaxAllowedWrites() ||
 +
|-
 +
| getAddress() ||
 
|}
 
|}
  
Línea 20: Línea 88:
 
* Debes trabajar con direcciones y hacerlo byte a byte, tanto para leer como para escribir.
 
* Debes trabajar con direcciones y hacerlo byte a byte, tanto para leer como para escribir.
 
* Las direcciones van de 0 a 999 y podrás almacenar datos de 0 a 255. Para datos mas grandes debes dividirlos en bytes. Por ejemplo si el dato es tipo [[unsigned int]] lo debes dividir entre 4 y luego de recuperar multiplicar por 4 (pierdes presicion).
 
* Las direcciones van de 0 a 999 y podrás almacenar datos de 0 a 255. Para datos mas grandes debes dividirlos en bytes. Por ejemplo si el dato es tipo [[unsigned int]] lo debes dividir entre 4 y luego de recuperar multiplicar por 4 (pierdes presicion).
 +
 +
== Advertencias ==
 +
* En ESP8266 es distinto [https://arduino.stackexchange.com/questions/25945/how-to-read-and-write-eeprom-in-esp8266 mira aqui].
  
 
== Ejemplo 1 ==
 
== Ejemplo 1 ==
Leer y escribir un solo byte.
+
Escribir y leer un solo [[byte]].
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
Línea 42: Línea 113:
  
 
== Ejemplo 2 ==
 
== Ejemplo 2 ==
Leer y escribir un dato tipo [[int]] osea dos bytes.
+
Escribir y leer un dato tipo [[int]] osea dos bytes.
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
 
#include <EEPROM.h>
 
#include <EEPROM.h>
int Direccion = 0;          //Variable con la posición de memoria
 
 
 
void setup(){
 
void setup(){
 
   //Escribir
 
   //Escribir
   int sensor = analogRead(0) / 4;   //Recuerda que el valor debe estar entre 0~1024.
+
   int dato = 12345;
   EEPROM.write(Direccion, highByte(x));
+
   EEPROM.write(0, highByte(dato)); //Toma mas significativo
   EEPROM.write(Direccion+1, lowByte(x));
+
   EEPROM.write(1, lowByte(dato));   //Toma menos significativo
 
   //Leer
 
   //Leer
   byte val = EEPROM.read(Direccion);
+
   int val = EEPROM.read(0);
   int dato1 = val;
+
   val = val << 8;                   //Desplaza a la izquierda
  dato1 = dato1 & << (8 * i);     //Desplaza a la derecha
+
   val += EEPROM.read(1);
   val = EEPROM.read(Direccion+1);
 
  dato1 = val;
 
 
}
 
}
  
Línea 67: Línea 134:
  
 
== Ejemplo 3 ==
 
== Ejemplo 3 ==
Leer y escribir un dato tipo [[long]] osea cuatro bytes.
+
Escribir y leer un dato tipo [[long]] osea cuatro bytes.
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
Línea 75: Línea 142:
 
   //Escribir
 
   //Escribir
 
   long dato = 123456789;
 
   long dato = 123456789;
   long AuxDato = dato;    //Saco copia para no destruir dato
+
   for (byte i=0; i<4; i++) {
   for (int i=0; i<sizeof(dato); i++) {
+
      EEPROM.write(3-i, lowByte(dato));
       EEPROM.write(i, highByte(AuxDato));
+
      dato = dato >> 8;     //Desplaza 8 bits a la derecha
       AuxDato = AuxDato & << 8; //Desplaza 8 bits a la izquierda
+
  }
 +
   //Lee
 +
  long val = 0;
 +
   for (byte i=0; i<3; i++) {
 +
       val += EEPROM.read(i);
 +
       val = val << 8;       //Desplaza 8 bits a la izquierda
 +
  }
 +
  val += EEPROM.read(3);
 +
}
 +
 
 +
void loop(){
 +
  //Nada
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 4 ==
 +
Escribir y leer un dato tipo matriz.
 +
 
 +
<syntaxhighlight lang="c++">
 +
#include <EEPROM.h>
 +
 
 +
void setup(){
 +
  Serial.begin(9600);
 +
  //Escribir
 +
  char data[12] = "Arduino 123";
 +
  for (byte i=0; i<13; i++){
 +
      EEPROM.write(i, data[i]);
 
   }
 
   }
 
   //Leer
 
   //Leer
   long val = 0;
+
   char val[12];
   for (int i=sizeof(val); i>0; i--) {
+
   for (byte i=0; i<13; i++){
       val = EEPROM.read(i - 1);   //Extrae los bits menos significativos
+
       val[i] = EEPROM.read(i);
      if (i != 1) {
 
        val = val & << (8 * i);  //Desplaza a la derecha menos el ultimo
 
      }
 
 
   }
 
   }
 +
  Serial.print(val);
 
}
 
}
  
Línea 96: Línea 187:
  
 
== Vea también ==
 
== Vea también ==
* [[flash]]
+
<categorytree mode=all>Librerias</categorytree>
* [[SRAM]]
 
* [[highByte()]]
 
* [[lowByte()]]
 
* [[not bit a bit]] - (<nowiki>~</nowiki>)
 
* [[and bit a bit]] - (<nowiki>&</nowiki>)
 
* [[and bit a bit compuesto]] <nowiki>(&=)</nowiki>
 
* [[or bit a bit]] - (<nowiki>|</nowiki>)
 
* [[or bit a bit compuesto]] <nowiki>(|=)</nowiki>
 
* [[xor bit a bit]] - (<nowiki>^</nowiki>)
 
* [[bitshift left]] - (<nowiki><<</nowiki>)
 
  
 
== Referencias ==
 
== Referencias ==
 +
* [https://www.arduinolibraries.info All Librays]
 +
* [http://playground.arduino.cc/Code/EEPROMex EEPROMex]
 
* [https://www.luisllamas.es/guardar-variables-entre-reinicios-con-arduino-y-la-memoria-no-volatil-eeprom/ Memoria EEPROM] - Luis Llamas
 
* [https://www.luisllamas.es/guardar-variables-entre-reinicios-con-arduino-y-la-memoria-no-volatil-eeprom/ Memoria EEPROM] - Luis Llamas
 
* [http://www.educachip.com/como-usar-la-memoria-eeprom-de-arduino/ Como usar EEPROM] - EducaChip
 
* [http://www.educachip.com/como-usar-la-memoria-eeprom-de-arduino/ Como usar EEPROM] - EducaChip
 +
* [https://arduino.stackexchange.com/questions/25945/how-to-read-and-write-eeprom-in-esp8266 EEPROM para ESP8266]
 +
* [https://arduinoplusplus.wordpress.com/2019/04/02/persisting-application-parameters-in-eeprom/ Persisting parameters in EEPROM] - Marco_C
  
[[Category:Estructura]]
+
[[Category:Librerias]]
 +
[[Category:memoria]]

Revisión actual del 00:14 10 sep 2019

Descripción

Es una memoria no volátil para mantener datos después de apagado nuestro Arduino. Se puede grabar constantes desde un boceto con algunas instrucciones especiales. Al igual que la memoria flash tiene una vida útil de unas 100,000 ciclos de escritura. Esta memoria solo puede leerse byte a byte y su uso puede se un poco incómodo. También es algo más lenta que la SRAM.

Memoria en cada Arduino
Tipo Arduino UNO Arduino MEGA Arduino MKR1000
flash 32K 256K 256K
Flash-bootloader 0.5K 8K -
SRAM 2K 8K 32K
EEPROM 1K 4K -

Es una libreria EEPROM de Thijs Elenbaas...

Sintaxis

#include <EEPROM.h>
EEPROM.write(dirección, dato);
EEPROM.read(dirección);

Parametros

dirección
Es la dirección entre 0 y el total de memoria EEPROM de tu placa.
dato
Es un valor de un byte.


Metodos

Metodos de EEPROM
Metodo Descripciom
read()
readByte()
readInt()
readLong()
readDouble()
readBlock()
writeByte()
writeInt()
writeLong()
writeDouble()
writeFloat()
writeBlock()
update()
updateByte()
updateInt()
updateLong()
updateBouble()
updateFloat()
updateBlock()
isReady()
setMemPool()
setMaxAllowedWrites()
getAddress()

Comentarios

  • La EEPROM de tu Arduino es especialmente util para guardar datos como: MAC, IP, constantes de calibración de algún sensor y claves de usuario.
  • Para actuar con esta memoria debes usar la libreria EEPROM.h que esta por defecto en el IDE.
  • Debes trabajar con direcciones y hacerlo byte a byte, tanto para leer como para escribir.
  • Las direcciones van de 0 a 999 y podrás almacenar datos de 0 a 255. Para datos mas grandes debes dividirlos en bytes. Por ejemplo si el dato es tipo unsigned int lo debes dividir entre 4 y luego de recuperar multiplicar por 4 (pierdes presicion).

Advertencias

Ejemplo 1

Escribir y leer un solo byte.

#include <EEPROM.h>
int Direccion = 0;          //Variable con la posición de memoria

void setup(){
   //Escribir
   byte data = B11001;    //25 en binario
   EEPROM.write(Direccion, data);
   //Leer
   byte val = EEPROM.read(Direccion);
}

void loop(){
   //Nada
}

Ejemplo 2

Escribir y leer un dato tipo int osea dos bytes.

#include <EEPROM.h>
void setup(){
   //Escribir
   int dato = 12345;
   EEPROM.write(0, highByte(dato));  //Toma mas significativo
   EEPROM.write(1, lowByte(dato));   //Toma menos significativo
   //Leer
   int val = EEPROM.read(0);
   val = val << 8;                   //Desplaza a la izquierda
   val += EEPROM.read(1);
}

void loop(){
   //Nada
}

Ejemplo 3

Escribir y leer un dato tipo long osea cuatro bytes.

#include <EEPROM.h>

void setup(){
   //Escribir
   long dato = 123456789;
   for (byte i=0; i<4; i++) {
      EEPROM.write(3-i, lowByte(dato));
      dato = dato >> 8;      //Desplaza 8 bits a la derecha
   }
   //Lee
   long val = 0;
   for (byte i=0; i<3; i++) {
      val += EEPROM.read(i);
      val = val << 8;       //Desplaza 8 bits a la izquierda
   }
   val += EEPROM.read(3);
}

void loop(){
   //Nada
}

Ejemplo 4

Escribir y leer un dato tipo matriz.

#include <EEPROM.h>

void setup(){
   Serial.begin(9600);
   //Escribir
   char data[12] = "Arduino 123";
   for (byte i=0; i<13; i++){
      EEPROM.write(i, data[i]);
   }
   //Leer
   char val[12];
   for (byte i=0; i<13; i++){
      val[i] = EEPROM.read(i);
   }
   Serial.print(val);
}

void loop(){
   //Nada
}

Vea también


Referencias