Autor Tema: Puntero a flash (PROGMEM)  (Leído 3714 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado - TuX -

  • PIC10
  • *
  • Mensajes: 14
Puntero a flash (PROGMEM)
« en: 31 de Agosto de 2009, 17:34:30 »
Estoy escribiendo un programa en WinAVR 2009 para el atmega32 en el cual tengo varias matrices en la memoria flash, el problema que tengo es que necesito declarar un punteros hacia el inicio de las matrices, bueno la idea  es crear una matriz de punteros que apunte a las matrices en flash.

El problema es como declarar correctamente el puntero, aqui pongo un programa sencillo para ejemplificar:


Código: [Seleccionar]
#include <avr\io.h>

#include <avr\iom8.h>

#include <avr\pgmspace.h>




 
const uint8_t matriz[] PROGMEM =
{
0b01101100,
0b01101100,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00
};


int main(void) {

uint8_t a[9], i;
uint8_t *p_matriz = &C_Dobles[0];

for (i=0; i<=9; i++){
a[i]=pgm_read_byte(p_matriz);
}

   while(1==1) {

   }

}

Este codigo lo simulo en avr studio pero me da una advertencia  del tipo de objetivo apuntado y al simular  me da valores incorrectos al revisar si copio la matriz de la flash en la matriz que declaro en ram. la declaracion del puntero la hice como normalmente se hace, asi lo hice para crear un puntero a una matriz que esta en eeprom y si funcino, alguna idea de como se declara correctamente.

Desconectado - TuX -

  • PIC10
  • *
  • Mensajes: 14
Re: Puntero a flash (PROGMEM)
« Respuesta #1 en: 02 de Septiembre de 2009, 19:09:11 »
Bueno pues ya descubri como se hace, leyendo el pgmspace.h

Para declarar un puntero haca la flash se hace asi:

Código: [Seleccionar]
PGM_VOID_P p_flash;
p_flash = &Matriz_en_flash[0];

donde
Código: [Seleccionar]
PGM_VOID_Pesta definido en pgmspace.h como un puntero generico

Código: [Seleccionar]
#define PGM_VOID_P   const prog_void *
Para copiar la matriz de la memoria flash en una matriz en ram seria algo asi

Código: [Seleccionar]
for (i=0; i<=8; i++){

array_en_ram[i] = pgm_read_byte(p_flash ++);

//siendo  array_en_ram de igual o mayor tamaño que la matriz de flash
}

Esto es realmente util e interesante.

TuXFamily
« Última modificación: 02 de Septiembre de 2009, 19:14:09 por - TuX - »

Desconectado FuYiVape

  • PIC12
  • **
  • Mensajes: 69
    • Electronica y Sistemas
Re: Puntero a flash (PROGMEM)
« Respuesta #2 en: 07 de Septiembre de 2009, 18:28:33 »
Yo use esto

Código: [Seleccionar]
const char *textLCD; //Puntero a flash
char *IRAMtxtLCDPtr; //Puntero a iRAM
Citar

Y la leer desde la flash y ponerlo en ram, use esto

Código: [Seleccionar]
memcpy(IRAMtxtLCDPtr, textLCD, 16);
Código: [Seleccionar]

Desconectado - TuX -

  • PIC10
  • *
  • Mensajes: 14
Re: Puntero a flash (PROGMEM)
« Respuesta #3 en: 14 de Septiembre de 2009, 17:02:27 »
Interesante, no se me habia ocurrido eso, habra que probar ;-)