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

組み込み技術者のための MPLAB XC8 ユーザガイド 組み込み技術者のための MPLAB XC8 …ww1.microchip.com/downloads/jp/DeviceDoc/50002400B_JP.pdf · 2016-2017

  • Upload
    lykhanh

  • View
    274

  • Download
    2

Embed Size (px)

Citation preview

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 1

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

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

はじめに

本書には 8 ビットデバイスおよび MPLAB XC8 C コンパイラ向けの 5 つのサンプル コードを掲載しています。読者にはマイクロコントローラと C 言語プログラミングに関するある程度の知識が必要です。

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

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

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

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

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

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

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

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

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

DS50002400B_JP - p. 2 2016-2017 Microchip Technology Inc.

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

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

#include <xc.h>

// 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

#define LEDS_ON_OFF 0x55

void main(void) {

// Port D access

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

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

1.1 ヘッダファイル <xc.h>

このヘッダファイルは、ソースファイル内のコードからコンパイラ固有またはデバイス固有の機能を使えるようにします。<xc.h> を含む各種ヘッダファイルは、MPLAB XC8 インストール ディレクトリ内の includeサブディレクトリに保存されています。

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

セクション 1.1参照

セクション 1.2 参照

セクション 1.3 参照

セクション 1.4 参照

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 3

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

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]>[PICMemory Views]>[Configuration Bits] と選択すると開きます。

図 1: [Configuration Bits] ウィンドウ

必要な設定を済ませたら、[Generate Source Code to Output] をクリックした後に、 [Output] ウィンドウ内の pragma ディレクティブをコードへコピーします。上記のサンプルコードもそのようにして作成しました。

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

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

DS50002400B_JP - p. 4 2016-2017 Microchip Technology Inc.

1.3 LED 値マクロの定義

次のセクションで説明するように、LED に書き込む値はマクロ記述 (LEDS_ON_OFF)に割り当て済みです例 : (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) では、ポート D ピンとポート B ピンが周辺モジュール ( 既定値では無効 ) と多重化されています。唯一の問題は、それらのピンが既定値によってアナログピンとして設定されるという事です。このため、明示的にデジタル I/O ピンとして設定する必要があります。サンプルコードはポート D を以下のように設定します。

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

LATD = LEDS_ON_OFF; // write to port latch - RD[0:3] = LED[0:3]加えて、ピンの方向 ( 入力または出力 ) を指定するために TRIS レジスタを使います。サンプルコードは TRISDと TRISBを使います。あるビットを「0」にクリアすると、そのビットに対応するピンは出力として設定されます。「1」にセットすると入力として設定されます。サンプルコードはポート D を以下のように設定します。

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

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 5

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

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

#include <xc.h>

// 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

#define LEDS_ON_OFF 0x05#define LEDS_OFF_ON 0x0A#define INSTR_CYCLE_DELAY 25000

void main(void) {

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

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

while(1) {

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

// delay value change

_delay(INSTR_CYCLE_DELAY); // delay in instruction cycles

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

} return;}

セクション 2.1参照

セクション 2.2 参照

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

DS50002400B_JP - p. 6 2016-2017 Microchip Technology Inc.

2.1 while()ループと変数値

ポート D とポート B の LED の状態 ( 点灯 / 消灯 ) を変更するため、ループの最初の部分にマクロ LEDS_ON_OFFを割り当て、後の部分にマクロ LEDS_OFF_ONを割り当てます。ループは while(1) { }を使って実行します。

2.2 _delay()関数

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

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

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 7

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

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

#include <xc.h>

// 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

// Interrupt function

void interrupt isr(void){// only process Timer0-triggered interruptsif(INTCONbits.TMR0IE && INTCONbits.TMR0IF) {

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

}}

void main(void){

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

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

セクション 3.1 参照

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

DS50002400B_JP - p. 8 2016-2017 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);

return;}

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

3.2 Timer0 の設定

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

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

セクション 3.2 参照

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

2016-2017 Microchip Technology Inc. DS50002400B_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 ウェブページでご覧になれます。

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

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

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

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

DS50002400B_JP - p. 10 2016-2017 Microchip Technology Inc.

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

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

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 11

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

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

DS50002400B_JP - p. 12 2016-2017 Microchip Technology Inc.

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

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

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

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

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 13

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

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

