TODOPIC
FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: MarHer en 17 de Mayo de 2004, 15:57:00
-
Hola a todos, necesito si me pueden ayudar en lo siguiente: tengo que recorrer un tabla (con un puntero) ubicada en la memoria flash que se encuentra paginada, el problema me surge cuando incremento el puntero justo cuando cambia la pagina en la memoria..
Muchas gracias..
-
Porque no intentas meter la tabla en la eeprom interna del pic, y te creas una matriz que siga una lógica de NxN caracteres???
No se si te servirá la idea...
Espero que si... ;D
-
No puedo, la tabla tiene 32k mas o menos y no entra en la eeprom...
Hay alguna forma de obtener la direccion absoluta o algo asi?..
Por ej si yo tengo 30x8000 a que direccion absoluta de memoria se refiere?..
Gracias por la atencion y la ayuda!!
-
Porqué no usas una eeprom externa??
Un saludo.
-
Esto es para el laburo, me dieron un placa ya diseñada con micro, eeprom, ran, flash (es un dispositivo para tarifar las llamadas que se realizan en un locutorio) y yo tengo que programarla.. el diseño de hard ya esta hecho y no se modifica..
La idea es que tengo una tabla cargada en la memoria flash y tengo que recorrerla para obtener informacion de ella dejando punteros apuntando a cierta posicion de la tabla...
Espero que entiendan...
Gracias.
-
¿Tienes el datasheet de la memoria flash?, dinos cuál es y le echamos un vistazo
-
Perdoname, pero de esto empese hace menos de un mes.. Lo que mas se es de programacion en C.. No te entiendo lo que me pedis..
-
Perdóname tú a mí por utilizar un palabro en inglés. La verdad es que nos acostumbramos a llamar las cosas en inglés y luego no sabemos ni cómo se les llama en español.
El datasheet es la hoja de especificaciones técnicas de la memoria flash que utilizas. Si no lo tienes, dinos la referencia de la memoria o los datos que aparezcan serigrafiados sobre la misma.
-
Segun lo que te entendi te envio esto...
Yo luego de eso hice una funcion que recorre la flash..
Esta la estructura de la Memoria
SECTIONS
RAM = READ_WRITE 0x1000 TO 0x3FFF;
/* unbanked FLASH ROM */
MY_PROG = READ_ONLY 0x5000 TO 0x7FFF;
ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
/* banked FLASH ROM */
TABLA = READ_ONLY 0x308000 TO 0x30BFFF;
TABLA1 = READ_ONLY 0x318000 TO 0x31BFFF;
PAGE_30 = READ_ONLY 0x308000 TO 0x30BFFF;
PAGE_31 = READ_ONLY 0x318000 TO 0x31BFFF;
PAGE_32 = READ_ONLY 0x328000 TO 0x32BFFF;
PAGE_33 = READ_ONLY 0x338000 TO 0x33BFFF;
PAGE_34 = READ_ONLY 0x348000 TO 0x34BFFF;
PAGE_35 = READ_ONLY 0x358000 TO 0x35BFFF;
PAGE_36 = READ_ONLY 0x368000 TO 0x36BFFF;
PAGE_37 = READ_ONLY 0x378000 TO 0x37BFFF;
PAGE_38 = READ_ONLY 0x388000 TO 0x38BFFF;
PAGE_39 = READ_ONLY 0x398000 TO 0x39BFFF;
PAGE_3A = READ_ONLY 0x3A8000 TO 0x3ABFFF;
PAGE_3B = READ_ONLY 0x3B8000 TO 0x3BBFFF;
PAGE_3C = READ_ONLY 0x3C8000 TO 0x3CBFFF;
PAGE_3D = READ_ONLY 0x3D8000 TO 0x3DBFFF;
/* PAGE_3E = READ_ONLY 0x3E8000 TO 0x3EBFFF; not used: equivalent to ROM_4000 */
/* PAGE_3F = READ_ONLY 0x3F8000 TO 0x3FBFFF; not used: equivalent to ROM_C000 */
END
PLACEMENT
_PRESTART, STARTUP,
ROM_VAR, STRINGS,
VIRTUAL_TABLE_SEGMENT,
NON_BANKED, COPY INTO ROM_C000, ROM_4000;
DEFAULT_ROM INTO PAGE_30,PAGE_31,PAGE_32,PAGE_33,PAGE _ 34,PAGE_35,PAGE_36,PAGE_37,
PAGE_38,PAGE_39,PAGE_3A,PAGE_3B,PAGE_ 3C,PAGE_3D;
MY_TABLE INTO TABLA;
MY_TABLE1 INTO TABLA1;
MY_ROM INTO MY_PROG;
DEFAULT_RAM INTO RAM;
END
Esta es la funcion que graba en la flash..
/////////////////////////////////////////////////////////////////////
//
// Rutina de escritura en FLASH
//
// Nota1: como programo en zona paged, no es necesario desabilitar
// las interrupciones. Igual las desabilito.
//
// Nota2: se debe configurar los registros PPAGE y FCNFG (BKSEL) de
// acuerdo a la pagina donde almacene la informacion
//
/////////////////////////////////////////////////////////////////////
U8 ProgFlash( U16* progAdr, U16* bufferPtr, U16 size,U8 Page)
{
U8 CCRCopy;
U8 Fcnfg,Ppage;
Fcnfg = FCNFG;
Ppage = PPAGE;
if(((U16) progAdr & ALIGNED_WORD_MASK)!=0) // check por aligned word
return(FAIL);
// enmascaro las interrupciones cuando programo en paginas 3E y 3F
asm
{
TFR CCR,A
STAA CCRCopy ;store CCR
ORCC #$10 ;mask interrupts
};
// limpio flags de error
FCNFG = 3;
FSTAT_PVIOL = 1;
FSTAT_ACCERR = 1;
FCNFG = 2;
FSTAT_PVIOL = 1;
FSTAT_ACCERR = 1;
FCNFG = 1;
FSTAT_PVIOL = 1;
FSTAT_ACCERR = 1;
FCNFG = 0;
FSTAT_PVIOL = 1;
FSTAT_ACCERR = 1;
FCNFG_BKSEL0 = 1; // selecciono...
FCNFG_BKSEL1 = 1; // banco 3.
PPAGE = Page; // pagina 30 (banco 3)
while(size !=0)
{
// buffer de comandos vacio?
if(FSTAT_CBEIF ==1)
{
*progAdr++ = *bufferPtr++;
// ejecuto el comando
FCMD = COMM_PROG;
FSTAT = COMM_CBEIF;
// veo si hubo algun error
if((FSTAT_ACCERR) || (FSTAT_PVIOL))
{
// desenmascaro las interrupciones
asm
{
LDAA CCRCopy
TFR A,CCR ;restore CCR
};
PPAGE = Ppage;
FCNFG = Fcnfg;
return(FAIL);
};
size--;
};
};
while(FSTAT_CCIF !=1);
asm
{
LDAA CCRCopy
TFR A,CCR ;restore CCR
};
PPAGE = Ppage;
FCNFG = Fcnfg;
return(PASS);
}
-
Después de lo que has enviado, y dada mi nula experiencia con memorias flash, es muy probable que diga cualquier barbaridad.
No obstante, veo que las posiciones de memoria reservadas para lectura y escritura són únicamente las que van de la 0x1000 a la 0x3FFF y, si mis cálculos no fallan, eso suma 12KB.
-
Deberias indicar que componentes forman la tarjeta, tipo de micro, memoria y esas cosas.
Si no entiendo mal alguien se curró el aparato, y ahora el encargado del soft que se busque la vida?? vaya panorama.
-
Nadie se curro nada, la targeta fue diseñada por la empresa.
El micro es un motorola MC9S12A256
-
Yo ya me he perdido por completo!!!
cuentanos en que está basada la tarjeta!!!
Tipo de memoria flash!! modelo..... tipo de micro... y si puede ser... una fotito de la pcb... a ver si nos desliamos!!! porque veo que cada uno hablamos de una cosa!!! 

O estás trabajando con los datos dentro de la flash del propio micro???
La verdad, es que con tan poca documentación, te estamos orientando a palo de ciego!!! 
Pero no te preocupes, que seguro que te podemos ayudar entre todos!