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 CCS Technical Support

CCS bootloader that can change eeprom.

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



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

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

CCS bootloader that can change eeprom.
PostPosted: Wed Jun 24, 2009 11:29 am     Reply with quote

CCS 3.249 [email protected]
Has anyone seen the CCS example bootloader corrupt or change the data eeprom?

After a Firmware update my Data EEPROM seems to now all be set to 255.
((or I should say at least the first 32 bytes)) that I use for config info.


Last edited by treitmey on Thu Jun 25, 2009 9:28 am; edited 1 time in total
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Jun 24, 2009 11:54 am     Reply with quote

1. Is the problem repeatable, or does it rarely happen ?

2. Are you calling write_eeprom() in your application program ?
Comment out all such lines, and see if you still get the problem.

3. Try setting the WRTD fuse, when you program the bootloader itself
into the PIC. This will protect the data eeprom from write operations.
Also, preload the data eeprom with some known values, by using the
#rom 0xF00000 = {} method. Do this in the bootloader program itself.
See if you still get the problem. I'm trying to establish if the problem
is caused by some fluke in the code, or is it a hardware issue.

4. Have you followed all standard hardware design practices, such as
putting a 100 nF (0.1 uF) ceramic capacitor between all Vdd pins and Gnd,
placed very close to the chip ?
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

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

PostPosted: Thu Jun 25, 2009 9:19 am     Reply with quote

Thanks for the speedy reply.
(I've been debugging and doing what you suggested since 5min after your post)

I think I've got it solved. It was my own incorrect code.
The below code seems to be working as intended.

soo...

Any suggestions on this bootloader code chunk that allows for eprom updating. Just took the CCS loader and changed a little. I'll only post a chuck in hopes to avoid the copyright issues.
1. I increased the upper limit of addr of PCH for region of eprom 0x0f0000
2. Then I check if the address is in that area and read/write the eprom
3. ??am I correct in thinking the h_addr should be reset back to zero after a record type 4?? if record type 4 it has 2 bytes of data that are the upper 16bit of a 32bit address.
Then the next loop it uses the h_addr for make32. But after it uses the h_addr in the make32 shouldn't that be reset back to 0 until it hits another type 4 record.??

Any suggesstions for updates/enhancments
Any suggesstions for updates for PIC16

loader.c
Code:
      if (line_type == 1)
      {
        done = TRUE;
      #if defined(__PCM__)
      } else if ((addr < LOADER_ADDR || addr > LOADER_END) && addr < 0x2000){
      #elif defined(__PCH__)
      } else if ((addr < LOADER_ADDR || addr > LOADER_END) && addr < 0xF000FF){
      #endif
        checksum = 0;  // Sum the bytes to find the check sum value
        for (i=1; i<(buffidx-3); i+=2)
        checksum += atoi_b16 (&buffer[i]);
        checksum = 0xFF - checksum + 1;

        if (checksum != atoi_b16 (&buffer[buffidx-3]))
        do_ACKLOD = FALSE;
        else
        {
          if (line_type == 0)
          {
            // Loops through all of the data and stores it in data
            // The last 2 bytes are the check sum, hence buffidx-3
            for (i = 9,dataidx=0; i < buffidx-3; i += 2)
            {
              data[dataidx++]=atoi_b16(&buffer[i]);
            }
            if ((addr >= 0x00F00000) && (addr <= 0x00F000FF))//data eprom
            {
              Eaddr=addr-0x00F00000;//write_eeprom is zero based, subtract the offset
              for(i=0;i<count;i++,Eaddr++)
              {
                tmpData=read_eeprom(Eaddr);
                if(tmpData!=data[i])
                {
                  write_eeprom(Eaddr,data[i]);
                  //fputc(Eaddr,DEBUG);//06/24/2009 11:54AM tjr
                  //fputc(data[i],DEBUG);//06/24/2009 11:54AM tjr
                }
              }
            }
            #if getenv("FLASH_ERASE_SIZE") > getenv("FLASH_WRITE_SIZE")
            #if defined(__PCM__)
            if ((addr!=next_addr)&&(addr&(getenv("FLASH_ERASE_SIZE")-1)!=0))
            #else
            if ((addr!=next_addr)&&(addr&(getenv("FLASH_ERASE_SIZE")/2-1)!=0))
            #endif
            erase_program_eeprom(addr);
            next_addr = addr + 1;
            #endif
            // if data is in the EEPROM area use write_eeprom()
            //record type 04, Extended Linear Address Record,
            //else
            write_program_memory(addr, data, count);
            //h_addr =0;
          }
          else if (line_type == 4)
          {
            h_addr = make16(atoi_b16(&buffer[9]), atoi_b16(&buffer[11]));
            //fputc('%',DEBUG);
            //fputc(hi(h_addr),DEBUG);//06/24/2009 11:54AM tjr
            //fputc(lo(h_addr),DEBUG);//06/24/2009 11:54AM tjr
            //fputc('%',DEBUG);
          }
        }
      }
    }
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