第3回 PICマイコン統合開発環境(MPLAB X IDE)

■3.1 MPLAB X IDEの概要
 MPLAB X IDE は,Microchip Technology 社より無償で提供されている,PC 上で動作する PIC マイコン用の統合開発環境(IDE:Integrated Development Environment)である.
 本実習では,MPLAB X IDE v.5.35 を使用する.
 MPLAB X IDE は,以下に示す機能を備えている.
  • ビルドイン・エディタを使ってプログラムのソースコード(source code)を作ることができる.
  • アセンブリ言語やC言語等の言語ツールを使ってソースコードをアセンブル(assemble:アセンブリコードから機械語への変換)/コンパイル(compile:ソースコードからアセンブリコードへの変換),リンク(link:中間ファイルを結合して実行形式ファイルを生成)してオブジェクトコード(object code:機械語の16進数表記)を生成する.ソースコードからオブジェクトコードを生成する一連の処理をビルド(build)と呼ぶ.
  • シミュレータでプログラムの流れを見ながら論理的な動作をデバッグ(debug:検証および修正)できる.
  • PICkit3 などのプログラマを使ってデバイスにプログラムを書き込める.
 本実習ではPICマイコン専用アセンブリ言語である mpasm を用いてプログラムを開発する.

◆3.1.1 関連ファイル
 アセンブリ言語を用いてプログラムを開発する場合に扱われる主なファイルタイプを以下に示す.

ファイルタイプ 拡張子 内 容 場所 
ソースコード
ファイル
.asm プログラムの動作を記述したファイル. プロジェクトで作成したフォルダ直下
オブジェクトコード
ファイル
.hex マイコンが実行可能な形式で記述されたファイル.
PIC にダウンロードして実行することができる.
プロジェクトで作成したフォルダ>dist>default>production フォルダ内
アセンブルリスト
ファイル
.lst ソースコードとオブジェクトコードを対応づけて記述したファイル. プロジェクトで作成したフォルダ>build>default>production フォルダ内
 
■3.2 基本操作法
◆3.2.1 起動と新規プロジェクトの作成
  デスクトップから MPLAB X IDE を選択して起動する.



 既存のプロジェクトは,File メニューより Open Project... を選択,もしくはにより読み込むことができる.

▼新規プロジェクトの作成
 MPLAB X IDE を使って開発作業を行う場合,まず,プロジェクト(Project)というものを定義する必要がある.
 プロジェクトは,ソースプログラム(複数可)のコーディング作業,アセンブル・リンク作業,デバッグ作業等の一連の作業を一括管理するためのものである.
 File メニューより New Project... を選択,もしくはボタンにより表示される「New Project ダイアログ」の指示に従い,デバイスプロジェクト名作業フォルダなどを指定する.

Step1. プロジェクトタイプ設定 Choose Project

 Categories:「Microchip Embedded」,Projects:「Standalone Project」を選択.選択したら「Next」をクリック.


Step2. 使用デバイス(PIC)設定 Select Device

 実習で使用するPICマイコンに合わせて,Device:「PIC16F84A」を選択.選択したら「Next」をクリック.


Step4. プログラム書込み装置設定 Select Tool (Optimal)

 実習では本物の電子回路への書込みを行わないため,Hardware Tools:「Simulator」を選択.選択したら「Next」をクリック.


Step6. 使用言語(コンパイラ)設定 Select Compiler

 実習では機械語を使用するため,Compiler Toolchains:「mpasm (v.5.87) ...」を選択.選択したら「Next」をクリック.


Step7. プロジェクト名,作業フォルダ設定 Select Project Name and Folder

 今回の実習用として,Project Name:「step03」を入力.
 実習では 21番教室PCの M ドライブに作業フォルダを作成するため,Project Location:「M:\」を設定.
 ソースコードに日本語を含めたい場合は,Encoding:「Shift JIS」を指定.日本語はエラーの原因となりやすいため,使用しないほうが無難
 完了したら「Finish」をクリック.


 新しいプロジェクト(satep03)がIDEに登録され,プロジェクトの様々な情報を表示する Dashboard が現れる.


 なお,M ドライブには自動的に作業フォルダが作成される.
 

◆3.2.2 ソースコードの作成とオブジェクトコードファイルの生成
▼新規ファイルの作成
 File メニューより New File... を選択,もしくはボタンによりにより表示される「New File ダイアログ」の指示に従って新しいソースコード・ファイルを作成する.

Step1. ファイルタイプ設定 Choose File Type

 Categories:「Assembler」,File Types:「AssemblyFile.asm」を選択.選択したら「Next」をクリック.


Step2. ファイル名設定 Name and Location

 今回の実習用として,File Name:「step03」を入力.
 Created File に,先に作成した作業フォルダ内に「asm」タイプのファイル名が表示されていることを確認する.
 完了したら「Finish」をクリック.


 新しいファイル(satep03.asm)がIDEに登録され,エディタが現れる.


 
