MPLAB XC8 - PIC...

32
2015-2018 Microchip Technology Inc. DS50002400C_JP-p. 1 組み込み技術者のための MPLAB ® XC8ユ ーザガイド - PIC MCU 組み込み技術者のためのMPLAB ® XC8ユーザガイド - PIC MCU 本書には、CCI (Common Code Interface) を使った 8 ビット PIC MCU および MPLAB XC8 C コンパイラ向けの 5 つのサンプルコードを掲載しています。CCI の詳細は『MPLAB XC8 C Compiler User’s Guide(DS50002053) を参照してください。 読者にはマイクロコントローラと C 言語プログラミングに関するある程度の知識が必要です。 1. LED を点灯または消灯させる 2. _delay() 関数を使って LEDを 点滅させる 3. 遅延用に割り込みを使って LED を点滅させる 4. ADC を使ってデジタル ポテンショメータの値を LED で表示する 5. LED EEPROM データ値を表示する A) MPLAB X IDE内でのコード実行 B) ソフトウェアとハードウェアの入手先 注意 : この日本語版文書は参考資料としてご利用ください。 最新情報は必ずオリジナルの英語版をご参照願います。

Transcript of MPLAB XC8 - PIC...

2015-2018 Microchip Technology Inc. DS50002400C_JP-p. 1

組み込み技術者のためのMPLAB® XC8ユーザガイド -

PIC MCU

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

本書には、CCI (Common Code Interface) を使った 8 ビット PIC MCU および MPLAB XC8 C コンパイラ向けの 5 つのサンプルコードを掲載しています。CCI の詳細は『MPLAB XC8 C Compiler User’s Guide』(DS50002053) を参照してください。

読者にはマイクロコントローラと C 言語プログラミングに関するある程度の知識が必要です。

1. LED を点灯または消灯させる

2. _delay()関数を使って LEDを 点滅させる

3. 遅延用に割り込みを使って LED を点滅させる

4. ADC を使ってデジタル ポテンショメータの値を LED で表示する

5. LED に EEPROM データ値を表示する

A) MPLAB X IDE内でのコード実行

B) ソフトウェアとハードウェアの入手先

注意 : この日本語版文書は参考資料としてご利用ください。 最新情報は必ずオリジナルの英語版をご参照願います。

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.2 2015-2018 Microchip Technology Inc.

1. LEDを点灯または消灯させる

以下のサンプルコードは、PIC16F1719 マイクロコントローラ (MCU) を実装した Explorer 8 ボード上の LED を点灯または消灯します。詳細はセクション B. 「ソフトウェアとハード ウェアの入手先」を参照してください。

// PIC16F1719 Configuration Bit Settings

// For more on Configuration Bits, セクション 1.1 参照// consult your device data sheet

// CONFIG1#pragma config FOSC = ECH // External Clock, 4-20 MHz#pragma config WDTE = OFF // Watchdog Timer (WDT) disabled#pragma config PWRTE = OFF // Power-up Timer disabled#pragma config MCLRE = ON // MCLR/VPP pin function is MCLR#pragma config CP = OFF // Flash Memory Code Protection off#pragma config BOREN = ON // Brown-out Reset enabled#pragma config CLKOUTEN = OFF // Clock Out disabled.#pragma config IESO = ON // Internal/External Switchover on#pragma config FCMEN = ON // Fail-Safe Clock Monitor enabled

// CONFIG2#pragma config WRT = OFF // Flash Memory Self-Write Protect off#pragma config PPS1WAY = ON // PPS one-way control enabled#pragma config ZCDDIS = ON // Zero-cross detect disabled#pragma config PLLEN = OFF // Phase Lock Loop disable#pragma config STVREN = ON // Stack Over/Underflow Reset enabled#pragma config BORV = LO // Brown-out Reset low trip point#pragma config LPBOR = OFF // Low-Power Brown Out Reset disabled#pragma config LVP = OFF // Low-Voltage Programming disabled

// #pragma config statements should precede project file includes.// Use project enums instead of #define for ON and OFF.

#include <xc.h> セクション 1.2 参照#include <stdint.h>

void main(void) {

uint8_t portValue = 0x05; セクション 1.3 参照

// Port B access セクション 1.4 参照

ANSELB = 0x0; // set to digital I/O (not analog) TRISB = 0x0; // set all port bits to be output LATB = portValue; // write to port latch - RB[0:3] = LED[4:7]

// Port D access ANSELD = 0x0; // set to digital I/O (not analog) TRISD = 0x0; // set all port bits to be output LATD = portValue; // write to port latch - RD[0:3] = LED[0:3]

}

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.3

1.1 コンフィグレーション ビット

Microchip 社製デバイスは、各種デバイス機能の動作を設定または有効化 / 無効化するためのビットを格納したコンフィグレーション レジスタを備えています。

設定が必要なコンフィグレーション ビット

特に以下の設定が必要です。

• オシレータの選択 - ハードウェアのオシレータ回路に適合する必要があります。正しく選択しないとデバイスクロックは動作しません。一般的に開発ボードは高速水晶振動子向けに構成したオシレータを使います。以下はサンプルコードからの抜粋です。 #pragma config FOSC = ECH

• ウォッチドッグ タイマ - このタイマは必要になるまで無効にしておく事を推奨します。これにより予期せぬリセットを防ぎます。以下はサンプルコードからの抜粋です。 #pragma config WDTE = OFF

