第17回 ブレッドボードの回路を動作させてみる

今回はMPLABXの使い方を一通り確認します。

目次

今回の説明

回路を完成させるために以下の順序で説明しています。このエントリの説明は(3)「プログラムを作る」の部分のMPLABXの概要説明になります。

前回までの説明で、ブレッドボードで回路を組み立てて開発環境もインストールしましたので、今回は回路が問題なく動作するか確認してみます。今回の説明では、実際にプログラムをビルドします。プログラムの中身については次回以降詳細に説明しますので、今回はMPLABXでのPICプログラム開発の流れを把握してみてください。

  1. LEDを電池と抵抗のみで光らせる回路を組み立てる
    PICマイコンの回路を組み立てる前に、まずはブレッドボードに慣れておくことにします。電池、抵抗、LEDのみを使って、ブレッドポード上に回路を組んでLEDを光らせてみます。ここでは電池、抵抗、LEDの回路記号と回路図の説明をして、回路図からブレッドボードに組む方法を説明します。まずはブレッドボードに慣れましょう!
  2. PICマイコンのベース回路を組む
    はじめの一歩の回路は、LEDを1秒に1回光らせるだけの回路です。この回路をブレッドボードに組み立てます。
  3. プログラムを作る
    LEDを1秒に1回光らせるプログラムを作成します。
  4. PICマイコンに書き込んで動作させる
    作成したプログラムをPICマイコンに書き込んで動作させてみます。
  5. ベース回路にスイッチを追加
    LEDの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。これまではLEDを光らせる、という出力制御をしましたが、今度はPICマイコンで外部から信号を入力する方法を確認します。
  6. ベース回路にブザーを追加
    スタートスイッチ付きの、1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーとして完成させます。

開発環境のMPLABXの操作概要

MPLABX IDEとXCコンパイラのインストールできたら、早速MPLAB Xを立ち上げてみましょう。

デフォルト設定でインストールした場合、macOSは、「アプリケーション」→「microchip」→「mplabx」→「(バージョン番号フォルダ)」→「mplab_ide.app」です。

MPLABX IDEのフォルダ位置(macOS)

Windowsは、デフォルト設定でインストールした場合、デスクトップに「MPLAB X IDE vx.xx」があります(vx.xxはバージョン番号)。デスクトップにない場合は、「Windowsメニュー」→「すべてのアプリ」→「Microchip」→「MPLAB X IDE vx.xx」です。

MPLABX IDEのフォルダ位置(Windows)

MPLABXを立ち上げると、以下のようなウインドウが表示されます。以下はmacOS版のウインドウですが、Windows版もほぼ同様のスクショになります。

MPLABX IDEスタート画面

それでは開発の流れを確認したあと、実際にMPLABXを操作しながら開発の流れを確認しましょう。準備するものは、MPLABXをインストールしたMac/PC以外に、作成したブレッドボード、電池ボックス、PICKit3、PICKit3付属のUSBケーブルです。

開発の流れ

開発規模の大小にかかわらず、開発の流れは以下のようになります。

まず、新規に「プロジェクト」を作成します。プロジェクトを作成したら、そのプロジェクトに対して新規ファイルを追加、そのファイルにプログラムを書きます。プログラムができたらビルドしてPICマイコンに書き込み、実際に回路を動作させます。

一度にすべての機能を実装したり、一発で動作することはあまりないので、実際には以下のような手順になります。

Mplabx development flow

「プロジェクト」とか「ファイル」とか、今は具体的にわからなくても大丈夫です。これから実際にやってみますので、その過程でどんなものなのか感覚をつかんでみてください。

プロジェクト作成

それでは、これからプロジェクトを作成し、プログラムファイルを追加、プログラム作成(今回はコピペ)、ビルド、書き込み、動作させてみます。実際に自分でやってみながら手順を追ってみて下さい。また、スクショはmacOSのものですが、Windows版も同様の操作になります。

まず、MPLAB Xを立ち上げます。ていうか、立ち上げてますよね。

はじめに新規プロジェクトを作成します。MPLAB Xの”File”メニューから”New Project”を選択します。

Mplabx trial 1

メニューを選択すると、プロジェクト作成のための情報を入力するウィザードが始まります。

まず、以下の画面で、「Categories」として「Microchip Embedded」、「Projects」として「Standalone Project」を選択してください。通常のPICマイコンのプログラムを作る場合、この選択をすることになります。選択したらNext>ボタンをクリックします。

プロジェクトウイザード

次の画面で、このプロジェクトで使用するPICマイコンの型番を指定します。プルダウンメニューになっていますので、メニューから選択できますが、数が多いので選択するのは大変です。そこで、以下のようにDevice欄に今回使用するPICマイコンの型番、 “pic12f1822” を直接入力します。入力は小文字でもOKです。合致するものが見つかると自動的に大文字に変換してくれます。入力できたらNext>ボタンをクリックします。

Mplabx trial 3

次に、、、ちょっと難しい内容ですので、そっとNext>ボタンをクリックしてください。(プログラムをデバッグする際の設定になります。基礎編ではデバッグは行いませんので、ここではNoneを選択したまま次の設定に進みます)

Mplabx trial 4

次の画面で、プログラムの書き込みツールを指定します。お持ちのPICkitに合わせて「PICkit3」または「PICkit4」を選択します。以下は「PICkit4」を選択した状態です。選択したらNext>ボタンをクリックします。

プロジェクトウイザード

次の画面で、使用するコンパイラを指定します。以下のように先ほどインストールしたXCコンパイラを選択します。

