MPLABX XC8環境で、最近のPICのプログラミングを勉強していきます。(MPLAB Xはv5.05をXC8はv1.45を使っています。)
まず、8ピンPICのPIC12F1822を使ってみます。同じファミリーにPIC12F1840がありますが、プログラムメモリーとデータメモリの容量の違いだけです。(プログラムメモリは、1822が2kワード、1840が4kワード、データメモリは、1822が128バイト、1840が256バイトです)
PIC16F675など旧タイプの8ピンPICとピン配列は同じですが、中身はかなり機能が強化されています。
まずは、恒例のLチカ(LEDの点滅)をやってみましょう。
回路図です。入出力ピンの名称は、GPIOではなく、RA0~RA5になり、容量性負荷の影響を受けないように、IO回路にラッチが導入されています。今回は、RA0のLEDを点滅させます。
ブレッドボードです。電源(5V)は、USBシリアル変換モジュールFT234Xからとっています。
PIC12F1822のクロックは、DC~32MHzで動作します。内部クロックでもPLLを使えば32MHzクロックで動かせます。
今回は、内臓クロック16MHzで動作させてみました。
CONFIG1で
FOSC = INTOSC
CONFIG2で
PLLEN = OFFとし
OSCCON =0b01111010;に設定します。bit6~bit3でクロック周波数を設定します。
1111 16MHz
1110 8MHz
1101 4MHz
1100 2MHz
1011 1MHz
以下省略
です。
-----------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <stdlib.h>
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // 内部クロックを使う(INTOSC)
#pragma config WDTE = OFF // ウオッチドッグタイマーを使わない(OFF)
#pragma config PWRTE = ON // パワーアップタオイマーを有効にする(ON)
#pragma config FOSC = INTOSC // 内部クロックを使う(INTOSC)
#pragma config WDTE = OFF // ウオッチドッグタイマーを使わない(OFF)
#pragma config PWRTE = ON // パワーアップタオイマーを有効にする(ON)
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(OFF)
// CONFIG2
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // 動作クロックを32MHzで動作させない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // 動作クロックを32MHzで動作させない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
#define _XTAL_FREQ 16000000
void main() {
OSCCON = 0b01111010 ; // 内部クロック16MHz
ANSELA = 0b00000000 ; // アナログは使用しない
TRISA = 0b00001000 ; // ピンは全て出力(RA3は入力のみ)
PORTA = 0b00000000 ; // 出力ピンの初期化
while(1){
RA0 = 1;
__delay_ms(500);
RA0 = 0;
__delay_ms(500);
}
RA0 = 1;
__delay_ms(500);
RA0 = 0;
__delay_ms(500);
}
}
-----------------------------------------------
PICkit3で問題なく書き込みが出来、0.5秒ごとにLEDが点滅しました。
それではと32MHzで動作させてみました。
PLLEN = ON
#define _XTAL_FREQ 32000000
OSCCON = 0b01110000;
としてコンパイル・書き込みをしました。
問題なくLチカが動作しました。