Page 1 of 1

No internal EEProm with use of bootloader

Posted: Wed Jan 08, 2020 9:14 pm
by patrick schoon
Hi,

In my project (PIC16F18857) i use the internal eeprom for storing parameters.
All is working fine.

Now I added a bootloader, starting 0x00-0x6FF.
I shifted the application starting from 0x700.

This is working except for the internal eeprom.
I did some tests but all results are "0" when readout the eeprom.

All other functions do work like I2C, PWM, ADC.

Any one have an idee?

Re: No internal EEProm with use of bootloader

Posted: Thu Jan 09, 2020 12:29 pm
by tiny
Hello Patrik,
according to the data sheet, the MCU has 256 bytes EEProm, so the addressing should go 0x00 to 0x6F and 0x70 to 0xFF.

Regards
Christina

Re: No internal EEProm with use of bootloader

Posted: Fri Jan 10, 2020 11:15 am
by Benj
Hello,
I shifted the application starting from 0x700.
Can you detail how you did this, if done incorrectly it may have also shifted the access to the EE memory.

Re: No internal EEProm with use of bootloader

Posted: Sat Jan 11, 2020 2:13 pm
by patrick schoon
Hi Christina,

Thanks for your input.
I'm aware of these data's.

Hi Ben,

I think this is the case.

I compiled my project with compiler offset parameter "--codeoffset=0x700".

Then i load my project with use of the bootloader into the project.

Configuration bits are the same for bootloader and application.
Bootloader uses no interrupts.

So from your words i understand i also need to set an offset for the eeprom....

I did some tests with monitoring the MPLAB IPE. No alterations are seen in the eeprom data. Totaly dead.

Re: No internal EEProm with use of bootloader

Posted: Mon Jan 13, 2020 11:02 am
by Benj
Hello,

The CODEOFFSET option should be enought to do everything correctly from memory. I've also done a bit of Googling but can't seem to find any documented issues with this.

Are you expecting the default EEPROM data to be programmed onto the device via the Bootloader? If so the bootloader code probably has to specifically look for this in your .hex file and perform this for you.

If you write a value to an EEPROM location in your program then can that be read back ok? You may have to create a first run type section of code in your program. i.e. check the first EEPROM location and if it is 0 then manually write the initial values to the EEPROM. Annoying but probably easier then editing the bootloader and loader application.

Re: No internal EEProm with use of bootloader

Posted: Mon Jan 13, 2020 11:53 am
by patrick schoon
Hi Ben,

I also checked the Microchip datasheets and Googled to find answers, but did not find satisfying answers.

I programmed the eeprom for a few bytes with use of the MPlab IPE.
Also these values are not read by the program.

I made a LUT with the initial values for the eeprom.
The eeprom is checked for FF value at the last byte. If new the lut wil be programmed into the eeprom and the last byte wil be set.

All read, write and initiate eeprom mechanisms are working perfect if programmed from start address 0x00.

So at the moment we are looking into the bootloader firmware.

Should it help if i bypass the eeprom macro and use C- code?

Thanks for now.

Re: No internal EEProm with use of bootloader

Posted: Mon Jan 13, 2020 12:25 pm
by Benj
Hello,

Hmm this is strange, looking at the code for the 16F18857 device we do use the NVM type code to access the EEPROM. This could potentially be being effected by the code shift which to me would possibly be a compiler bug.

Specifically these lines.

Code: Select all

NVMADRL = Address & 0xff;
NVMADRH |= 0xF0;
The code is located here.

C:\ProgramData\MatrixTSL\FlowcodeV8\CAL\PIC\PIC_CAL_EEPROM.c

Functions below starting at line 140.