• コード保護 - コード保護は必要になるまで無効にしておきます。そうする事でデバイスメモリ へのフルアクセスを確保します。以下はサンプルコードからの抜粋です。 #pragma config CP = OFF

サンプルコードで使っている PIC16F1719 MCU とは異なる 8 ビットデバイスを使う場合、上 記とは異なるコンフィグレーション ビットの設定が必要になる場合があります。対応するコン フィグレーション ビットの名前と機能は、各デバイスのデータシートを参照してください。 データシートは http://www.microchip.com で製品番号を使って検索できます。

各デバイスが備えるコンフィグレーション ビットの詳細は、MPLAB XC8 インストール ディレ クトリ内の以下の場所に保存されているファイルを参照してください。

MPLAB XC8 Installation Directory/docs/chips

コンフィグレーション ビットの設定方法

MPLAB X IDE では、[Configuration Bits] ウィンドウを使ってコンフィグレーション ビットを表 示および設定できます。このウィンドウは、メニューを [Window] > [PIC Memory Views] > [Configuration Bits] と選択すると開きます。

図 1: [CONFIGURATION BITS]ウ ィンドウ

設定を選択した後は、この情報を書き出す先のコードをクリックしてから、[Insert Source Code in Editor] アイコンをクリックして設定を書き出します。結果の例を先のサンプルコード に示しています。

このウィンドウに関する詳細は MPLAB X IDE ユーザガイドを参照してください。

Note: コンフィグレーション ビットを正しく設定しないと、デバイスは期待通りに ( あるいは 全く )機能しません。

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.4 2015-2018 Microchip Technology Inc.

1.2 インクルードするヘッダファイル

xc.hヘッダファイルは、ソースファイル内のコードからコンパイラ固有またはデバイス固有の機能を使えるようにします。ユーザが選択したデバイスに基づき、コンパイラは xc.h が適切なデバイス固有ヘッダファイルを指定できるようにマクロを設定します。デバイス固有ヘッダは、ユーザコード内でインクルードしない事が必要です ( コードの移植性が失われるため )。

stdint.hヘッダファイルは固定長の整数タイプを定義します。例えば、uint8_tは符号なし8 ビット整数です。

これらとその他のヘッダファイルは、MPLAB XC8 インストール ディレクトリ内の pic/includeサブディレクトリに保存されています。

1.3 LED 値の変数

LED に書き込む値は、変数 (portValue) に割り当て済みです (LED D1/D3/D5/D7 は ON、LED D2/D4/D6/D8 は OFF)。ボードの回路図は『Explorer 8 Development Board User’s Guide』 (DS40001812) のセクション B.4 「Explorer 8 ボードの入手先と設定方法」を参照してく ださい。

1.4 ポートアクセス

デジタル I/O デバイスピンは周辺モジュール I/O ピンと多重化されている場合があります。デジタル I/O のみを使うため、多重化されている周辺モジュールは無効にします。これには、周辺モジュール レジスタ内のビット値を定義済みの C 変数を使います。これらの変数は、コンパイラ の includeディレクトリ内にあるデバイス固有ヘッダファイルに書かれています。どの周辺モジュールがどのピンを共有しているかは、各デバイスのデータシートを参照してください。

サンプルコードのデバイス (PIC16F1719) では、ポート B ピンとポート D ピンが周辺モジュール ( 既定値では無効 ) と多重化されています。ポートピンは既定値ではアナログピンであるため、デジタル I/O ピンとして設定する必要があります。ポート B の場合 :

ANSELB = 0x0; // set to digital I/O (not analog)

デバイスピンは、デジタル I/O ポート (PORT) またはデバイス内のラッチ (LAT) レジスタのどちらかに接続します。サンプルコードは LATDと LATBを使います。マクロ LEDS_ON_OFFは両方のラッチに割り当てられます。サンプルコードはポート D を以下のように設定します。

LATB = portValue; // write to port latch - RD[0:3] = LED[0:3]

加えて、ピンの方向 ( 入力または出力 ) を指定するために TRIS レジスタを使います。サンプルコードは TRISB と TRISD を使います。このレジスタ内のビットを「0」にクリアすると対応するピンは出力として設定され、「1」にセットすると入力として設定されます。ポートBの場合 :

TRISB = 0x0; // set all port bits to be output

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.5

2. _delay()関数を使って LEDを点滅させる

以下のサンプルコードでは、最初のサンプルコードの一部を変更しています。このサンプルコードは LED を単純に点灯するのではなく、自動的に点滅させます。

// PIC16F1719 Configuration Bit Settings

// For more on Configuration Bits, consult your device data sheet

// CONFIG1#pragma config FOSC = ECH // External Clock, 4-20 MHz#pragma config WDTE = OFF // Watchdog Timer (WDT) disabled#pragma config PWRTE = OFF // Power-up Timer disabled#pragma config MCLRE = ON // MCLR/VPP pin function is MCLR#pragma config CP = OFF // Flash Memory Code Protection off#pragma config BOREN = ON // Brown-out Reset enabled#pragma config CLKOUTEN = OFF // Clock Out disabled.#pragma config IESO = ON // Internal/External Switchover on#pragma config FCMEN = ON // Fail-Safe Clock Monitor enabled