プロジェクトウイザード

なお、XCコンパイラは何ヶ月かごとにバージョンアップされます。新しいバージョンをインストールすると、古いバージョンを上書きするのではなく、追加でインストールされます。XCコンパイラを複数バージョンインストールすると、上のコンパイラ選択画面で複数のバージョンがリストされます。

最後にプロジェクト名称などを設定します。以下の説明図も合わせて見ながら設定してみて下さい。まず、Project Name欄に、”LED_Flash”と入力してください。もしご自分で付けたいプロジェクト名があればそれを指定いただいても構いません。

次にProject Location欄のプロジェクトフォルダの場所を確認してください。自分で作成したフォルダになっていない場合は、「Browse…」ボタンをクリックして、自分で作成したプロジェクトフォルダ位置を指定します。「Set as main project」はチェックをつけて、「Use project location as the project folder」のチェックは外します。

最後に、Encoding欄はUTF-8を選択してください。UTF-8を選択すると、プログラム中のコメントに日本語が入力可能になります。選択できたらFinishボタンをクリックします。

プロジェクトウイザード

さて、これでLED点滅制御プログラムを作成するためのプロジェクトができました。ただ、この状態ではプログラムを書くためのファイルなどはまだ用意されていません。このあと、このプロジェクトに、main.cファイルを新規追加して、main.cにプログラムを書いていくことになります。

プロジェクト作成のウィザードが終わると、プロジェクトが作成され、ウインドウ左上の方に作成したプロジェクトが以下のように表示されていると思います。

プロジェクトタブ

プログラム作成

ここまでの操作でLED点滅制御のプログラムを作成するための「プロジェクト」を作成しました。次にこのプロジェクトにプログラムを書くためのファイルを追加します。

このファイルですが、自分の好きな名前がつけられますが、ここではC言語の一般的なファイル名である “main.c” にします。このセクションでは、このmain.cを新規にプロジェクトに追加して、main.cにプログラムをコピペすることにします。今回はMPLABXでの開発〜動作確認までの流れを確認するためなので、main.cの中身には触れないことにします。

補足ですが、プログラム規模が大きくなってくると、main.cだけで開発するとわかりづらくなりますので、いくつかのファイルに分けたりします。その場合は、ひとつのプロジェクトにいくつものプログラムファイルが追加されることになります。

それでは、main.cという名称のファイルをこのプロジェクトに追加しましょう。ソースコードは、プロジェクトの”Source Files”というディレクトリに追加します。

ここで補足ですが、この”Source Files”というディレクトリは、実際にはFinder(macOS)やExplorer(Windows)で探してもどこにもありません。あくまで、MPLABXがそれぞれのプロジェクトに対して仮想的に管理してくれているだけです。(ちょっと込み入った話ですので、この話はよくわからなくても今後の理解に影響はありません)

main.cを追加するには、まずプロジェクトにある”Source Files”というフォルダを右クリックします。右クリックするとコンテキストメニューが表示されますので、New → main.c… を選択してください。

main.cファイル作成

続いて、作成するファイルの名称などを聞かれますので、以下のダイアログのように “File Name” 欄に “main”と入力します。拡張子(.c)は “Extension”欄で指定しますが、すでに “c” が選択されていると思いますのでこのままでOKです。設定したら “Finish” ボタンをクリックします。

Main c file creation mac

この手順で、Source Filesの下にmain.cが作成されたと思います。それと同時に、右の広い領域に以下のようにmain.cの内容が表示されたと思います。このエディタでmain.cにプログラムを書いていくことになります。このファイルはCのメインファイルとして作成したため、メイン関数で使われる典型的な内容がすでに書かれています。

main.cファイル

さて、プログラムの中身は次回以降の記事で詳細に説明しますので、まずは現在main.cに書かれている内容をすべて消去して、以下のプログラムをコピペしてください。(macOS/Windows共通です)

/*
 * File:   main.c
 */
#include <xc.h>

// PIC12F1822 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)


// クロック周波数指定
// __delay_ms()関数が使用する
#define _XTAL_FREQ 1000000

void main(void) {

    // PICマイコン設定
    OSCCON = 0b01011010;  // 内部クロック周波数を1MHzに設定
    ANSELA = 0b00000000;  // すべてのピンをデジタルモードに設定
    TRISA  = 0b00001000;  // すべてのピンを出力モードに設定(ただしRA3ピンは常に入力モード)

    // LEDを消灯する
    LATA5 = 0;
    
    // LED点滅処理(永久に繰り返す)
    while(1){
        // LEDを950ms消灯する
        LATA5 = 0;
        __delay_ms(950);            
        // LEDを50ms点灯する
        LATA5 = 1;
        __delay_ms(50);
    }

    // 以下の命令は実行されない
    return;

}

これでプログラムが完成しました。ここでファイルを保存します。アプリケーションメニューの「File」→「Save…」を選択します。ここまでの作業で以下のようになります。

Main c pasted

ビルド

次にビルドをします。ビルドとは、先ほど保存したC言語のプログラムをPICマイコンが処理できるコードに変換する作業です。ビルドはエラーがなければすぐに終わります。今回はプログラムをコピペいただいたのでエラーは出ないと思います。ツールアイコンにビルドボタンがありますので、そのボタンをクリックしてください。

Build button

クリックすると、右下の領域に以下のように何か文字が表示されると思います。これは、ビルド過程でコンパイラから出力される文字(ログ)の表示領域です。エラーがあれば、該当箇所が青文字で、エラーの内容が赤文字で表示されます。

