初版作成 2012
最終更新 2025.05.14
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 コンパイラが使えるようになる。
このサイト が詳しい。
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
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() を呼ぶ。 コンフィギュレーションの設定方法は後で説明する。
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;
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 を使う。 COM ポートは 1 桁台しか設定できない。 私のメインマシンの場合、COM1 はハードが存在するポートに 強制的に割り当てられるので、COM2 以降に設定する。
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;
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」を押す