// CONFIG2#pragma config WRT = OFF // Flash Memory Self-Write Protect off#pragma config PPS1WAY = ON // PPS one-way control enabled#pragma config ZCDDIS = ON // Zero-cross detect disabled#pragma config PLLEN = OFF // Phase Lock Loop disable#pragma config STVREN = ON // Stack Over/Underflow Reset enabled#pragma config BORV = LO // Brown-out Reset low trip point#pragma config LPBOR = OFF // Low-Power Brown Out Reset disabled#pragma config LVP = OFF // Low-Voltage Programming disabled

// #pragma config statements should precede project file includes.// Use project enums instead of #define for ON and OFF.

#include <xc.h>#include <stdint.h>

void main(void) {

uint8_t portValue;

// Port B access ANSELB = 0x0; // set to digital I/O (not analog) TRISB = 0x0; // set all port bits to be output

// Port D access ANSELD = 0x0; // set to digital I/O (not analog) TRISD = 0x0; // set all port bits to be output

while(1) {

portValue = 0x05; LATB = portValue; // RB[0:3] = LED[4:7] LATD = portValue; // RD[0:3] = LED[0:3]

// delay value change

_delay(25000); // delay in instruction cycles

セクション 2.1参照

セクション 2.2参照

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.6 2015-2018 Microchip Technology Inc.

portValue = 0x0A; LATB = portValue; // RB[0:3] = LED[4:7] LATD = portValue; // RD[0:3] = LED[0:3] _delay(25000); // delay in instruction cycles

}}

2.1 while()ループと変数値

ポート B とポート D の LED を点滅させるため、最初に変数 portValueに 0x05を代入し、その値をポートラッチに書きます (LED 0/2/4/6 が ON)。次にその補数 0x0A を同変数に代入し、 ポートラッチに書きます (LED 1/3/5/7 が ON)。ループは while(1) { }を使って実行します。

2.2 _delay()関数

実行速度が速いため、LED は点滅しているように見えません。このため実行速度を遅くする必要があります。_delay()はコンパイラのビルトイン関数です。

このビルトイン関数の詳細は『MPLAB® XC8 C Compiler User’s Guide』(DS50002053) を参照 してください。

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.7

3. 遅延用に割り込みを使って LEDを点滅させる

以下のサンプルコードでは、最初のサンプルコードの一部を変更しています。そこではループの実行を遅らせるために遅延ループを使いましたが、それによってプログラムにデッドタイムが生じました。これを防ぐため、以下のサンプルコードではタイマ割り込みを使います。

// PIC16F1719 Configuration Bit Settings

// For more on Configuration Bits, consult your device data sheet

// CONFIG1#pragma config FOSC = ECH // External Clock, 4-20 MHz#pragma config WDTE = OFF // Watchdog Timer (WDT) disabled#pragma config PWRTE = OFF // Power-up Timer disabled#pragma config MCLRE = ON // MCLR/VPP pin function is MCLR#pragma config CP = OFF // Flash Memory Code Protection off#pragma config BOREN = ON // Brown-out Reset enabled#pragma config CLKOUTEN = OFF // Clock Out disabled.#pragma config IESO = ON // Internal/External Switchover on#pragma config FCMEN = ON // Fail-Safe Clock Monitor enabled

// CONFIG2#pragma config WRT = OFF // Flash Memory Self-Write Protect off#pragma config PPS1WAY = ON // PPS one-way control enabled#pragma config ZCDDIS = ON // Zero-cross detect disabled#pragma config PLLEN = OFF // Phase Lock Loop disable#pragma config STVREN = ON // Stack Over/Underflow Reset enabled#pragma config BORV = LO // Brown-out Reset low trip point#pragma config LPBOR = OFF // Low-Power Brown Out Reset disabled#pragma config LVP = OFF // Low-Voltage Programming disabled

// #pragma config statements should precede project file includes.// Use project enums instead of #define for ON and OFF.

#include <xc.h>#include <stdint.h>

// Interrupt function

void __interrupt() tcInt(void){ // only process Timer0-triggered interrupts

if(INTCONbits.TMR0IE && INTCONbits.TMR0IF) { // static variable for permanent storage duration static uint8_t portValue; // write to port latches LATB = (portValue++ >> 4); // RB[0:3] = LED[4:7] LATD = portValue++; // RD[0:3] = LED[0:3] // clear this interrupt condition INTCONbits.TMR0IF = 0;

}}

void main(void){

// Port B access ANSELB = 0x0; // set to digital I/O (not analog) TRISB = 0x0; // set all port bits to be output

// Port D access ANSELD = 0x0; // set to digital I/O (not analog) TRISD = 0x0; // set all port bits to be output

セクション 3.1参照

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.8 2015-2018 Microchip Technology Inc.

// Timer0 setup

OPTION_REG = 0xD7; // timer 0 internal clock, prescaler 1:256 INTCONbits.TMR0IE = 1; // enable interrupts for timer 0 ei(); // enable all interrupts

while(1);}

3.1 割り込み関数

__interrupt()指定子を使う事により、関数を割り込み関数として指定します。tcInt()割り込み関数には複数の割り込み要因に対応する事が求められる可能性があるため、Timer0 が割り込みを生成した場合にのみカウンタ値 (portValue) をインクリメントさせるためのコードを追加しています。

3.2 Timer0 の設定

タイマの設定とタイマ割り込みの有効化のためのコードを main ルーチンに追加する必要があります。また、ラッチへの代入のための変数値の変更は割り込みサービスルーチンで行います。

全ての割り込みを有効にするため、ei()を使います。この関数は xc.h内で定義されます。

セクション 3.2参照

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.9