Build results

この領域の最後の行に、”Loading completed”と出力されればビルド成功です。あとは、ビルドされたプログラムをPICマイコンに書き込む作業です。

書き込み

書き込みはブレッドボードのコネクタにPICKitを接続して書き込めばOKですが、実はこの状態で書き込みを行うと、PICマイコンが見つからない、というエラーになってしまいます。これについて原因と対応方法を説明します。

PICマイコンにプログラムを書き込むには、PICマイコン内部のプログラムを記憶しておくメモリに電圧をかけてプログラムを書き込みむ必要があるため、電源を供給する必要があります。この電源をどのように供給するかが問題になります。

この電源供給方法には2通りあります。ひとつは、電池ボックスをブレッドボードにつないで回路側の電源から供給する方法です。もうひとつはPICKit本体から供給する方法です。

PICKitから供給できるのであれば、書き込むときにわざわざ電池ボックスをブレッドボードに接続する必要はないので、常にPICkitから書き込んだ方がいいですよね。でも、PICKitから電源を供給する方法ではうまくいかない場合があるんです。ただし、今回の回路ではPICKitから電源供給しても問題ありません。

細かい内容になりますが、この背景を簡単に説明しておきます。

実は、PICKitから電源を供給する、というのは、そのターゲットの回路に電力を供給することになります。PICKitから電力を供給すると、そのターゲットの回路が必要とする電流が流れます。回路が大規模の場合、PICKitからの電力供給は追いつかなくなり、結果的にプログラムを書き込めなくなってしまいます。

PICKitから電源を供給するといちいち回路側の電源を接続しなくてよいので手軽ですが、この場合の回路はあまり電力を使わない、というケースに限ります。電力をたくさん使う回路の場合は、回路側で用意している本来の電源をつなげて電源を供給し、PICKitからは電源を供給しない設定で書き込みます。

プロジェクトのデフォルトは、PICKit3から電源を供給しない設定になっています。今回の回路はLEDをひとつのみ点灯する回路ですので、電力をあまり使いません。そのため今回はPICKitから電源を供給することにします。

それでは、以下の手順でPICkitから電源を供給する設定に変更して、PICマイコンにプログラムを書き込みましょう。

  1. プロジェクト設定ダイアログを開く
  2. プロジェクト設定の中のPICKit3のプログラム書き込み時の電源供給設定をONにして、電圧を5Vに設定する
  3. プログラムを書き込む

それでは始めます。

まずプロジェクトの設定ダイアログを表示するため、”LED_Flash”というプロジェクト名を右クリックして、メニューの一番下の”Properties”を選択します。

Project properties menu

以下のようなプロパティダイアログが表示されますので、次の設定をします。

  1. 左の項目から「PICkit3」または「PICkit4」を選択します
  2. 右上のポップアップメニューから「Power」を選択します
  3. 「Power target circuit from PICkit」のチェックボックスをオンに、Voltage Levelを5.0に設定します

プロジェクト設定

この設定ができたら、OKボタンをクリックします。このダイアログで、プログラム書き込み時、電源をPICkit3から5.0Vで供給する、という設定をしたことになります。

これで書き込みの準備ができました。

ではこれから実際に書き込みます。まず、Mac/PCとPICkitをUSBケーブルで接続します。PICkitは以下のように、前回までに製作したブレッドボードのピンヘッダに差し込みます。向きに注意しましょう。PICKitの三角マークがある側が1番ピンです。

PICkitのピンヘッダ接続

ちょっと不安定なので、左手で押さえたままにします。次に、プログラムを書き込みます。書き込みはツールアイコンに書き込みボタンがありますので、それをクリックします。

Write button

クリックすると、書き込み処理が始まりますが、以下のダイアログが表示された場合は「PICkit3」または「PICkit4」の「SN: xxxxxx」というところを選択してOKボタンをクリックします。これは、MPLABX IDEがPICkitを見つけられなかった場合に表示されます。表示された場合、PICkitがどれか教えてあげます。

PICkit not found

次に、以下のようなダイアログが表示されると思います。

Voltage confirmation

これは何を言っているかというと、「あなた、知ってると思うけど、このPICマイコンには3.3Vモデルと5Vモデルがありますよね。あなた、書き込みの電圧を5Vの設定にしてるみたいだけど、もし書き込むPICマイコンが3.3Vモデルの場合、このまま書き込んだらぶっ壊れるけどいいよね」(意訳)というような内容です。5Vで問題ないのでOKボタンをクリックしてこのまま進めます。

書き込みが終わっても特にダイアログが出るわけでもないので、右下のタスク領域にログが表示されますので、そこを確認してみます。

Programmed  mini

このように最後の行に “Programming/Verify complete”と表示されれば、無事書き込み完了です。

ところで、PICKitを差しっぱなしにしていると、LEDが点滅を始めたと思います。これはプログラム書き込み後、PICマイコンが動作を始めたためです。ただ、電池をつないで動作確認しますので、ここでいったんPICKitを外します。

動作確認

では、電池をつないで動作させてみます。以下のように電池ボックスから出ている電線をブレッドボードに接続して、スイッチを入れます。

Base circuit confirmation

うまく1秒に1回ピカッ、ピカッ、と光りましたか?

もし光らなかったら、回路とプログラムをもう一度確認してみてください。動かない原因がどうしてもわからなかったら、ご質問を受け付けますので、このサイトの「Contact」ページからお問い合わせいただければと思います。

それでは次回からプログラムを詳しく説明していきます。

更新履歴