▼プロジェクトのプロパティ設定
 File メニューより Project Propaties (step03) を選択し,デバッグに関する設定を行う.

 動作周波数設定 Instruction Frequency (Fcyc)

 実習では 1 MHzの動作周波数を仮定している.
 Categories:「Simulator」,Instruction Frequency (Fcyc):「1」を選択.


 ビルドモード設定 Build in absolute mode

 デバッグ機能(Watch)を有効にするため,Categories:「mpasm (Global Options)」,Build in absolute mode:チェックする
 完了したら「OK」をクリック.


 
▼ソースコード例
 ソースコードの書き方にはいろいろな制約やコツがある.
 ソースコードは,プログラムタイトルに始まり,ハードウェアや定数・変数の定義初期設定等のマイコンの動作準備項目を記述した後,具体的なマイコン動作の記述であるメインルーチン割り込み処理ルーチンサブルーチンを記載するのが一般的である.

 以下に,簡単なプログラムソースコード例を示す.

ソースコード 内 容
;***********************************************************
;       step03 for PIC16F84A
;       step03.asm, H. OSADA, Oct. 2021
;***********************************************************
;
;=================================================
;  definitions
;=================================================
;- hardware -----------------------------------
        LIST P=PIC16F84A
        #INCLUDE "P16F84A.INC"
;
        __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;
;- constant label -----------------------------
INTERVAL    EQU     03DH    ;main interval timer
;
;- file register ------------------------------
        CBLOCK  0CH
            counter         ;main counter
            cnt_1ms         ;1ms timer counter
            W_temp          ;Wreg temp register
            STATUS_temp     ;STATUS temp register
        ENDC
;
;=================================================
;  run start
;=================================================
;- reset start --------------------------------
        ORG     0
        GOTO    INIT
;
;- interrupt start ----------------------------
        ORG     4
        GOTO    ISR
;
;- initialize ---------------------------------
INIT
        BSF     STATUS,RP0      ;set Bank1
        MOVLW   00FH
        MOVWF   TRISB           ;set Port B dir
        MOVLW   087H            ;prescale 256
        MOVWF   OPTION_REG
        BCF     STATUS,RP0      ;set Bank0
;
;TIMER0 ---------------------------------
        MOVLW   INTERVAL        ;TIMER0 preset
        MOVWF   TMR0
        BSF     INTCON,T0IE     ;TIMER0 enabled
        BSF     INTCON,GIE      ;all interrupt enabled
;
;=================================================
;  main routine
;=================================================
MAIN
        CALL    T1ms
BREAK
        GOTO    MAIN
;
;=================================================
;  interrupt service routine
;=================================================
ISR
;- TIMER0 reset -------------------------------
        BCF     INTCON,T0IF     ;interrupu flag clear
        MOVLW   INTERVAL        ;TIMER0 preset
        MOVWF   TMR0
;
;- counter increment --------------------------
        INCD    counter,F       ;counter = counter + 1
;
;- return to main routine ---------------------
        RETFIE
;
;=================================================
;  subroutine
;=================================================
;---------------------------------------
;  1ms timer (1cycle=1us)
;---------------------------------------
T1ms
        MOVLW   0F9H
        MOVWF   cnt_1ms         ;2cycle
L_T1ms
        NOP
        DECFSZ  cnt_1ms,F
        GOTO    L_T1ms          ;4*249-1=995cycle
        RETURN                  ;2+995+1=998cycle
;
;***********************************************************
        END
■プログラムタイトル
 タイトル
 ファイル名 作者 日付等    


◇各種定義◇


■ハードウェア定義
 プロセッサの種類を指定
 インクルードファイルの設定

 コンフィグビットの設定

■定数ラベル定義
 TMR0 初期値宣言

■変数レジスタ定義
 0CH番地より定数領域確保
 (0CH)メインカウンタ
 (0DH)1msタイマカウンタ
 (0EH)Wregの一時保存用
 (0FH)STATUSの一時保存用
 定数領域確保終了

◇実行開始◇


 リセット番地の指定
 (必ず0番地)
 初期化処理へジャンプ

 割り込み番地の設定
 (必ず4番地)
 割り込み処理へジャンプ

■初期設定
 ポートBの入出力方向を設定
 レジスタBankを1に設定
 TRISBレジスタに書き込み
 (7:4出力,3:0入力)
 プリスケーラ設定

 レジスタBankを0に戻す

 タイマ0初期設定
 インターバル初期値設定

 タイマ0割り込み許可
 全割り込み許可

■メインルーチン
 (永久ループ)


 メインルーチンでの処理内容
 (1ms待ちサブルーチン実行)
 MAINへ戻る

■割り込み処理ルーチン




 タイマ0割り込みフラグクリア
 インターバル初期値再設定



 割り込み処理の内容


 メインへ復帰

■サブルーチン



【1msタイマ】


 0F9H(249)回のループを
 CNT_1に設定

 1サイクル調整
 CNT_1 - 1が0でなげれば
 L_T1mへジャンプ
 0ならリターン


◇プログラム終了◇ 

 コード部分をコピーして IDE のエディタへ貼り付ける.



