nicolebarge23
Joined: 08 Jul 2008 Posts: 1
|
18F452 & FLASH memory && write_program_memory |
Posted: Fri Jul 18, 2008 7:31 am |
|
|
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] |
|