日付 内容
日付 内容
2016.8.24 新規投稿
2018.11.23 PICkit4情報追加
2018.11.24 インクルードファイルをxc.hのみに変更
main関数型をvoid main(void)に変更
通知の設定
通知タイミング
guest
54 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
はると
はると
1 月 前

いつもお世話になっております。picの勉強を始めたばかりの初心者です。
17回のところでうまくプログラムの書き込みができず、下記のエラー文が表示されます。
何回か試してみても同じエラーが出て解決方法がわかりません。

Operation failed because the measured Vpp voltage failed to reach the requested Vpp voltage value within the timeout period.

はると
はると
返信  管理者
1 月 前

返信ありがとうございます。上記を試してみましたが、同じエラーが繰り返されるだけでした。

syou2
syou2
1 年 前

マイコンを勉強したくこのサイトで始めた初心者です。
最初の#include <xc.h>で添付の表示が出てマイコン設定のところでエラーが派生します。
PCはMacを使用しています。
xc.hは次のPathにあるのですがどこかにこのPathを設定する必要があるのでしょうか。
/Applications/microchip/xc8/v2.41/pic/include/xc.h
よろしくお願いします。

syou2
syou2
返信  管理者
1 年 前

回答ありがとう御座います。includeのpathがうまく出来てないようでしたのでxc8のコンパイラをもう一度入れ直しました。Compiler Settigsの時にAdd xc8 to the PATH environment variableにチェックを入れてみました。その後にbuiludeしたらエラーが出なくなりました。教えてくださったEmbeddedのToolchainにxc8(v2.41)が入っていることも確認しました。ありがとう御座います。

syou2
syou2
返信  管理者
1 年 前

前に解決したと思いメッセージを送ったのですが、まだ解決してないようです。ビルドした後の画面を添付します。前回教えていただいたXC8のPathは間違ってないようでした。

aKI
aKI
2 年 前

PICマイコン初心者です。このサイトで一から勉強させていただいています。大変詳細で分かりやすく感謝しております。
実は応用編まですすめ実践編に入る前に、自分でプログラムを作ろうと元の点灯、消灯を再開させようとしましたら、ビルド後に”Programming/Verify complete”の表示はするのですが書き換えられていない動きをしています。(回路は第17回のシンプルな接続に戻しています。)どう確認を進めればよいのか助言をいただけると助かります。ツールはPICKIT4,
MPLAB X IDE 6.00を使っています。宜しくお願いします。

aKI
aKI
返信  aKI
2 年 前

自己解決しました。お恥ずかしいことにSet Main projectで書き込む対象を変えていませんでした。プログラムを作る画面を開いていればそれが書き込められると勘違いっしていました。outputをよく見れば、対象のプログラムが表示されていました。

dmr
dmr
2 年 前

