MPLAB X 覚え書き

初版作成  2012
最終更新  2016.11.24


◆◆ インストール ◆◆

http://www.microchip.com/mplab/mplab-x-ide

で MPLAB-X IDE をダウンロードしてインストールする。

インストールが終わると、Web ブラウザが自動的に
立ち上がり、コンパイラのサイトが開く。

XC8 コンパイラ (2012.3 公開  元々は HI-TECH C Compiler) を

http://www.microchip.com/mplab/compilers

からダウンロードしてインストールする。

MPLAB X IDE において

  [tools] --> [options] --> [embedded] --> [build tools: add]
  C:\Program Files\Microchip\xc8\v1.xx\bin

で XC8 コンパイラが使えるようになる。


◆◆ 参考サイト ◆◆

このサイト が詳しい。

◆◆ アセンブラでの開発 2016.10 ◆◆

File --- New Project

Categories: Microchip Embedded
Projects: Standalone Project

Family と Device を選ぶ。
PIC16F685  は  Middle Range 8-bit MCUs  にある。

Hardware Tools = PICkit2
Compiler Toolchains = mpasm --- mpasm (v5.70)

空のプロジェクトができる。

File --- New File
  Categories: Assmbler
  File Types: AssemblyFile.asm

コンパイルに成功すると hex ファイルは以下のフォルダに生成される。

Project-Name.X\dist\default\production


◆◆ C 言語での開発(雛形ファイル作成機能を使用) ◆◆

File --- New Project

Categories: Samples -- Microship Embedded
Projects:   PIC16 C Template を選ぶ

File ---  Project Properties

Device: PIC の型番 を選ぶ

Compiler Toolchain:  XC8 コンパイラを選ぶ

Categories: Conf:
  上にスクロールして [General] を選び、直後に
  一番下の Encoding: のリストボックスで Shift_JIS を選ぶ。

雛形ファイルとその中に含まれる関数は以下の通り

  main.c                  main()
  system.c                ConbfigureOscillator()
  user.c                  InitApp()
  configuration_bits.c
  interrupts.c            isr()

main() から ConfigureOscillator() と InitApp() を呼ぶ。

コンフィギュレーションの設定方法は後で説明する。


◆◆ コンフィギュレーションの設定  2016.9.23 ◆◆

Window --- PIC Memory Views --- Configuration Bits

Generate Code を押し、生成されたコードを
configuration_bits.c にコピーする。

なぜ configuration_bits.c が有効になるのか謎。
どこからもインクルードされていないように見える。

PIC16F88 で内部クロック(8 MHz)を使う場合は、以下のようにする。

1. FOSC: INTOSCIO
   WDTE: OFF      Watchdog Timer
   PWRTE: ON      Power-up Timer
   MCLRE: OFF     reset switch
   BODRN: ON      Brown-out Reset
   LVP: OFF       Low-voltage Programming
   CPD: OFF
   WRT: OFF
   CCPMX: RB0
   CP: OFF

   FOCS 以外は用途に合ったものを選ぶ。

   configuration_bits.c の末尾にコピペする

2. main.c に以下の行を付加する

#include "system.h" の手前

#include <pic16f88.h>

main() 関数の手前

#define _XTAL_FREQ 8000000  // __delay_us(x)  __delay_ms(x) に関係する

main() 関数の中

OSCCON = 0x70;    // クロック周波数の指定

ConfigureOscillator() は system.c の中にある 空である
InitApp() は user.c の中にある 空である


◆◆ 定数 ◆◆

16進   0x7f
2進    0b00011010

(注意!)
2 進数のつもりで 0x00000110 としないように。(0b のつもりが 0x)
コンパイルエラーは出ない。

◆◆ レジスタの操作 ◆◆

PORTA = 0b11111111;

のように書く。PORTA は pic16f88.h の中で以下のように定義されている。

extern volatile unsigned char           PORTA               @ 0x005;

◆◆ ビット操作 ◆◆

main() の手前で以下のマクロを定義する

#define bitset(var,bitno)    ((var) |= 1UL << (bitno))
#define bitclr(var,bitno)    ((var) &= ~(1UL << (bitno)))
#define bitread(var,bitno)   ( ( (var) & 1UL << (bitno) ) >> (bitno) )

bitset bitclr のマクロは help で検索すると見つかる。
bitread は私が書いた。一応動作チェックはしたが、自己責任で使うこと。

マクロを使わず素直に書く場合は

PORTAbits.RA0 = 1;

