発電実験:発電機励磁装置 元に戻る

Ⅶ.プログラミング(準備) 2024/7/2

本文目次

本文以外目次
1.開発方法
2.プログラムの書き方
3.CONFIG
4.定数値/変数アドレス設定
5.リセットベクター
6.割込みベクター
7.初期化(プログラム内容)
8.メイン処理(プログラム内容)
9.サブルーチン(プログラム項目)
10.割り込みサブルーチン(プログラム項目)
11.テーブル


本   文
1.開発方法
開発には、Windowsパソコンと今回使用したPICの製造元マイクロチップ社の開発アプリケーションソフトMPLAB IDEV8.84を使用し、開発したプログラムをPICに書き込むツールとしてPICKIT3(『(3)プログラミングの書き込みツール』で簡単に説明する)を使用した。
開発状況 プログラム書き込み状況
プログラムミングツールMPLAB IDEの画面 (写真向かって左側のモニター 1600×1200)
(1)MPLAB IDEを使用したプログラムの作成
a.『Project』→『Project Wizard』で開発するPICを選択し『次へ』をクリックします。
b.同窓から開発言語を選択する。
通常はアッセンブラになっている。
Active Toolsuite: Microchip MPASM Toolsuite ※1
Toolsuite Contents MPASM Assembler ・・・・・
Location: C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe
Store tool locations in project (プロジェクトのツールの場所を保存します。)

※1 Cコンパイラの場合など変更します。
『次へ』をクリックします。

c.同窓から開発するためのプログラムファイルを設定します。
Create New Project File で設定します。
今回は『C:\PIC\VolGene\VolGene』で『次へ』をクリックします。
d.同窓からソースファイルの登録をします。
他で開発した物があり、そのソースファイルなどをコピーする場合にここで設定し、コピーが出来ます。
『次へ』をクリックすると、右記最後の表示が出て『完了』をクリックします。
e.下のファイルが生成される。
d.アッセンブラファイルを作成する。
(a)アッセンブラのファイル作成
『ファイル』→『New』でファイルを開き(2)アッセンブラの初期定義を記載し『VolGene.asm』を登録する。

(b)定義する。
『Files』の窓で、『Source Files』を右クリックして『AddFiles』を選び(a)で作成したファルを選択する。
すると左図の様にasmファイルが追加される。

(2)プログラミング
最初に記載する物はCONFIGになるが、この事については、PIC16F193Xのデータシート 125ページに記載の初期設定を参照下さい。
他にバンク切り替えなどのマクロを定義しておくと便利なので、その定義も記載する。
その他プログラムで使用する定数などはプログラムの書き方以降で説明する。

プログラム例

(3)プログラミングの書き込みツール
プログラム言語としては、PIC161938 のアッセンブラ言語(上記説明でも有った 52 個の命令を使用したプログラム)を使用し、マイクロチップ社無償配布の『MPLABIDE』で作成している。
又、PIC16F1938 にプログラムを書込みしているのは、右写真の『PICKIT3』(秋月電子 3,900円)でパソコンとは USB で接続し、PIC 側は 6 つの端子で接続される物を使用している。
この PICKIT3 については、非純正の物が販売されており、先ほどと同じ物であれば、インターネットモール『eBay』では、送料込みで $25 約2,000 円(輸送方法はメール便と思われるので、途中で紛失も有り保障関係もモールで内容を確認して購入契約して下さい)、私は、右写真の様に、ZIF ソケットが付いた物を購入しました。
価格は FreeShipping で、$35 約 2,800 円ですが、輸送方法を確実な物とし EMS にしたので、$45 約 3,600 円となりました。
脱線ついでに ZIF ソケット部は日本で購入すれば、約 4,000 円はします。
秋月電子通商は『http://akizukidenshi.com/』eBay は『http://www.ebay.com/』で購入が出来ます。.
接続する回路接続方法は下記の結線になる様にすること。
[目次に戻る]


2.プログラムの書き方

MPLAB IDEで記載するプログラムの記載項目と概要を下記に示す。
(1)CONFIG
MPLAB IDEでアッセンブルする時の設定を記載する。
またアッセンブラーで何度同じ複数行のプログラムをマクロ化して記載する方法があるので、必要な場合は記載する。本プログラムではバンク切り替えのプログラムをマクロ化している。『バンク切り替え』については『Ⅲ.ハードウェアー3.CPU(2)~(3)』を参照して下さい。

(2)定数値/変数アドレス設定

(3)リセットベクター
・リセット(電源が入ったなど)した時に、下記命令のアドレスを記載する。
・最初に処理するアドレスを記載する。(今回は最初が初期化:ラベル名 『INIT』)