4. ADCを使ってデジタル ポテンショメータの値を LEDで表示する

このサンプルコードは、前のサンプルコードと同じデバイスとポート B およびポート D LED を 使いますが、デモボード上のポテンショメータからの値をポート A 経由で ADC に入力し、その変換結果を LED で表示します。

コードは手書きではなく MPLAB Code Configurator (MCC) を使って生成します。MCC プラグイ ンは、MPLAB X IDE の [Available Plugins] タブ ([Tools] > [Plugins] で開く ) を使ってインス トールできます。プラグインのインストール方法はMPLAB X IDEのヘルプを参照してください。

『MPLAB® Code Configurator ユーザガイド』(DS40001725) を含む MCC 関連の情報は、以下 の MPLAB Code Configurator ウェブページでご覧になれます。

https://www.microchip.com/mplab/mplab-code-configurator

このサンプルコードを生成するために使った MCC GUI の設定を図 2 ~図 8 に示します。

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.10 2015-2018 Microchip Technology Inc.

図 2: ADCプ ロジェクトのシステムリソース設定

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.11

図 3: ADCプ ロジェクトのシステムリソース選択

PIC10/PIC12/PIC16/PIC18 MCU を選択すると、[Easy Setup] 画面から 周辺モジュールの詳細を直接設定できます。

Foundation Services Library はより抽象化されており、通常は周辺モ ジュール利用の基本機能を提供し、設定プロセスを容易にします。

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.12 2015-2018 Microchip Technology Inc.

図 4: ADCプ ロジェクトのシステムリソース設定

図 5 に、選択後の RA0 から AN0 のマップ表示を示します。

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.13

図 5: ADCプ ロジェクトの ADCピ ンリソース - グリッド

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.14 2015-2018 Microchip Technology Inc.

図 6: ADCプ ロジェクトのピンリソース設定

図 7でピンRB0:3およびRD0:3が選択されている場合、これらのピンは上記ウィンドウに表示されます。

RA0 は図 5 で以前に選択されています。

ウィンドウ内にピン設定が表示されると、各ピンに対してピン設定を選択できます。

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.15

図 7: ADCプ ロジェクトの GPIOピ ンリソース - グリッド

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.16 2015-2018 Microchip Technology Inc.

図 8: ADCプ ロジェクトの GPIOピ ンリソース - パッケージ

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.17

以上のようにコードを設定した後に、[Project Resources] ウィンドウの [Generate] ボタンをク リックします。MCC はモジュール形式のコードを生成します。すなわち main、システム、周辺モジュールコードは全て別々のファイルです。各周辺モジュールのヘッダファイルも別々です。

プログラムに機能を追加する場合、必ず main.cを編集する必要があります。また、そのコードに必要な全ての関数またはマクロが生成されたファイル内に含まれているかどうか確認する必要があります。

図 9: MCCに よって生成された ADCコ ード

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.18 2015-2018 Microchip Technology Inc.

4.1 編集後の main.cコード

編集後の main.cテンプレート ファイルを以下に示します。一部のコメントは省略しました ( 省略箇所には < >で囲んだ注釈を記入しています )。main()に追加したコードは赤字で示し ています。

/** Generated Main Source File

<See generated main.c file for file information.> */

/* (c) 2016 Microchip Technology Inc. and its subsidiaries.You may use this software and any derivatives exclusively with Microchip products.

<See generated main.c file for additional copyright information.> */

#include "mcc_generated_files/mcc.h"

/* Main application */void main(void) { // initialize the device SYSTEM_Initialize();

// <No interrupts used - see generated main.c file for code.> while (1) {

// Select A/D channel

ADC_SelectChannel(channel_AN0);

// Start A/D conversion ADC_StartConversion(); // Wait for ADC to complete

while(!ADC_IsConversionDone()); // Write to Port Latches

LATD = ADRESH; // RD[0:3] = LED[0:3] LATB = (ADRESH >> 4); // RB[0:3] = LED[4:7]

}}/** End of File */

セクション 4.2参照

セクション 4.3参照

セクション 4.4参照

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.19

4.2 A/D チャンネルを選択して変換を開始する

adc.cモジュールから以下の関数を使います。

void ADC_SelectChannel(adc_channel_t channel)

変数 channel は、adc.h 内で定義されている typedef adc_channel_t の値です。このサン プルコードでは、ポテンショメータ入力は RA0 であるため、channel_AN0を選択します。

以下の関数を使って A/D 変換を開始します。

void ADC_StartConversion()

4.3 ADC が完了するまで待機する

adc.cモジュールから以下の関数を使います。

bool ADC_IsConversionDone()

この関数はADCON0bits.GO_nDONEビット (デバイス固有ヘッダファイル内で定義 )をネゲー トした値を返します。しかし、main 内の while ループではこのビットの実際の値が必要であるため、戻り値を再度ネゲートします。

4.4 ポートラッチに書き込む

LED は 8 個しかないため、ADRESH からの値だけを表示します。下位ビットは LATD を介して LED0 ~ LED3 で表示します。上位ビットは LATBを介して LED4 ~ LED7 で表示できるようシフトします。

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.20 2015-2018 Microchip Technology Inc.

5. LEDに EEPROMデータ値を表示する

このサンプルコードは、これまでとは異なる Microchip 社製デバイス (PIC16F1939 MCU) を 使って、EEPROM データ (EEData) を読み書きします。読み値はポート D とポート B の LEDで表示します。

