Programa AVR EEPROM directamente desde la fuente C

10

Cuando incluye el siguiente código en una fuente AVR C, aparentemente puede programar directamente los fusibles, sin la necesidad de un comando adicional o un archivo .hex:

#include <avr/io.h>

FUSES = {
        .low =          LFUSE_DEFAULT ,
        .high =         HFUSE_DEFAULT ,
        .extended =     EFUSE_DEFAULT ,
};

¿Existe un truco similar para programar valores en EEPROM?

He revisado /usr/lib/avr/include/avr/fuse.h donde puedo encontrar algunos comentarios sobre una macro , pero no puedo encontrar un comentario similar en /usr/lib/avr/include/avr/eeprom.h e interpretar el preprocesador las cosas están un poco fuera de mi liga.

Sería muy útil si pudiera incluir los valores predeterminados de EEPROM en el código fuente de C. ¿Alguien sabe cómo lograr eso?

edit1:

Este truco de FUSOS solo se ejecuta en tiempo ISP, no en tiempo RUN. Por lo tanto, no hay fusibles programados en el código de ensamblaje resultante en el controlador. En su lugar, el programador realiza ciclos automáticos a través de un ciclo de programación FUSES adicional.

edit2:

Utilizo las cadenas de herramientas avr-gcc y avrdude en Linux.

    
pregunta jippie

2 respuestas

7

Con avr-gcc, la macro EEMEM se puede usar en la definición de una variable, consulte libc docs y un ejemplo here :

#include <avr/eeprom.h>
char myEepromString[] EEMEM = "Hello World!";

declara que la matriz de caracteres reside en una sección llamada ".eeprom" que, después de la compilación, le dice al programador que estos datos se programarán en la EEPROM. Dependiendo de su software de programación, es posible que deba proporcionar explícitamente el nombre del archivo ".eep" creado durante el proceso de creación al programador, o puede encontrarlo implícitamente por sí mismo.

    
respondido por el JimmyB
6

Sí, puede escribir manualmente los datos predeterminados en EEPROM en el código fuente. Primero, revise esta impresionante guía en la EEPROM con AVR: Tutorial AVR EEPROM de Dean. También, debo agregar que es una mejor idea crear un archivo .eep que contenga los datos de EEPROM utilizando el archivo makefile que se programará en el dispositivo junto con el código fuente. Sin embargo, si no está familiarizado con varias operaciones de makefile y linker, todavía se puede hacer desde su archivo de código fuente, solo ocurrirá tan pronto como el circuito se encienda, deteniendo la operación inicial del programa.

Al comienzo del programa (antes de cualquier tipo de bucle principal), puedes hacer algo como esto:

#include <avr/eeprom.h>

#define ADDRESS_1 46  // This could be anything from 0 to the highest EEPROM address
#define ADDRESS_2 52  // This could be anything from 0 to the highest EEPROM address
#define ADDRESS_3 68  // This could be anything from 0 to the highest EEPROM address

uint8_t dataByte1 = 0x7F;  // Data for address 1
uint8_t dataByte2 = 0x33;  // Data for address 2
uint8_t dataByte3 = 0xCE;  // Data for address 3

eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
eeprom_update_byte((uint8_t*)ADDRESS_2, dataByte2);
eeprom_update_byte((uint8_t*)ADDRESS_3, dataByte3);

La función "actualizar" verifica primero si ese valor ya está allí, para guardar en escrituras innecesarias, preservando la vida útil de EEPROM. Sin embargo, hacer esto en muchos lugares puede llevar bastante tiempo. Podría ser mejor verificar una sola ubicación. Si es el valor deseado, entonces el resto de las actualizaciones se pueden omitir por completo. Por ejemplo:

if(eeprom_read_byte((uint8_t*)SOME_LOCATION) != DESIRED_VALUE){
  eeprom_write_byte((uint8_t*)SOME_LOCATION, DESIRED_VALUE);
  eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
  eeprom_update_byte((uint8_t*)ADDRESS_2, dataByte2);
  eeprom_update_byte((uint8_t*)ADDRESS_3, dataByte3);
}

Si está buscando actualizar grandes cantidades de datos, intente usar otras funciones como eeprom_update_block(...) . Y definitivamente leer ese tutorial; esta bien escrito

Podría colocar todas las declaraciones de actualización de EEPROM en una sola declaración condicional del preprocesador. Esto es muy simple de hacer:

#if defined _UPDATE_EEPROM_
  #define ADDRESS_1 46  // This could be anything from 0 to the highest EEPROM address
  uint8_t dataByte = 0x7F;  // Data for address 1
  eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
#endif // _UPDATE_EEPROM_

Este bit de código ni siquiera se compilará a menos que hagas lo siguiente:

#define _UPDATE_EEPROM_

Puede dejar esto como un comentario, y luego descomprimirlo si necesita cambiar los valores EEPROM predeterminados. Para obtener más información sobre el preprocesador de C, consulte este manual en línea . Creo que es posible que esté más interesado en las secciones sobre macros y declaraciones condicionales.

    
respondido por el Kurt E. Clothier

Lea otras preguntas en las etiquetas