PIC16F84電子遊戯(4)
最終更新日:2000年12月28日

テストプログラムのソースリスト
プログラムリストの説明に入る前に、統合開発環境MPLABのセットアップをします。
詳細は書籍「PIC活用ガイドブック 後閑哲也著 技術評論社」に譲るとして、添付のCD-ROMに収録されていますので、インストールしましょう。
この環境でエディタでのソースリスト入力からアセンブル、デバッグまで全てPC上で出来るようになります。
起動は スタート>プログラム>Microchip MPLAB>MPLAB で行います。
ポイントは環境設定でデバッグ可能なように設定することです。そうしないとエディタしか動かすことが出来ません。(書籍に詳しく載っていますので、そちらを見て下さい。)
;**********************************************************************
;    Filename:	    ledtest.asm                                     *
;    Date:          2000/12/16                                        *
;    File Version:                                                    *
;**********************************************************************

	list      p=16F84             ; list directive to define processor
	#include <p16F84.inc>         ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;***** VARIABLE DEFINITIONS
w_temp        EQU     0x0C        ; variable used for context saving 
status_temp   EQU     0x0D        ; variable used for context saving

count_data	EQU	0x10		;500msec keisoku count ram
led_data	EQU	0x11		;LED set data

tm0_setdata	EQU	0b2h	;FFH-B2H=77  77*256=19.7msec
cnt_setdata	EQU	19h	;19.7*25=492.5msec
;**********************************************************************
		ORG     0x000             ; processor reset vector
  		goto    main              ; go to beginning of program


		ORG     0x004             ; interrupt vector location
		movwf   w_temp            ; save off current W register contents
		movf	STATUS,w          ; move status register into W register
		movwf	status_temp       ; save off contents of STATUS register

		;---------------------------------	
		bcf	INTCON,T0IF
		movlw	tm0_setdata
		movwf	TMR0

		decfsz	count_data,1
		goto	next_int
time_up		movlw	cnt_setdata		
		movwf	count_data
		decf	led_data,1
		nop	
next_int
		nop
		;----------------------------------

		movf    status_temp,w     ; retrieve copy of STATUS register
		movwf   STATUS            ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		retfie                    ; return from interrupt



main
		call	port_set
		movlw	00h
		movwf	PORTA
		movlw	0ffh
		movwf	PORTB

		call	timer0_set
		movlw	cnt_setdata		
		movwf	count_data
		movlw	0ffh
		movwf	led_data

main_loop
		
		movf	led_data,0
		movwf	PORTB

		goto	main_loop

port_set
				;RA0,RA1,RA2(OUT)
				;RA3,RA4(IN)
				;RB0,RB1,RB2,RB3,RB4,RB5,RB6,RB7(OUT)
		bsf	STATUS,RP0
		clrf	TRISA
		bsf	TRISA,3
		nop
		bsf	TRISA,4	
		clrf	TRISB
		bcf	STATUS,RP0
		return

timer0_set

		bsf	STATUS,RP0
		movlw	087h		;(1)PORTB NOT PULLUP
					;(0)INTEDG
					;(0)TOCS
					;(0)TOSE
					;(0)PSA
					;(111)1/256
		movwf	OPTION_REG
		bcf	STATUS,RP0
		
		movlw	tm0_setdata
		movwf	TMR0
		bsf	INTCON,T0IE
		bsf	INTCON,GIE
		return


		END                     ; directive 'end of program'
(テストプログラムのソースリスト)
ソースリストの雛形を開く
MPLABの中には各マイコンチップ用の雛形(テンプレート)ファイルが入っています。
そのリストを使用してソースリストを書くと大変便利です。
上の赤字の部分がその雛型ファイルを利用した部分です。インクルードファイルの設定や割り込み処理などが記述されていますので、そのまま使用しましょう。
雛形ファイルは file>open>mplab>template>code>f84temp.asm で開くことが出来ます。
コンフィギュレーションビットの設定
PIC書き込みソフト「PICEE」でも出てきましたコンフィギュレーションビットの設定について説明します。この設定はPICの動作状態などを指定するところです。
ソースリスト上の

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

