アセンブラ言語でワクチンを動かそう

まずはこの回路だけは理解しておかないとプログラムは全く理解できません。


では始めましょう

(1,0の機械語しかコンピュータは理解できませんが、ちょっと人間語に近い言語と思ってください)

まずはパソコンでメモ帳(editor)を開いてください。

ファイル名を 付けましょう

たとえば vaccine.ASM とかに
 ラベルにASMさえつけておけばtaroでも何でもお好きに

書き終わったらコンパイル(HEXファイルに)して、ライターでチップにコピーして完成です。
たったのこれだけですが、、、。実はこれからですがとにかく始めましょう。

書いてみましょう

メモ入れは  ;  このマークの後に(ダブルコンマ)

これだけでワクチン君を自由自在に動かせます。

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