教育用GM管開発を振り返って(8)その1

自作には工作技術のほかにマイコンやパソコンのプログラミング技術が必要になる。ここでは、7セグメントLED表示の7SEGGM管を例にとってPICマイコンのプログラミングについて解説したい。


必要なもの


マイコンにもいろいろあるが、PICマイコンを使い出した切っ掛けは、たまたま手に取った入門書がPICだったのと、「電子工作の実験室」というサイトの存在が大きい。偉そうに言っても、プログラミングは誰かのパクリから始まる。PICのマニュアルだけでアセンブラーが書けるわけもない。まずは、入門書の例を実際に確認していくことから始まった。その前に、PICを使用するにはプログラムを書き込むライターが必要だ。Microchip社の純正ライターは高いので、秋月電子製の同等品のキットを購入し、はんだ付けして作った。今でも使っていて問題はない。言語については、当時はアセンブラーだけが無料で利用できた。現在はC言語が無料で使用できるが、C言語は使ったことがない、というか、勉強したが、ポインターという考え方が理解できずに挫折した。Microchip社のマニュアルもアセンブラーで使用例が記述されている。


最初は情報館で


PICを使い始めたのは情報館の工作教室だった。何か、中学生に適した工作はないかと考えて思い付いたのはロボットだったが、予算的に実現が難しい。何とか千円程度の部品代で済む工作はないかと考えて、特別にワークショップという枠を設け、PICを使った工作物を展開した。バーサライターといって情報館にも展示物があって振ると文字が見えるという工作を手始めに、ベンハムのコマ、赤外線リモコン、走行モジュール、電子サイコロなどを実施した。これで、かなりプログラミングの腕を上げたと思う。バーサライターこそパクリだったが、ベンハムのコマはモーターの回転制御、赤外線リモコンはパルス制御、電子サイコロは乱数の実現などの課題があった。


7SEGGM管のPICプログラム


「らでぃ」の実験集に掲載しているが、以下に一部を抜粋して解説する。


最初はコンフィギュレーションで始まる。品番と基本的なスイッチの選択を指定する。この部分だけは他の部分と書式が違っている。一般的には、ラベル、命令など、引数など並んでいる。PICは、使い慣れた16F84Aの後発品で機能をアップした16F819を使用した。

INCLUDE "P16F819.INC"
LIST P=16F819
__CONFIG _INTRC_IO & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _MCLR_OFF & _LVP_OFF & _CP_OFF

ここで、MCLRをOFFにしたのは、PICの4番ピンを10秒率への切り替え判定に使用したことによる。
次はファイルレジスタの定義。Nの列は変数で0x20などはメモリー位置を表す。;以下はコメント。

N	EQU	0x20		;Converter to 7seg-LED
ON	EQU	0x21		;Pulse detection flag
TU	EQU	0x22		;Counter for 1sec-timer
WB	EQU	0x23		;Backup of STATUS
SB	EQU	0x24		;Reset of W
TM	EQU	0x25		;Counter for 10sec-timer
LX	EQU	0x26		;Dynamic light-on
N1	EQU	0x27		;10^0
N2	EQU	0x28		;10^1
N3	EQU	0x29		;10^2
N4	EQU	0x2A		;10^3
N5	EQU	0x2B		;Holder of N1
N6	EQU	0x2C		;Holder of N2
N7	EQU	0x2D		;Holder of N3
N8	EQU	0x2E		;Holder of N4
HF	EQU	0x2F		;Hold Flag

次がプログラムの最初で、実行もここから順に行われる。タイマーTMR0による1秒間を作り出す割込みのための割込み処理を記述している。この1秒ごとのクロックは常時動作している。第2カラムは命令で、確か35ある命令のうち必要なものだけを覚えればよい。数値は、主に2進数か8進数で表示されている。つまり、1から255までの8ビットに相当する数値を表している。

ORG	0		;リセットベクタ
GOTO	START
ORG	4		;割込みベクタ
BCF	INTCON,TMR0IF	;割り込みフラグをクリア
MOVWF	WB		;Wレジスタ退避
SWAPF	STATUS,0	;STATUS取り出し
MOVWF	SB		;STATUS退避
BANKSEL	TMR0
MOVLW	0xD9		;カウント値=217(=256-39)を再ロード
MOVWF	TMR0
INCF	TU,1		;TUレジスタをカウントアップ
BCF	PORTA,0		;全消灯
BCF	PORTA,1
BCF	PORTA,2
BCF	PORTA,3
INCF	LX,1		;LXレジスタをカウントアップ
MOVF	LX,0
ADDLW	0xFC
BTFSC	STATUS,C	;LX=4ならばリセット(LX=0)
CLRF	LX
SWAPF	SB,0		;STATUS戻し
MOVWF	STATUS
SWAPF	WB,1		;Wレジスタ戻し
SWAPF	WB,0
RETFIE