コードの大部分は MPLAB Code Configurator (MCC) を使って生成します。MCC のインストー ル方法とユーザガイドの入手方法については以下を参照してください。 セクション 4. 「ADC を使ってデジタル ポテンショメータの値を LED で表示する」に 設定して無効にできます。

このサンプルコードを生成するために使った MCC GUI の設定を図 10 ~図 14 に示します。

図 10: EEDATAプ ロジェクトのシステムリソース設定

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.21

図 11: EEDATAプ ロジェクトのメモリリソース設定

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.22 2015-2018 Microchip Technology Inc.

図 12: EEDATAプ ロジェクトのピンリソース設定

図 13でピンRB0:3およびRD0:3が選択されている場合、これらのピンは上記ウィンドウに表示されます。

ウィンドウ内にピン設定が表示されると、各ピンに対してピン設定を選択できます。

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.23

図 13: EEDATAプ ロジェクトの GPIOピ ンリソース - グリッド

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.24 2015-2018 Microchip Technology Inc.

図 14: EEDATAプ ロジェクトの GPIOピ ンリソース - パッケージ

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.25

以上のようにコードを設定した後に、[Project Resources] ウィンドウの [Generate] ボタンをク リックします。MCC はモジュール形式のコードを生成します。すなわち main、システム、周辺モジュールコードは全て別々のファイルです。各周辺モジュールのヘッダファイルも別々です。

プログラムに機能を追加する場合、必ず main.cを編集する必要があります。また、そのコードに必要な全ての関数またはマクロが生成されたファイル内に含まれているかどうか確認する必要があります。

図 15: MCCによって生成されるコードの EEDATAプロジェクト ツリー

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.26 2015-2018 Microchip Technology Inc.

5.1 変更した main.cコード

編集後の main.cテンプレート ファイルを以下に示します。一部のコメントは省略しました ( 省略箇所には < >で囲んだ注釈を記入しています )。追加したコードは赤字で示しています。

/** Generated Main Source File

<See generated main.c file for file information.> */

/* (c) 2016 Microchip Technology Inc. and its subsidiaries.You may use this software and any derivatives exclusively with Microchip products.

<See generated main.c file for additional copyright information.> */

#include "mcc_generated_files/mcc.h"

#define NUM_EE_VALUES 64#define INSTR_CYCLE_DELAY 25000

/* Main application */void main(void) { // initialize the device SYSTEM_Initialize();

// <No interrupts used - see generated main.c file for code.>

// Declare RAM array, loop variable

volatile uint8_t RAMArray[NUM_EE_VALUES]; uint8_t i;

// Write initial values to EEPROM Data PIR2bits.EEIF = 0x0; // clear write flag

for(i=0; i<NUM_EE_VALUES; i++){ DATAEE_WriteByte(_EEADRL_EEADRL_POSN + i, i); while(!PIR2bits.EEIF); // check for write finished PIR2bits.EEIF = 0x0; } while(1){ // Read from EEPROM and display for(i=0; i<NUM_EE_VALUES; i++){ RAMArray[i] = DATAEE_ReadByte(_EEADRL_EEADRL_POSN + i); LATD = RAMArray[i]; // RD[0:3] = LED[0:3] LATB = (RAMArray[i] >> 4); // RB[0:3] = LED[4:7] _delay(INSTR_CYCLE_DELAY); // delay value change }

セクション 5.2参照

セクション 5.3参照

セクション 5.4参照

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.27

// Write to EEPROM in reverse order for(i=0; i<NUM_EE_VALUES; i++){ DATAEE_WriteByte(_EEADRL_EEADRL_POSN + (NUM_EE_VALUES - 1) - i, RAMArray[i]); while(!PIR2bits.EEIF); // check for write finished PIR2bits.EEIF = 0x0; }

};

}/** End of File */

5.2 EEData 関連の変数

EEData の読み書き値を保存する変数は、読み書き関数プロトタイプで指定されている型に適合する必要があります。この関数プロトタイプは mcc.h から参照され、memory.h 内にあります。

void DATAEE_WriteByte(uint8_t bAdd, uint8_t bData);uint8_t DATAEE_ReadByte(uint8_t bAdd);

uint8_tは unsigned charの事です。stdint.h (mcc.h から参照されている)内で定義され ています。

5.3 EEData への書き込み

このサンプルコードは EEData を 2 回書き込みます。最初の書き込みは EEData メモリ内の値を初期化し、次の書き込みは表示を変化させるためにデータを変更します。

EEData への書き込みには複数サイクルかかります。このため書き込み完了フラグ(PIR2bits.EEIF) を使って書き込みの完了を検出します。このフラグは初期クリアされ、書き込みが完了するたびにソフトウェアでクリアする必要があります。

5.4 EEData からの読み出し

EEData への書き込み後に、メモリ値を読み出して RAM 配列に格納し、ポート D およびポートBの LEDで表示します。読み出し後の書き込みループ内でRAM配列内の値を使ってEEDataメモリ内の値を変更します。

実行速度が速いため、LED は点滅しているように見えません。このため、2 つ目のサンプルコードと同様に _delay()関数を使って実行速度を遅くします。

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.28 2015-2018 Microchip Technology Inc.

A. MPLAB X IDE内でのコード実行

A.1 プロジェクトの作成

1. MPLAB X IDE を起動します。

2. IDE から [New Project] ウィザードを起動する ([File]>[New Project])。

3. 画面の指示に従って以下の手順で新しいプロジェクトを作成します。

