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 |