【 取り扱い説明書 】


 Flash PIC には、まだたくさんのバグが残っている可能性があります。見つけ次第修整していきます。
不運にもバグに遭遇されました折にはぜひデジタル降魔録にあるBBS等でお知らせください。

Flash PICのページへ戻る
勝手にQ&Aへ戻る
デジタル降魔録のトップページへ戻る



【 目次 】


【搭載しているPICについて】 このページの先頭

 基板上に載っているPICは仮想のものでFPIC16F999という型番ですが、命令は14ビット語長
のPICに準拠しています。
28ピンデバイスで、7ビットの入出力ポートAと、8ビットの入出力ポートB、Cを持っています。
 残りのピンは電源とクロック・リセットピンです。

 SFR(Special Function Register)の割り当てアドレス
アドレスレジスタ名説明
0x00INDF間接アドレス用
0x01TMR0タイマー0(現在準備中)
0x02PCLプログラムカウンタの下位8ビット
0x03STATUS演算結果のフラグ(Zerro=bit2 とCarry=bit0しかありません)
0x04FSR間接アドレス設定用
0x05TRIS_AポートAの入出力設定用(1:入力ポート 0:出力ポート)
0x06TRIS_BポートBの入出力設定用(1:入力ポート 0:出力ポート)
0x07TRIS_CポートCの入出力設定用(1:入力ポート 0:出力ポート)
0x08PORT_AポートAの内容
0x09PORT_BポートBの内容
0x0APORT_CポートCの内容
※アドレス0x0B(11)~0x15(21)がユーザーエリアです。汎用ファイルレジスタとして自由に使えます。
(0x16~0x7Fまでは確保してありますが、Watchテーブルには表示されません)

 FlashPICは16F84、877あたりをシミュレートできます。ただし、割り込み機能がありませんので次の命令は動きません
● RETFIE

 次の機能は搭載されていません。
● 割り込み機能
● タイマ機能(タイマ0のみ準備中)
● A/D変換機能
● USART機能
● MSSP機能
● パラレル通信機能
● キャプチャ・コンペア機能
● WDTとSLEEP機能
● EEPROM機能
● プログラムメモリへの書き込み機能

 次の制約があります。
● プログラムエリアは0~0x1FFの512アドレスまで。プログラムエリアのページは0に固定されてます
● スタックは2レベルまで
● PCLATHはありません。従ってPCregの加算処理は、そのときのアドレスの0xFFまでとなります



【トレーニングボード1のハード構成】 このページの先頭
 

 トレーニングボード1には8個のLEDと1個の7セグメント表示器、1個の押しボタンスイッチが基板上にあります。
 さらに、外部機器として〝ちきどん〟というACモータで回転するユニットが接続されています。
 〝ちきどん〟には回転歯車に4個のマイクロスイッチが取り付けられており、スティックが当るとそのマイクロスイッチがONになります。これらはトレーニングボードのPICに配線されていますのでプログラムでスキャンできます。
 また、〝ちきどん〟を作動させるためのリレーがトレーニングボード上にあり、〝ちきどん〟の回転のON/OFFがコントロールできます。

 各ポートの接続先は
 ポートA0(入力)→基板上の押しボタンスイッチ
 ポートA1~A4(入力)→〝ちきどん〟に取り付けられているマイクロスイッチ1~4
 ポートA5(入力)→未使用
 ポートA6(出力)→〝ちきどん〟をON/OFFさせているリレーへ(0でリレーがONになり〝ちきどん〟が動きます)

 ポートB0(出力)→7セグメント表示器のセグメント〝a〟
 ポートB1(出力)→7セグメント表示器のセグメント〝b〟
 ポートB2(出力)→7セグメント表示器のセグメント〝c〟
 ポートB3(出力)→7セグメント表示器のセグメント〝d〟
 ポートB4(出力)→7セグメント表示器のセグメント〝e〟
 ポートB5(出力)→7セグメント表示器のセグメント〝f〟
 ポートB6(出力)→7セグメント表示器のセグメント〝g〟
 ポートB7(出力)→7セグメント表示器のセグメント〝Dp〟
 すべて1で点灯します

 ポートC0~C7(出力)→LED0~7
 すべて1で点灯します
 ボード1の回路図


