ここでは、データバスだけに関連したアーキテクチャを図1に示します。
; file name = add.asm an example of the addition list p=16f84 #include "p16f84.inc" __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF RADIX DEC TEMP EQU 20H ;20H番地に、TEMPというラベルをつける ORG 00H ;00H番地からプログラムをはじめる。 MOVLW 10 ;Wレジスタ←10 MOVWF TENP ;TEMP←Wレジスタのデータを入れる MOVLW 5 ;Wレジスタ←5 ADDWF TEMP,0 ;Wレジスタ←TEMP+Wレジスタ(0ならば、Wレジスタに演算結果を収納する。 ; 1ならば、ファイルレジスタに演算結果を収納する。) END
MOVLW k k(定数)をWレジスタに格納する MOVWF f f(ファイルレジスタ)にWレジスタのデータを格納する ADDWF f,d f(ファイルレジスタ)とWレジスタを足し合わせてdが 示す場所(0ならばWレジスタへ、1ならばファイルレジスタへ) に演算結果を格納する。 注1)数値を直接入力できるのはWレジスタのみ 注2)ファイルレジスタに代入するにはWレジスタに一度入力してからのみ 注3)ADDWF TEMP,0 の0のときはWレジスタに、1のときはファイルレジスタに代入される
Directories: 作業用ディレクトリ File Name: addEdit project ダイアログボックスで
Project Target Filename add.hex .... Project Filesの Add Node.. ボタンを押し、 add.asmを加える。 OKボタンを押す。
Building ADD.HEX... Compiling ADD.ASM: Command line: "C:\PROGRA~1\MPLAB\MPASMWIN.EXE /p16F84 /q C:\MPLAB\ADD.ASM" Warning[205] C:\MPLAB\ADD.ASM 1 : Found directive in column 1. (list) Error[113] C:\MPLAB\ADD.ASM 13 : Symbol not previously defined (EMP) MPLAB is unable to find output file "ADD.HEX". Build failed.13行目の TENPをTEMPに変更し、もう一度コンパイルする。
Building ADD.HEX... Compiling ADD.ASM: Command line: "C:\PROGRA~1\MPLAB\MPASMWIN.EXE /p16F84 /q C:\MPLAB\ADD.ASM" Warning[205] C:\MPLAB\ADD.ASM 1 : Found directive in column 1. (list) Build completed successfully.
changeで、Tools→MPLAB simulator processor = 16f84 clock HS 10
movlw 0xAが実行され、Special Function Registerウィンドウ内の ワーキングレジスタwの値が0Aとなる。更新されたので赤文字である。
w 0A 10 00001010 .以下同様に確認する。
; file name = cjump.asm an example of the conditional jump list p=16f84 #include "p16f84.inc" __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF RADIX DEC COUNT EQU 20H ;20HをCOUNTと呼ぶ ANS EQU 21H ;21HをANSと呼ぶ MOVLW 0 ;Wに0を代入 MOVWF ANS ;AnsにWの値を代入 MOVLW 10 ;Wに10を代入 MOVWF COUNT ;COUNTにWの値を代入 LOOP INCF ANS,1 ;ANSの値をインクリメント DECF COUNT,1 ;COUNTの値をデクリメント BTFSS STATUS 2 ;スキップする GOTO LOOP ;無条件ループ END
LOOP ANS+1 COUNT-1 COUNTが0であるか? →LOOPへ戻る ↓YES 次の処理
処理 ↓ ↓ ↓<処理 ↓
; file name = subr.asm an example of the subroutine list p=16f84 #include "p16f84.inc" __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF RADIX DEC TEMP EQU 20H SIGNAL EQU 21H MOVLW 0 ;W←0 MOVWF TEMP ;TEMP←W MOVWF SIGNAL ;SIGNAL←W LOOP INCF TEMP,1 ;TEMP←TEMP+1 CALL CHECK ;サブルーチンコール BTFSS SIGNAL,0 ;SIGNALの第0BITが1だったらスキップ GOTO LOOP CHECK MOVLW 5 ;W←5 SUBWF TEMP,0 ;W←TEMP-W 0:W , 1:F と割り当てられている BTFSC STATUS,2 ;STATUSの2bit(ZERO)が0スキップ INCF SIGNAL,1 RETURN END
76543210 PORT A XXX00000 0:使用可能 PORT B 00000000 X:使用不可能 PORT B 00000001 とすると、PB0だけが5Vとなる。 他は0Vだが実際には0.6Vくらい(論理的に'0') これはPICが大出力電流をサポートするためと思われ。 '1'=5V ----- | | '0'=0V___|ポートA,ポートBから、データを取り込むか、出力するか を設定しなければならない。その為のレジスタがTRISAおよびTRISBである。
TRISA,TRISB ← ファイルレジスタ (Special Function Registerの) ↑ ↑ portA portB 1:入力、0:出力 すなわちportA,portBの出力ごとに入出力方向を指定できる。そのためには、ファイルレジスタ中のSTATUSレジスタの第5bitをRP0といい、 これを0にするとbank0, 1にするとbank1になる。
ファイルレジスタのアドレス bank0 bank1 00h ...... 80h ...... ...... ...... 05h portA 85h trisA 06h portB 86h trisB ...... ...... アドレス 00000100 04h 10000100 84n ↑ MSBがRP0なんだー。RP0はステータス・レジスタの第5bitなんだー。では具体的にどうするん?
BSF STATUS,RP0 ; bank1に指定する。Bit Set File Register MOVLW 02 ; 入出力方向設定 1bit:入力、0bit:出力 MOVWF TRISA ; 方向を指定とすると、
BCF STATUS,RP0 ; bank0に指定する。Bit Set File Register MOVLW 01 ; 出力値設定 MOVWF PORTA ; 値出力INPUTポートに1を出力しても問題ない。
BSF STATUS,5 ; Bank1に切り替える。 MOVLW B'00000001' ; ポートAの入出力を設定 MOVWF TRISA ; TRISAに書き込む MOVLW B'00000000' ; ポートBの入出力を設定 MOVWF TRISB ; TRISBに書き込む BCF STATUS,5 ; Bank0に戻す注意 !!!