プログラムをコピペしてビルドしてみたのですが、これはエラーがあるということですか?

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory ‘C:/Users/��F/Documents/MPLABX/LED_Flash1.X’
make -f nbproject/Makefile-default.mk dist/default/production/LED_Flash1.X.production.hex
make[2]: Entering directory ‘C:/Users/��F/Documents/MPLABX/LED_Flash1.X’
“C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe” -mcpu=12F1822 -c  -mdfp=”C:/Users/��/xc8″ -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,–data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits  -std=c99 -gdwarf-3 -mstack=compiled:auto:auto   -o build/default/production/newmain.p1 newmain.c 
::: error: (1180) directory “C:/Users/��/xc8” does not exist
make[2]: *** [build/default/production/newmain.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
(908) exit status = 1
nbproject/Makefile-default.mk:107: recipe for target ‘build/default/production/newmain.p1’ failed
make[2]: Leaving directory ‘C:/Users/��F/Documents/MPLABX/LED_Flash1.X’
nbproject/Makefile-default.mk:91: recipe for target ‘.build-conf’ failed
make[1]: Leaving directory ‘C:/Users/��F/Documents/MPLABX/LED_Flash1.X’
nbproject/Makefile-impl.mk:39: recipe for target ‘.build-impl’ failed

BUILD FAILED (exit value 2, total time: 617ms)

dmr
dmr
返信  管理者
2 年 前

文字化けはしていないように思います。MPLABのバージョンを変更してみました。もう一度コピペからビルドしてみました。
/*
 * File:  main.c
 */
#include<stdio.h>
#include<stdlib.h>
#include <xc.h>

// PIC12F1822 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = INTOSC  // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF    // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF   // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF   // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF     // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF    // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON    // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF  // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF    // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF   // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
// CONFIG2
#pragma config WRT = OFF    // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF   // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF   // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO    // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF    // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

// クロック周波数指定
// __delay_ms()関数が使用する
#define _XTAL_FREQ 1000000

void main(void) {

  // PICマイコン設定
  OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
  ANSELA = 0b00000000; // すべてのピンをデジタルモードに設定
  TRISA = 0b00001000; // すべてのピンを出力モードに設定(ただしRA3ピンは常に入力モード)

  // LEDを消灯する
  LATA5 = 0;
   
  // LED点滅処理(永久に繰り返す)
  while(1){
    // LEDを950ms消灯する
    LATA5 = 0;
    __delay_ms(950);       
    // LEDを50ms点灯する
    LATA5 = 1;
    __delay_ms(50);
  }

  // 以下の命令は実行されない
  return;

}

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory ‘C:/Users/��F/Documents/MPLABX/LED_Flash.X’
make -f nbproject/Makefile-default.mk dist/default/production/LED_Flash.X.production.hex
make[2]: Entering directory ‘C:/Users/��F/Documents/MPLABX/LED_Flash.X’
“C:\Program Files\Microchip\xc8\v2.36\bin\xc8-cc.exe” -mcpu=12F1822 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,–data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall  -std=c99 -gdwarf-3 -mstack=compiled:auto:auto   -o build/default/production/main.p1 main.c 
terminate called after throwing an instance of ‘std::invalid_argument’
 what(): No such file or directory
error: clang frontend command failed with exit code 3 (use -v to see invocation)
(908) exit status = 1
nbproject/Makefile-default.mk:106: recipe for target ‘build/default/production/main.p1’ failed
make[2]: Leaving directory ‘C:/Users/��F/Documents/MPLABX/LED_Flash.X’
nbproject/Makefile-default.mk:90: recipe for target ‘.build-conf’ failed
make[1]: Leaving directory ‘C:/Users/��F/Documents/MPLABX/LED_Flash.X’
nbproject/Makefile-impl.mk:39: recipe for target ‘.build-impl’ failed
make[2]: *** [build/default/production/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 6s)

dmr
dmr
返信  管理者
2 年 前

c90に変更でエラーが出なくなりました。有難うございました。前に進めます。^^
このc99,90は何ですか?

sho
sho
4 年 前

こちらで,PICを一から勉強させていただいています.
誤植がありました.

次の画面で、プログラムの書き込みツールを指定します。お持ちのPICkitに合わせて「PICkit3」または「PICkit4」を選択します。以下は「PICkit4」を選択した状態です。線足したらNext>ボタンをクリックします。

「線足したら」→「選択したら」

ですね.だれでもわかるでしょうけど,揚げ足を取るわけではありませんが,あまりにも完璧な講座なので少しのミスもないほうがよいと思いました.

今後ともよろしくお願いいたします.

管理者
管理者
返信  sho
4 年 前

ご指摘どうもありがとうございました!
さっそく修正いたしました。

細かいことでもご指摘いただけると大変助かります。(特に誤植は本人はなかなか気づかないことが多いので…)
お手数でなければ、何か見つけましたらご指摘いただけると幸いです。

ところで、このシリーズ記事ですが、MPLABX IDEの最新バージョンと違うところも出てきていますので、今後順次最新情報に更新していく予定です。

sho
sho
返信  管理者
4 年 前

すばやい対応でビックリしています.
ありがとうございました.
今後ともよろしくお願いいたします.

minoru
minoru
4 年 前

初めまして。ここまでフォローして来たのですが、書き込みのところで以下のエラーが出て進めなくなりました。どうすればいいでしょうか?
Connecting to programmer…
The programmer could not be started: Could not connect to tool hardware: PICkit3PlatformTool, com.microchip.mplab.mdbcore.PICKit3Tool.PICkit3DbgToolManager
すみませんがお教えください。よろしくお願いします。

minoru
minoru
返信  minoru
4 年 前

binaryさんへのお答えに従って何度かトライして、後電圧を4.5にして動きました。ご面倒をおかけしました。

キャップ
キャップ
6 年 前

基礎編の第17回までの情報で、PIC12F1822への書き込みと動作確認がスムーズに出来ました。
ここまで丁寧に解説されているサイトは他には見たことがありません。
貴重な情報を提供していただいたclaynetsさんに感謝致します。

ところで、電子回路図ですがどのようなソフトウェアで書かれていますでしょうか?
今後、自分も書く機会があると思い質問させていただきました。
いずれ、claynetsさんのように、pngファイルなどでインターネットに公開することを考えています。

管理者
管理者
返信  キャップ
6 年 前

キャップさま、
コメントどうもありがとうございます! 動作確認までできてよかったです。実際に動くと嬉しいですよね。

ところで、ご質問の電子回路図ですが、macOS用の「Affinity Design」というアプリで描いています。このアプリは、Illustratorとほぼ同じ機能を持っていて、macOSのイラレ系アプリとして人気があります。結局、直線や円などを組み合わせて部品の回路記号を作成して、それをグループ化、部品として使っています。

電子回路図を描くアプリは、フリーソフトの「KiCad」や「LTSpice」、Autodesk社の「EAGLE」などがあります。最初はこれらのアプリで回路図を作成してみたのですが、いずれのソフトも図としての品質はよくなかったので、結局、自分でゼロから描くことにしました。

きれいな電子回路図を描きたいのであれば、イラレ系のアプリでゼロから作成するのが一番きれいだと思います。

binary
binary
6 年 前

picマイコン初心者です。プログラミングをしていてこの分野を勉強したいと思い第1回から記事を見させて頂いています。とてもわかりやすく、ここまで躓く事なく来れましたが、書き込みの段階で以下のようなエラーが出て、対応できませんでした。
エラーの解決方法をもしよろしければ教えて下さい。
[エラー]
The programmer could not be started: Could not connect to tool hardware: PICkit3PlatformTool, com.microchip.mplab.mdbcore.PICKit3Tool.PICkit3DbgToolManager

管理者
管理者
返信  binary
6 年 前

binaryさま、
コメントどうもありがとうございました。

再現確認しようとしているのですが、なかなかこちらで再現できておりません。そこで、似たような症状がないかMicrochipのフォーラムなどで確認したところ、PICkit3のモードが異なっている可能性があるかもしれません。

PICkit3本体に黒いボタンがあると思います。このボタンを以下のように操作してご確認いただけますでしょうか。

1) PICKit3をPCから外す
2) PICkit3の黒いボタンを押したまま、USBケーブルをPCに接続する
3) USBケーブルを接続したら、黒いボタンをはなす