【トレーニングボード2のハード構成】 このページの先頭
 

 トレーニングボード2には7セグメント表示器が8個と、押しボタンスイッチが20個搭載されています。

 8個の7セグメント表示器を表示させるには、通常ダイナミック点灯方式で回路を組みますが、Flash PICではあまりにも速度が遅いため、この方式では点滅してしまい正しく表示できません。
 そこでコスト高になりますが、汎用 ICの74LS374を8個使ったスタティック点灯方式にしました。
 74LS273でも同じ回路を作れますが、出力電流が10mAも取れないので、24mAほど流せる74LS374を使用しました。

 このあたりは現実的に本気でこだわってますが、マジでこんな回路を仕事場で組んだら「バカもの!」と叱られます。
でも、Flash PICでは何個部品を使おうとタダです。絵ですからね(笑)

 20個のスイッチは簡単なキーボードとして機能します。
 イメージとしては、0~15のスイッチは16進を入力、16~19は〝RUN〟〝CLR〟〝CAN〟〝SET〟キーとして刻印が打ってありますが、プログラム次第では汎用キーとして利用できます。
 20個のスイッチはダイナミックスキャン方式で読み取ります。この方式もPICの速度が要求されますが、人間がマウスでボタンを押す動作はかなりゆっくりです。7セグメント表示器ほどの速度は要求されませんが、それでも10倍速ほどに上げないと、長いあいだマウスで押しておかないと反応しません。
 ダイナミックスキャンの具体的な方法は下記の〝●キーボードをダイナミックスキャンする方法〟かトレーニングボード2のサンプルプログラムの1番を実行してみてください。


 ●各桁の表示器へのアクセス方法
① 書き込みたい表示データをポートCへ載せます。データ構成は点灯するビットを〝0〟とします。
② 書き込みたい桁のアドレス(0~7番)のデータをPB1,2,3へ出力します。
③ PB0をLoにして、すぐHiにしますと、アドレスで選んだラッチ回路にポートCのデータが書き込まれて表示器が点灯します。
※リセット直後はデタラメなデータが表示されますので初期設定でクリアする必要があります。


 ●キーボードをダイナミックスキャンする方法
① キーグループ(PB4~PB7)を順にLoにするスキャンループ処理を作ります。
② スキャンループの中でキービットデータ(PA0~PA4)を随時読み取り、Loのビットがあった場合キーが押されています。
③ そのときのキーグループとキービットデータのLoになっているビットから押されたキーを特定します。
※詳しくはトレーニングボード2のサンプルプログラムの1番を読み込んでソースプログラムをご覧ください。
 ダイナミックスキャンは常にスキャンし続ける必要があり、スキャン処理にかなりのCPUパワーを使われますので、Flash PICの速度は10倍速以上にする必要があります。速度が遅いとキーの反応が悪くなります。

 ボード2の回路図




【Flash PICの使い方】 このページの先頭

 Flash PICはトレーニングボードですので、そのままでは何も動きません。実際にプログラムを書いて、基板上のものをコントロールしてPICプログラムの勉強をしようとするものです。
 サンプルプログラムを数点用意しましたが、これも読み込むだけでは動きません。読み込んだプログラムをPICの理解するマシン語にアセンブルして転送してやる必要があります。

 実際にサンプルプログラムを読み込んで動くようになるまでの工程を紹介します。

サンプルプログラム3を読み込んで動かしてみます。
 
