【
MPC17-02-B
】
PIC12F1822
かんたんマイコンプログラミング
1
ハードウェアの製作
(1) 回路図
(2) 部品
(3) 実体配線図
[1]マイコン
PIC12F1822P
PIC 12F1822
A
A
150Ω
茶緑茶金
[2]LED
[3]抵抗器
[4]圧電ブザー
10kΩ
茶黒橙金
-PIC 12F1822
-PIC 12F1822
(4) PICkit3の接続
図のように、PICkit3を接続する。
2
プログラミングの前の準備
(1) プログラムの開発環境の準備とプロジェクトの作成
別添資料「PICマイコンにプログラムを書き込む方法」を参照のこと。
今回は、あらかじめ準備されている学習用プロジェクトファイルmpc17-02-bを使う。
(2) 学習用プロジェクトファイルの展開
圧縮ファイル“mpc17-02-b.X.zip”をデスクトップに展開する。
(3) 統合開発環境MPLAB XIDEでプロジェクトを開く。
(a) MPLAB XIDEを起動する。
(b) [File]-[Open Project ...]をクリック
(c)デスクトップの場所を指定し、”MPC17-02.X”をダブルクリックして開く。
(d) MPLAB XIDEでは、複数のプロジェクトを開くことができるので、”Main Project”に設定したプロジェ クトだけをビルドするようになっている。そこで、mpc17-02-bをMain Projectとするため、MPLAB XIDE のProjectウインドウで、”mpc17-02-b “ を右クリックして、[Set as Main Project]をクリック。
PICkit3
MCLR/VPP
+2.4〜 5V
-PIC 12F1822
VDD VSS Ground ICSPDAT
3
LED
点灯時間(タイマの設定時間)の調整
(1) mpc17-02-settings.h を開く
MPLAB XIDEの画面で、”MPC17-02-B”-”Header Files”-”mpc17-02-settings.h”を開く。
(2) mpc17-02-settings.h の編集
次のコードの数値を変更する。TIME_LIMITと数値の間に半角空白を入れること。
#define TIME_LIMIT 8 // LEDが点灯している時間(タイマの秒数)
(3) ビルドと書き込み、動作確認
[Make and Program Device Main Project]のアイコンをクリック
[CAUTION]警告のダイアログボックスが表示されたら、
電源が正しく接続されていることを確認して、[OK]をクリック。 (標準では、PICkit3から電源供給をしないので、問題はない)
※書き込みの段階で、赤い字でエラーメッセージが出る場合、電源が接続 されていなかったり、電線の接続に不具合があったりすることが多い。
4
LED
点滅時間の調整
(1) mpc17-02-settings.h を開く
MPLAB XIDEの画面で、”MPC17-02-B”-”Header Files”-”mpc17-02-settings.h”を開く。
(2) mpc17-02-settings.h の編集
次のコードの数値を変更する。_INTERVALと数値の間に半角空白を入れること。
#define LED_BLINK_INTERVAL 100 // LEDが点滅する間隔(40 ~ 500)
(3) ビルドと書き込み、動作確認
[Make and Program Device Main Project]のアイコンをクリック
[CAUTION]警告のダイアログボックスが表示されたら、
電源が正しく接続されていることを確認して、[OK]をクリック。 (標準では、PICkit3から電源供給をしないので、問題はない)
※書き込みの段階で、赤い字でエラーメッセージが出る場合、電源が接続 されていなかったり、電線の接続に不具合があったりすることが多い。
5
ブザー音の調整
(1) mpc17-02-settings.h を開く
MPLAB XIDEの画面で、”MPC17-02-B”-”Header Files”-”mpc17-02-settings.h”を開く。
(2) mpc17-02-settings.h の編集
次のコードの数値を変更する。_LENGTHや_HEIGHTなどの英字と数値の間に半角空白を 入れること。
#define BEEP_START_LENGTH 2000 // 起動音の長さ #define BEEP_START_HEIGHT 5 // 起動音の高さ
#define BEEP_SHOCK_LENGTH 4000 // ブザーを叩いたときの音の長さ #define BEEP_SHOCK_HEIGHT 2 // ブザーを叩いたときの音の高さ #define BEEP_ALARM_LENGTH_1 4000 // 警報音(最初の音)の長さ #define BEEP_ALARM_HEIGHT_1 8 // 警報音(最初の音)の高さ #define BEEP_ALARM_LENGTH_2 2000 // 警報音(次の音)の長さ #define BEEP_ALARM_HEIGHT_2 16 // 警報音(次の音)の高さ
(3) ビルドと書き込み、動作確認
[Make and Program Device Main Project]のアイコンをクリック
[CAUTION]警告のダイアログボックスが表示されたら、
電源が正しく接続されていることを確認して、[OK]をクリック。 (標準では、PICkit3から電源供給をしないので、問題はない)
※書き込みの段階で、赤い字でエラーメッセージが出る場合、電源が接続 されていなかったり、電線の接続に不具合があったりすることが多い。
6
(付録)プロジェクトの作成
学習用プロジェクトファイルmpc17-02-bの作成方法を説明する。
(1) プログラムの開発環境の準備
別添資料「PICマイコンにプログラムを書き込む方法」を参 照のこと。
(2) 統合開発環境MPLAB XIDEでプロジェクトを作成
(a) MPLAB XIDEを起動する。
(b)新しいプロジェクトを作成
[File]-[New Project ...]をクリック
(c) [Choose Project]
初期のプロジェクト[Microchip embedded]-[Standard project]のま ま、[Next]をクリック。
(d) [Select Device]
マイコンの種類を選択する。
[Family] は[Mid-Range-8-bit-MCUs]を選択、 [Device]は[PIC12F1822]を選択、
[Next]をクリック。
(e) [Select Header]
デバッグ用のヘッダを選択する。
今回は、簡単なプログラムなのでヘッダをつけない。[None]のま ま、[Next]をクリック。
(f) [Selet Tool]
プログラムの書き込み用のツールを選択する。 [PICkit3]をクリックして、[Next]をクリック。
(g) [Select Compiler]
ソースプログラムをマイコンの機械語に変換するためのコンパイ ラを選択。[XC8...]の最新のものをクリックして、[Next]をクリッ ク。
(h) [Select Project Name and Folder]
プロジェクト名とフォルダ名の設定。 [Project Name]を[mpc17-02-b]と入力
[Encoding]は、[UTF-8]とする。これは、ソースプログラム中に日 本語を使うために設定する。
[Finish]をクリック。
(i) Main Project確認
(3) ソースプログラムの作成
(a)プロジェクトの展開
画面左側のProjects ウィンドウにある[▶︎
mpc17-02-b]の︎をクリックし、展開する。
(b)ソースファイルの追加
[▶︎Source Files]を右クリック。 [New ▶︎]-[main.c…]
(c)ソースファイル名の入力
ファイル名として[main-mpc17-02-b]と入力。 [Finish]をクリック。
(d)作者名の変更
ソースファイルの先頭3行目にある、Author (作者)の欄に、作者名を記入。 /*
* File: main-mpc17-02.c * Author: *****
*
* Created on August 11, 2017, 3:12 PM */
7行目以降を削除して、後で示されるサンプルソースファイルをコピー&ペーストする。
(4) ヘッダファイルの作成
設定をヘッダファイルとしてまとめておき、そのファイルだけを修正することで、最終的な製品 の性能の調整を目指す。
(a)ヘッダファイルの追加
[▶︎Header Files]を右クリック。 [New ▶︎]-[C Header File…]
(b)ヘッダファイル名の入力
7
(付録)ソースファイルとヘッダファイルの準備
(1) ソースプログラムの編集
(a) MPLAB XIDEの画面で、”MPC17-02-B”-”Source Files”-”main-mpc17-02-b.c”を開く。
(b) 7行目以降を消去して、次のコードをコピー&ペーストする
/*
* LED1 : PIN 2 (RA4) : 1-OFF, 0-ON * Buzzer : PIN 6 (RA1)
* ANALOG PORT : PIN 6 (AN1) *
*/
#include <xc.h> // XC8コンパイラ用のヘッダ(レジスタ名などのキーワードの定義を含む) #include <stdint.h> // 整数型のビット数を明示して宣言するためのヘッダファイル
#include "mpc17-02-settings.h" // 設定用ヘッダファイル // PICマイコンの動作設定その1
// PIC micro controller Configuration 1
#pragma config FOSC = INTOSC // 内部クロック使用。
#pragma config WDTE = OFF // ウォッチドッグタイマなし。 #pragma config PWRTE = ON // 64ms後にプログラム開始。
#pragma config MCLRE = OFF // 外部リセットなし。RA3 は入力ピン。 #pragma config CP = OFF // コード保護なし。
#pragma config CPD = OFF // データ保護なし。
#pragma config BOREN = ON // 電源電圧低下時のリセットあり。 #pragma config CLKOUTEN = OFF // クロック出力不可。
#pragma config IESO = OFF // 内部外部クロックなし。 #pragma config FCMEN = OFF // FCMなし。
// 動作設定その2 // Configuration 2
#pragma config WRT = OFF // 書き込み保護なし。 #pragma config PLLEN = OFF // PLLなし。
#pragma config STVREN = ON // スタックオーバー/アンダーフローでリセット。 #pragma config BORV = LO // 電源電圧低下監視閾値は Low モード
#pragma config LVP = OFF // 低電圧プログラムなし。
// I/Oポートの初期化 void initIo(void) {
OSCCON = 0b01110010 ; // Internal clock 8MHz OPTION_REG = 0b00000000 ; // Weak Pull up ON ANSELA = 0b00000000 ; // ALL Digital PORT
TRISA = 0b00001000 ; // Input : RA3, Output: others WPUA = 0b00001000 ; // Weak pull-up : RA3
PORTA = 0b00000000 ; // Initialize PORTA }
// I/Oポートの定義 (LED を接続するポートが変わった時はここを変更する) #define PORT_LED RA4
#define TRISA_LED TRISA4 #define PORT_ADC ANSA1 #define PORT_BUZ RA1 #define TRISA_BUZ TRISA1 #define TRISA_ADC TRISA1 #define PORT_NO_ADC 1 // LED制御用関数
// ちょっと待つ処理を簡単に書くための関数 void wait(volatile uint32_t i)
{
while (i-- > 0); }
// A/D変換関数
// A/D conversion functions void initAdc(void)
{
PORT_ADC = 1; // PORT_ADC で定義されたポートをアナログポートにする。Analog port (see PORT_ADC def.) setting
TRISA_ADC = 1; // A/D 変換端子を入力モードにする。RA1 as input
ADCON0 = 0b00000001 | (PORT_NO_ADC << 2); //AD 変換を有効化。0:unimp, xxxxx:analog ch, 0:GOnDone, 1:ADC enable
ADCON1 = 0b01000000; //0:(ADFM=0)Left justified (10bit res.), 100:Fosc/4 ,0:Reserved, 00:AVDD=VREF
CM1CON0 = 0x00; //コンパレータを無効化。Comparator disable }
uint16_t getAdc(void) // A/D変換した値を得る。 // 戻り値:
// A/D 変換されたアナログ信号の大きさ(0〜1023) {
uint16_t adcvalue; //ADC
wait(10); GO_nDONE = 1; while (GO_nDONE);
adcvalue = ADRESH<<2 | ADRESL>>6 ; return adcvalue;
}
uint16_t getShock(void) {
uint16_t adcvalue;
TRISA_ADC = 1; // Buzzer Port INPUT mode PORT_ADC = 1; // ADC port as Analog port adcvalue = getAdc();
return adcvalue; }
#define T0UNIT 31 // Timer0Counter about 1sec ( 1 / (1 / ((Clock 8MHz / 4) / prescaler 256) * 256)
void initTimer0(void) {
TMR0 = 0x00; // Initialize TIMER0
TMR0CS = 0; //Internal instruction cycle clock (FOSC/4) PSA = 0; //Prescaler is assigned to the Timer0 module
} }
// ブザー制御用関数
inline static void buzToggle(void) { PORT_BUZ ^= 1; } void beepBuz(uint32_t length, uint32_t height)
// ブザを鳴らす // 引数:
// length : 音の長さ
// height : 音の高さ(小さいほど高い音) {
uint16_t i;
TRISA_BUZ = 0; // Buzzer Port OUTPUT mode PORT_ADC = 0; // ADC port as Digital port for (i = 0; i < length; i++) {
buzToggle(); wait(height); } } void beepAlarm(void)
// 決められた時間が経過したときの警報音を鳴らす {
uint8_t i;
for (i = 0; i < 3; i++) {
beepBuz(BEEP_ALARM_LENGTH_1, BEEP_ALARM_HEIGHT_1); beepBuz(BEEP_ALARM_LENGTH_2, BEEP_ALARM_HEIGHT_2); wait(2000); } } void main(void)
// メイン関数。この関数から動作開始 {
uint16_t adc; // A/D 変換の値。A/D converted value
int32_t pwm, dpwm; // LED の明るさを PWM 制御するためのカウンタとカウンタの増分
initIo(); // I/O ポートの初期化 initAdc(); // A/D 変換ポートの初期化 initTimer0(); // Timer0 の初期化
beepBuz(BEEP_START_LENGTH, BEEP_START_HEIGHT); // 起動音を鳴らす
while (1) {
adc = getShock();
if (adc > SHOCK_THRESHOLD) {
beepBuz(BEEP_SHOCK_LENGTH, BEEP_SHOCK_HEIGHT); // 衝撃を検出したときの音 ledOn(); // LED を点灯する。
T0Counter = 0;// タイマのリセット。計時開始。 pwm = 0; dpwm = +1;
while (T0Counter < T0UNIT * TIME_LIMIT) {
//タイマのカウンタが決まった時間になるまで繰り返し実行
if (pwm > LED_BLINK_INTERVAL) { // pwm カウンタが最大値を超えたら pwm = LED_BLINK_INTERVAL; // pwm カウンタを最大値にセット dpwm = -1; // pwm カウンタの増分をマイナス(減) } else if (pwm < 0) { // pwm カウンタがマイナスになったら
pwm = 0; // pwm カウンタを 0 にリセット dpwm = +1; // pwm の増分をプラスに設定 }
ledOn(); // LED 点灯
wait(LED_BLINK_INTERVAL - pwm); // ちょっとの間 LED を消灯し続ける pwm += dpwm; // pwm カウンタを増やす
}
beepAlarm(); //警報音を鳴らす。 ledOff(); // LED を消灯する。 } else {
ledOff(); }
} return; }
(2) 設定用ヘッダファイルの作成
(a) MPLAB XIDEの画面で、”MPC17-02-B”-”Header Files”-”mpc17-02-settings.h”を開く。
7行目以降を消去して、次のコードをコピー&ペーストする。
#ifndef MPC17_02_SETTINGS_H #define MPC17_02_SETTINGS_H #ifdef __cplusplus
extern "C" { #endif
#ifdef __cplusplus }
#endif
// 数値を変更すると機能が調整できる。
#define SHOCK_THRESHOLD 20 // 衝撃の閾値 (0 ~ 1023)
#define TIME_LIMIT 8 // LEDが点灯している時間(タイマの秒数) #define LED_BLINK_INTERVAL 100 // LEDが点滅する間隔(40 ~ 500)
#define BEEP_START_LENGTH 2000 // 起動音の長さ #define BEEP_START_HEIGHT 5 // 起動音の高さ
#define BEEP_SHOCK_LENGTH 4000 // ブザーを叩いたときの音の長さ #define BEEP_SHOCK_HEIGHT 2 // ブザーを叩いたときの音の高さ #define BEEP_ALARM_LENGTH_1 4000 // 警報音(最初の音)の長さ #define BEEP_ALARM_HEIGHT_1 8 // 警報音(最初の音)の高さ #define BEEP_ALARM_LENGTH_2 2000 // 警報音(次の音)の長さ #define BEEP_ALARM_HEIGHT_2 16 // 警報音(次の音)の高さ // 調整用設定終了
(3) ビルドと書き込み、動作確認
[Make and Program Device Main Project]のアイコンをクリック
[CAUTION]警告のダイアログボックスが表示されたら、
電源が正しく接続されていることを確認して、[OK]をクリック。 (標準では、PICkit3から電源供給をしないので、問題はない)
※書き込みの段階で、赤い字でエラーメッセージが出る場合、電源が接続 されていなかったり、電線の接続に不具合があったりすることが多い。
X IDEの下側の[Output]に[Programming/Verify complete]と表示されたら、書き込み完了。