PIC を使ってLEDを光らせる!!
PIC 概要
PIC(Peripheral Interface Controller)とは、Microchip Technology Inc社が開発、販売している組み込みコンピュータ。同じような組み込みコンピュータに、RaspberryPiや、Arduinoなどの高性能な組み込みコンピュータが登場している。PICはそれらより性能は低いが、同じようにプログラムを書き込んで周辺機器を制御することが可能なものである。
PIC のスペック(PIC16F1827)
デバイス名 | プログラムメモリ | ビット | SRAM(bytes) | Data EEPROM(bytes) | 動作周波数 | 値段 |
PIC16F1827 | 4K | 8 | 384 | 256 | 最大32MHz(内部) | 150円 |
RaspberryPi3 | 64 | 1G | 1.2GHz | 約5,000円 | ||
Arduino Uno | 32K | 8 | 2K | 1K | 16MHz | 約3,000円 |
PIC プログラムに必要なソフト、ハード一覧
ソフト
- MPLAB X IDE(PICのプログラムを記述)
- MPLAB XC Compiler(PICのコンパイラ)
ハード
- PICKit3(PICにプログラムを書き込むのに必要)
- PICマイコン (今回はPIC16F1827)
- ブレッドボード(電子回路をはんだなしで動かせる)
- ジャンプワイヤー(ブレッドボードで部品と部品をつなぐケーブル)
- USB電源(PICの電源5V)
- はんだごて(はんだする際に必要 ブレッドボードだけでいいなら使わない)
ハード一覧入手方法
初めて電子工作する際はいろいろと必要になるので、以下の表を参考に。ほとんどがAmazonで買える。
ハード | 販売サイト | リンク | 値段 |
PICKit3 | Amazon | PIC プログラミングキット PICKIT3互換品 PIC マイコン | ¥2,400 |
PICマイコン | 秋月電子 | PICマイコン PIC16F1827-I/P | ¥150 |
ブレッドボード | Amazon | 5個セット 400穴 ミニブレッドボード | ¥870 |
ジャンプワイヤー | Amazon | ブレッドボードジャンパーワイヤー | ¥990 |
USB電源 | Amazon | マイクロUSBメスソケットへのDIPアダプタボード | ¥529 |
はんだごて | Amazon | はんだごてセット | ¥2,099 |
PIC で出力、入力
PICの入出力はレジスタに値を設定することで変更します。
PICのデータシートを見ると以下のようになっており、Vssの上がRAレジスタ。下がRBレジスタとなっています。
このPICではRAとRBがそれぞれ0~7の8Pin存在しています。
例えばPin18番のRA1を出力したい場合はC言語で記述すると以下のようなコードになります。
順を追って上から説明します。
ANSELA = 0x0;
TRISA = 0x7D;
LATA = 0x02;
ANSELレジスタ
初めにPICはアナログモードと、デジタルモードがピンごとに設定することができます。今回はデジタル出力を行うため、ANSELというレジスタを設定して、全ピンをデジタルに設定します。設定方法は以下のコードのみです。
0xは16進数で表現するための記号であり、0x00は10進数にすると0になります。2進数にすると0000000となります。
ANSELA = 0x0;
RA7 | RA6 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
(*今回はRA1ピンを出力するのでANSELAと記述しましたが、RBピンを設定するときはANSELBと書くことでRBの設定を行うことができます。)
TRISレジスタ
ANSELレジスタで、アナログ、デジタルモードの設定を行うことができました。次は入出力モードの設定です。
PICではピンごとに入力、出力を行うことができますが、あらかじめどちらのモードで使用するか設定する必要があります。その設定を行うことができるのがTRISレジスタです。今回はRA1のみ出力するような設定をしましょう。
コードで記述すると以下のようになります。0x7Dを2進数にすると1111101になります。以下の表を参考にしてください。
TRISA = 0x7D;
RA7 | RA6 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
LATレジスタ
さていよいよRA1ピンに電気信号を出力させましょう。ピンの出ロ、入力設定はLATレジスタで行います。TRISレジスタとの違いは先ほどはモードの設定でしたが、こちらは実際にPICから電気を出力したり、出力を止めたりすることができます。ではRA1ピンを出力させましょう。(よく出力をHigh、出力停止をLowと呼びます。)
LATA = 0x02;
RA0~RA7を表で表してみましょう。ここでRA1のみ出力にする場合は以下のようにビットを立てればよいのです。
RA7 | RA6 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
実際に回路を組んでLEDを光らせる
これまでの知識を生かして、3つのLEDを順番に光らすプログラムを組んでみました。
出力するピンはRB7、RB6、RB5の3つです。回路はブレッドボードで組みました。電源の電圧はUSBからとってきているので5Vです。
以下がPICに書き込んだCのコードです。
- 初めにRBのピンをANSELBレジスタですべてデジタルモードに設定。
- 次に、TRISBレジスタでRB7、RB6、RB5を出力モードに設定。RBピンの出力を一度すべてオフにし初期化させています。
- レープ内では、初めに、ledを光らせるピンを指定する変数をチェックしています。
- 次に、LATBレジスタに変数を代入し、RBピンに対して出力させます。
- 最後に、変数を1ビット右シフトさせて次のLEDを光らせる準備をしています。あとはこの流れを繰り返すだけです。
#include "mcc_generated_files/mcc.h"
#include <xc.h>
#define _XTAL_FREQ 500000
void main(void)
{
// initialize the device
SYSTEM_Initialize();
ANSELB = 0x0;
TRISB = 0x1F;
LATB = 0x0;
uint8_t mask = 0x10;
uint8_t led = 0x80;
while (1)
{
__delay_ms(500);
if(led == mask){ led = 0x80;}
LATB = led;
led = led >> 0x01;
__delay_ms(500);
}
}
上記のコードをPICKit3でPICに書き込み、回路を組めば動きます。(*PICを稼働させる設定方法は省いているので、このコードのみでは実際には動作しません。)
PICのほかの記事も書いています。参考にしてください。
thank you. it has opened my reasoning to start.