PIC18F14K50の基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
ブートローダーの原理

Bootloaderとは、メインのプログラムをメインメモリーに取り込む短い起動プログラムのことで、簡単には、PICkit の代わりをするプログラムと考えてよいでしょう。 Bootloaderは、PCからUSB経由で、本来目的とするユーザーが作成したプログラムのHEXコードを受け取り、をPICのROMエリアに自分自身で書き込んでいきます。

Bootloader を利用するPICのメモリには、右図のようにプログラムが書き込まれます。

つまり、PCで作成した、ユーザープログラムをPICに書き込むときは、SWを押しながらUSBプラグをPCに接続します。

Bootloaderプログラム本体は、PICkitなどのプログラマーであらかじめPICに書き込む必要がありますが、Bootloaderが書き込まれたPICにユーザープログラムを書き込むには、PICkitなどのプログラマーは、不要です。

ユーザープログラム作成の決まり

「目的とするプログラム」を、1000番地以降に配置するため、以下の2点を変更します。

  1. XC8コンパイラに、プログラムを1000番地以降に配置(offset)するようMPLABXのプロジェクトで指示する。 指示手順詳細は、XC8でブートローダ用プログラムを作る をご覧ください。
  2. Configuration bitsは、Bootloaderで設定するため、ユーザープログラムで設定する必要はありません。

 Bootloadeで指定しているコンフィグレーションビットとは異なる設定にするために、ユーザープログラムに、 コンフィグレーションの記載をすることも可能です。 この場合、PCアプリのブートローダーのメニューから Program > Setting... を選びConfiguration bitsも書き込めるようにします。

プログラム

タイマー0の説明で作成した、LED点灯プログラムをBootloader用に書き直したものを示します。 両者を比較してみてください。Bootloader用プログラムは、元のソースリストからコンフィグレーションの記載を削除しただけです。 ただし、MPLABXプロジェクトのXC8 linkerには、codeをoffsetするための指示を記入します。

BootloaderのプログラムをPICに書き込んだ時に、すでに、コンフィグレーションを一緒に書き込んでいるため、Bootloader用ユーザープログラムには、 コンフィグレーションの記載していません。 このためメインプログラムは、非常に簡単になっています。

USB機能の確認を行うのに適したテスト基板を作成しました(右図)。このボードを使うとBootloaderプログラムの開発などが大変に効率的に行えます。

プロジェクトファイル bl01_t0.zip

<プログラム>
main.c

//  File name: <<Bootloader専用>>
//  Description: Timer0 example
//  Timer0で内部クロック(4MHz)をカウントし、
//  カウントオーバーでLEDを点滅させる。
//  Notes:  4MHz内部クロック
//        LED RB0
//        LED RB1
//        LED RB2
//        LED RB3
//    Language: MPLAB xc8
//    Target: PIC18F26J50

#include <xc.h>
//
void main(void){
  OSCCON = 0b01100010;     // 内部クロック4Mhz
  LATB = 0;                // PortCのすべてのビットを「0」
  TRISB = 0b11110000;      // LEDの接続されているポートを出力に設定
  T0CON = 0b10000001;      // Timer 0 設定(262mSecごと)
                           // 16BIT_mode SOURCE_INT PS_1/4
  LATB = 0x03;                     // LED 2個を点灯
  while(1){                        // 繰り返しループ
    while(! INTCONbits.TMR0IF);    // Timer 0 のタイムアップを待つ
    INTCONbits.TMR0IF = 0;         // Timer 0 からのキャリーフラッグをクリア
    LATB ^= 0x0F;                  // LED 4個の出力を反転
  }
}