MPLAB X IDE のエディタでは,コードの種類に応じて以下のように色分けされるため,それぞれ正しく入力されているかどうかをある程度確認できる(ユーザが定義した変数は確認できない).

アセンブラ命令 青太字(MOVF
アセンブラ疑似命令 青細字(EQU
SFR 水色細字(STATUS
コメント 緑細字(;- hardware ---
他(ラベル等) 茶細字(INTERVAL

▼オブジェクトコードファイルの生成
 mpasm を用いて作成したソースコードファイルをビルドすることで,ソースコードからオブジェクトコードファイルを生成することができる.
 Production メニューより Build Project (step03) を選択,もしくはボタンによりプロジェクトのビルドが開始される.
 ビルド中は,Output ウィンドウに進行状況が表示される.

 ソースファイルに文法エラーがある場合は,Ouoput ウィンドウ最終行に「BUILD FAILED」と表示される.



 Ouoput ウィンドウに,エラーの発生行や内容が表示されるので,それを参考に修正を加える.
 エラーメッセージをダブルクリックすると,ビルトイン・エディタの該当行に自動的にカーソルが移動する(今回は,INCF 命令のタイプミス).



 ソースファイルに文法エラーが無い場合は,Ouoput ウィンドウ最終行に「BUILD SUCCESSFUL」が表示され,作業フォルダ内にオブジェクトコードファイルが生成される.
 M:/step03.X/dist/default/production/step03.X.production.hex



 オブジェクトコードは専用のプログラマを利用してマイコンに書込むことができる.
 
■3.3 デバッグ(Debug)
 デバッグとは,作成したプログラム(ビルドが行われて文法エラーのないもの)に対して,期待通りではない動作(誤動作)が無いかどうか,プログラム中の全ての命令の流れをを確認し,必要であれば修正を加えて誤動作を取り除く作業である.
 誤動作の元となる,文法エラーではないものの不適切なプログラム部分は,一般にバグ(Bug:害虫)と呼ばれる.

 プログラムの流れを実際のターゲットハードウェア上で確認することは,PIC 内部の各レジスタの値の変化を直接見ることができないため非常に困難である.そこで考えられたのがシミュレータであり,これは他のコンピュータで PIC の命令を実行したように見せるプログラムである.
 MPLAB X IDE に搭載されたシミュレータを用いることで,プログラム中の任意の場所を実行でき,またその実行前後の全ての PIC のレジスタの状態を知ることができる.したがって,作成したプログラムが意図通りに動いているかどうかをターゲットハードウェア無しで調査することができる.

◆3.3.1 デバッグの開始と基本操作
 Debugger メニューより Debug Project を選択,もしくはボタンによりデバッグが開始される.
 デバッグが開始されると専用メニュー(アイコン)が表示され,利用できるようになる.

 実行を終了する  実行を一時停止する   実行をリセットする  実行を再開する
 コードを1行実行する.
 その行が関数コールだった場合,呼び出した関数全体を実行して停止する.        
 コードを1行実行する.
 その行が関数コールだった場合,呼び出した関数の先頭の命令文を実行して停止します.
 コードを1行実行する.
 その行が関数コールだった場合,実行後に呼び出し元の制御に戻る

 また,プログラムカウンタ(PC),STATUSレジスタ・フラブ(z,dc,c),ワーキングレジスタ(W),バンク状態(bank)も表示される.
Debug メニューより Select Tool > 4 MPLAB SIM を選択し,MPLAB SIM を起動する.

 リセットした状態のエディタ画面.


◆3.3.2 デバッグ用ツール
 デバッグを効率よく実施するために様々なツールが用意されている.

▼ブレークポイント
 コードの実行を一時停止する位置.任意のコード位置に設定できる.
 行の左側の余白をクリックすることで,設定/解除できる.



▼変数レジスタ値の確認
 プログラムが一時停止時に任意の変数レジスタ値を確認できる.
 
 変数レジスタ名にカーソルを合わせて少し待つと,その変数レジスタのアドレスと値がポップアップで示される.
 また,継続的に内容を確認したい場合,変数レジスタ名上で右クリックし,New Watch... を選択すると,Watchウィンドウに変数レジスタが登録される.



▼ストップウォッチ
 プログラムの実行に伴う PIC のリアルタイム実行時間を算出する.

 Window メニューより Debugging > Stopwatch を選択することにより起動し,結果をStopwatchウィンドウに表示する.


 
■課題
 アセンブリコードから機械語への変換を行うアセンブル処理には,実習で利用したアブソリュート・アセンブル(absolute assembly)以外に,リロケータブル・アセンブラ(relocatable assembler)を用いたリロケータブル・アセンブル(relocatable assembly)という処理がある.
 リロケータブル・アセンブルとはどのような概念の元に行われる処理なのか,またその利点等を示しなさい.

 レポートは,下記のWordファイルを使用して作成すること.なるべく簡潔にまとめることが望ましい.
 Form03.docx

 WebClassより期限内に提出すること.