〝ちきどん〟の装備されているトレーニングボード1を選んで、SAMPLEボタンを押しサンプル一覧の中から
3つ目の〝7セグメント表示器の中をグルグル廻します〟を選びます。




 
 ソースプログラムがソースウインドウに読み込まれましたので、編集ボタンを押して編集画面を出します。




 
ソースウインドウに読み込まれたソースプログラムが表示されています。
このままではソースプログラムを読み込んだだけで、プログラムエリアにアセンブルされていませんので動きません。

次に写真の〝Build〟ボタン(①)を押します。

編集画面の詳しい使い方は下記をご覧ください。必要の無い方は読み飛ばして〝Build〟ボタンを押した写真へ進んでください。


編集画面の使い方
ソースウインドウ内をクリックするとキーボードからプログラムの編集ができます
ウインドウ内を全て選択してコピーした後、メモ帳などの別のアプリケーションへプログラムを移動させることができます。
逆にメモ帳などのエディッタで作成されたプログラムをコピーしてFlash PICのソースウインドウへ貼り付けることも出来ます。

各種ボタンの説明
 
①:ソースプログラムをPICのマシン語に変換して隣のプログラムエリアに送ります。エラーがあるとエラーリストが出ます。
②:現在のソースプログラムを保存します。次回このページを開くと再読み込みされます。
  ひとつのソースプログラムしか保存できません。いくつも保存する時はソースプログラムを全て選択して、メモ帳など外部エディッタへ移動させてから、お使いのコンピューターへ保存してください。
③:PICのピン情報が出ます。
④:ソースプログラム内を消去して初期状態にセットします。
⑤:ソースプログラム内をスクロールさせます。

   ソースウインド側(右)のボタン類




 
⑥:プログラムエリア内の選択されている行にブレークポイントを設定します。プログラムを走らるとブレークポイントの位置で停止します。
⑦:PICのメモリー内を一覧表示するWatchウインドウが出ます。
⑧:PICをリセットさせてプログラムのスタート番地を0番に戻します。
⑨:クリックするたびにプログラムを1行ずつ実行します。⑦のWatchウインドウも更新されます。キーボードの〝S〟キーを押してもワンステップできます。
⑩:プログラムをスタートさせます。ブレークポイントが設定されているとその位置で停止し、⑦のWatchウインドウも更新されます。
・プログラムエリア内のニーモニックは大文字表記でも小文字表記でも切り替えることができます。
・ブレークポイントは1ヶ所しか設定できません。
・リセットボタンを押すと、実際のPICと同じように入出力設定のファイルレジスタと、プログラムカウンターのみが初期化されます。ボード1の場合、CN1をクリックすると電源を切ったときと同じように、Flash PIC内のすべてのレジスタ類が初期化されます。

   逆アセンブラウインド側(左)のボタン類







〝Build〟ボタンを押した時の写真
 
ソースウインドウの〝Build〟ボタンを押した時の写真です。
サンプルプログラムにはエラーがありませんので、ソースプログラムに手を加えない限り、エラー無しのエラーリストが出ます。
プログラムエリア内にマシン語が送り込まれ、逆アセンブラされたものが表示されています。




 
エラーリストと編集画面(EDIT画面)を消して①〝RUN〟ボタンを押します。
 ②〝+〟ボタンを押すとFlash PICの速度を上げることができます。トレーニングボードの反応が鈍い時などは
 20倍速まで上げることができます。
サンプル3では1~2倍速が適当です。(2GHzのWindowsマシンで)




 
7セグメント表示器の中のLEDがプログラムによってグルグル廻っているのが見れます。



【ソースプログラムの書き方】 このページの先頭

・ソースプログラムはMPASMフォーマットです。
・数値表現は10進数はそのまま、16進数は頭に〝0x〟をつけます。現時点ではこの二種だけです。
・サブルーチンコールやジャンプ先はラベルが使用できます。
・定数設定にもEQU擬似命令で設定されているラベルが使用できます。
・擬似命令は〝org〟と〝EQU〟のみ使用できます。
・格納先の指定(ディスティネーション)は下記の6種類の表記が許されています。
●Wレジスタへ格納する時
   〝to_W〟 〝to_w〟  〝W〟 〝w〟 〝 W〟(Wの前にひとつのスペース) 〝 w〟(wの前にひとつのスペース)

