Bootloader for 16F87x

How to install and use Shane Tolmie's bootloader 
and Petr Kolomaznik's PIC downloader

Function
A bootloader enables download of hex-files directly into the flash-memory of a PIC or other microcontroller. The bootloader receives the user program via the PIC's UART and writes it directly to the program memory (self programming). This feature greatly speeds up the development process, because the chip remains in the target circuit and need not be moved between the target circuit and the programmer.

When no bootloader is installed, all memory in the PIC can be utilized for user programs. That is 4 K for the 16F873 (0x000 to 0xFFF). Installing a bootloader means, that some part of the memory is occupied by the bootloader. The user can download his program into the remaining memory space. The bootloader in figure 1 occupy 256 words (0xF00 to 0xFFF), that is 6 % of the memory in a 16F873. The disadvantage of loosing 6 % memory is little compared to the advantage of fast program download and more friendly development routines.


Fig. 1. Memory map for 16F873

The first 4 words in the flash memory (0x000 to 0x003) contain a jump to the bootloader. The original 4 words are recognized during download and reallocated to the memory space of the bootloader. At boot time, the bootloader waits 200 ms for a download to begin. If no download is detected, the bootloader activates the user program, starting with the first 4 reallocated words and then jumping to the remaining user program.

Programming the bootloader
The bootloader package at Shane Tolmie's website contains all the software needed. I'll explain the procedure by giving an example how to program the bootloader version 8.23 into a 16F873.

Choose the hex-file with the right crystal oscillator frequency and the desired download speed. I chose the file 30419-bootldr-v26-16F873-74-04Mhz-19200bps.hex for my 16F873 with 4 MHz oscillator and 19200 bps download.

Load the hex-file into the PIC-programmer and check the fuse settings before programming. I did not want the Low Voltage programming to be on (which it is in the hex-file). If the Low Voltage programming fuse is on, the PIC may become unstable during operation. My recommended fuse settings are shown in figure 2.


Fig. 2. Fuse settings for programming the bootloader
into a 16F873 with 4 MHz oscillator

The fuses selected when programming the bootloader can not be changed later by the downloaded user program. This is because the bootloader does not change the configuration word of the PIC.

Downloading a user program
A PIC downloader is contained in the bootloader software package. The PIC downloader is used for transferring the hex-file from your PC to the bootloader in the target chip. After having programmed the bootloader into the PIC, the download procedure is tested by downloading a suitable program into the PIC. An UART test program for 16F873 and a description of a testboard for 16F873 can be found elsewhere on this site. A test program is also included in the bootloader software package.


Fig. 3. The PIC downloader writing to the target PIC

Load the hex-file into the PIC downloader (click Search or press F2), activate the downloader (click Write or press F4) and reset the PIC. The reset activates the bootloader and makes it listen for a new download on the serial port. The bootloader and PIC downloader shake hands and then the hex-file is downloaded. After a few seconds - viola - the new user program is running in the PIC.

If the downloaded program is going to use the serial port of the PIC, the PIC downloader must be closed and a terminal program (e.g. HyperTerminal) started. In my case, the PIC downloader and HyperTerminal both use COM2 - but never at the same time!

Memory reservation
Memory reservation is necessary to preserve the code space used by the bootloader. For the 16F873, memory reservation is done like this in CCS C (PCM 3.060):

        #org 0x0F00,0x0FFF {} //16F873 bootloader resides here

Memory reservation in Microchip MPASM is done like this for a 16F873:

        ORG 0x0000    ;User program starts here
        ...
        ORG 0x0F00    ;Bootloader starts here
        NOP
        END

The last lines will generate a compiler error if the user program goes higher than 0x0EFF.

Hint #1
The bootloader reallocates the program words between 0x000 and 0x003. This means, that the first 4 words in the user program must contain a GOTO (long jump) pointing to the remaining user program. This is usually the case when using a compiler, for example the C-compiler PCM from CCS. If you are using an assembler, for example MPASM from Microchip, you must insert the GOTO manually as shown below:

        ORG 0x000
        GOTO Begin
        ORG 0x004
Begin   User program starts here

Hint #2
If the PIC's serial port is used by the downloaded program and you want to download a new program, the PIC downloader might not be able to reach the PIC due to traffic on the port. In that case, you must first press and hold the PIC's reset button while clicking Write (or press F4) on the PIC downloader. The downloader will now start searching for the PIC. Releasing the PIC's reset button will start the download.



This page created February 7th, 2003 by Lars Petersen, oz1bxm@pobox.com
Updated June 13th, 2003.

Back to PIC experiments