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

PIC24F Program Memory Write in ASM

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



Joined: 27 Jun 2012
Posts: 6

View user's profile Send private message

PIC24F Program Memory Write in ASM
PostPosted: Thu Oct 04, 2012 6:24 am     Reply with quote

HI All

am working on a Project in PIC24FV32KA304 with CCS PCD Compiler Version 4.130.

I am trying to implement Program memory Write in CCS with ASM Coding.

Tried all Combinations but still am getting error after PM Write sequence (WRERR bit set in NVMCON register)

given the simple code for just writing some constant data in a Particular address in Program Memory.

Please guide where am wrong or any other Idea to do this.

Can anyone tell me what is wrong with this code.?? am trying it for the Whole day. and am not getting any clue.

Thanks

Vino
Code:



//Fuse Settings
#include <24F32KA304.h>
#device ICD=TRUE

#FUSES WPOSTS1                  //Watch Dog Timer PostScalar 1:1
#FUSES FRC                              //Internal Fast RC Oscillator
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOCKSFSM          //Clock Switching is disabled, fail Safe clock monitor is disabled
#FUSES NOWINDIS                 //Watch Dog Timer in Window mode
#FUSES WDT_NOSL                 //Watch Dog Timer, disabled during SLEEP
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPUT                            //No Power Up Timer
#FUSES DEBUG                      //Debug mode for use with ICD
#FUSES ICSP3                            //ICD uses PGC3/PGD3 pins
#FUSES NODSBOR                  //BOR disabled in Deep Sleep
#FUSES NODSWDT                  //Deep Sleep Watchdog Timer disabled

#use delay(clock=8000000)

#use i2c(I2C2,slave,SCL=PIN_B3,SDA=PIN_B2,ADDRESS=0XBC)

//Variables Used in this Function
long    NVMCON,NVMKEY,PSVPAG,TBLPAG,W0,W1,W2,W3,W4;
int1    NVMCON_WR;

#locate NVMCON   =   0X0760
 #bit    NVMCON_WR   =   0X0760.15
#locate NVMKEY      =   0X0766
#locate TBLPAG      =   0X0032
#locate W0      =   0X0000
#locate W1      =   0X0002
#locate W2      =   0X0004
#locate W3      =   0X0006
#locate W4      =   0X0008

/// The Function "Write_PM_Word" is called from Main Program through an I2C Interrupt


void Write_PM_Word(void)
{   
   TBLPAG   = 0X0000;
   W0      = 0X07C0;       //PM Address to write 0X0007C0
   W1      = 0X1AA5;       //Constant word L to write into that Addr
   W2      = 0X0000;       //Constant word M to write into that Addr
   bit_set(CORCON,3);       //Set CPU in High Priority Mode

   #asm

   tblwtl W1,[W0]               //Write to the PM Write Latch lower Word   
   tblwth W2,[W0]
   MOV  #0X4008,W3        //set the Write Mode in NVMCON
   MOV  W3,NVMCON
   MOV  #0X0055,W3
   MOV  W3,NVMKEY
   MOV  #0X00AA,W4
   MOV  W4,NVMKEY
   BSET NVMCON,#15   //Set the WR bit to start Write

   #endasm

   while(NVMCON_WR);
   
   bit_clear(CORCON,3);       //Reset CPU from High Priority Mode     
}

FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Thu Oct 04, 2012 8:04 am     Reply with quote

I don't think that #0X4008 corresponds to a valid write mode for this processor.

According to the datasheet, CORCON bit 3 can't be set. You'll either want to set IPL to level 7 or use a disi instruction as suggested in the datasheet.
jeremiah



Joined: 20 Jul 2010
Posts: 1331

View user's profile Send private message

PostPosted: Thu Oct 04, 2012 11:45 am     Reply with quote

Something else to consider. On the PIC24 parts, there are sometimes some timing considerations when implementing unlock sequences. Try changing your unlock sequence from:

Code:

   MOV  #0X0055,W3
   MOV  W3,NVMKEY
   MOV  #0X00AA,W4
   MOV  W4,NVMKEY


To:
Code:

   MOV  #0X0055,W3
   MOV  #0X00AA,W4
   MOV  W3,NVMKEY
   MOV  W4,NVMKEY


I know that seems like a small change, but it can sometimes make a difference.

As FvM suggested, I would also look at the DISI instuction. It is what the CCS functions use and is pretty handy for this type of scenario.
vino182k6



Joined: 27 Jun 2012
Posts: 6

View user's profile Send private message

PostPosted: Thu Oct 04, 2012 9:33 pm     Reply with quote

Hi FvM /Jeremiah

Thanks for your valid time.

After FvM's suggestion, I checked again in the datasheet. I found 2 different definitions for 1 word write mode selection in the NVMCON register. (One under program memory and another under eeprom memory). I followed
register description under eeprom memory (Microchip -ds39995c-page 64). Sorry, I don't know how to add the image.

Thats the problem. Now I modified it, working good. (to #4004 from # 4008).

Between, how/where to use "Disi #5" instruction in my code. A bit confused. Should use inside the #asm or in c ?

Thank you so much for your help.
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Fri Oct 05, 2012 1:59 am     Reply with quote

DISI #5 is an ASM instruction.
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