list p=16f84
#include p16f84.inc
RAMA equ 0x0c ; 時間造りのときに割り当て番地に0CH,0DHを使用します。
RAMB equ 0x0d ; 番地と同じ意味(EQU)、判りやすくしています.
ORG 0 ; 0番地から始めます.
GOTO INISET ;STARTへ飛ぶ
INISET
BSF STATUS,RP0 ;レジスタSTATUSを1にする(ページ1)/裏舞台の1ページに設定します。
MOVLW 0xe0 ;11100000B ;11100000BをレジスタWに入れる/0が出力,1が入力を意味する
MOVWF TRISA ;TRISAにレジスタWのデータ-を移動/A ポートの設定
MOVLW 0xf3 ;11110011B ;11110011BをレジスタWに入れる,/0が出力,1が入力を意味する
MOVWF TRISB ;TRISBにレジスタWのデータ-を移動/Bポートの設定
BCF OPTION_REG,7 ;入力をプルアップ(目玉の部分)
BCF STATUS, RP0 ;レジスタSUTATUSを0にすなわちページを表舞台の0ページに戻しておく
MOVLW 0x1f ;00011111B
MOVWF PORTA ; 停止スタンバイ
MOVLW 0xf3 ;11110011B
MOVWF PORTB
GOTO START
START
CALL DTIME_1 ; 時間稼ぎ
GOTO MAIN ;MAINへ行こう
MAIN
; MOVLW 0x06 ;00000110B ; forward
movlw 0x0a
MOVWF PORTA ;いざ前進(1、4ビット目0で右,左前L/,2,3ビット目右後,左後Hn
CALL DTIME_1 ; 時間稼ぎ
MOVLW 0x0f ;00001111B
MOVWF PORTA ; 停止(1から4ビット全てHで動作せず)上の回路を眺めながら理解
CALL DTIME_1 ; 時間稼ぎ
GOTO MAIN
DTIME_1 ; call delay routine
call TIME_1 ; 0.1[s] x 5
call TIME_1
call TIME_1
call TIME_1
call TIME_1
; 0.1秒の遅延時間の作成。10Mhzクロックの計算、これが厄介ですが、
TIME_1
MOVLW 0x44 ; 16*4+4=68 16進数
MOVWF RAMA ; RAMA にいれる(0CH番地に)。
TIME_11
CLRF RAMB ; (256*3*68+68*4)*0.4=20.998ms
TIME_12 ; このチップが8ビットなのでmax256回まで(4hzで0.4usが1語命令)
DECFSZ RAMB,1 ;(MOVLW、MOVWF,CLRFが1命令計3命令/DECFSZ,が1命令
GOTO TIME_12 ;GOTOが2命令、RETURNが2命令です。)後は考えてみてください。
DECFSZ RAMA,1
GOTO TIME_11
TIME_13
MOVLW 0X00
MOVWF RAMA
TIME_14
CLRF RAMB ; (256*3*256+256*4)*0.4=79.053ms
TIME_15
DECFSZ RAMB,1
GOTO TIME_15
DECFSZ RAMA,1
GOTO TIME_14
RETURN ; 20.998+79.053=100.51ms すなわち約0.1秒が出来ました。
end
|