●レジスタへ格納する時
   〝to_F〟 〝to_f〟  〝F〟 〝f〟 〝 F〟(Fの前にひとつのスペース) 〝 f〟(fの前にひとつのスペース)


【ソースプログラムの例】
下記はMicrochipで公表されている"0"~"65535"までの10進数を16進数に変換するプログラム(FlashPICのサンプルプログラム5)です。

赤字は説明のための文章で、プログラムには一切関係ありません。

通常最初にヘッダ定義というPICデバイスが持つファイルレジスタなどのアドレス設定を行います。
		↓ EQU擬似命令・・・INDFというラベルに0x00を設定しています
INDF 		EQU	0x00
PCL			EQU	0x02
STATUS		EQU	0x03
FSR			EQU	0x04	 ↓ 〝;〟から後ろはコメントとなってプログラムの説明を書きます
TRIS_A		EQU	0x05 	;Port-Aの入出力ピン設定レジスタ
TRIS_B		EQU	0x06	 ↑コメントはプログラムには直接影響出ません
TRIS_C		EQU	0x07
PORT_A		EQU	0x08
PORT_B		EQU	0x09
PORT_C		EQU	0x0A
;
; 使用するメモリー類のアドレス設定
使用するメモリーを指定するには、プログラム上で直接アドレスを指定しても間違いではありませんが、
修整が困難になったり、間違いが頻繁に起きますので通常は下記のようにEQU擬似命令を使ってあらかじめ設定します。
FPIC16F999は0x0B(11番地)から汎用メモリ(ユーザーファイルレジスタ)となっています。
H_byte		EQU	0x0B ←プログラムで使うH_byteという名前に0x0B番地を割り当ててます。
L_byte		EQU	H_byte+1 ← 演算子を使ったEQU擬似命令使用例・・・H_byte=0x0Bなのでここは0x0Cとなります	
R0			EQU	L_byte+1 ←同じようにL_byte=0x0CなのでR0=0x0Dとなります
R1			EQU	R0+1 このようにするとH_byteの設定値を変えるだけですべてが変更できます
R2			EQU	R1+1 PICによって汎用メモリのアドレスが異なりますのでこのような使い方をします
;
H_temp		EQU	R2+1	; temporary register
L_temp		EQU	H_temp+1; temporary register
;

↓ EQU擬似命令でPA_INIというラベルに定数をあらかじめ設定
PA_INI		EQU	0x3F	;PORT_Aの入出力ピン設定用のデータ
多くの場所で同じ設定値を使用するときは、ここの1ヶ所を変更するだけですべての変更できますので
このような使い方をよくします。
;
		↓ org擬似命令 ここからプログラムコードを書くように指示しています
		org	0x00
		goto    main   ;FlashPICはリセットすると0番地から走り出しますのでメイン処理へ飛ばしています
;
───────────────────────────────────
 サンプル5では下記のようにサブルーチンが並んでいますが、説明からは省略します
mpy10b
		andlw   0x0F
		addwf   L_byte, F
		btfsc   STATUS,0
		incf    H_byte, F
mpy10a
		bcf     STATUS,0        ; multiply by 2
    |
  以下省略
    |
─────────────────────────

