Escribir en la FLASH

Hola amigos,

He tenido grandes dificultades al tratar de escribir en la flash, ya que debido a que la transmision Serial es muy lenta (dada la gran cantidad de muestras), no me ha quedado mas remedio que muestrear los canales analogos e ir guardandolos en la FLASH, para despues enviarlos al PC, por otra parte, ya que necesito ir enviando datos 1 a 1 hacia la flash, he pensado en punteros y dejar reservado el espacio en la memoria flash mdiante arreglos.

Estoy usando la Duemilanove y no me permite crear arreglos mayores a 890 (arreglo[890]), y como si esto fuera poco, si creo dos o mas arreglos de ese tamaño tambien me arroja problemas y debo disminuir la capacidad de los arreglos, en definitiva, no me permite guardar mas de 890 datos en la flash y yo pretendo ojalá llenarla.
(cuando digo que me arroja problemas, no es en la compilación, ya que si pruebo con menos datos la cosa funciona).

Si alguien ya ha tenido este problema o si al menos ha hecho algo parecido por favor que me ayude :wink:

Saludos

Ten en cuenta que el ATmega328 tiene 16Kb de RAM por lo que si cada entero ocupa 16bits podrás meter 1000 en la RAM, si a eso le quitas las variables que estés usando y demás cosas, pues te quedarán los 890.

El Arduino puede mandar por serie hasta 2Mbit/s que es bastante información, si no tendrás que usar otro micro, como algún Cypress por ejemplo.

Sin saber que es ni que debe hacer, no te puedo aconsejar mucho más.

Un saludo :wink:

Estás confundiendo la flash (memoria de programa) con la ram, lo primero como te dice chiva es ver cuanta ram tienes, una vez compilado puedes ver cuanta ha usado el programa (con el AVR Studio, en el de arduino no sé como es) y además tienes que dejar espacio para los datos de la pila (stack) del microcontrolador, que también utiliza la ram en ejecución del programa para almacenarlos.

En este código hice más o menos lo que dices:
http://www.jmnlab.com/servominiz/servominiz.html
http://www.jmnlab.com/servominiz/codigo1280.html

Muestrear el adc, almacenar el valor en dos vectores y una vez hecho ésto mandarlos al pc.

Para ello como dices con crear un par de vectores y recorrerlos en un bucle para almacenar el valor del adc alto y del adc bajo y luego sacarlos vale:

volatile unsigned char pc_adc_alto[250]; //datos para mandar al pc
volatile unsigned char pc_adc_bajo[250];

El límite del vector lo tienes en la ram del micro que estimes que puedes usar.

Ahí está hecho así y funciona, puede tener fallos ya que no está repasado el código y es con WinAVR, pero la idea es la misma.

Hola denuevo, muchas gracias

Ya he solucionado el problema del limite de memoria, por alguna razón, a pesar de estar usando la librería pgmspace.h y comandos definidos allí, no me funcionaba (y al parecer me escribía en la ram). Actualmente
ya he solucionado el problema y estoy escribiendo en ella :).