(4)割り込みベクター
・割り込みが入った時の処理アドレスを記載する。
・また続いて、割り込みフラグを見て処理するアドレスを記載する。
・最後には『RETFIE』を記載する。

(5)初期化(プログラム内容)

(6)メイン処理(プログラム内容)

(7)サブルーチン(プログラム内容)

(8)割り込みサブルーチン(プログラム内容)

(9)テーブル
(プログラムエリアにデータなどを格納する時に使用する方法で今回はLCDの初期表示のデータを入れている)

なお概略ではあるが、プログラムの動きを下記に示す。
割込みベクターでの処理時間(3つの処理時間の和)は最低が2msなので、それよりも早くしなければならない。
[目次に戻る]


3.CONFIG

ここでは、アッセンブラにどんなCPUを使用し、そのCPUの初期設定をどうするかを知らせます。
今回の記載内容を下記に示します。
;*******************************************
;CONFIG 125P
LIST P=PIC16F1938 ; LIST宣言で、使用するPICをPIC16F1938と定義する
INCLUDE P16F1938.INC ; 設定ファイルp16f1938.incを読み込む

ERRORLEVEL -207,-302,-306
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _VCAPEN_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_19 & _LVP_OFF
;*******************************************
BANK0 MACRO
MOVLB 0
ENDM
BANK1 MACRO
MOVLB 1
ENDM
BANK2 MACRO
MOVLB 2
ENDM
BANK3 MACRO
MOVLB 3
ENDM
BANK4 MACRO
MOVLB 4
ENDM
;BANK5 MACRO
; MOVLB 5
; ENDM
BANK6 MACRO
MOVLB 6
ENDM
BANK7 MACRO
MOVLB 7
ENDM
BANK8 MACRO
MOVLB 8
ENDM
(1) ここで使用するCPU名を宣言します。 LIST P=PIC16F1938

(2) 次にこのアッセンブラに取込む(INCLUDE)定義ファイル名(P16F1938.INC)を記載します。
この定義ファイルには、各インターフェース名と関連する数値(アドレスやBitなど)や本文記載の__CONFIG以降の _FOSC_INTOSCなど対応する数値(設定値など)が記載されている。

(3) エラーレベルについは ・・・(まだ勉強不足 で今は呪いと思って記載しています。)

(4) configの内容を定義する。
ここに記載されている内容はP16F1938.INCで定義されている名前を記載する。
例『_FOSC_INTOSC と _BOREN_OFF 』で説明する。
P16F1938.INCで対応する 値は_FOSC_INTOSC が H'FFFC' と _BOREN_OFF が H'F9FF' になっている。 何れもメモリーエリアは__CONFIG _CONFIG1 で FOSC はbit 2-0で定義されINTOSCを使用する場合は100となる事がデータシートに記載されている。
同じ様にBORENはbit 10-9で定義されOFFは00になっている。
アッセンブラは__CONFIG _CONFIG1の行全てを&(AND)にして定義しているアドレス(_CONFIG1 はH'8007')へ書き込むことになる。
早速計算して見よう。 FFFC & F9FF = F9FCとなりP16F1938.INC を使用し __CONFIG _CONFIG1 のデータを作成する事が理解されたと思う。
表で表すと下記のようになります。
この機能が無ければ、

CONFIG1 EQU H'F9FC'

と記載する必要があり、一目見てもこれが、FOSC はINTOSCを使用しBORENはOFFで有る事は非常に判り難いと思います。(次に説明する『定数値/変数アドレス設定』の定数はこのタイプなので、コメントを書いてはいますが、判り難いと思います。)
ただし、_FOSC_INTOSC と _BOREN_OFF も記載方法をP16F1938.INC で定義されている物と寸分違わず記載する必要が有るので、注意が必要です。
メンテナンスを考えれば、P16F1938.INC を使用する後者の方が良いと思いますが・・・

関係しているデータシートとP16F1938.INCを次ページに添付しているので、参照下さい。

(5) マクロを記載する。
通常マクロは複数行の良く使うプログラムを登録し、登録した名前をプログラム文中に記載することにより、簡単にプログラムを記載することが出来ます。(サブルーチンでは無いので、プログラム長は長くなりますが、移動する時間が無いので、早くする事が出来ます。)
ここで使用しているマクロは見て判りやすいようにしているだけで、あまり自慢する物ではありませんが、紹介します。
バンクの概念については、Ⅲ.ハードウェアー 2.CPU (2)ブロック図と今回使用するものを参照下さい。

