教育用GM管開発を振り返って(8)その2
(その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:TJOがid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)