;******************************************************************************************
;  チョッパー式スイッチングレギュレター　サンプル
;     発振周波数 10KHz
;     出力電圧    3V
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H18.01.20
;   History      :
;******************************************************************************************
;   Define I/O
;     GP0:ADC Input(AN0)
;     GP1:None 
;     GP2:TR Base Control
;     GP3:None 
;     GP4:None
;     GP5:None
;******************************************************************************************
;====================== 以下はPIC12F683用の記述 ======================
	LIST	P=PIC12F683,ST=OFF,R=DEC
	INCLUDE	"P12F683.inc"	;標準ヘッダ定義ファイル
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF 
; 設定電圧パラメータ(3V;153/2,  5V;255/2)
PI_VLT	= H'4C'	;153/2(=H'99') 
;
ADANSH	EQU	20H
ADANSL	EQU	21H
INDAT	EQU	22H
LPTIM10K1 EQU	23H
;
	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
	BSF	STATUS,RP0	; BANK1を選択
	BSF	OSCCON,6	; 8MHzを設定
	BSF	OSCCON,5	; 8MHzを設定
	BSF	OSCCON,4	; 8MHzを設定
	MOVLW	B'00010001'	; Bit7:0, Bit6-4:ADC Clock, Bit3-0:Select Degital or Analog
	MOVWF	ANSEL		; Bit3-0:AN0のみアナログ,Bit6-4:Fosc/2;高速を指定
	MOVLW	B'111011'	; GP2は出力に設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を指定
;	MOVLW	B'111011'	; BANK0でComparaterとして使わないでGP0-3はデジタルIO設定    
;	MOVWF	CMCON0		; BANK0でデジタルIO設定  ※See 8.0 Comparater Control Register
	CLRF	GPIO		; BANK0でポート初期化
	MOVLW	B'10000001'	; GP7:Fmt, GP6:VRef, GP5,4:None, GP3,2:Sel Bit, GP1:Start, GP0:ADC On 
	MOVWF	ADCON0		; 結果を右詰,基準は電源電圧,AN2指定,測定準備,ADC ONを指定
;=====================================================================
	BCF	GPIO,2
MAIN
; 1.電圧測定
	CALL	CHKVLT
; 2.電圧が低い場合、スイッチングトランジスタをONにする
	CALL	TRCHKON
; 3.スイッチングトランジスタをOFFにする
	CALL	TROFF
;
	GOTO	MAIN
;
;******************************************************************************************
;   Function Name : TROFF
;   Title         : スイッチングトランジスタをOFFにする
;   Input         : 
;   Output        : 
;   Disctiption   : 
;******************************************************************************************
TROFF
; 1.TRをOFFにする	
	BCF	GPIO,2
; 2.WAIT(10KHz)
	CALL	TIM10K
;
	RETURN
;******************************************************************************************
;   Function Name : TRCHKON
;   Title         : 電圧が低い場合、スイッチングトランジスタをONにする
;   Input         : INDAT
;   Output        : 
;   Disctiption   : 
;******************************************************************************************
TRCHKON
;  1.電圧が高い場合、抜ける
	MOVLW	PI_VLT
	SUBWF	INDAT,F
	BTFSC	STATUS,C
	RETURN
;  2.TRをONにする
	BSF	GPIO,2
;  3.WAIT(10KHz)
	CALL	TIM10K
;  4.TRをOFFにする
	BCF	GPIO,2
;
	RETURN

;******************************************************************************************
;   Function Name : CHKVLT
;   Title         : 電圧測定
;   Input         : 
;   Output        : INDAT
;   Disctiption   : 
;******************************************************************************************
CHKVLT
;  1.A/D Conveter より電圧を得る(0->1024)
	CALL	GETADC
;  2.10ビット=>8ビット変換(下2ビットは切り捨て)
	MOVFW	ADANSL
	MOVWF	INDAT
	RRF	INDAT,F
	RRF	INDAT,F
	BTFSS	ADANSH,1
	BCF	INDAT,7
	BTFSC	ADANSH,1
	BSF	INDAT,7
	BTFSS	ADANSH,0
	BCF	INDAT,6
	BTFSC	ADANSH,0
	BSF	INDAT,6

	RETURN
;
;******************************************************************************************
;   Function Name : GETADC
;   Title         : A/D Converter からのデータ収集関数
;   Input         : 
;   Output        : ADANSH   :  上位２ビット
;                   ADANSL   :  下位８ビット
;******************************************************************************************
GETADC
	BCF	STATUS,RP0	; BANK0を指定
	BSF	ADCON0,GO	; ADCの開始フラグを立てる
	BTFSC	ADCON0,GO	; ADCの開始フラグが完了するまで待つ
	GOTO	$-1		; ADCの開始フラグが完了するまで待つ
	MOVFW	ADRESH		; 上位２ビットデータ収集
	MOVWF	ADANSH		; 上位２ビットデータ代入
        BSF	STATUS,RP0	; BANK1を指定
	MOVFW	ADRESL		; 下位８ビットデータ収集
	BCF	STATUS,RP0	; BANK0を指定
	MOVWF	ADANSL		; 下位８ビットデータ代入

	RETURN


;******************************************************************************************
;   Function Name : TIM10K
;   Title         : WAIT(10KHz)
;   Input         : 
;   Output        :
;   Disctiption   : 8MHz/4 => 20KHz
;******************************************************************************************
TIM10K
	MOVLW	H'32'
	MOVWF	LPTIM10K1
TIM10K1			;100 STEP
	DECFSZ	LPTIM10K1,F
	GOTO	TIM10K1 
	RETURN
	END