BANK0 MACRO ←マクロ0は登録名BANK0 とする。
MOVLB 0 ←BSR(バンクセレクトレジスター)に0をロードする。
 これでバンクを切り替える。
ENDM ←マクロ定義の終了
P16F1938.INC の config に関係するものを表形式にして記載する。
[目次に戻る]


4.定数値/変数アドレス設定
定数に数値を予め入れて置き、プログラム文中では、数値をそのまま記載しても目的が判り難いので、ここで定義した定数を記載する様にしている。
数値の意味はさまざまで、レジスターへ入れるデータ(各インターフェースの設定やメモリー(計算などで使用)のデータとしても使用)、メモリーのアドレスやBitなども表している。
以下に各インターフェースの設定に使用している物の一部を記載し、定義の方法を説明する。
;定数
;●CPUの各レジスターの初期値の定数 詳細はMPLABIDEの使い方のプログラミング 定数設定を参照
SET_OSCCON EQU B'11110000' ;8MHz×4 '11110000'
SET_OPTION EQU B'00100001' ;(5)=0
;入出力設定
SET_TRISA_PWMT EQU B'00110000' ;PWM使用時設定 出力=0 CCP5(4)の初期ロックで=1
SET_TRISA EQU B'00100000' ;出力=0 CCP5(4)は出力=0
SET_ANSELA EQU B'00100000' ;RA5(AN4)
SET_WPUB EQU B'00000000' ; プルアップ設定
SET_TRISB EQU B'11111110' ; 1,2はロータリーエンコーダ
SET_ANSELB EQU B'00000000'
SET_IOCBP EQU B'00010000' ; 4は立上りで検出
SET_IOCBN EQU B'00000110' ; 1,2は立下りでフラグ
SET_TRISC EQU B'00000000'
;A/D関係
SET_ADCON0 EQU B'00010001' ;6-2:AN4の使用 0:ADCイネーブルビット
SET_ADCON1 EQU B'11100000' ;7:右詰め 6-4:A/DクロックFosc/64 2,1-0 基準電圧
;タイマー関係
SET_TMR0 EQU 0x00 ;0xDA ;割込みサブルーチンで再使用するための定数
SET_T2CON EQU B'00000000' ;PMW用 リセット信号分周期
SET_PR2 EQU 0xFF ;PWM用 タイマーカウント比較値
SET_CCPTMRS1 EQU B'00000000' ;PWM用 CCP5= B'xxxxxx00'
SET_CCP5CON EQU B'00111100' ;PWM用 プリスケラーほか設定
SET_CCPR5L EQU 0x80 ;PWM用 出力値デューティ時間
SET_T4CON EQU B'00001011' ;AVR用 割り込み分周期
SET_PR4 EQU D'125' ;AVR用 タイマーカウント比較値

(1)文法説明
最初の行で説明する。 SET_OSCCON EQU B'11110000' ;8MHz×4 '11110000'
なお(  )内が右側説明文の対応するプログラム定義文 
定数名(SET_OSCCON)に、バイナリデータの11110000 (B'11110000')を、入れる(EQU ) データの概要はこのCPUのクロックを32MHz(8MHz×4 '11110000')で動作させると言うことコメント(;)にしている。
以下同様であるが、データの表し方を説明すると、B=binary(2進数)、D=Decimal(10進数)、0x・・=hexadecimal(16進数)、’ ’=アスキー文字(ASCII=American standard code for information interchange)脱線するが、7bitコードで0x00~0x1Fは制御0x20~0x7Eは印刷可能な文字として昔はテレタイプなどのにも使用されているコード。

(2) 各変数の概略説明
最終章の『Ⅷ.プログラム(ソースリスト)』定数値/変数アドレス設定を見ながら下記説明を見てほしい。 ちなみに、ページ数はPIC16F193Xデータシートの参照ページを表している。

SET_OSCCON EQU B'11110000' ;8MHz×4 '11110000'
;□ 内部クロックの周波数の選択をします。 ■OSCCON 108p
; OSCCON = SPLLEN*|IRCF(3:0)|-|SCS(1:0) [108p]
; SPLLEN=1 ソフトPLLイネーブルビット 0=4xPLLは無効 1=4xPLLは有効 
; 但しconfig2[128p]PLLEN=1(PLL使用)の時は4xPLL有効に固定される。
; IRCF=1110 4ビット15種類のクロックを指定 今回は32MHz=8MHz×4なので、1110
; SCSはシステムクロックを2ビット 3種類の選択が出来 config1[126p] FOSCで
;  設定したクロックを使用するので、00 となる 以上から OSCCON='1 1110 0 00' となる

