コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」

コンピュータ系実験Ⅲ
「ワンチップマイコンの応用」
第2週目
実験内容

LED点灯回路の制御プログラムの作成
 MPLABを用いたノートPC上でのシミュレーション
 実験書16ページ、図10の回路を用いて実機動作
(課題3のみ)

PICのアセンブリ言語でのプログラミング
ここで少し先週の復習
アセンブリ言語とは?

こういう感じのものです。
ORG
BSF
CLRF
BCF
CLRF
MOVLW
MOVWF
・・・・
0
STATUS,RP0
TRISB
STATUS,RP0
PORTB
55H
PORTB
アセンブリ言語とは?
プロセッサが解釈可能な言語(機械語)を人
間が理解可能な形にした低水準言語
⇔高水準言語,高級言語 ex)C言語, Java
 ニーモニックともいう
 プロセッサごとに定義された命令を用いる

 プロセッサによって言語仕様が異なる
Ex) PICとPentiumでは全く異なる命令
 PICでは35種類の命令を使用する(実験書45~
49ページ)
機械語とは?
プロセッサが解釈可能な言語
 ディジタル回路では0と1で表現される
 下記の0と1の羅列がプロセッサでのなんら
かの動作を示す

11000000000100
00000010001100
11000000010001
00011100001100
・・・
機械語とアセンブリ言語
機械語を人間が理解可能な形にしたもの
 命令を見れば大体の動作の予想がつく

機械語
11000000000100
00000010001100
11000000010001
00011100001100
・・・
アセンブリ言語
MOVLW 04H
MOVWF 0CH
MOVLW 11H
ADDWF 0CH,W
・・・
用語①
アセンブル:アセンブリ言語で書かれたプログ
ラムを機械語に変換すること
 アセンブラ:アセンブリ言語を機械語に変換す
るプログラム

アセンブリ言語
MOVLW 04H
MOVWF 0CH
MOVLW 11H
ADDWF 0CH,W
アセンブル
機械語
11000000000100
00000010001100
11000000010001
00011100001100
用語②

アセンブリ言語の動作を示す部分をオペコー
ド、引数を示す部分をオペランドという
ADDWF 0CH,W
オペコード オペランド
アセンブリ言語の特徴

メモリやレジスタなど、計算資源を直接扱う
 C言語のような変数は存在しない
 C言語などのように変数に対してコンパイラがメ
モリを割り当てたり、計算に使用するレジスタを決
めてくれたりはしない
プロセッサの構造(レジスタの数や用途など)
を知らないとプログラミングできない
 一般に高級言語で書いたプログラムよりも高
速に動作する

PIC(PIC16F84)上の資源

PIC上でプログラミングする際に使用する資
源は以下の通りである(実験書7~8ページ)
 プログラムメモリ:プログラムを格納するメモリ
 レジスタファイル:動作設定やデータ格納用メモリ
STATUSレジスタ
 ポートの入出力設定、入出力
 汎用レジスタ など

 Wレジスタ(Working
Register):
演算する際に一時保存用に使用するレジスタ
PICの構造
プログラムメモリ
(EEPROM)
演算処理部
メモリ
(レジスタ
ファイル)
入
出
力
ポ
ー
ト
PICの構造
プログラム
メモリ
プログラム
カウンタ
命令
レジスタ
レジスタ
ファイル
MUX
W レジスタ
ALU
入
出
力
ポ
ー
ト
RA0~RA7
RB0~RB7
PICの構造
プログラム
メモリ
プログラム
カウンタ
命令
レジスタ
レジスタ
ファイル
MUX
W レジスタ
ALU
データバス
入
出
力
ポ
ー
ト
RA0~RA7
RB0~RB7
PICの構造
プログラム
メモリ
プログラム
カウンタ
プログラムバス
命令
レジスタ
レジスタ
ファイル
MUX
W レジスタ
ALU
入
出
力
ポ
ー
ト
RA0~RA7
RB0~RB7
PICの構造
プログラム
メモリ
プログラム
カウンタ
命令
レジスタ
レジスタ
ファイル
MUX
Wレジスタ
ALU
プログラムメモ
リのアドレスを
生成するカウ
ンタ
入
出
力
ポ
ー
ト
RA0~RA7
RB0~RB7
PICの構造
プログラムアドレス
プログラム
メモリ
プログラム
カウンタ
命令
レジスタ
レジスタ
ファイル
MUX
Wレジスタ
ALU
入
出
力
ポ
ー
ト
RA0~RA7
RB0~RB7
プログラムバスを通って、
命令が読み出される
PICの構造
プログラム
メモリ
プログラム
カウンタ
命令
レジスタ
レジスタ
ファイル
MUX
Wレジスタ
ALU
入
出
力
ポ
ー
ト
RA0~RA7
RB0~RB7
命令に従って、
ALUで処理が行われたり、
レジスタファイルの内容が
読み出されたりする
PICの構造
プログラム
メモリ
プログラム
カウンタ
命令
レジスタ
レジスタ
ファイル
MUX
Wレジスタ
ALU
入
出
力
ポ
ー
ト
RA0~RA7
RB0~RB7
命令に従って、
ALUで処理が行われたり、
レジスタファイルの内容が
読み出されたりする
PICの構造
プログラム
メモリ
プログラム
カウンタ
命令
レジスタ
レジスタ
ファイル
MUX
Wレジスタ
ALU
入
出
力
ポ
ー
ト
RA0~RA7
RB0~RB7
プログラムメモリ

