TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: - TuX - 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:
#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.
-
Bueno pues ya descubri como se hace, leyendo el pgmspace.h
Para declarar un puntero haca la flash se hace asi:
PGM_VOID_P p_flash;
p_flash = &Matriz_en_flash[0];
donde
PGM_VOID_Pesta definido en pgmspace.h como un puntero generico
#define PGM_VOID_P const prog_void *
Para copiar la matriz de la memoria flash en una matriz en ram seria algo asi
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
-
Yo use esto
const char *textLCD; //Puntero a flash
char *IRAMtxtLCDPtr; //Puntero a iRAM
Y la leer desde la flash y ponerlo en ram, use esto
memcpy(IRAMtxtLCDPtr, textLCD, 16);
-
Interesante, no se me habia ocurrido eso, habra que probar ;-)