次では主にCPUの速度、入出力ポート、タイマーTMR0の時間間隔、計数レジスターなどの初期値を指定しており、最初に1回だけ実行される。

START
	BANKSEL	OSCCON
	MOVLW	B'01110100'	;内部クロック8MHz
	MOVWF	OSCCON
	BANKSEL	ADCON1
	MOVLW	B'00000110'	;All pins as digital I/O
	MOVWF	ADCON1
	BANKSEL	TRISA
	MOVLW	B'11110000'	;RA4-RA7を入力ポート、RA0-RA3を出力ポート
	MOVWF	TRISA
	BANKSEL	TRISB
	MOVLW	B'00000000'	;RB0-RB7を出力ポート
	MOVWF	TRISB
	BANKSEL	OPTION_REG
	MOVLW	0x87		;256カウントモード指定
	MOVWF	OPTION_REG	;プリスケーラへ出力
	BANKSEL	TMR0
	MOVLW	0xD9		;カウント値=217(=256-39)
	MOVWF	TMR0		;タイマーへ出力
	BCF	ADCON0,ADON
	BSF	INTCON,TMR0IE	;タイマ割り込み許可
	BSF	INTCON,GIE	;全体割り込み許可
	CLRF	N1		;N1,N2,N3,N4は1位から4位
	CLRF	N2
	CLRF	N3
	CLRF	N4
	CLRF	N5		;N5,N6,N7,N8は保持用
	CLRF	N6
	CLRF	N7
	CLRF	N8
	CLRF	TU
	CLRF	LX
	CLRF	ON
	CLRF	TMR1H
	CLRF	TMR1L
	BSF	HF,0		;Hold ON

次からが実行の本体で反復して実行される。ここで、まず、1秒率の測定か、10秒率の測定かを判断する。

MAIN
	BCF	INTCON,TMR0IE	;タイマ割り込み禁止
	CALL	DSP		;7seg-LED display
	BSF	INTCON,TMR0IE	;タイマ割り込み許可
	BSF	INTCON,GIE	;全体割り込み許可
	BTFSS	HF,0		;If Hold Flag is set
	CALL	LEDOFF		;If Hold Flag is clear
	BTFSS	PORTA,5		;Sellect SW
	GOTO	SEL10		;Sellect SW is clear

7セグメントLEDは起動とともに1秒率の表示で始まって、計数ブロックのCINIで計数し、1秒ごとに表示、1秒間保持をする。

SEL1				;Sellect SW is set(count/1sec)
	BSF	HF,0
	MOVF	TU,0		;TUレジスタが200でリセット(5msec*200=1sec)
	ADDLW	0x38		;256-200=56=0x38
	BTFSS	STATUS,C
	GOTO	CINI		;Counting
	CLRF	TU
	MOVF	N1,0		;計数保持		
	MOVWF	N5
	MOVF	N2,0
	MOVWF	N6
	MOVF	N3,0
	MOVWF	N7
	MOVF	N4,0
	MOVWF	N8
	CLRF	N1
	CLRF	N2
	CLRF	N3
	CLRF	N4
	GOTO	MAIN

ボタンスイッチを押すと10秒率の表示に切り替わる。CINIで計数すると同時に、サブルーチンHFEXが呼ばれて10秒率のフラッグがONであることを確認し、7セグメントLEDにカウントダウンが表示される。10秒経つと10秒間のカウント数が表示され、次にボタンスイッチが押されるまで表示が保持される。

SEL10				
	MOVF	TU,0		;TUレジスタが200でリセット(5msec*200=1sec)
	ADDLW	0x38		;256-200=56=0x38
	BTFSS	STATUS,C
	GOTO	CINI
	CALL	HFEX
	CLRF	TU
	INCF	TM,1		;TM=TM+1(sec)
	MOVF	TM,0
	ADDLW	0xF6		;256-10=246=0xF6
	BTFSS	STATUS,C
	GOTO	CINI
	CLRF	TU
	CLRF	TM

以下が10秒率の表示になる。

SELX				;10sec毎に表示
	MOVF	N1,0		;計数保持		
	MOVWF	N5
	MOVF	N2,0
	MOVWF	N6
	MOVF	N3,0
	MOVWF	N7
	MOVF	N4,0
	MOVWF	N8
	CLRF	N1
	CLRF	N2
	CLRF	N3
	CLRF	N4
	GOTO	MAIN

以下は、教育用GM管開発を振り返って(8)(その2)に続く。


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)