0番地
1番地
2番地
3番地
4番地
BSF
CLRF
BCF
CLRF
MOVLW
・・・

PIC16F84Aではプ
ログラムメモリを
1024ワード分搭載
1000命令程度まで
のプログラムを書
き込み可能
プログラムカウンタ
で指定された番地
の命令が読み出さ
れる
・・・・・・・・・・・・

プログラム
メモリ
1023番地
プログラム
カウンタ
プログラムメモリ

0番地
1番地
2番地
3番地
4番地
BSF
CLRF
BCF
CLRF
MOVLW
・・・

PIC16F84Aではプ
ログラムメモリを
1024ワード分搭載
1000命令程度まで
のプログラムを書
き込み可能
プログラムカウンタ
で指定された番地
の命令が読み出さ
れる
・・・・・・・・・・・・

プログラム
メモリ
1023番地
プログラム
カウンタ
0
プログラムメモリ
0番地
1番地
2番地
3番地
4番地
BSF
CLRF
BCF
CLRF
MOVLW
・・・
プログラムカウ
ンタの値は自動
的に+1され、次
の番地を指す
・・・・・・・・・・・・

プログラム
メモリ
1023番地
プログラム
カウンタ
1
プログラムメモリ
0番地
1番地
2番地
3番地
4番地
BSF
CLRF
BCF
CLRF
MOVLW
・・・
プログラムカウ
ンタの値は自動
的に+1され、次
の番地を指す
・・・・・・・・・・・・

プログラム
メモリ
1023番地
プログラム
カウンタ
2
プログラムメモリ
0番地
1番地
2番地
3番地
4番地
BSF
CLRF
BCF
CLRF
MOVLW
・・・
プログラムカウ
ンタの値は自動
的に+1され、次
の番地を指す
・・・・・・・・・・・・

プログラム
メモリ
1023番地
プログラム
カウンタ
3
プログラムメモリ
0番地
1番地
2番地
3番地
4番地
BSF
CLRF
BCF
CLRF
MOVLW
・・・

プログラムカウ
ンタの値は自動
的に+1され、次
の番地を指す
ジャンプ命令は
プログラムカウ
ンタの値を書き
換えることで実
現される
・・・・・・・・・・・・

プログラム
メモリ
1023番地
プログラム
カウンタ
4
レジスタファイル


0B番地
0C番地
0D番地
4E番地
4F番地
・・・
0番地
1番地
2番地
・・・
レジスタファイルも
プログラムメモリと
同様に、アドレスを
指定することで、
データの読み書き
ができる
読み出し、書き込み
のいずれであるか
は命令によって決
定される
実験書13ページ参
照
・・・

レジスタファイル
 PICの動作設定
0B番地
0C番地
0D番地
 ステータス
 外部との入出力
4E番地
4F番地
・・・
0番地
1番地
2番地
・・・
0番地から0B番地
まではSpecial
Function Register
(SFR)と呼ばれ、
用途が決まってい
る
・・・

0D番地
4E番地
4F番地
・・・
0C番地から4F番地 0番地
1番地
までは汎用レジスタ
2番地
であり、プログラム
実行中の一時デー
タなどの保存に使用 0B番地
する
0C番地
・・・

・・・
レジスタファイル
PICでのプログラミング