SET_OPTION EQU B'00100001' ;(5)=0
;OPTION_REG L=[]
; (7)WPUEN:PLUP[0N](6)INTEDG:RB割込[立下](5)T0CS:Tm0[内部CK](4)T0SE:Tm0[RA4立上]
; (3)PSA:Tm0[割込へ影響](2-0)プリスケーラ レート 000=1:2 001=4,8,16,32,64,128 111=1:256
;●2~7 9~10ピン RA
SET_TRISA EQU B'00000000'
; □PORTA トライステート レジスタ ■TRISA 86P
; ビット 7-0 TRISA<7:0>: PORTA トライステート制御ビット
; 1 = PORTA ピンが入力として設定されている ( トライステート)
; 0 = PORTA ピンが出力として設定されている
SET_ANSELA EQU B'00000000'
; □PORTA アナログ選択レジスタ ■ANSELA 86P
; ビット 7-6 未実装:「0」として読み出し
; ビット 5-0 ANSA<5:0>: RA<5:0> の各ピンの機能をアナログまたはデジタルのいずれかに選択します。
; 0 = デジタル I/O。ピンはポートまたはデジタル特殊機能に割り当てられる
; 1 = アナログ入力。ピンはアナログ入力として割り当てられる(1) デジタル入力バッファは無効
;●11~18ピン RC
SET_TRISC EQU B'00000000'
; □RC0の割り込み設定
; □PORTC トライステート レジスタ ■TRISC 94P
; ビット 7-0 TRISC<7:0>: PORTC トライステート制御ビット
; 1 = PORTC ピンが入力として設定されている ( トライステート)
; 0 = PORTC ピンが出力として設定されている
;●21~28ピン RB
SET_WPUB EQU B'00000000'
; 弱プルアップ PORTB レジスタ ■WPUB 90P
; ビット 7-0 WPUB<7:0>: 弱プルアップ レジスタ ビット
; 1 = プルアップ有効
; 0 = プルアップ無効
SET_TRISB EQU B'11000110'
; □PORTB トライステート レジスタ ■TRISB 90P
; ビット 7-0 TRISB<7:0>: PORTB トライステート制御ビット
; 1 = PORTB ピンが入力として設定されている ( トライステート)
; 0 = PORTB ピンが出力として設定されている
SET_ANSELB EQU B'00000000'
; □PORTB アナログ選択レジスタ ■ANSELB 90P
; ビット 7-6 未実装:「0」として読み出し
; ビット 5-0 ANSB<5:0>: RB<5:0> の各ピンの機能をアナログまたはデジタルのいずれかに選択します。
; 0 = デジタル I/O。ピンはポートまたはデジタル特殊機能に割り当てられる
; 1 = アナログ入力。ピンはアナログ入力として割り当てられる(1) デジタル入力バッファは無効
SET_IOCBP EQU B'00000000'
; □RBの割り込み設定 ■IOCBP 104P
;立ち上がりエッジの状態変化割り込みレジスタ
; 1=立上がりエッジの状態変化割り込みが有効。
; エッジ検出時に関連するステータス ビットおよび割り込みフラグがセットされる
; 0=状態変化割り込みは無効
SET_IOCBN EQU B'00000110'
;□RBの割り込み設定 ■IOCBN 104P
; 立ち下がりエッジの状態変化割り込みレジスタ
; 1=立下がりエッジの状態変化割り込みが有効。
; エッジ検出時に関連するステータス ビットおよび割り込みフラグがセットされる
; 0=状態変化割り込みは無効
●フラグ
;□RBの割り込みフラグ ■IOCBNF 104P
;状態変化割り込みフラグ レジスタ
; 1=関連ピンで有効な変更が検出された。
; IOCBPx = 1 のとき RBx で立ち上がりエッジが検出された場合、または
; IOCBNx = 1 のとき RBx で立ち下がりエッジが検出された場合にセットされる
; 0= 変更がない、または検出された有効な変更をユーザーがクリアした
;●その他設定
SET_TMR0 EQU 0x00 ;0xDA ;割込みサブルーチンで再使用するための定数
;タイマー0の設定
SET_ADCON0 EQU B'00000000'
;アナログの設定値は初期値です。
;アナログ設定
; A/D 制御レジスタ0 ■ADCON0: 137P
; ビット 7 未実装:「0」として読み出し
; ビット 6-2 CHS<4:0>: アナログ チャネル選択ビット
; 00000=AN0 00001=AN1 00010=AN2 00011=AN3 00100=AN4 00101=AN5 00110=AN6
; 00111=AN7 01000=AN8 01001=AN9 01010=AN10 01011=AN11 01100=AN12 01101=AN13
; 01110=予約 11100=予約 11101=バンドギャップ電圧を使用する温度リファレンス
; 11110=DAC 出力 ( 別名: CVREF 出力) 11111=固定電圧参照 (FVR) バッファ 1 出力
; ビット 1 GO/DONE: A/D 変換のステータス ビット
; 1 = A/D 変換サイクルが進行中。このビットをセットすると、A/D 変換サイクルが開始します。
; このビットは、A/D 変換が完了するとハードウェアによって自動的にクリアされます。
; 0 = A/D 変換完了 ( 進行中ではない)
; ビット 0 ADON: ADC イネーブル ビット
; 1 = ADC が有効
; 0 = ADC は無効となり、動作電流を消費しない
SET_ADCON1 EQU B'00000000'
; A/D 制御レジスタ1 ■ADCON1: 138P
; ビット 7 ADFM: A/D 変換結果フォーマット選択ビット
; 1 = 右詰め。変換結果がロードされる場合、ADRESH の 6 ビット MSB は「0」にセットされる
; 0 = 左詰め。変換結果がロードされる場合、ADRESL の 6 ビット LSB は「0」にセットされる
; ビット 6-4 ADCS<2:0>: A/D 変換クロック選択ビット
; 000=FOSC/2 001=FOSC/8 010=FOSC/32 011=FRC(専用のRCオシレータから供給されるクロック)
; 100=FOSC/4 101=FOSC/16 110=FOSC/64 111=FRC(専用のRCオシレータから供給されるクロック)
; ビット 3 未実装:「0」として読み出し
; ビット 2 ADNREF: A/D ネガティブ電圧リファレンスのコンフィギュレーション ビット
; 0 = VREF- は AVSS へ接続される
; 1 = VREF- は外部の VREF- へ接続される
; ビット 1-0 ADPREF<1:0>: A/D ポジティブ電圧リファレンスのコンフィギュレーション ビット
; 00 = VREF+ は AVDD へ接続される
; 01 = 予約
; 10 = VREF+ は外部の VREF+ へ接続される
; 11 = VREF+ は内部の固定電圧リファレンスへ接続される
SET_INTCON EQU B'10001000'
;割り込み制御レジスタ ■INTCON: 73P
; ビット7 0=禁止 1=許可 GIE: グローバル割り込み(すべてのマスクされていない割り込み)イネーブル ビット
; ビット6 0=禁止 1=許可 PEIE: 周辺装置割り込み(すべてのマスクされていない周辺装置割り込み)イネーブル ビット
; ビット5 0=禁止 1=許可 TMR0IE: Timer0 オーバーフロー割り込みイネーブル ビット
; ビット4 0=禁止 1=許可 INTE: RB0/INT 外部割り込みイネーブル ビット
; ビット3 0=禁止 1=許可 IOCIE: 状態変化イネーブル ビット(1)
; ===== 以下フラグにつき 設定しない 1でソフトウェアでクリアが必要 =====
; ビット2 0=していない 1=発生した TMR0IF: Timer0 (TMR0 レジスタが)オーバーフロー割り込みフラグ ビット(2)
; 注1: Timer0 がロールオーバ すると TMR0IF ビットがセットされます。
; Timer0 はリセット時には変化しないため、TMR0IF ビットをクリアする前に初期化が必要です。
; ビット1 0=していない 1=発生した INTF: INT 外部割り込みフラグ ビット
; ビット0 0=変化しない 1=が変化した IOCIF:状態(少なくとも1つの状態が)変化割込みピンのステート変化割り込みフラグビット
SET_PIE1 EQU B'00000000'
;周辺装置割り込みイネーブル レジスタ 1 ■PIE1: 74P
; ビット7 0=無効 1=有効 TMR1GIE: Timer1 ゲート割り込み(アクイジション完了)イネーブル ビット
; ビット6 0=禁止 1=許可 ADIE: A/D コンバータ (ADC) 割り込みイネーブル ビット
; ビット5 0=禁止 1=許可 RCIE: USART 受信割り込みイネーブル ビット
; ビット4 0=禁止 1=許可 TXIE: USART 送信割り込みイネーブル ビット
; ビット3 0=禁止 1=許可 SSPIE: 同期シリアル ポート (SSP) 割り込みイネーブル ビット
; ビット2 0=禁止 1=許可 CCP1IE: CCP1 割り込みイネーブル ビット
; ビット1 0=禁止 1=許可 TMR2IE: TMR2/PR2 一致割り込みイネーブル ビット
; ビット0 0=禁止 1=許可 TMR1IE: Timer1 オーバーフロー割り込みイネーブル ビット
SET_PIE2 EQU B'00000000'
;周辺装置割り込みイネーブル レジスタ 2 ■PIE2: 75P
; ビット7 0=禁止 1=許可 OSFIE: オシレータ エラー割り込みイネーブル ビット
; ビット6 0=禁止 1=許可 C2IE: コンパレータ C2 割り込みイネーブル ビット
; ビット5 0=禁止 1=許可 C1IE: コンパレータ C1 割り込みイネーブル ビット
; ビット4 0=禁止 1=許可 EEIE: EEPROM 書き込み完了割り込みイネーブル ビット
; ビット3 0=禁止 1=許可 BCLIE: MSSP バス衝突割り込みイネーブル ビット
; ビット2 0=禁止 1=許可 LCDIE: LCD モジュール割り込みイネーブル ビット
; ビット1 未実装:「0」として読み出し
; ビット0 0=禁止 1=許可 CCP2IE: CCP2 割り込みイネーブル ビット
SET_PIE3 EQU B'00000000'
;周辺装置割り込みイネーブル レジスタ 3 ■PIE3: 76P
; ビット7 未実装:「0」として読み出し
; ビット6 0=禁止 1=許可 CCP5IE: CCP5 割り込みイネーブル ビット
; ビット5 0=禁止 1=許可 CCP4IE: CCP4 割り込みイネーブル ビット
; ビット4 0=禁止 1=許可 CCP3IE: CCP3 割り込みイネーブル ビット
; ビット3 0=禁止 1=許可 TMR6IE: TMR6/PR6 一致割り込みイネーブル ビット
; ビット2 未実装:「0」として読み出し
; ビット1 0=禁止 1=許可 TMR4IE: TMR4/PR4 一致割り込みイネーブル ビット
; ビット0 未実装:「0」として読み出し
;● 割込みフラグ関係
;周辺装置割り込み要求レジスタ 1 ■PIR1: 77P
;ビット7 0=アクティブ 1=非アクティブ TMR1GIF: Timer1 ゲート割り込みフラグ ビット
;ビット6 0=未完・開始 1=完了 ADIF: A/D コンバータ割り込み(変換)フラグ ビット ( ソフトウェアでクリアが必要)
;ビット5 0=フルではない 1=フル RCIF: USART 受信割り込み(受信バッファ)フラグ ビット(RCREG の読み出しでクリア)
;ビット4 0=フル 1=空 TXIF: USART 送信割り込み(送信バッファ)フラグ ビット (TXREG への書き込みでクリア)
;ビット3 0=完了を待機 1=完了 SSPIF: 同期シリアルポート (SSP) 割り込み(送信/ 受信が)フラグ ビット
( ソフトウェアでクリアが必要)
;ビット2 CCP1IF: CCP1 割り込み(TMR1 レジスタの)フラグ ビット ( ソフトウェアでクリアが必要)
; キャプチャ モード:キャプチャが発生 0=していない 1=した
; コンペア モード: 比較一致が生じ 0=ていない 1=した
; PWM モード: このモードでは使用しない
;ビット1 0=していない、1=した TMR2IF: Timer2/PR2 割り込み(の一致が生じ)フラグ ビット (ソフトウェアでクリアが必要)
;ビット0 0=していない、1=した TMR1IF: Timer1 オーバーフロー割り込み(レジスタがオーバーフローし)フラグビット(ソフトウェアでクリアが必要)
;周辺装置割り込み要求レジスタ 2 ■PIR2: 78P
;ビット7 OSFIF: オシレータ エラー割り込みフラグ( ソフトウェアでクリアが必要)
; 0=エラーない 1 = システム オシレータでエラーが発生し、クロック入力が INTOSC に切り替わった
;ビット6 0=していない、1=した C2IF: コンパレータC2割り込み(有効なエッジが検知され)フラグ (ソフトウェアでクリアが必要)
;ビット5 0=していない、1=した C1IF: コンパレータC1割り込み(有効なエッジが検知され)フラグ (ソフトウェアでクリアが必要)
;ビット4 0=未完・開始 1=完了 EEIF: EEPROM書き込み完了割り込み(書き込み動作が)フラグビット(ソフトウェアでクリアが必要)
;ビット3 0=していない 1=した BCLIF: MSSP バス衝突割り込み(検知され)フラグ ビット (ソフトウェアでクリアが必要)
;ビット2 0=していない 1=した LCDIF: LCDモジュール割り込み(フレーム表示を完了し)フラグビット(ソフトウェアでクリアが必要)
;ビット1 未実装:「0」として読み出し
;ビット0 CCP2IF: CCP2 割り込み( TMR1 レジスタ)フラグ ビット (ソフトウェアでクリアが必要)
; キャプチャ モード(キャプチャが発生し) 0=ていない 1=た
; コンペア モード(比較一致が生じ) 0=ていない 1=た
; PWM モード このモードでは使用しない
;周辺装置割り込み要求レジスタ 3 ■PIR3: 79P
;ビット7 未実装:「0」として読み出し
;ビット6 CCP5IF: CCP5 割り込み(TMR1レジスタの)フラグ ビット (ソフトウェアでクリアが必要)
; キャプチャ モード(キャプチャが発生し) 0=ていない 1=た
; コンペア モード(比較一致が生じ) 0=ていない 1=た
; PWM モード このモードでは使用しない
;ビット5 CCP4IF: CCP4 割り込み(TMR1 レジスタの)フラグ ビット (ソフトウェアでクリアが必要)
; キャプチャ モード(キャプチャが発生し) 0=ていない 1=た
; コンペア モード(比較一致が生じ) 0=ていない 1=た
; PWM モード このモードでは使用しない
;ビット4 CCP3IF: CCP4 割り込み(TMR1 レジスタの)フラグ ビット (ソフトウェアでクリアが必要)
; キャプチャ モード(キャプチャが発生し) 0=ていない 1=た
; コンペア モード(比較一致が生じ) 0=ていない 1=た
; PWM モード このモードでは使用しない
;ビット3 0=ていない 1=した TMR6IF:TMR6/PR6一致割り込み(ポストスケールの一致が生じ)フラグビット(ソフトウェアでクリアが必要)
;ビット2 未実装:「0」として読み出し
;ビット1 0=ていない 1=した TMR4IF:TMR4/PR4 一致割り込み(ポストスケールの一致が生じ)フラグ ビット(ソフトウェアでクリアが必要)
;ビット0 未実装:「0」として読み出し

