11 votos

Programa AVR EEPROM directamente desde el código fuente en C

Al incluir el siguiente código en un AVR de código fuente de C, puede parecer directamente el programa de los fusibles, sin la necesidad de un comando extra o .archivo hex:

#include <avr/io.h>

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

Hay una táctica similar a la del programa de valores en la EEPROM?

He comprobado /usr/lib/avr/include/avr/fuse.h donde puedo encontrar algunos comentarios acerca de una macro, pero no puedo encontrar un comentario similar en /usr/lib/avr/include/avr/eeprom.h e interpretar el preprocesador cosas son un poco fuera de mi liga.

Sería muy útil si me podría incluir por defecto EEPROM los valores en el código fuente de C. Alguien sabe cómo hacerlo?

edit1:

Este FUSIBLES truco que sólo se ejecuta en el ISP en tiempo, no en tiempo de EJECUCIÓN. Así que no hay fusibles de ser programado en el ensamblado resultante de código en el controlador. En su lugar, el programador automáticamente los ciclos a través de un extra de FUSIBLES ciclo de programación.

edit2:

Yo uso el avr-gcc y avrdude conjunto de herramientas en Linux.

7voto

azhar Puntos 21

He hecho esto antes - manual de escritura de datos por defecto en la memoria EEPROM en el código fuente. En primer lugar, echa un vistazo a este impresionante guía en la EEPROM con AVR: Decano del AVR Tutoriales También, debo agregar que es una mejor idea para crear una .eep archivo que contiene la EEPROM de datos utilizando el archivo makefile que será programado en el dispositivo junto con el código fuente. Sin embargo, si usted no está familiarizado con varias makefile y el enlazador de operaciones, que todavía se puede hacer desde dentro de su archivo de código fuente - se acaba de suceder tan pronto como el circuito es alimentado, el estancamiento de la inicial de la operación del programa.

En el comienzo del programa (antes de cualquier tipo de bucle principal) se podría 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 "update" verifica primero si ese valor ya está ahí, para guardar en escrituras innecesarias, la preservación de la memoria EEPROM de la vida útil. Sin embargo, haciendo esto por muchos ubicación puede tomar un poco de tiempo. Podría ser mejor para comprobar una única ubicación. Si es que el valor deseado, y luego el resto de las actualizaciones puede ser omitido 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 usted está buscando para actualizar grandes cantidades de datos, trate de usar las otras funciones, tal como eeprom_update_block(...). Y, definitivamente, leer el tutorial; está bien escrito.

Usted puede poner todos de la EEPROM de la actualización de las declaraciones en un solo preprocesador de la instrucción condicional. Esto es muy sencillo 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 trozo de código no ser compilados a menos que usted haga lo siguiente:

#define _UPDATE_EEPROM_

Usted podría dejar esto como un comentario, a continuación, quite el comentario de si usted necesita para cambiar el valor predeterminado de la EEPROM los valores. Para obtener más información sobre el preprocesador de C, echa un vistazo a este manual en línea. Creo que puede ser la mayoría de los interesados en la sección de macros y sentencias condicionales.

7voto

pgs Puntos 2491

Con el avr-gcc el EEMEM macro puede ser utilizado en la definición de una variable, consulte la libc docs y un ejemplo aquí:

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

declara el array de caracteres a residir en una sección llamada ".eeprom", que después de la compilación dice el programador que este dato debe ser programado en la EEPROM. Dependiendo de su software de programación, usted puede necesitar explícitamente dar el nombre de el ".eep"-archivo creado durante el proceso de construcción para el programador, o puede que implícitamente encontrar por sí mismo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X