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

Bootloader with 16f1824

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



Joined: 02 Jun 2009
Posts: 123
Location: The Netherlands

View user's profile Send private message

Bootloader with 16f1824
PostPosted: Mon Jan 09, 2012 4:53 am     Reply with quote

Compiler version 4.123

I've tried to adapt the bootloader example to use it for a 16f1824, but it isn't working. In first I've had the "out of rom" fault, which I removed with the help of PCMprogrammer's explanation. I've added 0x20 to the LOADER_END in the #org lines.

ex_bootloader.c
Code:

#if defined(__PCM__)
#include <16F1824.h>

#FUSES INTRC_IO,NOWDT
#FUSES PUT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT,BORV25
#FUSES NOCLKOUT,NOIESO
#FUSES NOFCMEN,WRT
#FUSES PLL_SW,NOSTVREN,NODEBUG,NOLVP

#use delay(clock=4000000)
#use rs232(baud=9600, uart2)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
#endif


#define _bootloader


#include <bootloader_917.h>
#include <loader_917.c>


#if defined(__PCM__)
 #org LOADER_END+1,LOADER_END+10
#elif defined(__PCH__)
 #org LOADER_END+2,LOADER_END+20
#endif
void application(void) {
  while(TRUE);
}

#if defined(__PCH__)
#org 0x40,0x7F
#else
#org 0x20,0x3F + 0x20
#endif
void main(void) {
   if(input(PIN_A4) == 0)
   {
      load_program();
   }

   application();
}

#ORG default

#int_global
void isr(void) {
   jump_to_isr(LOADER_END+5*(getenv("BITS_PER_INSTRUCTION")/8));
}


bootloader_917.h
Code:
#if defined(__PCM__)
   #define LOADER_END   (0x1FF + 0x60 + 0x20)
   #define LOADER_SIZE   (0x1BF + 0x60)
#elif defined(__PCH__)
   #define FLASH_SIZE getenv("FLASH_ERASE_SIZE")
   #warning FLASH_SIZE
   #if ((0x500 % FLASH_SIZE) == 0 )       //IF 0x500 is even flash boundary
      #define LOADER_END   0x4FF
      #define LOADER_SIZE  0x3FF
   #else                                  //ELSE, goto next even boundary
      #define LOADER_END   ((0x500+FLASH_SIZE-(0x500%FLASH_SIZE))-1)
      #define LOADER_SIZE  (LOADER_END-0x100)
   #endif
#endif

#ifndef _bootloader

#if defined(__PCM__)
   #build(reset=LOADER_END+1, interrupt=LOADER_END+5)
#elif defined(__PCH__)
   #build(reset=LOADER_END+1, interrupt=LOADER_END+9)
#endif

#org 0, LOADER_END {}

#endif


In loader.c i've only changed:

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
to
#use rs232(baud=9600, uart2)

I've added a switch to pin A4 with a pull up resistor to +5V, A st232 board for changing the RS232 signals to TTL.

Compiling and programming works ok, but downloading the "new" software in the pic doesn't work. Siow.exe gives a time out warning when I use the "download software" button, Teraterm download the software without errors.

Ex_bootload code:
Code:

#if defined(__PCM__)
#include <16F1824.h>

#FUSES INTRC_IO,NOWDT
#FUSES PUT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT,BORV25 //PUT voor 64ms delay bij opstarten en bij brown-out
#FUSES NOCLKOUT,NOIESO                           //Codeprotectie aanzetten voor 0-rev?
#FUSES NOFCMEN,WRT
#FUSES PLL_SW,NOSTVREN,NODEBUG,NOLVP

//#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, uart2)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#endif

#include <bootloader.h>

void main(void) {
   int i=0;

   printf("\r\nApplication program version 1.00 \r\n");

   while(TRUE)
     printf("%u ",++i);

}
temtronic



Joined: 01 Jul 2010
Posts: 9229
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Jan 09, 2012 7:26 am     Reply with quote

hmm..
I don't have that chip but

first I'd get rid of any 'conditional' precompile code
those if ...pcm...else ...pch type statements.
Anything that looks confusing to the eye, might trip up the compiler.
Heck, you KNOW what chip you're using so why clutterup the code for another processor!

You're saying use 'uart2' but I don't know the default pins for that ,does the compiler ? AND is it the pins the bootloader is attached to??

You should add 'errors' to the us rs232(...) options.
mvanvliet



Joined: 02 Jun 2009
Posts: 123
Location: The Netherlands

View user's profile Send private message

PostPosted: Mon Jan 09, 2012 8:07 am     Reply with quote

I don't have removed the PCH code for not introduce extra faults. I've changed as minimum as possible to make it work.

The UART2 pins are pin 12 and 13 of the processor. That works because I've used the UART2 and ST232 PCB before (for RS232 connection).
mvanvliet



Joined: 02 Jun 2009
Posts: 123
Location: The Netherlands

View user's profile Send private message

PostPosted: Thu Jan 12, 2012 3:49 am     Reply with quote

I tried to use xmit and rcv instead of uart2, but that uses more ROM I think. Then I get again the "out of rom" error (01A9 left, need 001B7), but when I increase the #org segment and LOADER_END with another 20, it still gives that error.

ex_bootloader.c:
#org 0x20,0x3F + 0x40

bootloader.h:
#define LOADER_END (0x1FF + 0x60 + 0x40)

The rom allocation is:

ROM Allocation:
008A @12@PUTCHAR_2_
00E5 @12@FLASHWR
00B0 atoi_b16
0004 isr

Does anyone have an idea?
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