PIC16F84A で Lチカ


20150426_pic_device

PIC16F84A は、マイクロチップ社の8ビットマイコンです。
ひと昔前は、8ビットマイコンの定番的な存在でしたが。
現在では、同社の 18F シリーズや、アトメル社の ATmega が主流になっています。
今回は、無償でまとまった数を入手したので、久しぶりに PIC で遊んでみます。

スペック比較
Arduino Uno に使われているアトメル社の ATmega328P と比べると、かなり見劣りします。

ATmega328P PIC16F84A
外形 28ピン DIP 18ピン DIP
動作電圧 1.8 – 5.5V 2.0 – 5.5V
クロック 20 MHz 20 MHz
プログラム容量 32KB 1Kword ※1
EEPROM容量 2KB 64B
RAM容量 1KB 68B
AD変換 6個 なし
UART 1個 なし
SPI 1個 なし
I2C 1個 なし
IO電流 40mA 20mA
秋月価格 250円 250円

※1 PIC16F は14ビット命令長です。

開発環境
マイクロチップ社から MPLAB X IDE が無償で提供されています。
Cコンパイラも、8ビット(XC8)、16ビット(XC16)、32ビット(XC32) の無償版が提供されています。
それぞれ、Windows、MAC、Linux に対応しています。

PICライタ
秋月電子には、30種を超える PICライタ が販売されています。
ホビー用の定番は PICkit3 です。

C言語 プログラム
PICの開発環境が、この数年で大きく変わりました。
古い環境やアセンブラで書いた例はいろいろ見つかりましたが。
MPLAB X IDE + XC8 という新しい環境での例は少なかったです。

PIC特有の流儀は、3つくらいです。
(1) チップの品種ごとにマクロが用意されています。
レジスタのアドレスやビット配置などをさほど意識せずに、すっきり書けます。

#include <pic16f84a.h>

(2) config レジスタ用にマクロが用意されています。
main が実行される前に、初期設定を実行してくれます。

#pragma config WDTE = OFF, PWRTE = OFF, CP = OFF, FOSC = HS 

(3) 外部クロック用に周波数定義のマクロ定数が用意されています。
delay など正確な時間が必要な関数が使えます。

#define _XTAL_FREQ 16000000

Lチカのプログラムを書く。
TRISx は、IOポートの出力/入力を設定するレジスタです。
PORTx は、IOポートの値を設定するレジスタです。
今回は、RB4 に LED を付けます。

#include <xc.h>         /* XC8 General Include File */
#include <pic16f84a.h>  /* PIC16F84A */ 
#define _XTAL_FREQ 16000000     // 16MHz
#pragma config WDTE = OFF, PWRTE = OFF, CP = OFF, FOSC = HS 

void main(void)
{
    TRISA = 0x00;   // PortA all output
    TRISB = 0x00;   // PortB all output
    PORTA = 0x00;   // PortA all low
    PORTB = 0x00;   // PortB all low

    while(1)
    {
        PORTBbits.RB4 = 1;  // LED on
        __delay_ms(1000);   // 1sec
        PORTBbits.RB4 = 0;  // LED off
        __delay_ms(1000);   // 1sec
    }
}

MPLAB X IDE 上でコンパイル&ビルドする。
MPLAB X+XC8で__delay_ms関数にエラーマークが表示される問題の解決方法

プログラム転送
PICkit3 を使って、MPLAB X IDE から、PICマイコンにプログラムを転送する。
このとき、PICkit3 から5V電源を供給するようにすると、PICマイコン側は MCLK のプルアップ抵抗だけあればいいです。
20140426_picschematic_pickit3 20150426_pic_pickit3

最低限の回路
PICマイコンの周りに下記を追加します。
(1) 5V電源
(2) 電源コンデンサ
(3) MCLK のプルアップ抵抗
(4) セラミック発振子 ※2
(5) 動作確認用のLED

※2 クロック回路
PIC のクロック回路には、内部発振と、外部クロックの2つの方法があります。
内部発振では、外付けの抵抗とコンデンサが必要です。
外部クロックでは、水晶発振子、セラミック発振子、あるいはクロック源が必要です。
実装的には、セラミック発振子を使うのが簡単です。

20140426_pic_schematic_basic_led

動作確認
上記の回路で、電源を入れれば、LEDが点滅します。
20150426_pic_device

プログラムなどは、Github で公開しています。

参考
PIC 久しぶり – PIC16F84A XC8 LED
LEDを点滅させる - TMR0割込み -(PIC16F84A XC8)
16F84A XC8開発例 – カウンタ回路(7セグメントLEDの制御)
XC8:コンフィグレーションワード記述書式について
MPLAB X+XC8で__delay_ms関数にエラーマークが表示される問題の解決方法


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です