;******************************************************************************************
;  ACパルス発振器サンプル
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.11.03
;   History      :
;******************************************************************************************
;   Define I/O
;     GP0:TR(F2)
;     GP1:TR(F1)
;     GP2:A/D-Converter(AN2)
;     GP3:None 
;     GP4:TR(R1)
;     GP5:TR(R2)
;
;******************************************************************************************
;====================== 以下は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 
;
ADANSH	EQU	20H
ADANSL	EQU	21H
CNT	EQU	22H
CNT1	EQU	23H
CNT2	EQU	24H
CNT3	EQU	25H
INDAT	EQU	26H
LPDAT	EQU	27H

;
	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'00010100'	; Bit7:0, Bit6-4:ADC Clock, Bit3-0:Select Degital or Analog
	MOVWF	ANSEL		; Bit3-0:全てアナログ,Bit6-4:1/8（中ぐらいの速さ）を指定
	MOVLW	B'001100'	; GP2,GP3は入力に設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を指定
	MOVLW	B'000111'	; BANK0でComparaterとして使わないでGP0-3はデジタルIO設定    
	MOVWF	CMCON0		; BANK0でデジタルIO設定  ※See 8.0 Comparater Control Register
	MOVLW	B'010010'	; BANK0でポート初期化
	MOVWF	GPIO		; BANK0でポート初期化
	MOVLW	B'10001001'	; GP7:Fmt, GP6:VRef, GP5,4:None, GP3,2:Sel Bit, GP1:Start, GP0:ADC On 
	MOVWF	ADCON0		; 結果を右詰,基準は電源電圧,AN2指定,測定準備,ADC ONを指定
;=====================================================================


MAIN
	CALL	PROG2
;
	GOTO	MAIN

;******************************************************************************************
;   Function Name : PROG2
;   Title         : プログラム(2)
;                   ACパルス発振器サンプル
;   Input         : 
;   Output        : 
;   Disctiption   : 
;******************************************************************************************
PROG2
;  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
;  3.ダイヤル向きの補正
	MOVLW	H'FF'
	MOVWF	LPDAT
	MOVFW	INDAT
	SUBWF	LPDAT,F
;  4.プラスパルス
	CALL	MFON
;  5.WAIT
	CALL	TIMER
;  6.マイナスパルス
	CALL	MBON
;  7.WAIT 
	CALL	TIMER
;
	GOTO	PROG2
;******************************************************************************************
;   Function Name : MFON
;   Title         : プラスパルス
;   Input         : 
;   Output        : 
;   Disctiption   : 
;******************************************************************************************
MFON
; 1.TRを止める
	BCF	GPIO,0
	BCF	GPIO,5
	BSF	GPIO,1
	BSF	GPIO,4
; 2.プラスTRを稼動
	BSF	GPIO,5
	BCF	GPIO,4

	RETURN
;******************************************************************************************
;   Function Name : MBON
;   Title         : マイナスパルス
;   Input         : 
;   Output        : 
;   Disctiption   : 
;******************************************************************************************
MBON
; 1.TRを止める
	BCF	GPIO,0
	BCF	GPIO,5
	BSF	GPIO,1
	BSF	GPIO,4
; 2.マイナスTRを稼動
	BSF	GPIO,0
	BCF	GPIO,1
;
	RETURN

;******************************************************************************************
;   Function Name : MOFF
;   Title         : ゼロパルス
;   Input         : 
;   Output        : 
;   Disctiption   : 
;******************************************************************************************
MOFF
; 1.TRのBを止める
	BCF	GPIO,0
	BCF	GPIO,5
; 2.TRへの供給Rを切る
	BSF	GPIO,1
	BSF	GPIO,4
;
	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 : TIMER
;   Disctiption   : タイマー
;   Input         : 
;   Output        :
;******************************************************************************************
TIMER
	MOVFW	LPDAT
	MOVWF	CNT2
TIMER2
	MOVLW	H'01'
	MOVWF	CNT1
TIMER1
	MOVLW	H'0A'
	MOVWF	CNT
TIMER0
	DECFSZ	CNT,F
	GOTO	TIMER0 
	DECFSZ	CNT1,F
	GOTO	TIMER1
	DECFSZ	CNT2,F
	GOTO	TIMER2

	RETURN

	END
