MPLAB XとPICkit2でLEDを点滅させる

ちょっとしたプログラムをPICマイコンで動かしたくなったので、とりあえず最初はLEDを点滅するだけの簡単なプログラムを作って実際に動かしてみます。

PICkit2を最新の状態にアップデートする

道具箱の置くに潜んでいたPICkit2を取り出して最新版にアップデートします。

PICkit2

ちなみにPICkit2を持っていない場合はPICkit3を買いましょう。

PICKit3をebayで探す



PICkit2もPICkit3も基本的に使い方は同じですがPICkit3のほうが対応しているPICマイコンの種類が多いです。ebayだと送料込みで3500円くらいでPICkit3を買えます。日本のお店だと秋月で4500円+送料500円で売っています。

PICkit3の場合、Microchip: Downloads ArchiveにあるPICkit 3 Programmer App and Scripting Tool v3.10をダウンロードしてインストールします。PICkit3は持っていないのでPICkit3の説明はここまで。。たぶん、これで使えるようになっていると思います。

PICkit2の場合、PICkit 2 Development Programmer/DebuggerにあるPICkit 2 V2.61 Install with .NET Framework Aをダウンロードして解凍します。

解凍した中身にsetup.exeがあるので、それをダブルクリックしてインストールします。設定などは特に変えずにとにかくインストールすれば問題ないです。デスクトップにPICkit 2 v2.61のショートカットが作成されます。

PICkit2をパソコンにつなげてPICkit 2 v2.61を起動します。

PICkit2 not found. Check USB connections and use Tools
と表示されてします。Windowsのドライバーソフトウェアのインストールが終わっていない模様。

ドライバーソフトウェアのインストールが終わってからPICkit 2 v2.61を起動します。

PICkit 2 Operating System must be updatedなんちゃらというダイアログが表示されるので、OKを押します。Downloading failed.になる。

PICkit 2 v2.61を再起動する。
Tools → Download PICkit2 Operating Systemを選択する
PK2V023200.hexを選択する

これでOperating Systemがアップデートされます。

MPLAB XとXC8コンパイラをインストールする

MPLABにあるMPLAB X IDEをダウンロードします。

Windows (x86/x64) MPLAB® X IDE v2.35

MPLABX-v2.35-windows-installer.exeを実行してインストールします。設定とかはそのままです。

MPLAB X IDEのインストールが終わったら、次にXC8コンパイラのインストールをします

MPLAB® XC Compilers

Windows (x86/x64)のMPLAB® XC8 Compiler v1.34をダウンロードして設定等は変えずにインストールします。

XC8コンパイラのインストールが終わったらXC8コンパイラをMPLAB X IDEで使えるように設定します。

MPLAB X IDE v2.35を起動します。

Tools → Options
Embedded → Add
Base Directory: C:\Program Files (x86)\Microchip\xc8\v1.34\bin
Type: XC8

これでMPLAB X IDEでXC8コンパイラを使うことができるようになりました。

MPLAB X IDEを使ってLED点滅プログラムを書く

点灯プログラムを書く前に、使うPICマイコンを決めます。

PICkit2の場合、PIC12F683 (PDF 秋月で130円)
PICkit3の場合、PIC12F1822 (PDF 秋月で100円)

PIC12F1822のほうが省エネで安いのでお勧めなのですがPICkit2は対応していないのでPICkit2の人はPIC12F683を使いましょう。PICkit2でも少し手を加えればPIC12F1822に書き込めるらしいですが、そのうち試してみようと思います。

MPLAB X IDE v2.35を起動します。

File → New Project

Microchip Embedded → Standalone Project

Family: Mid-Range 8-bit MCUs (PIC10/12/16/MCP)
Device: PIC12F683 (PICkit3の人はPIC12F1822がお勧め)

Supported Debug Header: None

Select Tool: PICkit2 (PICkit3の人はPICkit3)

Select Compiler: XC8

Project Name: LED
Encoding: UTF-8

Source Filesを右クリック → New → C Main File