こちらでも引き続き再現できないか確認してみます。

binary
binary
返信  管理者
6 年 前

ご返事ありがとうございます。
pickit3のモード回答どおりに変換し、更に4.75vに変換すると記事通りに動作しました。解決方法を模索していただき本当にありがとうございます。

管理者
管理者
返信  binary
6 年 前

結果をご連絡いただきどうもありがとうございます。
黒いボタンを押すと、PICKit3のモードが初期状態に戻るようなので、何か違うモードになっていたのかもしれませんね。

あと、書き込み時の電圧は4.75Vということは、USBポートの容量の問題なのかもしれません。4.75Vで問題なければ、このあとの記事でも4.75Vで書き込みいただければと思います。

また何かわからないことがありましたらコメントいただければと思います。

junjun
junjun
6 年 前

大変分かりやすい説明に感謝しております。

マイコン・C言語ともに全くの初心者です。
基礎編を最後まで興味深く拝見して、実際に製作し、
自己流で プログラムを アレンジするなどして
楽しんでおります。

どうも スッキリしない疑問があります。

第17回で LED を点滅させる プログラム。
LATA5 = 0;
__delay_ms(950);
LATA5 = 1;
__delay_ms(50);
を While (1) { } に入れることで永久に点滅を繰り返す。

ここまでは理解できるのですが、
このWhile (1) { } を取り去った以下の コード。
LATA5 = 0;
__delay_ms(950);
LATA5 = 1;
__delay_ms(50);

この コードでは一回の「点灯」のみであり、
「 点滅」はしないように思われるのですが、
実際に書き込んでみると、LED が点滅を継続します。

基本的な知識不足による疑問かと思われますが、
よろしく お願い致します。

管理者
管理者
返信  junjun
6 年 前

junjunさま、
ご質問どうもありがとうございます。

LEDを点滅させるプログラムからwhile(1){}を削除して、main関数の中には1回だけ点灯させるコードが書かれているはずなのに、実際に実行するとwhile文があるかのように正常に動作する、ということですよね。

非常に鋭い質問です!

このご質問の本質は、
main()
{

プログラムコード

}

というプログラムを書いたとき、プログラムコードは1回実行されるのはいいとしても、処理が最後の「}」まできたらPICマイコンはどうなるのか、という点になります。

実は、main()関数の処理が終わって最後の「}」までくると、最初の「{」から処理を開始するんです。これは今回のプログラムに限らず、PICマイコンプログラム全般に当てははまります。

では、繰り返し実行するコードであれば、main()関数の中に1回分の処理を書いておくだけでいいのではないか? という疑問が生まれます。

main関数の中に1回分のコードを書いてそれを繰り返し実行させると問題が出てきます。というのは、main関数の最初の方にはPICマイコンのピンの属性設定をしたり、周波数設定をしています。main関数を何度も実行するようにしてしまうと、これらのコードが毎回実行されることになってしまいます。これらのコードは処理自体は時間がかからないにしても、やはり処理時間はかかります。

そのため、main関数に点滅のコードを1回だけ書くようにしてmain関数を繰り返し実行すると、、、

PICマイコン初期設定
LEDを950ms消灯
LEDを50ms点灯
PICマイコン初期設定
LEDを950ms消灯
LEDを50ms点灯
PICマイコン初期設定
LEDを950ms消灯
LEDを50ms点灯
:
:
というように処理を繰り返してしまいますので、時間計測としては良くない処理になってしまいます。

逆に電源投入後に1回だけ処理させたい場合は、

main()
{
 1回分の処理;

 while(1){
 }
}

というように最後に何も処理をしないwhile文を追加しないと、何度も実行してしまうことになります。

このようにいろいろと試されるのは非常にいいことだと思いますので、いろいろとプログラムを変更してご自分の理解を深めていただければと思います。

今後も何かわからないことなどございましたらご質問ください。

junjun
junjun
返信  管理者
6 年 前

ご丁寧な解説 どうもありがとうございます。
胸の つかえが取れた気がします。

応用編の プチチャレンジ課題で つまずいて、
一旦 ここに戻り、思い切って質問させていただきました。

初級向けC言語の解説本では、
あまり触れられていない「無限ループ」や「空のループ」の
使用法を再認識することができました。

まだまだ色々疑問は残りますが、
深追いして迷路に迷い込むことなく、
とりあえず次に進んで、
実践編も コンプリートしたいと夢を膨らませております。
必要な パーツも既に手元に届いております (^v^)♪

これからも どうぞ宜しくお願い致します。

管理者
管理者
返信  junjun
6 年 前

junjunさま、
早速のご確認どうもありがとうございました。

回答後に申し訳ございませんが一点捕捉させてください。

main関数自体を何度も繰り返すのはPICマイコンがそのような仕様になっているためで、例えばPC(Mac/Windows/Linux)でCプログラムを作成すると、main関数が終わるとプログラム処理そのものが終わりになりますので、その点をご留意いただければと思います。

実践編はまだ記事が途上ですが、早めに全部書く予定です。実践編もよろしくお願いします!

わからないことがありましたら、お気軽にご質問ください。

junjun
junjun
6 年 前

毎回 詳細な解説 ありがとうございます。

複数の LED を試してみたくなり、
RA0・RA1 ピンの使用について検討してみました。

そこで疑問が生じました。
TRISA により全ての ピン( RA3ピンを除く) が
出力モードとして設定されています。

PICkit3 から マイコンへ書き込む際には、
6・7番ピンを ICSPCLK・ICSPDATとして使用する為に、
TRISA の設定が オーバーライドされるという イメージで理解すれば

よろしいのでしょうか?

乱暴な言い方をすると、
「 出力ピンとして設定した ピンを用いて入力する 」とも言えそうな
気がしますが …… 。

また 6・7番ピンを ICSPCLK・ICSPDATとして使用する際には、
周辺回路と共用しない方が良いのでしょうか?

お忙しいところ、申し訳ありませんが、宜しくお願い致します。

管理者
管理者
返信  junjun
6 年 前

junjunさま、
ご質問どうもありがとうございます。

PICKitからPICマイコンに書き込む際、PICマイコンは通常のプログラム実行モードとは異なるプログラム書き込みモードになり、ICSPCLKとICSPDATピンはプログラム専用ピンになります。

TRISAの設定はプログラムが開始してから(main関数が実行されてから)設定されますので、TRISAがオーバーライドされる、ということにはなりません。プログラム書き込みモードはそもそもプログラムは動作していませんので、main関数での設定は実行されていません。

また、ICSPCLKとICSPDATピンですが、この新しいシリーズでは説明を省略しましたが、古いシリーズには説明しておりますのでご参照いただければと思います。

https://tool-lab.com/make/macpic-startup-28/

junjun
junjun
返信  管理者
6 年 前

早速の ご回答どうもありがとうございます。

「 ピンの有効活用方法 」を拝見して、色々な疑問が
解消できました。
実践編で登場する 16F18857 を使用すれば、
回路設計に大幅な余裕ができるのは分かっているのですが、
12F1822 にも愛着が沸いてきました。

これからも宜しくお願い致します。

けんけん
けんけん
6 年 前

こんにちは
第一回から記事を見させていただいております。pic初心者の者です。

書き込みボタンを押しましたが、

PICkit 3 is trying to supply 5.000000 volts from the USB port, but the target VDD is measured to be 4.750000 volts. This could be due to the USB port power capabilities or the target circuitry affecting the measured VDD.

The target circuit may require more power than the debug tool can provide. An external power supply might be necessary.
Connection Failed.

と表示されました。

ノートパソコンでやっていますが、電圧が不足しているということでよろしいでしょうか。

ご指導いただけますと幸いです。

よろしくお願いします。

管理者
管理者
返信  けんけん
6 年 前

けんけんさま、
ご質問どうもありがとうございます。

このメッセージは、原因が不明なことが多いので、大変お手数ですがいくつか確認していただければと思います。このメッセージは、本当に電圧が取れないこともあるのですが、他の原因の可能性もあるので、何通りかの手順をご確認いただければと思います。

A) PCのUSBポートに他のUSB機器は接続していますでしょうか。その場合、PCに接続する機器はPICKit3のみにしてどうなるかご確認お願いできますでしょうか。

