Autor Tema: Flash Como EEprom HCS08  (Leído 14674 veces)

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

Desconectado aismirlian

  • PIC10
  • *
  • Mensajes: 8
Flash Como EEprom HCS08
« en: 15 de Octubre de 2008, 12:44:17 »
Hola. Tengo un problema, a ver si alguien ya lo resolvió:
Tengo que guardar 3 bytes de datos no volátiles, y como estoy trabajando con un HCS08 no tengo memoria EEprom interna, por lo tanto tengo dos opciones que debido a la capacidad de almacenamiento que necesito elijo la de utilizar 3 bytes de la Flash como EEprom. Como para escribir en la flash no puedo hacerlo desde la misma flash para estos micros, hice una función que me copia a otra función en la RAM para que luego ejecutándola desde la RAM pueda escribir en la Flash.
Mi problema reside en la función que escribe en la flash, según la hoja de datos y el diagrama de flujo que muestra, arme la siguiente función:

void far Flash_Write (void)
{
  DisableInterrupts;
  //FCDIV=0x44; SUPUESTAMENTE NO HACE FALTA PORQUE LO HACE EN EL RESET
  FSTAT=0xC4;//LIMPIO TODOS LOS FLAGS DE ERROR

  FPROT_FPDIS=1;//SACO PROTECCION DE FLASH

  if(FSTAT_FACCERR)
  FSTAT_FACCERR=0;
 
  *DIRECCION=DATO_FLASH;//ASIGNO A LA DIRECCIÓN 0xF000 UN DATO CUALQUIERA

  FCMD=0x20;
 
  FSTAT_FCBEF=1;

  asm
  {
  NOP
  NOP
  NOP
  NOP
  NOP
  }
 
  if(FSTAT_FACCERR|FSTAT_FPVIOL)
  ERROR_FLASH=1;

  while (!FSTAT_FCCF);
}
Todo esto esta armado según el diagrama de flujo del Datasheet del M9S08QG8, en la seccion 4.5.

Cuando llamo a la función desde la RAM, la ejecuta lo mas bien, pero no me graba el valor que le dije en la Flash. No se a que se debe, si alguien tiene idea agradezco la ayuda.

Saludos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #1 en: 15 de Octubre de 2008, 16:49:47 »
Código: C
  1. /* Flash access function must be allocated in RAM */
  2. #pragma MESSAGE DISABLE C1805
  3. #define Page_Erase   PGM[21] = 0x40; temp = (( byte (*)( word ))( PGM ))
  4. #define Program_Byte PGM[21] = 0x20; temp = (( byte (*)( word, byte ))( PGM ))
  5.  
  6. /* Array of opcode instructions of the Erase/Program function in the HCS08 family */
  7. volatile unsigned char PGM[64]  =
  8. {  
  9.         0x87,0xC6,0x18,0x25,0xA5,0x10,0x27,0x08,0xC6,0x18,0x25,0xAA,0x10,0xC7,0x18,0x25,
  10.         0x9E,0xE6,0x01,0xF7,0xA6,0x20,0xC7,0x18,0x26,0x45,0x18,0x25,0xF6,0xAA,0x80,0xF7,
  11.         0x9D,0x9D,0x9D,0x9D,0x45,0x18,0x25,0xF6,0xF7,0xF6,0xA5,0x30,0x27,0x04,0xA6,0xFF,
  12.         0x20,0x07,0xA6,0xFF,0xC7,0x18,0x00,0xC6,0x18,0x25,0xA5,0x40,0x27,0xF4,0x8A,0x81
  13. };
  14. /*  The opcode above represents this set of instructions  
  15.     if ( FSTAT & 0x10 )
  16.                 {
  17.                   // Check to see if FACCERR is set
  18.                         FSTAT = FSTAT | 0x10;    // write a 1 to FACCERR to clear
  19.     }
  20.     (*((volatile unsigned char *)(Address))) = data;  //write to somewhere in flash
  21.     FSTAT = FSTAT | 0x80;      //Put FCBEF at 1.
  22.     _asm NOP;                  //Wait 4 cycles
  23.     _asm NOP;
  24.     _asm NOP;
  25.     _asm NOP;
  26.     if ( FSTAT & 0x30 )
  27.                 {  
  28.                   //check to see if FACCERR or FVIOL are set
  29.                         return 0xFF;             //if so, error.
  30.     }
  31.     while (( FSTAT & 0x40 )== 0 )
  32.                 {
  33.                         // Kick the dog
  34.                         _asm LDA 0xFF
  35.                         _asm STA 0x1800
  36.     }
  37.    */
  38. bool FlashErase( word Dest )
  39. {
  40.         byte temp;
  41.         bool Result = TRUE;
  42.  
  43.         /* In this routine is not allowed access to flash */
  44.         Cpu_DisableInt();
  45.  
  46.         temp = Page_Erase( Dest );
  47.  
  48.         if ( temp == 0xFF )
  49.         {
  50.                 /* Signal Error */
  51.                 Result = FALSE;
  52.         }
  53.  
  54.         Cpu_EnableInt();
  55.  
  56.         /* Signal Ok */
  57.         return( Result );
  58. }
  59. /*-----------------------------------------------------------------------------
  60. ** Function Name : FlashWrite
  61. ** Description   : Write a block of data in internal Flash
  62. ** Input         : Address, Source and length
  63. ** Output        : Result of operations
  64. ** Notes         :
  65. -----------------------------------------------------------------------------*/
  66. byte FlashWrite( word Address, byte *Source, byte Len )
  67. {
  68.         byte Index, temp;
  69.         bool Result = TRUE;
  70.  
  71.         /* In this routine is not allowed access to flash */
  72.         Cpu_DisableInt();
  73.  
  74.         for ( Index = 0; Index < Len; Index ++ )
  75.         {
  76.                 temp = Program_Byte( Address + Index, ( byte ) *( Source + Index ));
  77.  
  78.                 /* Execute Program routine */
  79.                 if ( temp == 0xFF )
  80.                 {
  81.                         /* Signal Error */
  82.                         Result = FALSE;
  83.                         break;
  84.                 }
  85.         }
  86.  
  87.         Cpu_EnableInt();
  88.  
  89.         /* Signal Ok */
  90.         return( Result );
  91. }
Estas dos funciones las tengo funcionando sin problemas, la diferencia con la que planteas vos, es que en vez de subir la función a RAM, directamente el array PGM contiene todos los opcodes necesarios para la ejecución de la misma.

Saludos !

Desconectado aismirlian

  • PIC10
  • *
  • Mensajes: 8
Re: Flash Como EEprom HCS08
« Respuesta #2 en: 16 de Octubre de 2008, 12:40:31 »
Antes que nada muchas gracias, pero al ver tu codigo me surgen un par de dudas:
Nunca vi esta declaracion en C:

#define Page_Erase   PGM[21] = 0x40; temp = (( byte (*)( word ))( PGM ))
#define Program_Byte PGM[21] = 0x20; temp = (( byte (*)( word, byte ))( PGM ))

O sea se entiende que para Borrar FCMD=0x40 y para Escribir un Byte FCMD=0x20. Lo que no entiendo es que función cumple temp y como es que esta declarado.

Otra cosa, en la parte que esta comentada, que vendría a ser lo mismo que escribiste en PGM, no veo la parte donde le asignas el valor a FCMD.

Gracias nuevamente.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #3 en: 16 de Octubre de 2008, 14:29:14 »
Hola, vamos por partes...

Las declaraciones de Page_Erase corresponde a la declaración de un puntero a función, en este caso PGM ( un array en memoria RAM ) que devuleve un byte y que recibe un word como parametro, de manera similar Program_Byte.
temp esta puesto de esa manera para forzar al compilador a asignar el resultado de la función, porque Program_Byte se traduce primero a PGM[21] = 0x40.
El FCMD se encuentra en el address 0x1826, y justamente se hace con la asignacion PGM[21]...si te fijas a partir de la dirección 20 del PGM dice
0xA6,0x20,0xC7,0x18,0x26 --> Cargar A con 0x20 y descargar A en 0x1826, por eso se pisa PGM[21]

Espero haber sido claro.

Saludos !



Desconectado aismirlian

  • PIC10
  • *
  • Mensajes: 8
Re: Flash Como EEprom HCS08
« Respuesta #4 en: 17 de Octubre de 2008, 09:50:55 »
Okay, entiendo, esta muy claro.
Ahora, cuando ejecuto el codigo, hice un .C aparte con este codigo, y llamo a estas funciones desde el main, de la siguiente manera:

if(FlashErase(DIRECCION))
ERROR_FLASH=FlashWrite(DIRECCION,&DATO_FLASH,1);

Donde DIRECCION=0xE382 y DATO_FLASH=0x65, pero como vi que hay que pasarle el puntero, le pase la direccion de DATO_FLASH, y cuando ejecuto, va a la RAM y lo ejecuta lo mas bien todo el codigo, pero cuando despues voy a ver la direccion 0xE382, aparece 0xFF y no 0x65.

Tenes idea a que se puede deber? tene en cuenta que como las definiciones de WORD, BYTE, las definiciones del temp las hice asi:
temp = (( byte (*)( word ))( PGM )) ------->  temp = (( int (*)( int ))( PGM ))
temp = (( byte (*)( word, byte ))( PGM )) -------> temp = (( int (*)( int, char ))( PGM ))

Igual no creo que eso este impidiendo que me escriba el byte en la flash.

Desconectado aismirlian

  • PIC10
  • *
  • Mensajes: 8
Re: Flash Como EEprom HCS08
« Respuesta #5 en: 17 de Octubre de 2008, 10:00:55 »
Ah y otra cosa que no se como es en tu codigo, es el Cpu_DisableInt(); y el Cpu_EnableInt(); yo los reemplace por DisableInterrupts() y EnableInterrupts() que lo unico que hacen en habilitar y deshabilitar las interrupciones generales, quiza en las tuyas hacen algo mas que quiza en las mias no lo hago y por eso no funciona.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #6 en: 17 de Octubre de 2008, 10:39:01 »
Hola, vamos por partes, con respecto a las funciones  Cpu_DisableInt() y el Cpu_EnableInt() solamente apagan y prenden las interrpciones, porque cuando se graba la flash nadie puede acceder a la misma.
Con respecto a la traducción de la macro no esta bien hecho, tene en cuenta la importancia de los signos y el sizeof de los tipos, la traduccion de estos typedefs en tipos nativos del lenguaje son:
  • byte se traduciria a unsigned char
  • word se traduciria a unsigned short int

El código de ejemplo es correcto, yo las uso de la misma manera, proba como te dije y fijate que onda.

Saludos !

PD: Agradecer no biene mal....

Desconectado aismirlian

  • PIC10
  • *
  • Mensajes: 8
Re: Flash Como EEprom HCS08
« Respuesta #7 en: 17 de Octubre de 2008, 16:11:00 »
Gracias Man, esta muy bien explicado.

Esto sirve bastante para cuando neceistas guardar un par de datos no volatiles y no hay necesidad de poner una memoria externa, mas si sobran bytes en la Flash.

Muchas gracias nuevamente.

Saludos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #8 en: 17 de Octubre de 2008, 16:19:15 »
Hola, si totalemnte cierto seria como un reemplazo de los micros que traian EEPROM, esta tecnologia ( SUPER FLASH ) se la compro FreeScale a ST y creo que a cambio le pasaron la arquitectura de los micros tipo 680x, sino fijate los data sheet de ST y vas a ver que son unos 6800 mejorados. Con que modelo de la familia HCS08 trabajas ?
Con respecto a las funciones no son 100 % mias, buzzeando buzzaendo junte conceptos y código snippeado y los meti todos juntos...

Saludos !
« Última modificación: 17 de Octubre de 2008, 16:21:27 por RICHI777 »

Desconectado aismirlian

  • PIC10
  • *
  • Mensajes: 8
Re: Flash Como EEprom HCS08
« Respuesta #9 en: 17 de Octubre de 2008, 16:40:19 »
Si igual que yo, primero empece con el datasheet solamente, pero para terminar de entenderlo necesite complementar con otros codigos.

Estoy trabajando con MC9S08QG8, el problema como ya dije era que tenia que guardar 3 variables no volatiles, con esto lo soluciono, pero vale aclarar que solamente con esto no alcanza, me refiero a que es  peligroso escribir en la flash sin saber bien donde estoy parado, conviene para esto bloquear la flash:

Primero hay que tener en cuenta que me conviene (para este micro) mover todo el programa al final de la parte de memoria de programa (llegando a 0xFFFF), esto es debido a que existe un registro FPROT que te permite bloquear la programacion y borrado de la flash en tiempos de ejecucion, dandole como parametro 7bits, los cuales van a ser el inicio de proteccion de flash, y de ahi para abajo, de esta forma me aseguro que el programa no me haga cagadas como escrbir donde no debe.

Espero que sirva el comentario.

Saludos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #10 en: 18 de Octubre de 2008, 08:32:41 »
Me parece muy buena la idea.  8)

Saludos !

Desconectado elotrogonzalo

  • PIC10
  • *
  • Mensajes: 25
Re: Flash Como EEprom HCS08
« Respuesta #11 en: 08 de Marzo de 2014, 01:00:57 »
Hola RICHI777! que gran aporte! ya estoy implementando estas rutinas para probarlas! solo tengo una duda con respecto a la función tipo booleana, cómo defino éste tipo de datos en el codewarrior por que no tengo agregado el typedef bool (el tipo booleano no lo tengo en mi CW).

O puedo reemplazarlo por un unsigned char?


Muchas gracias!!!
Saludos!

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #12 en: 08 de Marzo de 2014, 15:24:12 »
Código: C
  1. /* No include in CodeWarrior compiler */
  2. #ifndef __HIWARE__
  3.   /* Types definition */
  4.   typedef unsigned char byte;
  5.   typedef unsigned short int word;
  6.   typedef unsigned long dword;
  7. #else
  8.   /* Types definition */
  9.   typedef unsigned char byte;
  10.   typedef unsigned int word;
  11.   typedef unsigned long dword;
  12. #endif
  13.  
  14.  
  15. typedef unsigned char bool;
  16.  
  17. #ifndef FALSE
  18.   #define FALSE 0                    
  19. #endif
  20. #ifndef TRUE
  21.   #define TRUE  !FALSE              
  22. #endif

Desconectado elotrogonzalo

  • PIC10
  • *
  • Mensajes: 25
Re: Flash Como EEprom HCS08
« Respuesta #13 en: 08 de Marzo de 2014, 15:25:59 »
Que bueno gracias!

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Flash Como EEprom HCS08
« Respuesta #14 en: 08 de Marzo de 2014, 15:42:28 »
Lo ideal que esas definiciones las incluyas en un archivo header ( *.h  )  y que sea incluidos en todos los archivos fuentes.

Saludos !


 

anything