その他、メモリーのアドレス、変数は後のプログラム説明で紹介する。
[目次に戻る]


5.リセットベクター
リセットベクターのプログラムは以下です。
(注:プログラム左側のNoは説明の為に記載しています。実際のプログラムではNoは付いていません。)
;############################################
; リセットベクター
;############################################
1 ORG 00h ;RESETで0番地から始まる
2 GOTO INIT ;0番地はGOTOでMAIN処理へジャンプ

(1)説明
電源を入れ、最初に実行される命令を00hに書き込みます。
今回の場合は、GOTO INITなので、初期化のプログラムへ行く事になる。
[目次に戻る]


6.割込みベクター
割込みは沢山あり、必要な物だけを定義し、その割込みによりどの様な処理をするかここに記載する。
注意しなければならないのは、この割込み処理で、その他の割込みがかかる(特にタイマー、自動処理の要求)前に処理を終わる必要が有るので、自分の記載した割込みプログラムの処理時間を知っておく必要がある。
(1)説明
割込みはプログラムのコメントに記載の通り、 
a. 『BCF INTCON,GIE 』.割込み処理中はその他の割込みを停止する。 
b. I/O RBに接続されているボタンとロータリーエンコーダの処理I_RBプログラムへ
c. タイマー6:インデシャル動作信号でインデシャル応答試験でこの割込みまで、オシロなどへ信号を出すためのタイマーで1回の割込みで16(ms)の方形波が出る様になっている。
d. タイマー4:AVRの計算周期として使用している。
e. 割込みを許可してメイン処理へ戻る。 『RETFIE 』
[目次に戻る]


7.初期化(プログラム内容)
初期化のプログラム概要は下記の通りで、全てを見る場合は、ソースリストを参照の事。
初期化では各インターフェースの初期化(定数値/変数アドレス設定で設定している定数を使用して初期化)している。
(1) ラベルについて
最初に記載の『INIT』をラベルと言い、『リセットベクター』で説明した様に、電源を入れた時に最初にこのラベル以下から命令を実行します。

(2) 命令文の概略説明
ラベルの次の『BANK4』は『CONFIG』で説明した マクロBANK4を実行(MOVLB 4)します。
『2.CPUの(3)メモリーマップ』のアドレス値に対しBANK4のレジスター群を読書きする事が出来ます。
インターフェースRBの設定を以下に記載している。RBは入力として、ボタン RB4、ロータリーエンコーダ RB1,2、などは外付けにプルアップ抵抗10kΩが取り付けられている。
他に未使用ですが、LCDの処理完了フラグ用 RB3など入力として使用している。
初期化プログラムでは、
『MOVLW SET_WPUB』は内部プルアップの抵抗(半導体)をインターフェースRBのどれに入れるかのデータをCPUのWレジスターに一旦入れます。今回の場合は、全て使用していないので、データは0です。
『MOVWF WPUB』はWレジスターの内容をWPUBRB(プルアップ使用)のレジスターに入力しRBのプルアップの設定を実行しています。