DS50002400B_JP - p. 14 2016-2017 Microchip Technology Inc.

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

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 15

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

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

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

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

DS50002400B_JP - p. 16 2016-2017 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) {

// Start A/D conversion

ADC_StartConversion(channel_AN0); // 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 A/D 変換を開始する

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

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

セクション 4.2参照

セクション 4.3 参照

セクション 4.4 参照

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 17

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 ユーザガイド

DS50002400B_JP - p. 18 2016-2017 Microchip Technology Inc.

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

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

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

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

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

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 19

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

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

DS50002400B_JP - p. 20 2016-2017 Microchip Technology Inc.

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

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

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

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 21

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

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

DS50002400B_JP - p. 22 2016-2017 Microchip Technology Inc.

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

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 23

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

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

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

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

DS50002400B_JP - p. 24 2016-2017 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 unsigned char RAMArray[NUM_EE_VALUES]; unsigned char 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 ユーザガイド

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 25

// 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 ユーザガイド

DS50002400B_JP - p. 26 2016-2017 Microchip Technology Inc.

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

以下のようにプロジェクトを作成します。

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) プロジェクト名とフォルダの選択 : プロジェクト名を指定します。

プロジェクトを作成した後、使用中のサンプルコードに基づいて以下のどちらかを行います。

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

a) [Projects] ウィンドウ内でプロジェクト名を右クリックし、[New]>[Empty FIle] を選択 します。[New Empty File] ダイアログが開きます。

b) 「File name」に名前を入力します。

c) [Finish] をクリックします。

d) 本書のサンプルコードを空白のエディタ ウィンドウにコピー / ペーストし、[File]>[Save] を選択します。

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

最後にデバッグ実行を選択するとコードがビルドされ、デバイスにダウンロードされて実行されます。デモボード上の LED が 1 つおきに点灯します。停止アイコンをクリックすると実行は停止します。

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

デバッグ実行 停止

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

2016-2017 Microchip Technology Inc. DS50002400B_JP - p. 27

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 (v3.35 以降 ) は以下で入手できます。

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

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

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

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

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

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

B.3 PIC® MCU の入手先

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

http://www.microchip.com/PIC16F1719

http://www.microchip.com/PIC16F1939

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

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

http://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 ユーザガイド

DS50002400B_JP - p. 28 2016-2017 Microchip Technology Inc.

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

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

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

2017 Microchip Technology Inc. DS50002400B_JP - p. 29

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

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

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

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

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

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

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

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

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

責任を否認します。生命維持装置あるいは生命安全用途に

Microchip 社の製品を使用する事は全て購入者のリスクとし、

また購入者はこれによって発生したあらゆる損害、クレーム、

訴訟、費用に関して、Microchip 社は擁護され、免責され、損

害を受けない事に同意するものとします。特に記載のない限

り、暗黙的あるいは明示的を問わず、Microchip 社が知的財産

権を保有しているライセンスは一切譲渡されません。

商標

Microchip 社の名称とロゴ、Microchip ロゴ、AnyRate、 AVR、AVR logo、AVR Freaks、BeaconThings、BitCloud、 CryptoMemory、CryptoRF、dsPIC、FlashFlex、flexPWR、Heldo、JukeBlox、KEELOQ、KEELOQlogo、Kleer、LANCheck、LINK MD、maXStylus、maXTouch、MediaLB、 megaAVR、MOST、MOST logo、MPLAB、OptoLyzer、PIC、 picoPower、PICSTART、PIC32 logo、Prochip Designer、 QTouch、RightTouch、SAM-BA、SpyNIC、SST、SST Logo、 SuperFlash、tinyAVR、UNI/O、および XMEGA は米国およびその他の国における Microchip Technology Incorporated の 登録商標です。

ClockWorks、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、chipKIT、chipKIT logo、CodeGuard、CryptoAuthentication、CryptoCompanion、CryptoController、dsPICDEM、dsPICDEM.net、DynamicAverage Matching、DAM、ECAN、EtherGREEN、In-Circuit Serial Programming、ICSP、Inter-Chip Connectivity、JitterBlocker、 KleerNet、KleerNet logo、Mindi、MiWi、motorBench、MPASM、 MPF、MPLAB Certified logo、MPLIB、MPLINK、MultiTRAK、 NetDetach、Omniscient Code Generation、PICDEM、PICDEM.net、 PICkit、PICtail、PureSilicon、QMatrix、RightTouch logo、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 は Microchip Technology Inc. の子会社である Microchip Technology Germany II GmbH & Co. & KG 社の他の国における 登録商標です。