a) プロジェクトの選択: 「Microchip Embedded」を選択し、次に「Standalone Project」を選択します。

b) デバイスの選択: サンプルコードのデバイスを選択します。

c) ヘッダの選択: 何も選択しません。

d) ツールの選択: 使用するハードウェア デバッグツール(SNxxxxxx)を選択します。 デバッグツール名の下にシリアル番号(SN)が表示されない場合、そのデバッグツールが正しくインストールされているか確認します。詳細はデバッグツールのマニュアルを参照してください。

e) プラグインボードの選択: 何も選択しません。

f) コンパイラの選択: XC8 (最新バージョン番号)を選択します([bin location])。 XC8の下にコンパイラが表示されない場合、コンパイラが正しくインストールされているか、およびMPLAB X IDEがコンパイラを認識しているか確認します([Tools] > [Options]で[Build Tools]タブを開き、[Embedded]ボタンをクリック)。詳細は MPLAB XC8とMPLAB X IDEのマニュアルを参照してください。

g) プロジェクト名とフォルダの選択: プロジェクト名を指定します。

A.2 CCI (Common C Interface) の選択

プロジェクト作成後、[Projects] ウィンドウでプロジェクト名を右クリックして [Properties] を選択します。開いたダイアログ ボックスで「XC8 Compiler」カテゴリをクリックし、 「Preprocessing and messages」オプションを選択して「Use CCI syntax」にチェックを入れ ます。OK ボタンをクリックします。

A.3 サンプルコードのデバッグ

使用中のサンプルコードに基づいて以下のどちらかを行います。

1. 例 1、2、3 の場合、サンプルコードを書き込んだファイルを作成します。

a) [Projects]ウィンドウ内で「Source Files」フォルダを右クリックします。[New] > [main.c]を選択します。[New main.c]ダイアログが開きます。

b) 「File name」に名前を入力します(例: examplen)。nはサンプル番号です。

c) [Finish]をクリックします。ファイルがエディタ ウィンドウで開きます。

d) ファイル内のテンプレート コードを削除します。その後、本書のサンプルコードを 空白のエディタ ウィンドウに貼り付け、[File] > [Save]を選択します。

2. 例 4、5 の場合、各セクションの指示に従い MCC でコードを生成し、表示されたコードを使って main.cファイルを編集します。

最後に [Debug Run] を選択します。これによりコードをビルドしてデバイスにダウンロードし、 実行します。デモボード LED の出力を確認します。[Halt] をクリックすると実行は停止します。

図 16: ツールバー アイコン

デバッグ実行 停止

組み込み技術者のためのMPLAB® XC8ユーザガイド - PIC MCU

2015-2018 Microchip Technology Inc. DS50002400C_JP-p.29

B. ソフトウェアとハードウェアの入手先

本書のMPLAB XC8プロジェクトにはPIC16F1719またはPIC16F1939 MCUを実装したExplorer 8 ボードを使います。ボードには外部電源から 9 V を供給し、標準の (ICSP™) 通信を使いま す。開発には MPLAB X IDE を使いました。

B.1 MPLAB X IDE と MPLAB XC8 C コンパイラの入手先

MPLAB X IDE (v5.10 以降 ) は以下で入手できます。

https://www.microchip.com/mplab/mplab-x-ide

MPLAB XC8 C コンパイラ (v2.00 以降 ) は以下で入手できます。

https://www.microchip.com/mplab/compilers

B.2 MPLAB Code Configurator (MCC) の入手先

MCC (v3.66 以降 ) は以下で入手できます。

https://www.microchip.com/mplab/mplab-code-configurator

B.3 PIC® MCU の入手先

サンプルコード向けの PIC MCU は以下で入手できます。

https://www.microchip.com/PIC16F1719

https://www.microchip.com/PIC16F1939

B.4 Explorer 8 ボードの入手先と設定方法

Explorer 8 開発キット (DM160228) は以下で入手できます。

https://www.microchip.com/DM160228

ジャンパは下表のように設定します。

表 1-1: プロジェクト向けのジャンパ選択

ジャンパ 選択 説明

J2 BRD+5V 外部電源からボードに給電します (USB 電源は使いません )。

J14 +5V デバイスの電源電圧レベル

J24 オープン +5 V を使用します (3.3 V ではありません )。

J7 クローズ ポート D <RD0:3> の LED を有効にします。

J21 クローズ ポート B <RB0:3> の LED を有効にします。

J36 OSC1 to RA7 OSC1 CLKIN (8 MHz 外部オシレータ )

J37 OSC2 to RA6 OSC2 CLKOUT (8 MHz 外部オシレータ )

J51 PGD to RB7 ICSPDAT

J52 PGC to RB6 ISCPCLK

表 1-2: 未使用のジャンパ選択

ジャンパ 選択 説明

JP2 クローズ LCD は未使用

J22, J23, J53, J54 オープン LCD は未使用

J15, J16 オープン Digilent Pmod™ コネクタは未使用

J43, J44, J45, J46, J47 オープン mikroBUS は未使用

J41, J42, J48, J49, J50 オープン mikroBUS は未使用

J4, J31 VCAP RA5、RA4 は未使用

組み込み技術者のための MPLAB® XC8 ユーザガイド - PIC MCU

DS50002400C_JP-p.30 2015-2018 Microchip Technology Inc.

B.5 Microchip 社製デバッグツールの入手先

エミュレータとデバッガは以下の開発ツール ウェブページで入手できます。