Code: Select all

		MX_UINT16 FC_CAL_EE_Read (MX_UINT16 Address)
		{
			MX_UINT16 data = 0;

			#ifdef MX_EE

				#if defined _NVMCON1_NVMREG_POSN
					NVMCON1bits.NVMREG = 0;					//EEPROM Access
				#elif defined _NVMCON1_NVMREGS_POSN
					NVMCON1bits.NVMREGS = 1;				//EEPROM Access
				#endif

				NVMADRL = Address & 0xff;

				#if (MX_EE_SIZE > 256)
					NVMADRH = (Address & 0xff00) >> 8;
				#endif

				#if defined (MX_EE_TYPE4)					//EE Memory starts at address 0xF000
					NVMADRH |= 0xF0;
				#endif

				NVMCON1bits.RD = 1;
				#if defined _NVMDAT_NVMDAT0_POSN
					data = NVMDAT;
				#elif defined _NVMDATL_NVMDAT0_POSN
					data = NVMDATL;
				#endif

				#if defined _NVMCON1_NVMREG_POSN
					NVMCON1bits.NVMREG = 2;					//FLASH Access
				#elif defined _NVMCON1_NVMREGS_POSN
					NVMCON1bits.NVMREGS = 0;				//FLASH Access
				#endif

			#else
				#error "Chip does not have EEPROM memory"
			#endif
			return (data);
		}

Code: Select all

		void FC_CAL_EE_Write (MX_UINT16 Address, MX_UINT16 Data)
		{
			#ifdef MX_EE

				char bInterruptsEnabled;

				//wait for previous EE writes to complete...
				while (ts_bit(NVMCON1, WR));

				#if defined _NVMCON1_NVMREG_POSN
					NVMCON1bits.NVMREG = 0;					//EEPROM Access
				#elif defined _NVMCON1_NVMREGS_POSN
					NVMCON1bits.NVMREGS = 1;				//EEPROM Access
				#endif

				NVMADRL = Address & 0xff;

				#if (MX_EE_SIZE > 256)
					NVMADRH = (Address & 0xff00) >> 8;
				#endif

				#if defined (MX_EE_TYPE4)					//EE Memory starts at address 0xF000
					NVMADRH |= 0xF0;
				#endif

				#if defined _NVMDAT_NVMDAT0_POSN
					NVMDAT = Data;
				#elif defined _NVMDATL_NVMDAT0_POSN
					NVMDATL = Data;
				#endif

				NVMCON1bits.WREN = 1;

				bInterruptsEnabled = ts_bit(INTCON, GIE);
				cr_bit(INTCON, GIE);			//Disable Interrupts

				NVMCON2 = 0x55;
				NVMCON2 = 0xAA;

				NVMCON1bits.WR = 1;

				while (ts_bit(NVMCON1, WR));		//wait for EE write to complete...

				if (bInterruptsEnabled)
					st_bit(INTCON, GIE);		//Re-enable Interrupts

				NVMCON1bits.WREN = 0;

				#if defined _NVMCON1_NVMREG_POSN
					NVMCON1bits.NVMREG = 2;					//FLASH Access
				#elif defined _NVMCON1_NVMREGS_POSN
					NVMCON1bits.NVMREGS = 0;				//FLASH Access
				#endif

			#else
				#error "Chip does not have EEPROM memory"
			#endif
		}

Re: No internal EEProm with use of bootloader

Posted: Tue Jan 14, 2020 11:06 pm
by patrick schoon
Hi Ben,

For now I did a read test by adding an address read commando in C.
Test.jpg
Test.jpg (44.84 KiB) Viewed 5034 times
This works and to my suprise all values read by the eeprom macro are read as well.

To check why, i only put the "NVMADRH = 0x70" in the C-code at the beginning of the sequence and the eeprom read function does work.
There must be something going wrong with the address high byte in the macro..

Regards,

PS

Re: No internal EEProm with use of bootloader

Posted: Sun Jan 19, 2020 5:09 pm
by patrick schoon
Hi,

I solved my issues with the epprom by using replacing the eeprom macro by two C- macro's.

A read macro named NVMRead and a write macro named NVMWrite.
NVMRead.fcm
(778 Bytes) Downloaded 197 times
NVMWrite.fcm
(1.23 KiB) Downloaded 200 times
Both macro's do use the Address Hi byte (0xF0 for eeprom) as well.
Advantage to this is that also the User, Revision and Device ID can be read and writen (0x80).
PIC16F18857_NVM.png
(96.97 KiB) Downloaded 400 times