Wレジスタにレジスタファイ
ルの値を読み出す(または
直値をロード)
その値とレジスタファイルの
値(または直値)で演算

レジスタ
ファイル
Wレジスタ
ALU:Arithmetic Logic Unit
各種演算をするブロック
ALU
例)

04H
11H
04Hを0CH番地にロードし、
その値と11Hを加算する
レジスタ
ファイル
プログラム
MOVLW 04H
MOVWF 0CH
MOVLW 11H
ADDWF 0CH,W
04H
Wレジスタ
04H
15H
11H
ALU
15H
04H
11H
実験手順
1.
サンプルプログラム1(19ページ)を21ページの操作に従って
動かしてみる
1.
2.
3.
4.
5.
6.
7.
8.
先週、追加課題で動かしている人はやらなくてOK
サンプルプログラム2(23ページ)を動かし、23ページの表を
埋める→ TAのチェック
サンプルプログラム2を参考に、課題1を解く→ TAのチェック
サンプルプログラム3(26ページ)を動かしてみる
サンプルプログラム3を参考に、課題2を解く→ TAのチェック
サンプルプログラム4(29ページ)を動かしてみる
サンプルプログラム4を参考に、課題3を解く → TAのチェック
課題3を先週作成したボード(16ページ図10)で動かす
→ TAのチェック
サンプルプログラムについて①

サンプルプログラムの最初の辺りの行はPIC
の動作設定や初期化のコード
(最初の3行はファイルの読み込み等)
ここがプログラムの
ORG 0
0番地であることを示す
MAIN
BSF STATUS,RP0
この3行で
CLRF TRISB
PORTBの
BCF STATUS,RP0
入出力を設定
CLRF PORTB
PORTBの初期化
サンプルプログラムについて②

プログラム中のTRISBはレジスタファイル中
のSFRのTRISBレジスタのこと
 PORTBの入出力の設定を行う
 これに関しては翌週解説
サンプルプログラムについて③

プログラム中のPORTBはレジスタファイル中
のSFRのPORTBのこと
 PICのRB0~RB7(実験書5ページ図2参照)に対
応する
 例)PORTBを出力に設定した状態でPORTBの
値を11110000とすると、RB0~RB3には0が出力
され、RB4~RB7には1が出力される
 今回の回路だと、1が出力されたRB4~RB7に
接続されたLEDが点灯する
初期化部分で初出の命令
BSF (Bit Set File register)
 BCF (Bit Clear File register)
 CLRF (CLeaR File register)

PICの命令③ ビット操作命令 -BSF

BSF (Bit Set File register)
 ファイルレジスタの指定したビット(0オリジン)を1
にする
 例) BSF 0CH, 4
 0CH番地の値の4ビット目を1にする

0CHに00000000が格納されていたとすると
00010000となる
 指定可能なビットは0~7
PICの命令③ ビット操作命令 -BCF

BCF (Bit Clear File register)
 ファイルレジスタの指定したビットを0にする
 例)
BCF 0CH, 4
 0CH番地の値の4ビット目を0にする

0CHに11111111が格納されていたとすると11101111と
なる
 指定可能なビットは0~7

BSF, BCF以外にもビット判定(指定したビット
が0か1か)をして、分岐する命令も存在する
PICの命令④ 初期化命令 -CLRF

CLRF (CLeaR File register)
 指定したファイルレジスタの値を0にする
 例)CLRF
0CH
→ 0CH番地の値が00H(00000000)になる

CLRF以外にもWレジスタを初期化する命令
などが存在する
サンプルプログラムについて④

サンプルプログラム3ではループ(繰り返し)
を伴うコードが書かれている
LOOP
RLF
DECFSZ
GOTO
MOVF
0CH, F
0DH
LOOP
0CH, W
サンプルプログラム3で初出の命令
RLF (Rotate Left File register through
carry)
 DECFSZ (DECrement File register, Skip
of Zero)
 GOTO

PICの命令⑥ シフト命令

RLF (Rotate Left File register through
carry)
 ファイルレジスタの内容を1bit左シフトする
 7bit目はCarry(桁上がり)にシフトされる


Carryの実体はSTATUSレジスタのCarryビット
当然、逆方向のシフト命令も存在する
7
6
5
4
3
2
1
0
C
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
PICの命令⑤ 条件分岐命令

DECFSZ (DECrement File register, Skip
of Zero)
 指定したファイルレジスタの値から1を引いて(デ
クリメント)、その結果が0ならば次の命令をス
キップする(1つ後の命令を実行する)
 0でないならば、次の命令を実行する