https://www.microchip.com/development-tools

2015-2018 Microchip Technology Inc. DS50002400C_JP-p. 31

本書に記載されているデバイス アプリケーション等に関する

情報は、ユーザの便宜のためにのみ提供されているものであ

り、更新によって無効とされる事があります。お客様のアプ

リケーションが仕様を満たす事を保証する責任は、お客様に

あります。Microchip 社は、明示的、暗黙的、書面、口頭、法

定のいずれであるかを問わず、本書に記載されている情報に

関して、状態、品質、性能、商品性、特定目的への適合性を

はじめとする、いかなる類の表明も保証も行いません。

Microchip 社は、本書の情報およびその使用に起因する一切の

責任を否認します。Microchip 社の明示的な書面による承認な

しに、生命維持装置あるいは生命安全用途に Microchip 社の製

品を使用する事は全て購入者のリスクとし、また購入者はこ

れによって発生したあらゆる損害、クレーム、訴訟、費用に

関して、Microchip 社は擁護され、免責され、損害をうけない

事に同意するものとします。暗黙的あるいは明示的を問わず、

Microchip社が知的財産権を保有しているライセンスは一切譲

渡されません。

商標

Microchip 社の名称とロゴ、Microchip ロゴ、AnyRate、AVR、

AVR ロゴ、AVR Freaks、BitCloud、chipKIT、chipKIT ロゴ、

CryptoMemory、CryptoRF、dsPIC、FlashFlex、flexPWR、

Heldo、JukeBlox、KeeLoq、Kleer、LANCheck、LINK MD、

maXStylus、maXTouch、MediaLB、megaAVR、MOST、MOSTロゴ、MPLAB、OptoLyzer、PIC、picoPower、PICSTART、PIC32 ロゴ、Prochip Designer、QTouch、SAM-BA、SpyNIC、

SST、SST ロゴ、SuperFlash、tinyAVR、UNI/O、XMEGA は米

国およびその他の国における Microchip Technology Incorporatedの登録商標です。

ClockWorks、The Embedded Control Solutions Company、EtherSynch、Hyper Speed Control、HyperLight Load、IntelliMOS、mTouch、Precision Edge、Quiet-WIRE は米国にお

ける Microchip Technology Incorporated 社の登録商標です。

Adjacent Key Suppression、AKS、Analog-for-the-Digital Age、Any Capacitor、AnyIn、AnyOut、BodyCom、CodeGuard、CryptoAuthentication、CryptoAutomotive、CryptoCompanion、CryptoController、dsPICDEM、dsPICDEM.net、Dynamic Average Matching、DAM、ECAN、EtherGREEN、In-Circuit Serial Programming、ICSP、INICnet、Inter-Chip Connectivity、JitterBlocker、KleerNet、KleerNet ロゴ、memBrain、Mindi、MiWi、motorBench、MPASM、MPF、MPLAB Certified ロゴ、

MPLIB、MPLINK、MultiTRAK、NetDetach、Omniscient Code Generation、PICDEM、PICDEM.net、PICkit、PICtail、PowerSmart、PureSilicon、QMatrix、REAL ICE、Ripple Blocker、SAM-ICE、Serial Quad I/O、SMART-I.S.、SQI、SuperSwitcher、SuperSwitcher II、Total Endurance、TSHARC、USBCheck、VariSense、ViewSpan、WiperLock、Wireless DNA、ZENA は米国とその他の国における Microchip Technology Incorporated の商標です。

SQTP は米国における Microchip Technology Incorporated の

サービスマークです。

Silicon Storage Technology はその他の国における Microchip Technology Inc. の登録商標です。

GestIC と ULPP はその他の国における Microchip Technology Inc. の子会社である Microchip Technology Germany II GmbH & Co. & KG の登録商標です。

その他の商標は各社に帰属します。

© 2018, Microchip Technology Incorporated, All Rights Reserved.

ISBN: 978-1-5224-4998-0

Microchip社製デバイスのコード保護機能に関して以下の点にご注意ください。

• Microchip社製品は、該当するMicrochip社データシートに記載の仕様を満たしています。

• Microchip社では、通常の条件ならびに仕様に従って使用した場合、Microchip社製品のセキュリティ レベルは、現在市場に

流通している同種製品の中でも最も高度であると考えています。

• しかし、コード保護機能を解除するための不正かつ違法な方法が存在する事もまた事実です。弊社の理解では、こうした手法

は全てMicrochip社データシートにある動作仕様書以外の方法でMicrochip社製品を使用する事になります。このような行為

は知的所有権の侵害に該当する可能性が非常に高いと言えます。

• Microchip社はコードの保全性に懸念を抱いているお客様と連携して対応策に取り組んでいきます。

• Microchip社を含む全ての半導体メーカーで、自社のコードのセキュリティを完全に保証できる企業はありません。コード保

護機能とは、Microchip社が製品を「解読不能」として保証するものではありません。

コード保護機能は常に進歩しています。Microchip社では、常に製品のコード保護機能の改善に取り組んでいます。Microchip社の

コード保護機能の侵害は、デジタル ミレニアム著作権法に違反します。そのような行為によってソフトウェアまたはその他の著作

物に不正なアクセスを受けた場合、デジタル ミレニアム著作権法の定める所により損害賠償訴訟を起こす権利があります。

