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

read_configuration_memory for User ID

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



Joined: 09 May 2006
Posts: 66

View user's profile Send private message Visit poster's website

read_configuration_memory for User ID
PostPosted: Fri May 04, 2018 10:05 am     Reply with quote

I am trying to read the User ID on a PIC18F2685.

According to the manuals...
Code:

read_configuration_memory([offset], ramPtr, n);

should read User ID if using the correct offset. But I can't get this to work.

Can anyone help me with this please?

I can't find the offset to use anywhere, but after preloading the User ID, I did try this to no avail:
Code:

int8 array[8];
int32 i32;
for(i32=0;i32<0x0400000;i32++)
{
   read_configuration_memory(i32,array,8);
   restart_wdt();
   if(array[0]==0x31 && array[1]==0x32 && array[2]==0x33 && array[3]==0x34 && array[4]==0x35 && array[5]==0x36 && array[6]==0x37 && array[7]==0x38)
   {
      prinftf("FOUND IT");
   }
}

User ID is located at 0x0200000. I can confirm the data is there with PICkit.

Cheers,
Ttelmah



Joined: 11 Mar 2010
Posts: 19217

View user's profile Send private message

PostPosted: Fri May 04, 2018 12:09 pm     Reply with quote

The offset, is the offset _inside the configuration memory area_. Not the offset from the base of memory.

The configuration memory internally is read by a separate operation to a normal memory read, and it is the offset in this that the operation expects.

You need to be using the getenv function that reads the devID area, not the read_configuration_memory function.

It's worth understanding that the memory layout seen by the programmer is _not_ how the PIC internally sees it's memory. It's like EEPROM, which internally has to be read by separate code to access the EEPROM, but the programmer writes to it at an address in the main memory range.
tinley



Joined: 09 May 2006
Posts: 66

View user's profile Send private message Visit poster's website

PostPosted: Wed May 09, 2018 2:53 am     Reply with quote

Thank you for this further insight, but even after searching the manual for the function you suggest, I am none the wiser! Another case of very poor CCS documentation!

The documentation clearly says that:

read_configuration_memory([offset], ramPtr, n);

should read User ID if using the correct offset. But it doesn't? And no indication of what the offset should be is given?

I was looking for the string I stored in the user ID, using the huge 'for loop' in desperation!

I can't find any reference to the devID in the manual?
Ttelmah



Joined: 11 Mar 2010
Posts: 19217

View user's profile Send private message

PostPosted: Wed May 09, 2018 3:24 am     Reply with quote

getenv("ID")

Returns the device user ID

Look at #ID (which sets this).

Remember the preprocessor can only 'see' what is set in the code.

The reason the manual can't tell you the locations for anything is it is always device specific. However as I already said the locations for read_configuration_memory are 'configuration memory' relative.

If you just want to do a direct 'read' from the actual chip, in code, then use the read_program_eeprom instruction, not the read_configuration_memory instruction. The latter is built specifically to talk to the configuration memory (which needs a different bit set in the read operation). The ID locations are not actually in this part of this memory space.

Code:

char dev1, dev2;

dev1 = read_program_eeprom(0x3FFFFEL);
dev2 = read_program_eeprom(0x3FFFFFL);


Returns the hardware device ID.

Use 0x200000 for the User ID.
tinley



Joined: 09 May 2006
Posts: 66

View user's profile Send private message Visit poster's website

PostPosted: Wed May 09, 2018 3:52 am     Reply with quote

Thank you for your continued help. Sorry if I am being a bit thick!

char array[8];
array=getenv("ID");

returns error 'lvalue is read only'?
Ttelmah



Joined: 11 Mar 2010
Posts: 19217

View user's profile Send private message

PostPosted: Wed May 09, 2018 5:16 am     Reply with quote

You can't just move strings with =. You have to use strcpy. This accepts constant values.
tinley



Joined: 09 May 2006
Posts: 66

View user's profile Send private message Visit poster's website

PostPosted: Wed May 09, 2018 6:58 am     Reply with quote

So, I have finally sorted this out. For anyone else wanting to do the same thing, this works.

I want to manually type the ID into the IPE User ID, but you can test it with the following line in code, which puts the characters 1,2,3,4,5,6,7,8 into the user ID:
Code:
#id 0x3231,0x3433,0x3635,0x3837

Then to extract the user ID, simple to understand/read code is:
Code:

char serialNO[8];
     
serialNO[0]=read_program_eeprom(0x200000);
serialNO[1]=read_program_eeprom(0x200001);
serialNO[2]=read_program_eeprom(0x200002);
serialNO[3]=read_program_eeprom(0x200003);
serialNO[4]=read_program_eeprom(0x200004);
serialNO[5]=read_program_eeprom(0x200005);
serialNO[6]=read_program_eeprom(0x200006);
serialNO[7]=read_program_eeprom(0x200007);

serialNO now equals "12345678"

0x200000 was obtained from the ID Location: 200000 in the device file.

I trust this is useful to others who are frustrated with the CCS documentation!
Ttelmah



Joined: 11 Mar 2010
Posts: 19217

View user's profile Send private message

PostPosted: Wed May 09, 2018 7:28 am     Reply with quote

As I said:

Use 0x200000 for the User ID.
tinley



Joined: 09 May 2006
Posts: 66

View user's profile Send private message Visit poster's website

PostPosted: Wed May 09, 2018 9:02 am     Reply with quote

Thank you, yes, agreed. And I had already said that in my original question!

What I needed, as others may need, is how to read the User ID from configuration memory!!!

Hopefully I have given them that now!
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