B) PCのUSBポートにPICKit3のみ接続している場合、PICKit3を接続するタイミングを、PC起動前、PC起動後のパターンでご確認いただけますでしょうか。

C) PCの再起動などでも同じメッセージが出る場合、以下の手順でどうなるかご確認お願いできますでしょうか。

1) PCを起動、PICKit3をUSBケーブルでPCに接続
2) MPLABX IDEを立ち上げる
3) プロジェクト名を右クリックして「Properties」を選択
4) Categoriesの「Conf:[default]」を選択 (おそらく選択済みのはず)
5) 右側の領域のHardware Tool → PICKit3に「SN:xxxxxxxx」(xはPICKit3のシリアルナンバー)が表示されているので、それを選択
6) OKボタンをクリックしてPropertiesダイアログを閉じる
7) ビルド、書き込み

A〜Cの項目をご確認いただければと思います。

ところで、こちらのシリーズはPIC12F683を使用したものですが、このあと、PIC12F1822を使用してさらに色々な機能を説明しています。PIC12F683をPIC12F1822に置き換えれば動作させることができますので、以下のシリーズもご参照いただければと思います。

「PICマイコン電子工作入門 〜基礎編」
http://tool-lab.com/make-course/picbasic/

「PICマイコン電子工作入門 〜応用編」
http://tool-lab.com/make-course/picapp/

けんけん
けんけん
返信  管理者
6 年 前

ご返信感謝します!!
そのエラーについてですが、usbが4.75ボルトしかなかったのでプロパティ→pickit3→power→voltage levelを4.75ボルトにしたらうまくいきました!!

様々な解決方法をご提案してくださったこと誠に感謝しております。
ありがとうございました!!

管理者
管理者
返信  けんけん
6 年 前

けんけんさま、
的確な回答ができずに申し訳ございませんでした。4.75Vのエラーはよく見られるのですが、実際に電圧が低いというケースは少ないので、的外れな回答になってしまい申し訳ございませんでした。

今回は実際に4.75Vだったということで、私の方でも、このようなケースがある、ということで勉強になりました。ご質問いただきどうもありがとうございました!

pic biginer_JP
pic biginer_JP
6 年 前

こんにちは 最近picマイコンをはじめた者です。
pic16f628aを使って貴サイトと同じことをしようとしています。
xc16 compilerをダウンロードしたのですがMPLAB X IDEのselect compilerに反映されずコンパイルすることが出来ないです。
何かやるべき操作を忘れているのでしょうか?

管理者
管理者
返信  pic biginer_JP
6 年 前

こんにちは。ご質問どうもありがとうございます。
結論としては、PIC16F628Aは8-bitですのでXC8が必要になります。XC8をダウンロード、インストールするとSelect Compilerの欄に出てくると思います。

