2. 転送命令を学ぼう 2004 年 8 月に本講義ノートを Web にアップして以来, とても多くの方の訪問を受けてきました. 内容が一部古くなっていたので,2012 年 5 月時点の情報に書き改めました. 主な変更点は以下の通りです. 第 0 章に本講座の準備のための章を設け, 以下の更新をしました. 1. プログラム開発環境 (MPLAB IDE) を v8.84 に更新しました. 2012 年 5 月時点での最新バージョンは MPLAB X IDE v1.10 ですが, アセンブラの勉強のためには, 旧バージョンの v8.84 が良さそうです.( 筆者が X を使いこなしていないこともあります.) 2. ブレッドボード上に回路を製作し, その詳細を記しました. ハンダ付けをほとんど必要とせずにマイコン回路を製作できます. 3. 部品を全てネットで購入して, その仕様と入手先を記しました. 入手が容易な部品ばかりでマイコン回路を製作しました. 4.In-Circuit Debugger/Programmer に PICkit3 を用いました. ブレッドボード上のマイコンへのプログラミングに PICkit3 を使用した例を記しました. 1
; Load of Literal to Working Register まず, このソースファイルを打ち込んで下さい. MPLAB IDE v8.84 の立ち上げ方,Project File の作り方, アセンブラのソースファイルの作り方, ビルドの仕方, シミュレーションの仕方は第 0 章を参照してください. 注意 CONFIG の前のアンダーバーは 2 つあります. これは W レジスタに Literarl( リテラル, 文字 ) を転送させるプログラムです. 最初に 2 進数の 10011010 を転送し, 次に 16 進数の AB を転送し, 最後に 10 進数の 255 を転送します. は Move Literal to Working register の略です. B'10011010' ; Binary number 0xAB ; Hexadecimal number D'255' ; Decimal number END 2
シミュレーションの仕方プログラムを打ち込み終わったら,Debugger Select Tool MPLAB SIM Project Make と選択すると, プログラムに文法上の間違いがなければ,BUILD SUCCEEDED というメッセージが出ます. 次に View Special Function Registers を選択して下さい. 下図のようにレジスタ群の内容を示すウィンドウが開かれます. 図示の位置にカーソルを持ってきて右クリックすると, レジスタ内容の表示型を Hex(16 進数 ),Binary(2 進数 ),Decimal(10 進数 ),Char( 文字型 ) の中から選択できます. カーソルをここに持ってきて右クリック 3
Decimal と Binary を表示 W レジスタ内の数字が表示されています. ファンクションキーの F7 を押して, プログラムを一行ずつ実行して, WREG (W レジスタ ) の中の数字がどう書き換えられていくかを確認してください. 4
8 データバスPIC16F84A の Data Sheet の BLOCK DIAGRAM の抜粋です. プログラムメモリ 13 プログラムカウンタ 14 命令レジスタ 8レベルスタック 13ビット 5 直接アドレス ファイルレジスタ 8 ビット 7 MUX 68 7 間接アドレス FSR レジスタ STATUS レジスタ 8 命令デコーダコントローラ 打ち込んだプログラムはプログラムメモリに格納されます. マイコンの電源を入れると, プログラムメモリから命令が順次読み出され, 実行されていきます. 制御信号RA4~RA0 RB7~RB0 MUX ALU W レジスタ 入出力ポート 8 5
8 データバスPIC16F84A の Data Sheet の BLOCK DIAGRAM の抜粋です. プログラムメモリ 13 プログラムカウンタ 14 命令レジスタ 8レベルスタック 13ビット 5 直接アドレス ファイルレジスタ 8 ビット 7 MUX 68 7 間接アドレス FSR レジスタ STATUS レジスタ 8 命令デコーダコントローラ マイコンの中には W レジスタ (Working Register) という 8 ビットの数字を記憶しておく場所があります. 様々な処理のための 作業用レジスタ という意味です. 制御信号RA4~RA0 RB7~RB0 MUX ALU W レジスタ 入出力ポート 8 6
8 データバス B 10011010 の実行 プログラムメモリ 13 プログラムカウンタ 14 命令レジスタ 8レベルスタック 13ビット 5 直接アドレス ファイルレジスタ 8 ビット 7 MUX 68 7 間接アドレス FSR レジスタ STATUS レジスタ 8 命令デコーダコントローラ プログラムがスタートすると最初に がプログラムメモリから命令デコーダに読み込まれ, ここで命令の解読, コントローラにより実行されま す. の次の 10011010 が W レジスタに転送されます. 制御信号RA4~RA0 RB7~RB0 MUX ALU W レジスタ 入出力ポート 8 7
; Load of Literal to Working Register Configuration 設定です. マイコンのシステムクロックを設定します. END B'10011010' 0xAB D'255' Microchip の Web ページからダウンロードできる PIC16F84A の Data Sheet の 21 ページに Configuration の説明があります. OSC: Oscillator RC: Resistor/Capacitor 内蔵の発振回路,4MHz 程度まで発信周波数は不安定 HS: High Speed Crystal/Resonator 3.5MHz 以上で推奨本回路では 10MHz のセラミック発振子を外付けしてあるので,HS 設定とする. XT: Crystal/Resonator 4 MHz 以下 LP: Low Power Crystal 低消費電力, 200kHz 以下 WDT: Watch Dog Timer PWRTE: Power up Timer Enable CP: Code Protection 本資料の使い方の範囲内では全て 8 オフで差し支えない.
; Load of Literal to Working Register B'10011010' 0xAB D'255' 現実のマイコンでは電源を入れるとここから始まります. へジャンプする. END 9
; Load of Literal to Working Register w レジスタに 100110101 という数を転送せよという命令です. W レジスタ B'10011010' 10011010 0xAB END D'255' B 10011010 2 進数は = D 154 10 進数 = H 9A 16 進数です. 表現が違うだけでどれも同じ数字です. 10
; Load of Literal to Working Register w レジスタに AB という数を転送せよという命令です. W レジスタ B'10011010' 10101011 0xAB D'255' B 10101011 2 進表現 = D 171 10 進表現 = H AB 16 進表現 END 11
; Load of Literal to Working Register w レジスタに 255 という数を転送せよという命令です. W レジスタ B'10011010' 11111111 0xAB D'255' B 11111111 2 進表現 = D 255 10 進表現 = H FF 16 進表現 END 12
; Load of Literal to Working Register B'10011010' 0xAB D'255' W レジスタ 11111111 へジャンプする. END 13
次に, ワーキング (W) レジスタと ファイルレジスタ間でのデータの やりとりを体験してください. 14
8 データバス1024 14 ビット プログラムメモリ ( フラッシュメモリ ) 13 プログラムカウンタ (PC) 14 命令レジスタ 8レベルスタック 13ビット 5 直接アドレス ファイルレジスタ 8 ビット 7 MUX 68 7 間接アドレス FSR レジスタ STATUS レジスタ 8 命令デコーダコントローラ マイコンの中にはファイルレジスタ (File Register) という 8 ビットの数字を記憶できるレジスタが 68 個あります. 制御信号RA4~RA0 RB7~RB0 PIC16F84A の構成 MUX ALU Wレジスタ入出力ポート 8 15
0C~4F の番地を持つ 68 個の 8 ビットレジスタがある. 8 ビットの数字を 68 個までしまっておける 引き出し のようなもの. データの 一時保管所 のような意味です. 0x0C 0x4F ファイルレジスタ W レジスタはたった 1 個の 8 ビットレジスタからなる. w レジスタ 16
; Data from Working Register to File Register and vice versa このプログラムを打ち込んで下さい. MEM1 EQU 0x0C ;MEM1 at 0C MEM2 EQU 0x0C+1 ;MEM2 at 0D 0x9A ; '9A' to Working Register MOVWF MEM1 ; Move '9A' to MEM1 0x01 ; '01' to Working Register MOVWF MEM2 ; Move '01' to MEM2 MOVF MEM1,0 ; Load '9A' from MEM1 to W MOVF MEM2,0 ; Load '01' from MEM2 to W シミュレータでプログラムをステップ実行しながら,w, MEM1, MEM2 レジスタの中の数字がどう変わるか確認して下さい. END 17
MEM1, MEM2 の中の数字は,View File Registers により見ることができます. 0C 番地に MEM1 0D 番地に MEM2 18
; Data from Working Register to File Register and vice versa MEM1 EQU 0x0C ;MEM1 at 0C MEM2 EQU 0x0C+1 ;MEM2 at 0D 0x9A ; '9A' to Working Register 0C 番地のファイルレジスタに MEM1 という名前をつけ,0C+1 ( = 0D) 番地のファイルレジスタに MEM2 という名前を付けます. MOVWF MEM1 ; Move '9A' to MEM1 0x01 ; '01' to Working Register MOVWF MEM2 ; Move '01' to MEM2 MOVF MEM1,0 ; Load '9A' from MEM1 to W MOVF MEM2,0 ; Load '01' from MEM2 to W END 19
; Data from Working Register to File Register and vice versa MEM1 EQU 0x0C ;MEM1 at 0C MEM2 EQU 0x0C+1 ;MEM2 at 0D 電源を入れると の次から始まります. へジャンプする. 0x9A ; '9A' to Working Register MOVWF MEM1 ; Move '9A' to MEM1 0x01 ; '01' to Working Register MOVWF MEM2 ; Move '01' to MEM2 MOVF MEM1,0 ; Load '9A' from MEM1 to W MOVF MEM2,0 ; Load '01' from MEM2 to W END 20
; Data from Working Register to File Register and vice versa MEM1 EQU 0x0C MEM2 EQU 0x0C+1 MOVWF 0x9A MEM1 w レジスタに 100110101 という数を転送せよという命令 W レジスタ MOVWF MOVF MOVF 0x01 MEM2 MEM1,0 MEM2,0 10011010 END 21
; Data from Working Register to File Register and vice versa MEM1 EQU 0x0C MEM2 EQU 0x0C+1 MEM1 ファイルレジスタ 10011010 MOVWF MOVWF MOVF MOVF 0x9A MEM1 0x01 MEM2 MEM1,0 MEM2,0 w レジスタの内容をファイルレジスタの MEM1 に転送せよという命令です. MOVE W to F の略です. W レジスタ 10011010 END 22
; Data from Working Register to File Register and vice versa MEM1 EQU 0x0C MEM2 EQU 0x0C+1 MOVWF 0x9A MEM1 w レジスタに 00000001 という数を転送せよという命令 MEM1 ファイルレジスタ 10011010 W レジスタ MOVWF MOVF MOVF 0x01 MEM2 MEM1,0 MEM2,0 00000001 END 23
; Data from Working Register to File Register and vice versa CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF MEM1 EQU 0x0C MEM2 EQU 0x0C+1 MEM1 MEM2 ファイルレジスタ 10011010 00000001 MOVWF 0x9A MEM1 W レジスタ 0x01 MOVWF MOVF MOVF MEM2 MEM1,0 MEM2,0 w レジスタの内容をファイルレジスタの MEM2 に転送せよという命令 00000001 END 24
; Data from Working Register to File Register and vice versa MEM1 EQU 0x0C MEM2 EQU 0x0C+1 MEM1 MEM2 ファイルレジスタ 10011010 00000001 MOVWF 0x9A MEM1 W レジスタ 0x01 MOVWF MOVF MOVF MEM2 MEM1,0 MEM2,0 MEM1 の内容を w レジスタに転送せよという命令 10011010 MOVF f, d レジスタfの中身をdへ転送せよと言う命令 d = 0はWレジスタ END 25
; Data from Working Register to File Register and vice versa MEM1 EQU 0x0C MEM2 EQU 0x0C+1 MEM1 MEM2 ファイルレジスタ 10011010 00000001 MOVWF 0x9A MEM1 W レジスタ 0x01 MOVWF MEM2 00000001 MOVF MEM1,0 MOVF MEM2,0 MEM2の内容をw レジスタに転送せよという命令 END 26
; Data from Working Register to File Register and vice versa MEM1 EQU 0x0C MEM2 EQU 0x0C+1 MEM1 MEM2 ファイルレジスタ 10011010 00000001 MOVWF 0x9A MEM1 0x01 へジャンプする. W レジスタ MOVWF MEM2 00000001 MOVF MEM1,0 MOVF MEM2,0 END 27
演習問題 1.MEM1 に 0xAA,MEM2 に 0xBB を転送し, これらを交換するプログラムを作成せよ. 28
演習問題 1.MEM1 に 0xAA,MEM2 に 0xBB を転送し, これらを交換するプログラムを作成せよ. ; Problem 1 MEM1 EQU 0x0C ;MEM1 at 0C MEM2 EQU 0x0C+1 ;MEM2 at 0D MEM3 EQU 0x0C+2 ;MEM3 at 0E 0xAA ; AA' to Working Register MOVWF MEM1 ; Move AA' to MEM1 0xBB ; BB' to Working Register MOVWF MEM2 ; Move BB' to MEM2 MEM1 に 0xAA, MEM2 に 0xBB を転送 MOVF MEM1, 0 ;Load MEM1 to W MOVWF MEM3 ;Move W to MEM3 MOVF MEM2,0 ;Load MEM2 to W MOVWF MEM1 ;Move W to MEM1 MOVF MEM3,0 ;Load MEM3 to W MOVWF MEM2 ;Move W to MEM2 END MEM1の内容を一端 MEM3に転送し,MEM2 の内容をMEM1に移した後に,MEM3の内容を MEM2に転送 29
2004 年 8 月 30