Contactar con TUTO2002

5.15 Tabla M

Tabla en Memoria

 

Al plantearme Calibrar Acelerómetro – Trigonometría  he necesitado utilizar la función de C
Arco-Seno (asin)
Me advirtieron que es una función “muy pesada”.
 

En la prueba que realice resulto que el promedio de convertir

Seno > Ángulo era de      130 Microsegundos

 Me aconsejaron que crease una Tabla en Memoria ??????

 

Como siempre todo esta en la Web , solo hay que gastar tiempo en:

Buscarlo > Traducirlo > Asimilarlo > Probarlo

Desde aquí podéis empezar

 

http://www.arduino.cc/en/Reference/PROGMEM

 

Bueno si os sirve de algo, os daré alguna de las Notas que he tomado …

 

En Arduino tenemos 3 tipos de Memoria:

FLASH .- Es donde se almacena el ultimo programa cargado
 
SRAM (Static Random Access Memory) .-  Es donde el programa crea y manipula las variables
cuando se ejecuta el programa.
 
EEPROM .- Es un espacio de memoria donde podemos almacenar datos de forma permanente,
que no se modifica aunque carguamos otros programas.
Ya la  hemos utilizado por ejemplo para almacenar los Coeficientes PID.
Las memorias FLASH y EEPROM son memorias NO volátiles
(la información se mantiene aunque se desconecte la alimentación).
 
La cantidad de memoria disponible en función del micro de nuestro Arduino es
 

 

 

ATMega168

ATMega328P

ATmega1280

Flash
(1 Kbyte used
for bootloader)

16 KBytes

32 KBytes

128 KBytes

SRAM

1024 bytes

2048 bytes

8 KBytes

EEPROM

512 bytes

1024 bytes

4 KBytes

 
Hay una clara desproporción entre memoria FLASH y SRAM
 
Sobre todo cuando trabajemos con:
Cadenas de Texto (Ejemplo: para dar salida a un “display”)
 
Tablas / Matrices (Ejemplo:  Senos > Ángulos)

 En estos casos es prácticamente imprescindible guardarlas en la memoria FLASH.

Para poder cargar nuestros datos en el área de programa debemos utilizar el
“modificador”    PROGMEM unido al tipo de variable que vamos a utilizar
Estos son los tipos de variables que utiliza:
 prog_char          //   signed char     (1 byte)        -127   to  128
 prog_uchar        //  unsigned char (1 byte)          0   to  255
 prog_int16_t      //  signed int        (2 bytes)       -32,767  to  32,768
 prog_uint16_t   // unsigned int     (2 bytes)        0   to  65,535
 prog_int32_t    //  signed long      (4 bytes)       -2,147,483,648   to   2,147,483,647.
 prog_uint32_t  // unsigned long    (4 bytes)      0   to   4,294,967,295

 Parece que no soporta los “float”   ???

En la cabecera de nuestro programa debemos incluir la Librería avr/pgmspace.h
#include <avr/pgmspace.h>
Siguiendo el “ovillo”  
 
Este es el enlace al “manual” de AVR
Y aquí podéis encontrar otras funciones para trabajar con datos en memoria Flash.
Incluyo un ejemplo de cómo utilizarlo : TablaM01
 
 

Fijaros que antes de poder utilizar los datos de la memoria Flash tenemos que cargarlos en una variable nuestra

enteroLeido = pgm_read_word_near(tablaNumeros + i);

donde

enteroLeido                      Es nuestra variable
pgm_read_word_near     Es la Función utilizada
(tablaNumeros + i)          Es la Dirección de la Tabla + un “índice”

 

Por lo que he leído en los foros parece que los datos almacenados en memoria Flash

NO son modificables durante la ejecución del programa.

 

Enlaces

Tabla Senos > Ángulos

Memoria EEPROM

Č
ċ
TablaM01.pde
(1k)
Marcos Echeita,
10/10/2010 2:15
Comments