ライタのチェック

このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

2-1. プログラマ(ライタ)の製作

プログラマの入手方法

PIC ライタの製作上の注意点

  1. ハンダ付け一点一点で、導通、ショートのチェックを行う
  2. コンデンサの足はなるべく短く付ける
  3. トランジスタ、ダイオードは熱に弱いため、半田の熱で破壊してしまうこ とがあるので、注意すること

テスターによるチェック

電源、GND 関係の導通チェック

はじめに

電源ショートのチェック

信号線のチェック

電池を入れて 5V の電圧のチェック

三端子レギュレータを指で触り、異常発熱しないことを確かめる 一旦電源を切り、

起動テスト

12F629 や 12F675 の扱いの注意点として、 3FF 番地に retw 命令により定数 が埋め込まれている。 プログラムを書き込む前に、一度値を読み込んでメモしておくと破壊しても元 に戻せる。

検査用プログラムの使用法

検査用プログラムは PIC の各ポートをそれぞれ ON, OFF するだけのプロ グラムである。 これにより、本来 ON/OFF になるべき信号線が正常かどうか調べることができ る。 回路図より、各ポートは次に接続している。

ピン番号ポート接続先
7GP05V を電源とするトランジスタから、黄色の LED と、IC ソケットの 6, 11, 26, 32 へ。 OFF のとき 5V, ON のときは 0V。
6GP1ツェナーダイオードを介して、 12V を電源とす るトランジスタの入力へ。ここが Off になると、切替えスイッチを介して IC ソケットの 1 または 14 または 36 ピンに 12V がかかる。 ON のときは 0V になる。
5GP21.5kΩ の抵抗を介して、 RS232C の 2 番 ポートへ。
4GP3RS232C からの入力ポートとして使用。
3GP4ICソケットの 24, 28, 39 へ、
2GP5ICソケットの 23, 25, 29, 40 へ。

検査プログラムはつぎの動作をする。

  1. mode1 から mode 5 までの動作モードがある。
  2. 動作中は黄色の LED が点灯するが、各モードでモードの番号の回数だけ LED が消える。
  3. 全モードで GP0 は通常 OFF でモードを表示するときだけ ON になる。
  4. mode1 はすべてが OFF になる。このとき、各トランジスタは PNP のスイッ チング回路になっているので、すべて ON になり、電源電圧に近い電圧(5V, 12V)が出力される。
  5. mode2 は GP1 が ON になるので、 12V の出力が OFF になる。 ここで、トランジスタの出力が 0V にならない場合はトランジスタのベースの 電圧、また、ツェナーダイオードの両端の電圧を調べ、想定値になっているか を確認する。 ツェナーダイオードの両端の電圧が低い場合は新しい物に交換する。
  6. mode3 は GP2 が ON になる。 このとき、 RS232C の 2 番ポートに 5V が出力される。
  7. mode4 は GP4 が ON になる。 IC ソケットの 24, 28, 39 が 5V になる か確認する。
  8. mode5 は GP5 が ON になる。 ICソケットの 23, 25, 29, 40 が 5V になるか確認する。

検査用プログラムの説明

プログラム中で使用している定数は次の通り

maxstat=5
mode の数
maxcount=32
モードの持続時間

使用している変数は次のとおり

counterA
モード番号
counterB
モードの持続回数
counterC
LED の点灯時間の調整用

初期化

プログラムは init により割り込みの設定をし、その後無限ループに入る。 割り込みは 内蔵クロック/プリスケーラ 256/256 の割合、つまり、およそ 1MHz/256/256 ≒ 15Hz で割り込みがかかる。

割り込み

主処理

割り込みがかかったら 4 番地からプログラムを実行する。 始めにレジスタをすべて退避し、割り込みフラグを見て、正しいタイマ割り込 みかチェックする。

割り込みの主な処理は各モードでの動作であるサブルーチン mode と、その後 に呼ばれるLED を点滅させるサブルーチンflash である。

counterB は同一モードの繰り返し回数を管理している。 最大数は MAXCOUNT 定数で設定されている。 この値をひとつずつ減らしていき、 0 以外ならここで割り込み処理を終了す る。

counterA はモードの番号を示していて、最大状態数は MAXSTAT で管理してい る。最終モードになったら、またモード 1 からになる。 counterA を更新するとき、 counterC に counterA の二倍が入るよう setcountc サブルーチンを呼ぶ。

ここで、退避したレジスタを元に戻し、割り込み処理を終了する。

flash

このサブルーチンでは counterC が 0 のとき、 counterC を 1 減らし、 GPIO の 0 bit のみを反転、つまり黄色 LED を点滅させる。

mode

mode サブルーチンは counterA の値に応じて mode1 ~ mode5 の各モードを 呼び出す。

各モードでは 0 にしたい bit はマスクデータを使い and をとる。 1 にしたい bit はbsf 命令で個別に bit を指定している。

mode1

GPIO の 0 bit 目だけはそのままにし、他の bit を全て 0 にする。

mode2

GPIO の 0 bit 目だけはそのままにし、 1 bit のみを 1 にし、 2~5 bit 目は全て 0 にする。 (GPIO の 6,7 bit は未定義)

mode3

GPIO の 0 bit 目だけはそのままにし、 2 bit目 のみを 1 にし、 1 bit 目と 3~5 bit 目は全て 0 にする。

mode4

GPIO の 0 bit 目だけはそのままにし、 4 bit目 のみを 1 にし、 1~3 bit 目と 5 bit 目は全て 0 にする。

mode5

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

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科