教育用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:TJOがid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)