PICプログラムの基礎

PICプログラムの基礎
プログラミング言語
• 高水準言語
人間にわかりやすい
機械的に効率が悪い
BASIC、FORTRAN、JAVA等
・低水準言語
CPUにわかりやすい
機械的に効率がよい
C、アセンブリ言語
アセンブリ言語の用途(1)
• CPUの性能をフルに引き出すプログラム
• 周辺機器の直接制御
• 高水準言語の構築
• CPU内臓ICへのプログラム
アセンブリ言語の用途(2)
• 定められた動きをすればよい
• 周辺機器を直接制御したい
• 大量生産が必要である
一度アセンブリ言語でプログラムし、ICそのも
のに書き込んでしまう
PIC
•
•
•
•
•
Microchip社のマイクロコンピュータ
電化製品などの制御に利用
CPU、プログラム、メモリ、周辺I/Oをすべて一体化
プログラムが簡単
安価
用途に応じさまざまな種類があるが、この基板
ではPIC16F84Aを使用する。
PICの動作(電源等)
• 電源 +5VをVdd、
アースをGND
• MCLRには+5V
(電源ON時の動作
安定のためのおまじない)
PICの動作(クロック)
• 20MHzの
クロックを
OSC1、OSC2に
与える
PICの動作(入出力)
• 任意のポートを
入力・出力に
設定可能
• ポートA
• ポートB
5BIT
8BIT
教材基板の回路
• ポートA:
RA2~RA4 トグルスイッチ1~3によるプログラム
選択
RA0、RA1 74HC139を介してTR9をプルアップ、
発光ダイオード列を「選択」する
• ポートB:
出力8bitが発光ダイオード8つに対応する
ポートAで発光ダイオード列を選択、ポートBで個々の
発光ダイオードを制御
教材PICボードの回路
• ポートAの2bit(RA0、RA1)で点灯するLED
群を切り替える
•
•
•
•
RA0=0、RA1=0
RA0=0、RA1=1
RA0=1、RA1=0
RA0=1、RA1=1
→
→
→
→
7セグメントLED1
7セグメントLED2
さいころ
8列LED
教材PICボードの回路
発光ダイオード
発光ダイオードが点灯するには
・アノード側がHIGH
・カソード側がLOW
教材PICボードの回路
教材PICボードの回路
LED点灯部分にのみ着目する
LED群は4セット
7セグメントx2、さいころ、8列LED
・PICのポートB(8bit)の出力がそれぞれのLE
D群に接続されている
・ポートの出力がLOW(0)のときLEDが点灯
する
ポート出力例
・数値 03HをポートAに出力
→ 8列LED を選択
・数値 0CBHをポートBに出力
0CBH→11001011→●●○○●○●●
プログラム(ポートA)
発光ダイオード列の「選択」
ポートAに
・2進数表記では
・16進数表記では03H
LLLHH
00011
プログラム(ポートB)
発光パターン
●○●●○○●○
ポートBに
LHLLHHLH
・2進数表記では 01001100
・16進数表記では04CH
実際のプログラム
• プログラムにはアセンブラを使う
ポートAに00011(03H)を出力せよ
ポートBに10110010(0B2H)を出力せよ
アセンブリプログラム
相当するアセンブリプログラムのコア部分
MOVLW
MOVWF
MOVLW
MOVWF
03H
PORTA
0B2H
PORTB
(実際には各種設定が必要なのでもっと長い)
PICプログラムの流れ
• アセンブリソースの作成(ASMファイル)
• MPASMによるアセンブル
→ 機械語(HEXファイル)の作成
• PICライターによるPICへの書き込み
PICプログラミング例
・全体的構造
初期設定
MAINLP
メインルーチン
GOTO MAINLP
TIMERルーチン
初期設定
;宣言
LIST P=FIC16F84A
;
INCLUDE "P16F84a.INC" ;標準ヘッダ定義ファイルのインクルード
; 変数レジスタの定義
CNT1
CNT2
CNT3
EQU
EQU
EQU
0CH
0DH
0EH
;タイマ用変数
;タイマ用変数
;タイマ用変数
; 入出力ポートの定義など
ORG 0
MAIN
BSF STATUS,RP0
;バンク1へ切り替え
CLRF TRISA
;TRISAをクリア
CLRF TRISB
;TRISBをクリア
BCF STATUS,RP0
;バンク0に戻す
メインループ
MOVLW 03H
MOVWF PORTA
;8列LEDを出力先に選択
MAINLP
MOVLW 0FH
MOVWF PORTB
CALL TIMER
;ポートBに出力
;少し待つ
・・・・・・・・・・・・・・・・・・・・・
MOVLW 0DH
MOVWF PORTB
CALL TIMER
GOTO MAINLP
;ポートBに出力
;少し待つ
タイマールーチン
; 0.4msec タイマ
TIM10 MOVLW 0F9H
MOVWF CNT1
TIMLP1 NOP
DECFSZ CNT1,F
GOTO TIMLP1
RETURN
; 100msec タイマ
TIM100 MOVLW 0F9H
MOVWF CNT2
TIMLP2 CALL TIM10
DECFSZ CNT2,F
GOTO TIMLP2
RETURN
; 0.5sec タイマ
TIMER MOVLW 5
MOVWF CNT3
TIMLP3 CALL TIM100
DECFSZ CNT3,F
GOTO TIMLP3
RETURN
END
;1
;1+1=2
;1+1+2=4
;2+4*249-1=997
;997+2=999*0.4μsec=0.4msec
;0.4msec *249(about)
;2+(999+2+3)*249-1=249997
;100msec * 5(about)
PICプログラミング例
・ポートへの出力の基本的パターン
MOVLW 0FH
MOVWF PORTB
CALL TIMER
;ポートBに出力
;少し待つ
・数値0FH→00001111 がポートBに出力され
る
アセンブリプログラム作成上の注意
・ラベルは行の先頭から書く
・命令はタブ、もしくは半角空白の後に書く
・コメントは“;”に続けて書く
・全角空白は使わない
MAINLP
←ラベル
MOVLW 0FH ←命令
;これはコメント
←コメント