File Name: main
Extension: c

Finish

main.cを開く

#include <stdio.h>
#include <stdlib.h>

/*
 * 
 */
int main(int argc, char** argv) {

    return (EXIT_SUCCESS);
}

これでプログラムを書く土俵ができました。main.cを編集してLEDの点灯プログラムを作ります。

省エネモードでPICを使いたいのでクロック数を一番低いものにします。

外部クロック(2V、32kHz)を使った場合の消費電流は11μA。内部クロック(31kHz)を使った場合の消費電流がデータシートに記載されていないので両方試してみることにします」。

外部クロック32kHzを使って1秒ごとにLEDが点滅するプログラム(main.c)

#include <xc.h>
#define _XTAL_FREQ 32000
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))

// CONFIG
#pragma config FOSC = LP        // Oscillator Selection bits (LP oscillator: Low-power crystal on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

void main() {
    OSCCON = 0b01111000;
    TRISIO = 0x00;
    ANSEL = 0x00;
    ADCON0 = 0x00;
    while(1){
        GP0 = 1;
        __delay_ms(1000);
        GP0 = 0;
        __delay_ms(1000);
    }
}

内部クロック31kHzを使って1秒ごとにLEDが点滅するプログラム(main.c)

#include <xc.h>
#define _XTAL_FREQ 31000
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))

// CONFIG
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

void main() {
    OSCCON = 0b00001001;
    TRISIO = 0x00;
    ANSEL = 0x00;
    ADCON0 = 0x00;
    while(1){
        GP0 = 1;
        __delay_ms(1000);
        GP0 = 0;
        __delay_ms(1000);
    }
}

Run → Build Main ProjectをクリックするとPICkitでPICマイコンに書き込むためのHexファイルを吐き出してくれます。

Hexファイルの場所
C:/Users/your_username/MPLABXProjects/LED.X/dist/default/production/LED.X.production.hex

PICKitでPICマイコンにプログラムを書き込む

LEDの点滅プログラムをHexファイルにコンパイルしたら、つぎにHexファイルをPICKit2/3にインポートしてPICマイコンにプログラムを書き込みます。

ミニブレッドボードにPIC12F683を載せてワイヤジャンパーをつなげて、10kオームの抵抗をピン1とピン4に入れます。

こんな感じで書き込めます。PICkit3でも同じようにつなぎます。

PICkitに三角(▲)の矢印が付いているところから
緑 → ピン4
赤 → ピン1
黒 → ピン8
白 → ピン7
黄 → ピン6
なし

ピン4とピン1に抵抗10kオームを入れる。

詳しくはPICkit2 Programmerの使い方のPICkit2用アダプタの製作につなげ方が書いてあります。

PICkit 2 v2.61を起動する。

File → Import Hex

Hexファイルの大体の場所
C:/Users/your_username/MPLABXProjects/LED.X/dist/default/production/LED.X.production.hex

LED.X.production.hexを指定する。

Writeをクリックする。

これでLEDの点滅プログラムがPICマイコンに書き込まれました。

LED点滅プログラムを動かす

プログラムを書き込んでPICマイコンを取り出して、ブレッドボードに配置します。

内部クロック31kHzを使ったプログラムを書き込んだPICマイコンの回路、電源はUSBを使っています。

外部クロック32kHzを使ったプログラムを書き込んだPICマイコンの回路

外部クロック32kHzにはクリスタル(水晶発振子) 32.768kHzと43pFのコンデンサ2つを使っています。ちなみに最初に100pFのコンデンサを使ってみたのですが、そのときはうんともすんとも動きませんでした。

LEDをとって電源に抵抗をかませて電流を測ってみたところ、内部クロック31kHzを使っているPICが27uA、外部クロック32kHzを使っているPICが30uAの電流を消費していました。PICにかかっている電圧は4.7Vくらいです。

正確な時間が必要でなければ、消費電流も部品点数も少なくなるので内部クロック31kHzを使うのが良さそうです。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください