PICキット スタートマニュアル4
新規プログラム作成してみる(アッセンブラ)編
MPLAB X IDE(Ver3.51) 起動 MPLABXIDE ユーザーズガイドも参照してください
(1)アッセンブラ(MPASM)用プロジェクトの作成 MPLABマニュアル P47 3-3以降参照
「スタートマニュアル2」を参考にアッセンブラ用新規プロジェクトを作成します
プロジェクト名は何でも良いのですが、説明の都合上「PIC_START_PRG01」とでもしておきます。
すると、「MPLABXProjects」フォルダに「PIC_START_PRG01.X」が生成されます。
当局の場合は、「MPLABXProjects」フォルダ内の「PIC_BASIC」フォルダ内の「PIC_START」フォルダ内に生成されています
生成直後は「PIC_START_PRG01」プロジェクトをオープンしている状態です。
(2)アッセンブラ新規ソースファイルの作成
0)「PICKIT_START_PRG01」プロジェクトをオープンします。(画像01)
(1)からそのまま来た場合は、すでにプロジェクトオープンしています。
1)左上コマンドバーの「File」の「New File」をクリック、すると「New Project」ウインドウが開く
①Step1 Choose File Type (画像02)
Projectでは、「PIC_START_PRG01」を選択
Categoriesでは、「Assembler」をクリック
File Typeでは、「AssemblyFile.asm」をクリック
「Next」をクリック
②Step2 Name and Location (画像03)
File Nameでは、「PIC_START_PRG01」とでもします。(実際は好きなソースファイル名でOK)
「Next」をクリック
これで、「PIC_START_PRG01」フォルダに「PIC_START_PRG01.asm」が生成されました。
何も書かれていないソースファイルもオープンされていると思います。
(1)アッセンブラ(MPASM)用プロジェクトの作成 MPLABマニュアル P47 3-3以降参照
「スタートマニュアル2」を参考にアッセンブラ用新規プロジェクトを作成します
プロジェクト名は何でも良いのですが、説明の都合上「PIC_START_PRG01」とでもしておきます。
すると、「MPLABXProjects」フォルダに「PIC_START_PRG01.X」が生成されます。
当局の場合は、「MPLABXProjects」フォルダ内の「PIC_BASIC」フォルダ内の「PIC_START」フォルダ内に生成されています
生成直後は「PIC_START_PRG01」プロジェクトをオープンしている状態です。
(2)アッセンブラ新規ソースファイルの作成
0)「PICKIT_START_PRG01」プロジェクトをオープンします。(画像01)
(1)からそのまま来た場合は、すでにプロジェクトオープンしています。
1)左上コマンドバーの「File」の「New File」をクリック、すると「New Project」ウインドウが開く
①Step1 Choose File Type (画像02)
Projectでは、「PIC_START_PRG01」を選択
Categoriesでは、「Assembler」をクリック
File Typeでは、「AssemblyFile.asm」をクリック
「Next」をクリック
②Step2 Name and Location (画像03)
File Nameでは、「PIC_START_PRG01」とでもします。(実際は好きなソースファイル名でOK)
「Next」をクリック
これで、「PIC_START_PRG01」フォルダに「PIC_START_PRG01.asm」が生成されました。
何も書かれていないソースファイルもオープンされていると思います。
(3)アッセンブラ・ソースファイルの冒頭決まり文句を書く (画像05)
1)タイトルの作成
作成者が後で見た時に分かる様に、タイトル、機能、使用PIC、設定クロック等記載します
2)インクルードファイルの記載
使用PICと、その専用incファイルを記載
(4)コンフィギュレーション・レジスタを設定する (画像06、07、08、09)
概ね決まり文句的な事項なのですが、その時の設計によって違ってくるビットがあります。
ベースとなる設定に変更を加えるのが常套手段で、通常は「FOSC」の設定変更で済む事が殆どです
今後主流になるかもしれない、同じ14ピンのPIC16F18326では、長年存在した「FOSC」が無くなっています・・・
FOSC:システムクロックを内部発振とするか、外部発振とするか
100=INTOSC:内部発振回路を使用する、RA4(OSC2)-RA5(OSC1)ピンはI/Oとして使用可
010=HSオシレータ:OSC2-OSC1にX’TAL等を接続、PIC内部回路で水晶発振回路を形成し、システムクロックとする
もちろん、RA4(OSC2/CLKOUT)-RA5(OSC1/CLKIN)はI/Oとして使用できない
発振周波数は4MHZ以上となっています
111=ECH:CLKINピンに外部発振器からのクロックを供給、それをシステムクロックとする。RA4はI/O可
外部発振器には安価な物や高価でも精密な物で、安定した発振器がありますので、それらを使用します。
入力周波数は4MHZ~20MHZとなっています。
(5)GPR等のラベル定義、リセットベクタ・割込みベクタの記述 (画像10)
1)GPR(汎用データRAMレジスタ)のラベル定義
この辺の領域ではGPRの定義はもちろんですが、その他に定数ラベルやマクロ定義等を行えます。
しかし、ここではGPRの定義にとどめます。
PIC16F1705では、存在するGPRアドレスは下記の通りです
BANK00:20H~6FH(80バイト)
BANK01:A0H~EFH(80バイト)
BANK02:120H~16FH(80バイト)
BANK03:1A0H~1EFH(80バイト)
BANK04:220H~26FH(80バイト)
BANK05:2A0H~2EFH(80バイト)
BANK06:320H~32FH(16バイト)
共通RAM:70H~7FH(16バイトで、どのBANKにいても、このアドレスでアクセス可能)
当局はまず、ほぼ確実に使う、ウエイトルーチンの専用ワークをBANK0のGPRに定義します。(BANK0ならアドレスはどこでも良い)
いつどこでも使えるローカル変数的なtmp0~tmp3、32bit分(そのサブルーチンを抜けると破壊されること前提)
後は必要に応じて登録していく。それらは基本的にBANK0のGPR
BANK1以降のGPRは基本的にある程度まとまったメモリブロックとして使うバッファエリア等として使用
と住み分けすると良いかも、まあ各自の自由ですが。
共通RAMはどうでしょうか、当局レベルでは今まで使用必須の事例はほとんど無かったですが・・・
2)プログラムの先頭 (画像11)
PICのリセットベクタは0000Hで、インタラプトベクタは0004Hです。
電源投入時や、リセットが掛かった場合、PICは0000Hのアドレスから実行を開始し始めます。
そこで、プログラムの先頭は、
ORG OH ;リセットベクタ
と記載します。
「ORG」はプログラムの開始番地を指定するMPASMの疑似命令で、アッセンブラソース内に複数のORG命令があっても大丈夫です。
このソースファイルのプログラムは、電源投入時にここから始まると言う事を明記します。
すぐに割込みベクタが来ますので、ここでは「GOTO」命令で「INIT」と言うラベルにジャンプすると記載するのが常套手段です。
ORG 0H ;リセットベクタ アドレス
GOTO INIT ;事実上のプログラム先頭へGO!
以上の様に疑似命令とアッセンブラ・コードを記載します。
次に割込みベクタの指定です。
ORG 4H ;割込みベクタ アドレス
GOTO INT ;割込み処理ルーチンへGO!
あるいは、
ORG 4H ;割込みベクタ
INIT ;割込み処理ルーチンラベル
割込み処理コード
RETFIE ;割込み処理終了
と、4番地から割込みルーチンを記載し始めてもOKです。
そのあとは、プログラム本文を記載し始めます。
INIT ;本文ラベル
本文コード
と、ここまでは常套手段的先頭プログラム記載事項です。
ORG 800H
と記載すると、これ以降のソースコードはアドレス800Hから絶対アドレス配置されます。
しかし、リセットベクタと割込みベクタは必ずORG疑似命令で指定し、対応するソースコードを記載しておきます。
(6)機能レジスタ初期設定 (画像12,13)
すべての機能レジスタをイニシャライズする必要はありません。
基本的にはパワーオン・リセット時の初期値で放置して問題無い場合が殆どですが、そうで無いのも少しあります。
1)INTCONレジスタ BANK0
基本的にリセット時はGIE=OFFとなっているので、わざわざ設定しなくとも大丈夫なのですが、念のため。
CLRF INTCON
で、すべてのbitに0を書き込んでおきます。
2)PORTA、PORTC BANK0
すべてクリアしておきます
3)LATA、LATC BANK2
②の操作でクリアされていると思いますが、念のためクリア
4)OSCCON BANK1
必ず設定します。
OSCCONレジスタ
bit7 SPLLEN:ソフトウエアPLL設定ビット
1=4xPLL有効
0=4xPLL無効
※コンフィギュレーションワード:PLLEN=1の時、この設定は無視される
bit6-3 IRCF:内部発振器クロック選択ビット
1111=16MHZ HF
1110=8MHZ or 32MHZ HF
1101=4MHZ HF
1100=2MHZ HF
1011=1MHZ HF
1010=500KHZ HF
1001=250KHZ HF
1000=125KHZ HF
0111=500KHZ MF(リセット時のデフォルト値)
0110=250KHZ MF
0101=125KHZ MF
0100=62.5KHZ MF
0011=31.25KHZ HF
0010=31.25KHZ MF
000x=31KHZ LF
bit2 Unimplemented(Read = 0)
bit1-0 SCS:システムクロック選択ビット
1x=内部オシレータ ブロック
01=セカンダリオシレータ(タイマ1発振器)
00=コンフィギュレーションワード:FOSCビットによって決まるクロック
例1) 内部発振 32MHZ
コンフィギュレーションワード:FOSC=100、PLLEN=0
SPLLEN=1、IRCF=1110、SCS=00、OSCCON=F0H
例2) 水晶発振 8MHZ → 32MHZ
コンフィギュレーションワード:FOSC=010、PLLEN=0
SPLLEN=1、IRCF=1110(使用しない)、SCS=00、OSCCON=F0H
5)TRISAレジスタ(BANK1)、TRISC(BANK1)レジスタ
TRISAはRA0-5の入力か出力かの設定(RA3は入力のみ)
TRISCはRC0-5の入力か出力かの設定
リセット時は不定ですので、必ず設定します。
例1)TRISA=0FH:RA0-RA3まで入力、RA4-RA5は出力設定
6)ANSELAレジスタ(BANK3)、ANSELCレジスタ(BANK3)
ANSELレジスタはI/Oピンをデジタルかアナログかを設定します。
リセット時はすべてアナログになっているので注意が必要です。
例1)RA0をアナログ(ADC)入力、RA1、RA2をデジタル入力、RA4-RA5をデジタル出力
TRISA=07H
ANSELA=01H
7)設定終了時
BANK=0に戻しておく事を推奨します。
(7)ウエイトサブルーチン (画像14,15)
これはその、システムクロック周波数に合わせたルーチンを用意し、コピペして使います。
ほぼ必ず使うので、ソースの最後にでも「END」疑似命令と共に置いておくと便利。
1)タイトルの作成
作成者が後で見た時に分かる様に、タイトル、機能、使用PIC、設定クロック等記載します
2)インクルードファイルの記載
使用PICと、その専用incファイルを記載
(4)コンフィギュレーション・レジスタを設定する (画像06、07、08、09)
概ね決まり文句的な事項なのですが、その時の設計によって違ってくるビットがあります。
ベースとなる設定に変更を加えるのが常套手段で、通常は「FOSC」の設定変更で済む事が殆どです
今後主流になるかもしれない、同じ14ピンのPIC16F18326では、長年存在した「FOSC」が無くなっています・・・
FOSC:システムクロックを内部発振とするか、外部発振とするか
100=INTOSC:内部発振回路を使用する、RA4(OSC2)-RA5(OSC1)ピンはI/Oとして使用可
010=HSオシレータ:OSC2-OSC1にX’TAL等を接続、PIC内部回路で水晶発振回路を形成し、システムクロックとする
もちろん、RA4(OSC2/CLKOUT)-RA5(OSC1/CLKIN)はI/Oとして使用できない
発振周波数は4MHZ以上となっています
111=ECH:CLKINピンに外部発振器からのクロックを供給、それをシステムクロックとする。RA4はI/O可
外部発振器には安価な物や高価でも精密な物で、安定した発振器がありますので、それらを使用します。
入力周波数は4MHZ~20MHZとなっています。
(5)GPR等のラベル定義、リセットベクタ・割込みベクタの記述 (画像10)
1)GPR(汎用データRAMレジスタ)のラベル定義
この辺の領域ではGPRの定義はもちろんですが、その他に定数ラベルやマクロ定義等を行えます。
しかし、ここではGPRの定義にとどめます。
PIC16F1705では、存在するGPRアドレスは下記の通りです
BANK00:20H~6FH(80バイト)
BANK01:A0H~EFH(80バイト)
BANK02:120H~16FH(80バイト)
BANK03:1A0H~1EFH(80バイト)
BANK04:220H~26FH(80バイト)
BANK05:2A0H~2EFH(80バイト)
BANK06:320H~32FH(16バイト)
共通RAM:70H~7FH(16バイトで、どのBANKにいても、このアドレスでアクセス可能)
当局はまず、ほぼ確実に使う、ウエイトルーチンの専用ワークをBANK0のGPRに定義します。(BANK0ならアドレスはどこでも良い)
いつどこでも使えるローカル変数的なtmp0~tmp3、32bit分(そのサブルーチンを抜けると破壊されること前提)
後は必要に応じて登録していく。それらは基本的にBANK0のGPR
BANK1以降のGPRは基本的にある程度まとまったメモリブロックとして使うバッファエリア等として使用
と住み分けすると良いかも、まあ各自の自由ですが。
共通RAMはどうでしょうか、当局レベルでは今まで使用必須の事例はほとんど無かったですが・・・
2)プログラムの先頭 (画像11)
PICのリセットベクタは0000Hで、インタラプトベクタは0004Hです。
電源投入時や、リセットが掛かった場合、PICは0000Hのアドレスから実行を開始し始めます。
そこで、プログラムの先頭は、
ORG OH ;リセットベクタ
と記載します。
「ORG」はプログラムの開始番地を指定するMPASMの疑似命令で、アッセンブラソース内に複数のORG命令があっても大丈夫です。
このソースファイルのプログラムは、電源投入時にここから始まると言う事を明記します。
すぐに割込みベクタが来ますので、ここでは「GOTO」命令で「INIT」と言うラベルにジャンプすると記載するのが常套手段です。
ORG 0H ;リセットベクタ アドレス
GOTO INIT ;事実上のプログラム先頭へGO!
以上の様に疑似命令とアッセンブラ・コードを記載します。
次に割込みベクタの指定です。
ORG 4H ;割込みベクタ アドレス
GOTO INT ;割込み処理ルーチンへGO!
あるいは、
ORG 4H ;割込みベクタ
INIT ;割込み処理ルーチンラベル
割込み処理コード
RETFIE ;割込み処理終了
と、4番地から割込みルーチンを記載し始めてもOKです。
そのあとは、プログラム本文を記載し始めます。
INIT ;本文ラベル
本文コード
と、ここまでは常套手段的先頭プログラム記載事項です。
ORG 800H
と記載すると、これ以降のソースコードはアドレス800Hから絶対アドレス配置されます。
しかし、リセットベクタと割込みベクタは必ずORG疑似命令で指定し、対応するソースコードを記載しておきます。
(6)機能レジスタ初期設定 (画像12,13)
すべての機能レジスタをイニシャライズする必要はありません。
基本的にはパワーオン・リセット時の初期値で放置して問題無い場合が殆どですが、そうで無いのも少しあります。
1)INTCONレジスタ BANK0
基本的にリセット時はGIE=OFFとなっているので、わざわざ設定しなくとも大丈夫なのですが、念のため。
CLRF INTCON
で、すべてのbitに0を書き込んでおきます。
2)PORTA、PORTC BANK0
すべてクリアしておきます
3)LATA、LATC BANK2
②の操作でクリアされていると思いますが、念のためクリア
4)OSCCON BANK1
必ず設定します。
OSCCONレジスタ
bit7 SPLLEN:ソフトウエアPLL設定ビット
1=4xPLL有効
0=4xPLL無効
※コンフィギュレーションワード:PLLEN=1の時、この設定は無視される
bit6-3 IRCF:内部発振器クロック選択ビット
1111=16MHZ HF
1110=8MHZ or 32MHZ HF
1101=4MHZ HF
1100=2MHZ HF
1011=1MHZ HF
1010=500KHZ HF
1001=250KHZ HF
1000=125KHZ HF
0111=500KHZ MF(リセット時のデフォルト値)
0110=250KHZ MF
0101=125KHZ MF
0100=62.5KHZ MF
0011=31.25KHZ HF
0010=31.25KHZ MF
000x=31KHZ LF
bit2 Unimplemented(Read = 0)
bit1-0 SCS:システムクロック選択ビット
1x=内部オシレータ ブロック
01=セカンダリオシレータ(タイマ1発振器)
00=コンフィギュレーションワード:FOSCビットによって決まるクロック
例1) 内部発振 32MHZ
コンフィギュレーションワード:FOSC=100、PLLEN=0
SPLLEN=1、IRCF=1110、SCS=00、OSCCON=F0H
例2) 水晶発振 8MHZ → 32MHZ
コンフィギュレーションワード:FOSC=010、PLLEN=0
SPLLEN=1、IRCF=1110(使用しない)、SCS=00、OSCCON=F0H
5)TRISAレジスタ(BANK1)、TRISC(BANK1)レジスタ
TRISAはRA0-5の入力か出力かの設定(RA3は入力のみ)
TRISCはRC0-5の入力か出力かの設定
リセット時は不定ですので、必ず設定します。
例1)TRISA=0FH:RA0-RA3まで入力、RA4-RA5は出力設定
6)ANSELAレジスタ(BANK3)、ANSELCレジスタ(BANK3)
ANSELレジスタはI/Oピンをデジタルかアナログかを設定します。
リセット時はすべてアナログになっているので注意が必要です。
例1)RA0をアナログ(ADC)入力、RA1、RA2をデジタル入力、RA4-RA5をデジタル出力
TRISA=07H
ANSELA=01H
7)設定終了時
BANK=0に戻しておく事を推奨します。
(7)ウエイトサブルーチン (画像14,15)
これはその、システムクロック周波数に合わせたルーチンを用意し、コピペして使います。
ほぼ必ず使うので、ソースの最後にでも「END」疑似命令と共に置いておくと便利。
(画像05)
プログラムタイトルを記載、行に「;」(セミコロン)があるとそれより右側はコメント
タイトル直下に「LIST」および「INCLUDE」疑似命令を記述します。
対応文字色は変更できるみたいですが、当局はデフォルトのままで使用しています。
プログラムタイトルを記載、行に「;」(セミコロン)があるとそれより右側はコメント
タイトル直下に「LIST」および「INCLUDE」疑似命令を記述します。
対応文字色は変更できるみたいですが、当局はデフォルトのままで使用しています。
(画像11)
「ORG」疑似命令でリセットベクタの開始番地を指定
指定直後に、「GOTO」命令でイニシャライズを行うアドレスにジャンプする
続いで、割込みベクタの開始番地を指定している
指定直後に割込みルーチンを配置している。
「GOTO」命令で別のアドレスに配置された割込みルーチンにジャンプでも良い
「ORG」疑似命令でリセットベクタの開始番地を指定
指定直後に、「GOTO」命令でイニシャライズを行うアドレスにジャンプする
続いで、割込みベクタの開始番地を指定している
指定直後に割込みルーチンを配置している。
「GOTO」命令で別のアドレスに配置された割込みルーチンにジャンプでも良い