(3) 初期化の概要
a. 定数のクリアー CLRF ○・・・
b. 各定数に値を設定
c. LCDの初期化プログラムへ
CALL LCD_INT ;LCDの初期化 (Ⅴ.プログラミング 1.画面と設定方法(LCD) 参照)
d. PWMレジスターの初期化 (フラグがセットされるまで、待つ)
PWM_ZYUNBITYU
BTFSS PIR1,TMR2IF
GOTO PWM_ZYUNBITYU


LOOP1
BTFSS PORTA,4 ;CCP5の出力がでるまで待つ
GOTO LOOP1
詳細はⅤ.プログラミング 4.PWM回路 参照
e. 割込みを開始する。 
[目次に戻る]


8.メイン処理(プログラム内容)
ここで処理しているのは、LCD表示のサブルーチンを呼び出しているだけ。
このプログラムを実行中に各割込み処理が処理される。
割込み処理が処理しきれなくなると、このLCD表示への処理が出来なくなるため、画面のカーソル移動・点滅などに不具合でが出てくる。
END_TEST
CALL LCD_CRT ;
GOTO END_TEST
LCDの詳細は(Ⅴ.プログラミング 1.画面と設定方法(LCD) 参照)
[目次に戻る]


9.サブルーチン(プログラム項目)
ここでは、各処理のラベル名と処理の概要を記載し、内容については、『Ⅴ.プログラミング』の各処理内容で説明する。
(1) LCD_INT
a. LCD表示用のメモリーバッファー050~06Fに、テーブルLCDD_INT1とLCDD_INT2のデータを転送する。
b. 次にLCDの初期化(4BITモードにする)をする。
この中で、『タイマー』や『LCD_CM』『LCD_CM4』(8bit,4bitコマンド送信と信号線『RW』・『RS』シーケンス)のサブルーチンを多くCALL(サブルーチン呼出し)している。
c. 次に説明する『LCD_CRT』をCALLする。
(2) LCD_CRT
LCD表示用のメモリーバッファーの内容をLCDへデータ転送します。
(3) タイマー
LCDの初期化時に使用するタイマーでTM1,TM2の合計16bitのタイマーを使用して各時間を経過すれば、ループから抜け出し、元(CALLした所)に戻る。
[目次に戻る]