かなりややこしいのですが、PICマイコンのアーキテクチャは以下のようになっています。

[8-bitマイコン]
 PIC10, 12, 16, 18

[16-bitマイコン]
 PIC24, dsPIC30, dsPIC33

[32-bitマイコン]
 PIC32

またコンパイラは、XC8が8-bit用、XC16が16-bit用、XC32が32-bit用になります。

自分も最初の頃は同じ勘違いをしました。ただ、いちいち調べるのは面倒なので、XC8, 16, 32のコンパイラは全てインストールするようにしています。全てインストールされていると、必要なコンパイラが「Select Compiler」に表示されるようになります。(そもそも全部入りの1つのコンパイラを作ればいいのに、という気もしますが…)

それにしても、PICの型番の数字は紛らわしいですよね。特にPIC32は32-bitなのに、前後の数字のものは16-bitというのはわざと難しくしてるようにな気もします。スタバで注文するときの難しさに似ているような気もしますが、逆にパパッとわかるようになると、スタバでそうであるようにドヤ顔できるのかもしれません。

pic biginer_JP
pic biginer_JP
返信  管理者
6 年 前

素早い丁寧な返信ありがとうございます。
なるほど、、、一応データシートは目を通したのですがpic16fの数字に惑わされていました。
アドバイス通り全てのコンパイラをインストールしてみます(笑)

管理者
管理者
返信  pic biginer_JP
6 年 前

はい、また何かわからないことありましたらご質問いただければと思います。

reud
reud
7 年 前

初めまして、電子工作を始めてみたいと思い様々なサイトを探してみましたが、このサイトが一番わかりやすく助かっています。 いつもわかりやすい記事を作っていただきありがとうございます
今回ビルドが失敗するので、質問させていただきたいと思います
MPLAB文のout putがこうなり、成功しません。
//ここから
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory ‘C:/Users/reud/MPLABXProjects/tf.X’
make -f nbproject/Makefile-default.mk dist/default/production/tf.X.production.hex
make[2]: Entering directory ‘C:/Users/reud/MPLABXProjects/tf.X’
“C:Program Files (x86)Microchipxc8v1.42binxc8.exe” –pass1 –chip=12F1822 -Q -G –double=24 –float=24 –opt=+asm,+asmfile,-speed,+space,-debug,-local –addrqual=ignore –mode=free -P -N255 –warn=-3 –asmlist -DXPRJ_default=default –summary=default,-psect,-class,+mem,-hex,-file –output=default,-inhx032 –runtime=default,+clear,+init,-keep,-no_startup,-osccal,-resetbits,-download,-stackcall,+clib –output=-mcof,+elf:multilocs –stack=compiled:auto:auto “–errformat=%f:%l: error: (%n) %s” “–warnformat=%f:%l: warning: (%n) %s” “–msgformat=%f:%l: advisory: (%n) %s” -obuild/default/production/newmain.p1 newmain.c
:: error: (141) can’t open cpp.exe command file “C:UsersreudAppDataLocalTemp;C:Usersreud.atompackagescpp_s8j0.cmd”: Invalid argument
(908) exit status = 1
nbproject/Makefile-default.mk:106: recipe for target ‘build/default/production/newmain.p1’ failed
make[2]: *** [build/default/production/newmain.p1] Error 1
make[1]: *** [.build-conf] Error 2
make[2]: Leaving directory ‘C:/Users/reud/MPLABXProjects/tf.X’
make: *** [.build-impl] Error 2
nbproject/Makefile-default.mk:90: recipe for target ‘.build-conf’ failed
make[1]: Leaving directory ‘C:/Users/reud/MPLABXProjects/tf.X’
nbproject/Makefile-impl.mk:39: recipe for target ‘.build-impl’ failed

BUILD FAILED (exit value 2, total time: 970ms)
//ここまで
一応言われた通りに動かしています。
自分で解決しようと色々調べて、error(141)の部分でなぜかatomファイルのパスが見えたのでこれが悪い事してると思い.atomファイルを削除しましたが何も変わりませんでした。
よろしければ、解決方法とcpp.exeの解説、エラー内容をご教授していただきたいです。宜しくお願いいたします
//追記です
最初はLED_flashでプロジェクトを作成しましたが今と同じくエラーが出たため、tfというプロジェクト名にし、再度設定を確認を行いました

Hisatomi Kenji
Hisatomi Kenji
8 年 前

こんにちは。いつもありがとうございます。
サンプルプログラムで以下のコメントとプログラムについて、実際に動作させてみるとLEDが点灯することを確認しました。
// LEDを消灯する
LATA5 = 1;
引き続き読ませていただいています。

管理者
管理者
返信  Hisatomi Kenji
8 年 前

コメントどうもありがとうございます。
はい、何か不明な点がありましたらコメントいただければと思います。

Hayashi Takayuki
Hayashi Takayuki
返信  管理者
7 年 前

こんにちは。このサイトで勉強しているマイコン初心者です。
プログラム内の39、40行目の
// LEDを消灯する
LATA5 = 1;
これは矛盾していませんか?
それとも自分の勘違いでしょうか…

管理者
管理者
返信  Hayashi Takayuki
7 年 前

はじめまして。

ご指摘どうもありがとうございました!
すみません、コメントとプログラムが一致していませんでした。初期設定としては消灯する、ということにしますので、

// LEDを消灯する
LATA5 = 0;

に変更しました。

コメントどうもありがとうございました!

目次