このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
PIC ライタの製作上の注意点
三端子レギュレータを指で触り、異常発熱しないことを確かめる 一旦電源を切り、
12F629 や 12F675 の扱いの注意点として、 3FF 番地に retw 命令により定数 が埋め込まれている。 プログラムを書き込む前に、一度値を読み込んでメモしておくと破壊しても元 に戻せる。
検査用プログラムは PIC の各ポートをそれぞれ ON, OFF するだけのプロ グラムである。 これにより、本来 ON/OFF になるべき信号線が正常かどうか調べることができ る。 回路図より、各ポートは次に接続している。
ピン番号 | ポート | 接続先 |
---|---|---|
7 | GP0 | 5V を電源とするトランジスタから、黄色の LED と、IC ソケットの 6, 11, 26, 32 へ。 OFF のとき 5V, ON のときは 0V。 |
6 | GP1 | ツェナーダイオードを介して、 12V を電源とす るトランジスタの入力へ。ここが Off になると、切替えスイッチを介して IC ソケットの 1 または 14 または 36 ピンに 12V がかかる。 ON のときは 0V になる。 |
5 | GP2 | 1.5kΩ の抵抗を介して、 RS232C の 2 番 ポートへ。 |
4 | GP3 | RS232C からの入力ポートとして使用。 |
3 | GP4 | ICソケットの 24, 28, 39 へ、 |
2 | GP5 | ICソケットの 23, 25, 29, 40 へ。 |
検査プログラムはつぎの動作をする。
プログラム中で使用している定数は次の通り
使用している変数は次のとおり
プログラムは init により割り込みの設定をし、その後無限ループに入る。 割り込みは 内蔵クロック/プリスケーラ 256/256 の割合、つまり、およそ 1MHz/256/256 ≒ 15Hz で割り込みがかかる。
割り込みがかかったら 4 番地からプログラムを実行する。 始めにレジスタをすべて退避し、割り込みフラグを見て、正しいタイマ割り込 みかチェックする。
割り込みの主な処理は各モードでの動作であるサブルーチン mode と、その後 に呼ばれるLED を点滅させるサブルーチンflash である。
counterB は同一モードの繰り返し回数を管理している。 最大数は MAXCOUNT 定数で設定されている。 この値をひとつずつ減らしていき、 0 以外ならここで割り込み処理を終了す る。
counterA はモードの番号を示していて、最大状態数は MAXSTAT で管理してい る。最終モードになったら、またモード 1 からになる。 counterA を更新するとき、 counterC に counterA の二倍が入るよう setcountc サブルーチンを呼ぶ。
ここで、退避したレジスタを元に戻し、割り込み処理を終了する。
このサブルーチンでは counterC が 0 のとき、 counterC を 1 減らし、 GPIO の 0 bit のみを反転、つまり黄色 LED を点滅させる。
mode サブルーチンは counterA の値に応じて mode1 ~ mode5 の各モードを 呼び出す。
各モードでは 0 にしたい bit はマスクデータを使い and をとる。 1 にしたい bit はbsf 命令で個別に bit を指定している。
GPIO の 0 bit 目だけはそのままにし、他の bit を全て 0 にする。
GPIO の 0 bit 目だけはそのままにし、 1 bit のみを 1 にし、 2~5 bit 目は全て 0 にする。 (GPIO の 6,7 bit は未定義)
GPIO の 0 bit 目だけはそのままにし、 2 bit目 のみを 1 にし、 1 bit 目と 3~5 bit 目は全て 0 にする。
GPIO の 0 bit 目だけはそのままにし、 4 bit目 のみを 1 にし、 1~3 bit 目と 5 bit 目は全て 0 にする。
GPIO の 0 bit 目だけはそのままにし、 5 bit目 のみを 1 にし、 1~4 bit 目を全て 0 にする。
list p=12f629
#include p12f629.inc
variable env
env = _CPD_OFF
env &= _CP_OFF
env &= _BODEN_ON
env &= _MCLRE_OFF
env &= _PWRTE_ON
env &= _WDT_OFF
env &= _INTRC_OSC_NOCLKOUT
__config env
#define MAXSTAT d'5'+d'1'
#define MAXCOUNT d'32'
cblock 0x20
endc
org 0x0000
goto init
org 0x0004
cblock
wreg
stat
endc
movwf wreg
movf STATUS,0
movwf stat
btfss INTCON,T0IF
goto endinit
bcf INTCON,T0IF
cblock
counterA
counterB
counterC
endc
call mode
call flash
decfsz counterB,1
goto endinit
movlw MAXCOUNT
movwf counterB
incf counterA,1
movlw MAXSTAT
subwf counterA,0
btfss STATUS,C
goto setcount
movlw d'1'
movwf counterA
setcount
call setcountc
endinit
movf stat,0
movwf STATUS
movf wreg,0
retfie
setcountc
bcf STATUS,C
rlf counterA,0
movwf counterC
return
flash
movf counterC,1
btfsc STATUS,Z
return
decf counterC,1
movlw b'00000001'
xorwf GPIO,1
return
mode
movf counterA,0
addwf PCL,1
return
goto mode1
goto mode2
goto mode3
goto mode4
goto mode5
return
return
return
mode1
movlw b'00000001'
andwf GPIO,1
return
mode2
movlw b'00000011'
andwf GPIO,1
bsf GPIO,1
return
mode3
movlw b'00000101'
andwf GPIO,1
bsf GPIO,2
return
mode4
movlw b'00010001'
andwf GPIO,1
bsf GPIO,4
return
mode5
movlw b'00100001'
andwf GPIO,1
bsf GPIO,5
return
init
call 0x3ff
banksel OSCCAL
movwf OSCCAL
banksel GPIO
movlw b'00000011'
movwf GPIO
movlw b'00000111'
movwf CMCON
banksel TRISIO
; movlw b'00000000'
; movwf ANSEL
movlw b'00001000'
movwf TRISIO
clrwdt
movlw b'00000111'
movwf OPTION_REG
banksel GPIO
clrf GPIO
movlw d'1'
movwf counterA
movlw MAXCOUNT
movwf counterB
call setcountc
bsf INTCON,T0IE
bcf INTCON,T0IF
bsf INTCON,GIE
goto $
end