10.割り込みサブルーチン(プログラム項目)
ここでは、各処理のラベル名と処理の概要を記載し、内容については、『Ⅴ.プログラミング』の各処理内容で説明する。
(1) I_TMR4
A/D変換の指示をして、TM4にAVRの処理周期(2ms)を設定する。
つまり、TM4のタイマー周期で割込みが有ると、割込みをロックして、AVR関係(A/D変換指示、A/Dの値をとってPID処理(OPXをコール)してPWMの値を出すまで)の処理を完了後、この処理を実施して割込みを開始する事になる。
(2) I_TMR6
TM6の割込み処理により下記実行をする。
ポートAの2の信号をクリアーし、割込みを許可する。

(3) I_AD
今は使用していないが、A/D変換処理が完了したら割込みをかける処理です。
もし、AVRの処理がA/Dの変換処理より早くなった場合は使用する必要が出てくる。
将来参考用として残している。

(4) OPX
AVR関係の処理の中心でPIDの処理を実施している。

(5) SET_PWM
PWMに数値を入れる部分。

(6) I_RB 
ボタンやロータリーエンコーダを操作した時の処理をここで行っている。
[目次に戻る]


11.テーブル
LCDに関係するデータが記録されている。 
各ラベル毎に用途を説明する。
(1) LCDD_INT1 LCD表示データ1
(2) LCDD_INT2 LCD表示データ2
(3) LCD_Mno CSNOからLCDのメモリーに記載するアドレスを取得するためのデータ
(4) MNo_AD CSNOから設定するメモリーアドレスを取得する。
(5) MNo_V CSNOから数の最大数を取得する。
[目次に戻る]