DECFSZ以外にもビット判定命令などで同様
の動作をする命令も存在する
PICの命令⑦ ジャンプ命令

GOTO
 指定した番地(プログラムアドレス)に無条件分岐
する
 例) GOTO LOOP
→ LOOP(ラベル)に分岐する
 分岐できる範囲は000H~7FFHの間
DECFSZの例
0DH番地に3が格納されているとする
 下図では矢印で示した命令を実行しているも
のとする

0DH番地の値
LOOP
RLF
DECFSZ
GOTO
MOVF
0CH, F
0DH
LOOP
0CH, W
0
1
3
2
サンプルプログラムについて⑤

サンプルプログラム4の最初
GPR_1 EQU 0CH
GPR_2 EQU 0DH
GPR_3 EQU 0EH

は、“0CHという値にGPR_1という別名を付けますよ”
という意味(GPR_2, GPR_3も同様)
上記の場合、以下のコードは同じ意味を持つ
 MOVWF
GPR_1
 MOVWF 0CH
サンプルプログラム4で初出の命令
CALL (CALL subroutine)
 COMF (COMplement File register)
 NOP (No OPeration)
 RETURN (RETURN from subroutine)

PICの命令⑧ サブルーチンコール

CALL (CALL subroutine)
 指定したサブルーチンにジャンプする
 GOTO命令と異なる点はRETURN命令と組み合わせる
ことで、サブルーチンの呼び元に戻ることができる点
 例) CALL TIMER
→ TIMERというサブルーチンに飛ぶ
 このTIMERはラベルであるが、直接サブルーチンのプロ
グラムアドレスを数値で指定することも可能
 例) CALL 0FFH
→ 0FFH番地から始まるサブルーチンに飛ぶ
PICの命令⑧ サブルーチンコール

RETURN (RETURN from subroutine)
 CALLで呼び出されたサブルーチンから、CALL
の呼び出し元に戻る(CALL命令の次の命令に飛
ぶ)
PICの命令⑨ ビット反転命令

COMF (COMplement File register)
 正確にはFile
registerの値の(1の)補数
(Complement)をとる命令
 実行すると、指定したFile registerの値のビットが
全て反転する
 例) 0CH番地に11110000が格納されているとする
COMF 0CH
とすると、0CH番地の値は00001111になる
PICの命令⑩ 何もしない命令

NOP (No OPeration)
 その名の通り、何もしない命令
 今回のように時間を計る場合など、用途は様々
サンプルプログラムについて⑥

サンプルプログラム4の流れを以下に示す
メインルーチン
MAIN
・・・
;=====================
MOVLW 55H
LOOP
MOVWF PORTB
CALL
TIMER
COMF PORTB, W
・・・・
タイマサブルーチン
・・・
TIMER
・・・
RETURN
実験書45~49ページの見方
命令とその意味
ADDWF
: ADD W and F(Wレジスタとファイルレジスタの加算)
書式
: ADDWF
動作
: W ← W + f (d = 0(W))
f ← W + f (d = 1(F))
f, d
アセンブリ言語で
記述する際の書式
W : Wレジスタ
f : ファイルレジスタ(7bit:00h~7Fh)
d : 結果の格納先(0(W) or 1(F))
PIC内部の動作
この命令を実行したことによって
影響するフラグ : C, DC, Z
影響を受けるステータスレジスタのビット
マシン語
: 00 0111 dfff ffff マシン語に変換した際のビット列
例
: MOVLW 44H
・・・・
; Wレジスタに44hを書き込む
プログラム例
プログラミング時の注意事項


Wレジスタの値に入っている値を把握する
アルファベットで始まるアドレス、値には0を付ける
 AH → 0AH
 CH → 0CH



扱っている値がアドレスなのか数値なのか認識する
こと
アセンブル時にエラーが出た場合は、TAを呼ぶ前
にエラーコードを読み、自分で原因追求をしてみる
こと(実験書25ページ)
プログラム中にコメント以外で全角文字(全角スペー
スも含む)を入れないこと
作業中の注意

実験中は立ち歩かないこと
 立ち歩く用件がある場合はTAに伝えてから
PICライタに関して

PICライタを取り外すときは必ずPICライタの
電源を落としてからにすること
 Windowsがブルースクリーンになって、落ちるこ
とがあります
 MPLABも落としておくと、より安全です