の部分がこれにあたります。
_CP_OFF
プログラム領域のプロテクト指定です。趣味として開発していますので、プロテクトの必要はありませんのでOFFにしています。
_WDT_OFF
ウオッチドックタイマー使用の設定です。これも変に効いてしまうとややこしいのでOFFにします。
_PWRTE_ON
電源ONリセット機能の設定です。これはONにして電源ONリセットを許可しましょう。
_XT_OSC
発振素子回路の指定です。ここでは4MHzのセラミック発振子を使いますので、通常のセラミック発振モードにします。
ポートの設定(call port_set
ポートの入出力の設定を行います。
それぞれPORTAをTRISA、PORTBをTRISBのレジスタにデータを書き込むことによって入出力を設定します。入力は「1」、出力は「0」を設定します。
TRISA、TRISBのレジスタはbank1に存在しますので、設定の際はbankを1に切り換えて設定し(
bsf STATUS,RP0)、設定後は元(bcf STATUS,RP0)に戻します。
テストボードはRBポートを全て出力に、RAポートは3,4を入力に、0,1,2を出力に設定しました。RBポートにはLEDが直接つながっていますので、初期には点灯しないようにHに設定しましょう。
--- --- --- PA4 PA3 PA2 PA1 PA0
(TRISA)
PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
(TRISB)
タイマー割り込みの設定(call timer0_set)
今回のテストボードの動作は約0.5秒ごとにLEDが変化するようにしています。
このLEDの変化にはタイマー割り込みを利用しています。
タイマー割り込みの設定にはOPTION_REGにデータを設定します。
RBPU INTEDG TOCS TOSE PSA PS2-0
(OPTION_REG)
RBPU
PORTBのプルアップ設定です。今回はプルアップしないので「1」を設定します。
INTEDG
INTピンの割り込みエッジ設定です。今回は関係ありませんので「0」に設定します。
TOCS
タイマーのクロック設定です。今回は内部クロックを使用しますので「0」に設定します。
TOSE
タイマーの入力エッジ指定です。今回は関係ありませんので「0」にしましょう。
PSA
プリスケーラの切り換え設定です。今回はタイマーに使用しますので「0」にします。
PS2-0
プリスケーラの設定値です。今回は「111」にしてタイマークロックを256分周して使用します。発振子が4MHzの時はタイマーの基本クロックは1usecなので、256usecごとタイマーカウンタがカウントアップすることになります。
以上より今回のテストボードのOPTION_REGには87hを設定します。
movlw 087h
movwf OPTION_REG

このOPTION_REGもbank1に存在しますので、設定の時は必ずbankを1にします。
タイマーカウンタは8bitがオーバーフローすれば割り込み処理に飛びます。
今回は約20msecごとに割り込みが掛かるように設定します。
タイマーカウンタは256usecごとにカウントアップしますので、77回カウントすれば19.7msecごとに割り込みを掛けることが出来ます。
従って255-77=178=B2Hをタイマーカウンタの初期値に設定すれば良いことになります。
movlw tm0_setdata / (tm0_setdata EQU 0b2h)
movwf TMR0
割り込みの許可
タイマー割り込みの初期設定を行った後は、タイマー割り込みの許可を行い、全体の割り込みの許可を行います。
bsf INTCON,T0IE
bsf INTCON,GIE
割り込み中の処理
上記の設定通り割り込みは約20msecごとに掛かります。
割り込みに入ったらまず、タイマー割り込みフラグをクリアして、次の割り込みが掛かるように設定します。
bcf INTCON,T0IF
movlw tm0_setdata
movwf TMR0
約20msecごとの割り込みのためこれを25回数えて約0.5secの時間を作り出します。
19.7msec*25=492.5msec
実際には割り込みごとに
count_dataの内容を減らして「0」になれば表示用LEDのデータを変化させています。表示用LEDのデータはled_dataに割り付けてあるので、そこのデータを操作しているだけです。
メイン処理
メインルーチンはえらい簡単です。表示用LEDのデータled_dataをPORTBに出力しているのを繰り返しているだけです。実際にには割り込みで表示用データが変化しているので、メイン処理でLEDが変化しているように見えるのです。
movf led_data,0
movwf PORTB
goto main_loop
どうです、簡単でしたよね。これぐらいの内容ですから。
もちろん、どういう命令がどのような処理をするかはきちんと理解していないといけないですが、一度に全て覚えようとしないで、出てきた命令から順に理解していけば良いと思います。
さて、テストボードで初期設定と割り込み処理を勉強出来た(?)ので、次回からはもう少し高度な(といっても基本の組み合わせばかりですが・・・)内容に突っ込んでいきましょう。
これからもどんどん楽しくなる「PIC16F84電子遊戯」をよろしく。

不明点などあればメールお願いいたします。nonchansoft@nifty.com

Copyright(c)2000-2001 nonchansoft