Microchip社では、ChandlerおよびTempe (アリゾナ州)、Gresham (オレゴン州)の本部、設計部およびウェハー製造工場そしてカリフォルニア州とインドのデザイン センターがISO/TS-16949:2009認 証を取得しています。Microchip社の品質システムプロセスおよび手順は、PIC® MCUおよびdsPIC® DSCs、KEELOQ® コード ホッピング デバイス、シリアルEEPROM、マイクロペリフェラル、不揮発性メモリ、アナログ製品に採用されています。 さらに、開発システムの 設計と製造に関するMicrochip社の品質システムはISO 9001:2000 認証を取得しています。

QUALITY MANAGEMENT SYSTEM CERTIFIED BY DNV

== ISO/TS 16949 ==

DS50002400C_JP-p. 32 2015-2018 Microchip Technology Inc.

北米

本社2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 480-792-7200 Fax: 480-792-7277技術サポート: http://www.microchip.com/supportURL: www.microchip.com

アトランタDuluth, GA Tel: 678-957-9614 Fax: 678-957-1455

オースティン、TXTel: 512-257-3370

ボストンWestborough, MA Tel: 774-760-0087 Fax: 774-760-0088

シカゴItasca、IL Tel: 630-285-0071 Fax: 630-285-0075

ダラスAddison, TX Tel: 972-818-7423 Fax: 972-818-2924

デトロイトNovi, MI Tel: 248-848-4000

ヒューストン、TX Tel: 281-894-5983

インディアナポリスNoblesville, IN Tel: 317-773-8323Fax: 317-773-5453Tel: 317-536-2380

ロサンゼルスMission Viejo, CA Tel: 949-462-9523Fax: 949-462-9608Tel: 951-273-7800

ローリー、NC Tel: 919-844-7510

ニューヨーク、NY Tel: 631-435-6000

サンノゼ、CA Tel: 408-735-9110Tel: 408-436-4270

カナダ - トロントTel: 905-695-1980 Fax: 905-695-2078

アジア/太平洋

オーストラリア - シドニーTel: 61-2-9868-6733

中国 - 北京Tel: 86-10-8569-7000

中国 - 成都Tel: 86-28-8665-5511

中国 - 重慶Tel: 86-23-8980-9588

中国 - 東莞Tel: 86-769-8702-9880

中国 - 広州Tel: 86-20-8755-8029

中国 - 杭州Tel: 86-571-8792-8115

中国 - 香港SARTel: 852-2943-5100

中国 - 南京Tel: 86-25-8473-2460

中国 - 青島Tel: 86-532-8502-7355

中国 - 上海Tel: 86-21-3326-8000

中国 - 瀋陽Tel: 86-24-2334-2829

中国 - 深圳Tel: 86-755-8864-2200

中国 - 蘇州Tel: 86-186-6233-1526

中国 - 武漢Tel: 86-27-5980-5300

中国 - 西安Tel: 86-29-8833-7252

中国 - 厦門Tel: 86-592-2388138

中国 - 珠海Tel: 86-756-3210040

アジア/太平洋

インド - バンガロールTel: 91-80-3090-4444

インド - ニューデリーTel: 91-11-4160-8631

インド - プネTel: 91-20-4121-0141

日本 - 大阪Tel: 81-6-6152-7160

日本 - 東京Tel: 81-3-6880-3770

韓国 - 大邱Tel: 82-53-744-4301

韓国 - ソウルTel: 82-2-554-7200

マレーシア - クアラルンプールTel: 60-3-7651-7906

マレーシア - ペナンTel: 60-4-227-8870

フィリピン - マニラTel: 63-2-634-9065

シンガポールTel: 65-6334-8870

台湾 - 新竹Tel: 886-3-577-8366

台湾 - 高雄Tel: 886-7-213-7830

台湾 - 台北Tel: 886-2-2508-8600

タイ - バンコクTel: 66-2-694-1351

ベトナム - ホーチミンTel: 84-28-5448-2100

ヨーロッパ

オーストリア - ヴェルスTel: 43-7242-2244-39Fax: 43-7242 -2244-393

デンマーク - コペンハーゲンTel: 45-4450-2828 Fax: 45-4485-2829

フィンランド - エスポーTel: 358-9-4520-820

フランス - パリTel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79

ドイツ - ガーヒンクTel: 49-8931-9700

ドイツ - ハーンTel: 49-2129-3766400

ドイツ - ハイルブロンTel: 49-7131-67-3636

ドイツ - カールスルーエTel: 49-721-625370

ドイツ - ミュンヘンTel: 49-89-627-144-0 Fax: 49-89-627-144-44

ドイツ - ローゼンハイムTel: 49-8031-354-560

イスラエル - ラーナナ Tel: 972-9-744-7705

イタリア - ミラノ Tel: 39-0331-742611 Fax: 39-0331-466781

イタリア - パドヴァTel: 39-049-7625286

オランダ - ドリューネンTel: 31-416-690399 Fax: 31-416-690340

ノルウェー - トロンハイムTel: 47-7288-4388

ポーランド - ワルシャワTel: 48-22-3325737

ルーマニア - ブカレストTel: 40-21-407-87-50

スペイン - マドリッドTel: 34-91-708-08-90Fax: 34-91-708-08-91

スウェーデン - ヨーテボリTel: 46-31-704-60-40

スウェーデン - ストックホルムTel: 46-8-5090-4654

イギリス - ウォーキンガムTel: 44-118-921-5800Fax: 44-118 -921-5820

各国の営業所とサービス

2018/08/15