教育用GM管開発を振り返って(8)その2

apgmman.hatenablog.com

(その2)は続編なので、前編がまだの方は前編を先に。


7SEGGM管のPICプログラム(続き)


以下が計数を実行する本体で、まず検出を確認する。信号がONなら、フラッグを立て、再度、信号がONになれば、検出とみなしてフラッグを降ろす。CINI以下は、反復して実施される。

CINI	BTFSS	PORTA,4		;RA4がクリアならばMAINへ
	GOTO	CPAS
	BSF	ON,0		;(ON,0)をセット
	GOTO	MAIN
CPAS	BTFSS	ON,0		;(ON,0)がクリアならばMAINへ
	GOTO	MAIN

次では、パルスの検出後1msec以内の後続パルスを継続的に排除して、複数パルスによる重複カウントを避ける処理を実行している。

PDOWN				;パルスの立下りを検出
	MOVF	TMR1H,0
	ADDLW	0xF9
	BTFSS	STATUS,C	;TMR1H=256-7=249=0xF9
	GOTO	T1CLR
	MOVF	TMR1L,0
	ADDLW	0x30
	BTFSC	STATUS,C	;TMR1L=256-208=48=0x30
	GOTO	CSTART		;TMR=7*256+208=2000=1msec/(0.125usec*4)
T1CLR				;TMR1リスタート
	CLRF	TMR1H
	CLRF	TMR1L
	MOVLW	B'00000001'
	MOVWF	T1CON

ここからが、計数の本体で、まず、計数を8進数で加算し、10進数の各桁に桁上がりを含めて換算する。

CSTART
	INCF	N1,1		;N1=N1+1
	MOVF	N1,0
	SUBLW	0x0A
	BTFSS	STATUS,Z
	GOTO	NCL
	CLRF	N1
	INCF	N2,1		;桁上がり(N2=N2+1)
	MOVF	N2,0
	SUBLW	0x0A
	BTFSS	STATUS,Z
	GOTO	NCL
	CLRF	N2
	INCF	N3,1		;桁上がり(N3=N3+1)
	MOVF	N3,0
	SUBLW	0x0A
	BTFSS	STATUS,Z
	GOTO	NCL
	CLRF	N3
	INCF	N4,1		;桁上がり(N4=N4+1)
	MOVF	N4,0
	SUBLW	0x0A
	BTFSS	STATUS,Z
	GOTO	NCL
	CLRF	N4
NCL
	BCF	ON,0		;(ON,0)をクリア
	GOTO	MAIN

以下はサブルーチンで、HFEXでは、ボタンスイッチが押されたときに立てるフラッグのONとOFFを切り替える。LEDOFFでは7セグメントLEDを消灯する。

HFEX
BTFSC	HF,0
	GOTO	EX0
	BSF	HF,0		;If Hold flag is clear
	RETURN
EX0	BCF	HF,0		;If Hold flag is set
	RETURN
;
LEDOFF
	CLRF	PORTB		;Rev.2
	BCF	PORTA,0
	BCF	PORTA,1
	BCF	PORTA,2
	BCF	PORTA,3
	RETURN

DSPでは7セグメントLEDに数値を表示する。計数のレジスターが改変されないように、レジスターを置き換えて処理をしている。

DSP				;7seg-LED display
LX0	MOVF	LX,1
	BTFSS	STATUS,Z
	GOTO	LX1
	BTFSC	PORTA,0
	GOTO	LXE
	MOVF	N5,0
	MOVWF	N
	CALL	SEG
	MOVWF	PORTB
	BSF	PORTA,0		;RA0点灯(7-SEGがカソードコモンのため、NPNTr使用)
	GOTO	LXE
LX1	MOVF	LX,0
	SUBLW	0x01
	BTFSS	STATUS,Z
	GOTO	LX2
	BTFSC	PORTA,1
	GOTO	LXE
	MOVF	N6,0
	MOVWF	N
	CALL	SEG
	MOVWF	PORTB
	BSF	PORTA,1		;RA1点灯(7-SEGがカソードコモンのため、NPNTr使用)
	GOTO	LXE
LX2	MOVF	LX,0
	SUBLW	0x02
	BTFSS	STATUS,Z
	GOTO	LX3
	BTFSC	PORTA,2
	GOTO	LXE
	MOVF	N7,0
	MOVWF	N
	CALL	SEG
	MOVWF	PORTB
	BSF	PORTA,2		;RA2点灯(7-SEGがカソードコモンのため、NPNTr使用)
	GOTO	LXE
LX3	MOVF	LX,0
	SUBLW	0x03
	BTFSS	STATUS,Z
	GOTO	LXE
	BTFSC	PORTA,3
	GOTO	LXE
	MOVF	N8,0
	MOVWF	N
	CALL	SEG
	MOVWF	PORTB
	BSF	PORTA,3		;RA3点灯(7-SEGがカソードコモンのため、NPNTr使用)
LXE	RETURN

SEGでは、10進数の数値の表示を7セグメントLEDの各セグメントに割り当てている。

SEG				;7SEG変換
	MOVF	N,1
	BTFSC	STATUS,Z
	RETLW	B'01111110'	;0
	MOVF	N,0
	SUBLW	0x01
	BTFSC	STATUS,Z
	RETLW	B'00110000'	;1
	MOVF	N,0
	SUBLW	0x02
	BTFSC	STATUS,Z
	RETLW	B'01101101'	;2
	MOVF	N,0
	SUBLW	0x03
	BTFSC	STATUS,Z
	RETLW	B'01111001'	;3
	MOVF	N,0
	SUBLW	0x04
	BTFSC	STATUS,Z
	RETLW	B'00110011'	;4
	MOVF	N,0
	SUBLW	0x05
	BTFSC	STATUS,Z
	RETLW	B'01011011'	;5
	MOVF	N,0
	SUBLW	0x06
	BTFSC	STATUS,Z
	RETLW	B'01011111'	;6
	MOVF	N,0
	SUBLW	0x07
	BTFSC	STATUS,Z
	RETLW	B'01110000'	;7
	MOVF	N,0
	SUBLW	0x08
	BTFSC	STATUS,Z
	RETLW	B'01111111'	;8
	MOVF	N,0
	SUBLW	0x09
	BTFSC	STATUS,Z
	RETLW	B'01111011'	;9
	RETLW	B'01001111'	;E
;
	END

見た目は複雑そうだが、実際は順に実行されるので、演算の流れのイメージは掴みやすい。


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)