Autor Tema: Recorrer un tabla en la memoria Flash  (Leído 2116 veces)

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

Desconectado MarHer

  • PIC10
  • *
  • Mensajes: 6
Recorrer un tabla en la memoria Flash
« 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..

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Recorrer un tabla en la memoria Flash
« Respuesta #1 en: 17 de Mayo de 2004, 23:47:00 »
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

Desconectado MarHer

  • PIC10
  • *
  • Mensajes: 6
RE: Recorrer un tabla en la memoria Flash
« Respuesta #2 en: 18 de Mayo de 2004, 07:14:00 »
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!!

Desconectado josemyzm

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
RE: Recorrer un tabla en la memoria Flash
« Respuesta #3 en: 18 de Mayo de 2004, 09:46:00 »
Porqué no usas una eeprom externa??

Un saludo.
Saludos desde Logroño (España)

Desconectado MarHer

  • PIC10
  • *
  • Mensajes: 6
RE: Recorrer un tabla en la memoria Flash
« Respuesta #4 en: 18 de Mayo de 2004, 10:01:00 »
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.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17678
    • MicroPIC
RE: Recorrer un tabla en la memoria Flash
« Respuesta #5 en: 18 de Mayo de 2004, 10:04:00 »
¿Tienes el datasheet de la memoria flash?, dinos cuál es y le echamos un vistazo
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado MarHer

  • PIC10
  • *
  • Mensajes: 6
RE: Recorrer un tabla en la memoria Flash
« Respuesta #6 en: 18 de Mayo de 2004, 10:09:00 »
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..

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17678
    • MicroPIC
RE: Recorrer un tabla en la memoria Flash
« Respuesta #7 en: 18 de Mayo de 2004, 10:34:00 »
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.
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado MarHer

  • PIC10
  • *
  • Mensajes: 6
RE: Recorrer un tabla en la memoria Flash
« Respuesta #8 en: 18 de Mayo de 2004, 10:54:00 »
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);
}   


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17678
    • MicroPIC
RE: Recorrer un tabla en la memoria Flash
« Respuesta #9 en: 18 de Mayo de 2004, 11:28:00 »
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.
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado josemyzm

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
RE: Recorrer un tabla en la memoria Flash
« Respuesta #10 en: 18 de Mayo de 2004, 12:01:00 »
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.
Saludos desde Logroño (España)

Desconectado MarHer

  • PIC10
  • *
  • Mensajes: 6
RE: Recorrer un tabla en la memoria Flash
« Respuesta #11 en: 18 de Mayo de 2004, 12:46:00 »
Nadie se curro nada, la targeta fue diseñada por la empresa.
El micro es un motorola MC9S12A256

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Recorrer un tabla en la memoria Flash
« Respuesta #12 en: 18 de Mayo de 2004, 16:48:00 »
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!