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 ,
};
¿Hay algún truco similar para programar valores en EEPROM?
He comprobado /usr/lib/avr/include/avr/fuse.h
dónde puedo encontrar algunos comentarios sobre una macro, pero no puedo encontrar un comentario similar /usr/lib/avr/include/avr/eeprom.h
e interpretar las cosas del preprocesador está un poco fuera de mi alcance.
Sería realmente útil si pudiera incluir valores predeterminados de EEPROM en el código fuente de C. Alguien sabe cómo lograr eso?
edit1:
Este truco FUSES solo se ejecuta en tiempo de ISP, no en tiempo de EJECUCIÓN. Por lo tanto, no hay fusibles programados en el código de ensamblaje resultante en el controlador. En cambio, el programador realiza un ciclo automático a través de un ciclo de programación de FUSIBLES adicional.
edit2:
Uso la cadena de herramientas avr-gcc y avrdude en Linux.
Respuestas:
Con avr-gcc, la
EEMEM
macro se puede usar en la definición de una variable, vea loslibc
documentos y un ejemplo aquí :declara que la matriz de caracteres reside en una sección llamada ".eeprom" que luego de la compilación le dice al programador que estos datos deben programarse en la EEPROM. Dependiendo del software de su programador, es posible que deba proporcionar explícitamente al programador el nombre del archivo ".eep" creado durante el proceso de compilación, o puede encontrarlo implícitamente por sí mismo.
fuente
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 ihex $(src).elf $(src).eeprom.hex
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U eeprom:w:$(src).eeprom.hex
Sí, puede escribir manualmente datos predeterminados en EEPROM en el código fuente. Primero, consulte esta increíble guía sobre la EEPROM con AVR: Tutorial de EEPROM AVR de Dean. Además, debo agregar que es una mejor idea crear un archivo .eep que contenga los datos EEPROM utilizando el archivo MAKE que se programará en el dispositivo junto con el código fuente. Sin embargo, si no está familiarizado con varias operaciones de archivos MAKE y enlazadores, aún puede hacerlo desde su archivo de código fuente; solo sucederá tan pronto como se encienda el circuito, deteniendo la operación inicial del programa.
Al comienzo del programa (antes de cualquier tipo de bucle principal) puede hacer algo como esto:
La función "actualizar" comprueba primero para ver si ese valor ya está allí, para ahorrar en escrituras innecesarias, preservando la vida útil de EEPROM. Sin embargo, hacer esto para muchas ubicaciones puede llevar bastante tiempo. Puede ser mejor verificar una sola ubicación. Si es el valor deseado, el resto de las actualizaciones se pueden omitir por completo. Por ejemplo:
Si está buscando actualizar grandes cantidades de datos, intente usar otras funciones como
eeprom_update_block(...)
. Y definitivamente lea ese tutorial; Está bien escrito.Puede poner todas las declaraciones de actualización de EEPROM en una sola declaración condicional de preprocesador. Esto es muy sencillo de hacer:
Este bit de código ni siquiera se compilará a menos que haga lo siguiente:
Puede dejar esto allí como un comentario, luego descomentar si necesita cambiar los valores predeterminados de EEPROM. Para obtener más información sobre el preprocesador C, consulte este manual en línea . Creo que puede estar más interesado en las secciones sobre macros y declaraciones condicionales.
fuente
Ch. 7 Setting Initial Values
.EEMEM
variables, el compilador se encarga de administrar qué variable reside en qué parte de la EEPROM. De esta manera, solo opera en punteros (constantes, generados por el compilador) a las variables cuando accede a los datos. Si, por otro lado, define explícitamente la dirección donde reside cada variable, tendrá que ocuparse de esas direcciones usted mismo, incluso asegurarse de que ninguna variable ocupe accidentalmente la misma dirección, sobrescribiéndose entre sí; o volver a calcular todas las direcciones en caso de que el tamaño de almacenamiento de una variable cambie en el futuro, etc.