その他本書に記載されている商標は各社に帰属します。

© 2017, Microchip Technology Incorporated, All Rights Reserved.

ISBN: 978-1-5224-1311-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® DSC、KEELOQ® コード ホッピング デバイス、シリアル EEPROM、マイクロペリフェラル、不揮発性メモリ、アナログ製品に採用されています。さらに、開発システムの設計と製造に関する Microchip 社の品質システムは ISO 9001:2000 認証を取得しています。

DS50002400B_JP - p.30 2017 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, MATel: 774-760-0087 Fax: 774-760-0088

シカゴItasca, ILTel: 630-285-0071 Fax: 630-285-0075

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

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

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

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

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

ローリー、 NC

Tel: 919-844-7510

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

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

カナダ - トロント

Tel: 905-695-1980Fax: 905-695-2078

アジア / 太平洋アジア太平洋支社Suites 3707-14, 37th FloorTower 6, The GatewayHarbour City, Kowloon

香港Tel: 852-2943-5100Fax: 852-2401-3431

オーストラリア - シドニー

Tel: 61-2-9868-6733Fax: 61-2-9868-6755

中国 - 北京

Tel: 86-10-8569-7000Fax: 86-10-8528-2104

中国 - 成都

Tel: 86-28-8665-5511Fax: 86-28-8665-7889

中国 - 重慶

Tel: 86-23-8980-9588Fax: 86-23-8980-9500

中国 - 東莞

Tel: 86-769-8702-9880

中国 - 広州

Tel: 86-20-8755-8029

中国 - 杭州

Tel: 86-571-8792-8115Fax: 86-571-8792-8116

中国 - 香港 SARTel: 852-2943-5100 Fax: 852-2401-3431

中国 - 南京

Tel: 86-25-8473-2460Fax: 86-25-8473-2470

中国 - 青島

Tel: 86-532-8502-7355Fax: 86-532-8502-7205

中国 - 上海

Tel: 86-21-3326-8000Fax: 86-21-3326-8021

中国 - 瀋陽

Tel: 86-24-2334-2829Fax: 86-24-2334-2393

中国 - 深圳Tel: 86-755-8864-2200 Fax: 86-755-8203-1760

中国 - 武漢

Tel: 86-27-5980-5300Fax: 86-27-5980-5118

中国 - 西安

Tel: 86-29-8833-7252Fax: 86-29-8833-7256

アジア / 太平洋中国 - 厦門

Tel: 86-592-2388138 Fax: 86-592-2388130

中国 - 珠海

Tel: 86-756-3210040 Fax: 86-756-3210049

インド - バンガロール

Tel: 91-80-3090-4444 Fax: 91-80-3090-4123

インド - ニューデリー

Tel: 91-11-4160-8631Fax: 91-11-4160-8632

インド - プネ

Tel: 91-20-3019-1500

日本 - 大阪

Tel: 81-6-6152-7160Fax: 81-6-6152-9310

日本 - 東京

Tel: 81-3-6880-3770 Fax: 81-3-6880-3771

韓国 - 大邱

Tel: 82-53-744-4301Fax: 82-53-744-4302

韓国 - ソウル

Tel: 82-2-554-7200

Fax: 82-2-558-5932 または

82-2-558-5934

マレーシア - クアラルンプール

Tel: 60-3-6201-9857Fax: 60-3-6201-9859

マレーシア - ペナン

Tel: 60-4-227-8870Fax: 60-4-227-4068

フィリピン - マニラ

Tel: 63-2-634-9065Fax: 63-2-634-9069

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

台湾 - 新竹

Tel: 886-3-5778-366Fax: 886-3-5770-955

台湾 - 高雄

Tel: 886-7-213-7830

台湾 - 台北

Tel: 886-2-2508-8600 Fax: 886-2-2508-0102

タイ - バンコク

Tel: 66-2-694-1351Fax: 66-2-694-1350

ヨーロッパオーストリア - ヴェルス

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: 33-1-30-60-70-00

ドイツ - ガルヒング

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-7289-7561

ポーランド - ワルシャワ

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

各国の営業所とサービス

11/07/16