のように書く。PORTAbits まで入力すると、後はエディタが補完してくれる。
pic16f88.h の中で以下のように定義されている。

typedef union {
    struct {
        unsigned RA0                    :1;
        unsigned RA1                    :1;
        unsigned RA2                    :1;
        unsigned RA3                    :1;
        unsigned RA4                    :1;
        unsigned RA5                    :1;
        unsigned RA6                    :1;
        unsigned RA7                    :1;
    };
} PORTAbits_t;
extern volatile PORTAbits_t PORTAbits @ 0x005;


◆◆ Hex ファイルの場所 ◆◆

project_name.X -- dist -- HT_PIC16F54 or default -- production

◆◆ エディタの設定 ◆◆

配色

  Tools --- Options --- Fonts & Colors

  City Lights を選び、それを修正するか、そのまま用いるとよい。

tab

  Tools --- Options --- Editor -- Formatting
      expand tabs to spaces のチェックを外す
      tab size : 4

      しかし、上記のように設定しても tab キーを押すとスペースが 4 個入る。


◆◆ PICpro の使い方 ◆◆

書き込みツールに PICpro を使う。

COM ポートは 1 桁台しか設定できない。
私のメインマシンの場合、COM1 はハードが存在するポートに
強制的に割り当てられるので、COM2 以降に設定する。


◆◆ 16F88 の使い方 ◆◆

16F88 は設定項目が多いので 16F819 よりややこしい。
以下の条件で使用する。

内部クロック 8MHz
PORTA 全てアナログ入力
PORTB 全てデジタル出力

---------- configuration_bits.c ----------

// 'C' source line config statements

#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0      // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// CONFIG2
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode enabled)

-------- main.c --------

#define _XTAL_FREQ 8000000

void main(void)
{
    ConfigureOscillator();
    InitApp();

    OSCCON = 0x70;
    INTCON = 0;            // 割り込み禁止
    TRISA  = 0b11111111;   // 1:input  0:output
    TRISB  = 0b00000000;
    ANSEL  = 0b11111111;   // porta input = 1:analog  0:digital
    ADCON1 = 0b01000000;   // bit7 = 1:右寄せ 0:左寄せ
                           // bit6 = 1:ADクロックは2で割る
                           // bit54 = 00: 基準は Vdd-Vss
    ADCON0 = 0b01000001;   // bit76 = 01: adcon1.6=1 のとき Focs/16
                           // 8MHz のとき 2us (1.6us以上必要)
                           // bit5-3 = ch
                           // bit2=1:start 0:completed
                           // bit0=1:enabled 0:disabled

メインループ内

        bitset(ADCON0,3);  // ch = 1
        __delay_us(20);
        bitset(ADCON0,2);
        while(1){
           if ( bitread(ADCON0,2) == 0 ) break;
        }
        ch1 = ADRESH;

        bitclr(ADCON0,3);  // ch = 0
        __delay_us(20);
        bitset(ADCON0,2);
        while(1){
           if ( bitread(ADCON0,2) == 0 ) break;
        }
        ch0 = ADRESH;


◆◆ MPLAB で作ったプログラムのインポート ◆◆

Tools --- Options --- Embedded --- Default Charset を
Shift_JIS に変えておく。

File --- Import でプロジェクトの mcp ファイルを指定する。

プロジェクトフォルダの中に、MPLAB X が作成したプロジェクト
フォルダが生成される。プロジェクト名が abc なら、フォルダ名は
abc.X となる。

HEX ファイルは以下にできる。

   abc.X --- dist --- default --- production


◆◆ コンパイルしたプログラムの書き込み ◆◆

> アドウィンの PIC Programmer A を使う方法

書き込み用ソフト PICpro をインストールする。
買ったときに付属している CD に入っているが、
アドウィンのホームページにもあるようだ。

> Microchip の PICkit2 を使う方法

MPLAB-X をインストールすると、PICkit2 用の書き込みソフト
PICkit 2 Programmer も自動的にインストールされるようだ。

16F685 に書き込む方法

1. ハードウェアのティップスイッチ

20 pin である。ディップスイッチは 8p, 14p, 18p を選ぶ。

2. PICkit2 Programmer の設定

Device Family --- Mid Range --- Standard

Programmer --- Verify on Write
               Clear Memory Buffer on Write  の 2 箇所にチェックを入れる

               Manual Device Select はチェックしない。
               自動的に 16F685 が認識される

Tools --- Fast Programmin のみチェックする

3. 書き込み

File ---- Import hex file で hex ファイルを読み込む。
「Write」を押す