CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

18F452 & FLASH memory && write_program_memory

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
nicolebarge23



Joined: 08 Jul 2008
Posts: 1

View user's profile Send private message

18F452 & FLASH memory && write_program_memory
PostPosted: Fri Jul 18, 2008 7:31 am     Reply with quote

Hello !

I work with a 18f452 and i want store datas in the program memory. I use the write_program_memory(adr, data, x) to write in the FLASH.

In simulation, everything is good !!!! all my datas are stored in the flash. I use PROTEUS to simulate my 18f452 and the electrical draw.

But, when I fill my "true" 18f452 with my software, the datas aren't stored in the flash. I don't understand why there is a difference between the simulation and the experience ????

I can't even make work the samples of CCS about the write_program_memory function.

I would like to know if it is because the software or because any initialisation that i do.



I post my soft to see what i did !





Code:

/****************************************************************************************/
/*   Enregistrement   :    Fonction permettant d'enregistrer les nouvelles Trames lorsque    */
/*                  l'on enclenche le mode learning.                        */
/*                  Utilisation des listes chainées pour ne pas allouer trop       */
/*                  d'espace mémoire                                     */
/*                  Enregistrement de Liste Horizontale pour les Sorties (IO) puis   */
/*                  enregistrement de Liste Verticale pour les Trames            */
/****************************************************************************************/
byte Enregistrement(char buffer[100])
{
   long int ionumber,iodatanext,datanext,adresse,ionext;
   char   database[29];
   
   output_toggle(PIN_A0);

   //on initialise au début de la mémoire afin d'etre sur de tout lire
   FlashStartAddress = FLASH_DATA_START ;
   read_program_memory(FlashStartAddress,   &ionumber, 1 );                        //Lecture de ionumber


   //Initialisation si aucune trame n'a jamais été enregistrée
   //            IOSTART
   if( ionumber == 255  )
   {   
      strcpy(database, buffer );                                          //copie du buffer dans database
      adresse = FlashStartAddress+5;                                       //adresse du pointeur de Database   

      ionext = 0;
      datanext = 0;

      write_program_memory( FlashStartAddress,    &IO         ,1   );               //enregistrement de  p_IO_Next->IONumber
      write_program_memory( FlashStartAddress+1,    &adresse   ,2   );               //enregistrement de p_IO_Next->DataNext
//      write_program_memory( FlashStartAddress+3,    &ionext      ,2   );               //enregistrement de p_IO_Next->IONext
      write_program_memory( FlashStartAddress+5,    database   ,29   );               //enregistrement de p_Data_Next->Database
//      write_program_memory( FlashStartAddress+34, &datanext   ,2   );               //enregistrement de p_Data_Start->DataNext
      if ( FlashAddress < FlashStartAddress )      FlashAddress = FlashStartAddress;
      puts("enregistre la trame suivante :");
      puts(database);
      printf("sur la sortie : %d\r",IO);      
   }


   //Si il existe deja une sortie initiale qui a été enregistrée
   else if ( 0 < ionumber < 17 )
   {
      // On se place au début de la chaine de pointeur de sortie
      //               p_IO_Next = p_IO_Start

      read_program_memory( FlashStartAddress      , &ionumber      ,1   );            //lecture de  p_IO_Next->IONumber      
      read_program_memory( FlashStartAddress+1   , &iodatanext   ,2   );            //lecture de p_IO_Next->DataNext      
      read_program_memory( FlashStartAddress+3   , &ionext      ,2   );            //lecture de p_IO_Next->IONext
      read_program_memory( FlashStartAddress+5   , database      ,29   );            //lecture de p_Data_Next->Database
      read_program_memory( FlashStartAddress+34   , &datanext      ,2   );            //lecture de p_Data_Start->DataNext


      // on parcours tous les IO juska 16 inclus
      while(ionext!=65535 && ionumber!=IO)
      {
         //            p_IO_Next = p_IO_Next->IONext ;                        //on décale d'une sortie

         FlashStartAddress = ionext;   

         read_program_memory( FlashStartAddress      , &ionumber      ,1   );         //lecture de  p_IO_Next->IONumber      
         read_program_memory( FlashStartAddress+1   , &iodatanext   ,2   );         //lecture de p_IO_Next->DataNext      
         read_program_memory( FlashStartAddress+3   , &ionext      ,2   );         //lecture de p_IO_Next->IONext
         read_program_memory( FlashStartAddress+5   , database      ,29   );         //lecture de p_Data_Next->Database
         read_program_memory( FlashStartAddress+34   , &datanext      ,2   );         //lecture de p_Data_Next->DataNext            
      }
      
      //Creation d'une nouvelle sortie
      if ( ionumber != IO )
      {
         adresse = FlashAddress+64 ;            

         write_program_memory( FlashStartAddress+3   , &adresse      ,2   );         //enregistrement de p_IO_Next->IONext
         FlashStartAddress=adresse;
   
         strcpy(database, buffer );         
         adresse = FlashStartAddress+5;
         ionext = 0;
         datanext = 0;
            

         write_program_memory( FlashStartAddress,    &IO         ,1   );            //enregistrement de  p_IO_Next->IONumber
         write_program_memory( FlashStartAddress+1,    &adresse   ,2   );            //enregistrement de p_IO_Next->DataNext
   //      write_program_memory( FlashStartAddress+3,    &ionext      ,2   );            //enregistrement de p_IO_Next->IONext
         write_program_memory( FlashStartAddress+5,    database   ,29   );            //enregistrement de p_Data_Next->Database
   //      write_program_memory( FlashStartAddress+34, &datanext   ,2   );            //enregistrement de p_Data_Start->DataNext
            
         if ( FlashAddress < FlashStartAddress )      FlashAddress = FlashStartAddress;
            
         puts("enregistre la trame suivante :");
         puts(database);
         printf("sur la sortie : %d\r",IO);      
      }
                  
      //Creation nouvelle Trame
      // On se place sur la sortie qui nous interesse pour rajouter une trame
      else if ( ionumber == IO )
      {
         while ( datanext != 65535 && strcmp(database,buffer) != 0)
         {
            FlashStartAddress = datanext;

            read_program_memory( FlashStartAddress      , &ionumber      ,1   );         //lecture de  p_IO_Next->IONumber      
            read_program_memory( FlashStartAddress+1   , &iodatanext   ,2   );         //lecture de p_IO_Next->DataNext      
            read_program_memory( FlashStartAddress+3   , &ionext      ,2   );         //lecture de p_IO_Next->IONext
            read_program_memory( FlashStartAddress+5   , database      ,29   );         //lecture de p_Data_Next->Database
            read_program_memory( FlashStartAddress+34   , &datanext      ,2   );         //lecture de p_Data_Next->DataNext   
         }

         //Comparaison entre buffer (trame entrante et database (trame existante)
         if ( strcmp(database,buffer) == 0 )                                 // la trame a deja ete enregistree
         {
            puts("la trame suivante existe deja :");
            puts(dataBase);
            printf("sur la sortie : %d\r",IO);
            return 0;
         }
         if ( datanext == 65535 )
         {
            //Creation nouvelle trame associée à la sortie
            adresse = FlashAddress + 64;
         
            write_program_memory(FlashStartAddress+34   , &adresse   ,2 );
            FlashStartAddress=adresse;

            adresse+=5;
            strcpy(database,buffer);
            write_program_memory( FlashStartAddress      , &IO         ,1   );            //enregistrement de  p_IO_Next->IONumber
            write_program_memory( FlashStartAddress+1   , &adresse      ,2   );            //enregistrement de p_IO_Next->DataNext
//            write_program_memory( FlashStartAddress+3   , &ionext      ,2   );            //enregistrement de p_IO_Next->IONext
            write_program_memory( FlashStartAddress+5   , database      ,29   );            //enregistrement de p_Data_Next->Database
//            write_program_memory( FlashStartAddress+34   , &datanext      ,2   );            //enregistrement de p_Data_Start->DataNext
            if ( FlashAddress < FlashStartAddress )      FlashAddress = FlashStartAddress;
         
            puts("enregistre une nouvelle trame  :");
            puts(database);
            printf("sur la sortie : %i\r",IO);
         }      
      }
   }
}
[/quote]
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group