main
;
 このプログラムでは走り出してすぐにここへ飛ぶように指定されています。
 サンプル5では下記の記載はありませんが、ふつうはプログラム先頭でポート関係の初期化を行います。

		MOVLW	PA_INI ← EQU命令でPA_INI=0x3FとしていますのでMOVLW  0x3Fと同じ意味で、
		MOVWF	TRIS_A	; つまり全をポートを入力ポートに初期化していいます。サンプル5では必要ありません。
		CLRW
		MOVWF	TRIS_B
		MOVWF	TRIS_C
		MOVWF	PORT_B
		MOVWF	PORT_C

 		MOVLW   0x06		;ここで変換する10進数をセットしています。
		MOVWF   R0      ; Set R0 = 06(最上位)
		MOVLW   0x55
		MOVWF   R1      ; Set R1 = 55
		MOVLW   0x35
		MOVWF   R2      ; Set R2 = 35 (最下位)
				; ( R0, R1, R2 = 6,55,35 )
				;上記のメモリを使って10進を16進変換します
【注意】	"0x	"を付けて16進表記しているところに注目してください。たとえば、
 		MOVLW   0x00
		MOVWF   R0  
		MOVLW   0x00
		MOVWF   R1  
		MOVLW   0x16
		MOVWF   R2  
10進数"00016"を16進数変換しようとして(答えは"0x10"ですが)"0x16"を間違って"16"と10進表記で記載すると、
アセンブラは一旦16進の"0x10"と変換して、それをメモリR2に入れますので、"10"を変換するとして
それを16進変換しますので、答えとして "0x0A"を返しますのでご注意ください。
こういう設定数の部分は16進表記に統一したほうが間違いが起きません。

			↓ CALL先のラベル名・・・BCDtoBをサブルーチンコールして処理後、戻ってきます
		CALL    BCDtoB  ; After conversion H_Byte = FF 
						;& L_Byte = FF
						;変換後 :最上位=H_Byte
						;    :最下位=L_Byte に入る
↓ ジャンプ先のラベル名
self:
		GOTO    self←これはselfというラベルへジャンプする命令です。
 selfはこのGOTO命令の書かれている番地ですのでプログラムは永久にselfへ飛び続けて見た目停止します。
 それではWacthパネルを出してH_ByteとL_Byteをご覧ください。
 10進数 "65535" を16進に直して "0xFFFF" となっています。

;
;
		org	0x020 ←再び〝org〟擬似命令でアセンブルアドレスを0x20に変更しています。
				よって、BCDtoBのサブルーチンは0x20番地からアセンブルされます。
; サブルーチンBCDtoB・・・・・
BCDtoB:
		MOVF	R0,to_W
		・・・・・・・・・・・
		


【書式の制約】

CNT	EQU	0x0B
		org	0x00
↓ラベル名	↓ニーモニック	↓オペランド	↓コメント
BCDtoB:		MOVF		R0,to_W		;R0をWregに   
コメント以外はすべて半角英数字で書きます。
●ラベル名
 ・行の先頭から書きます。
 ・アルファベットで始まる半角英数字で最後に〝:〟コロンで終わります。コロンは無くてもいいですが、一目でラベルと見分けられますので付けたほうがいいかもです。
●ニーモニック
 ・行の先頭からひとつ以上のスペースあるいはタブが必要です。
●オペランド
 ・ニーモニックの次に1個以上のスペースかタブで区切ります。
 ・オペランドが続く場合はスペースを空けずに〝,〟カンマで区切ります。
 ・格納の先の指定(to_Wなど)の場合のみ〝,〟の次に1個のスペースは許可されます。
●コメント
 ・オペランドからひとつ以上のスペースかタブで区切り、〝;〟セミコロンから始まり行の最後まで(改行位置)に書けます。
  コメントは全角文字が使用できます。
 ※ソースは1行で完結する必要があります。コメントが長くなって2行にまたがる(折り返す)と行番号が狂いますので右端までに改行してください。
●org擬似命令は行の先頭から1文字以上のスペースかタブが必要です。

 ※ソースプログラムはウインドウの右端までで改行するようにしてください。エラー時の行番号が狂ってきます。
 コメントが長くなる場合は、一度改行して下の行に〝;〟を挿入後、続けるようにします。