EEPROM CRC

  El microcontrolador en las placas Arduino y Genuino tiene 512 bytes de: memoria EEPROM cuyos valores se mantienen cuando la placa está apagada (como un pequeño disco duro).
Una CRC es una forma sencilla de comprobar si los datos han cambiado o de han dañado. En este ejemplo se calcula un valor de CRC directamente en los valores de la EEPROM. Esta CRC es como una firma y cualquier cambio en el CRC calculado significa una modificación de los datos almacenados. El propósito de este ejemplo es poner de relieve cómo el objeto EEPROM se puede utilizar como una matriz.

Hardware necesario

  • Arduino o Genuino

Circuito

No hay circuito para este ejemplo.

 

Esquema

Código


//Escrito por Christopher Andrews. algoritmo CRC generado por pycrc, licencia MIT
//(https://github.com/tpircher/pycrc).
//Una CRC es una forma sencilla de comprobar si los datos han cambiado o se han dañado.
//En este ejemplo se calcula un valor de CRC directamente en los valores de la
//'EEPROM'.
//El propósito de este ejemplo es poner de relieve cómo el objeto 'EEPROM' se puede
//utilizar como una matriz.


#include <Arduino.h>
#include <EEPROM.h>

void setup() {

  //Inicia la comunicacion serie
  Serial.begin(9600);
  while (!Serial) {
    ; // espera a que el puerto serie se conecte. Necesario solo para el USB nativo
  }

  //Imprime la longitus de los datos para ejecutar en CRC.
  Serial.print("Longitud EEPROM: ");
  Serial.println(EEPROM.length());

  //Imprime el resultado de la llamada a eeprom_crc()
  Serial.print("Datos CRC32 de la EEPROM: 0x");
  Serial.println(eeprom_crc(), HEX);
  Serial.print("\n\nTerminado!");
}

void loop() {
  /* Bucle vacio */
}

unsigned long eeprom_crc(void) {

  const unsigned long crc_table[16] = {
    0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
    0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
    0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
  };

  unsigned long crc = ~0L;

  for (int index = 0 ; index < EEPROM.length()  ; ++index) {
    crc = crc_table[(crc ^ EEPROM[index]) & 0x0f] ^ (crc >> 4);
    crc = crc_table[(crc ^ (EEPROM[index] >> 4)) & 0x0f] ^ (crc >> 4);
    crc = ~crc;
  }
  return crc;
}
  

No hay comentarios:

Publicar un comentario