;******************************************************************************************
;  DC 12Vモーター制御サンプル(PWM方式)
;   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
LP1	EQU	22H
INDAT	EQU	23H
LPDAT	EQU	24H
CNT	EQU	25H
CNT1	EQU	26H
CNT2	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	PROG1
;
	GOTO	MAIN

;******************************************************************************************
;   Function Name : PROG1
;   Title         : プログラム(1)
;                   PWM方式によるDCモーター制御サンプル
;   Input         : 
;   Output        : 
;   Disctiption   : 
;******************************************************************************************
PROG1
;  1.A/D Conveter より電圧を得る(0->1024)
	CALL	GETADC
;
;  2.変数補正
;    (1)10ビットADC変数を、(符号)＋8ビット変数に加工(末尾1ビットは切り捨てる)  =>INDAT
	MOVFW	ADANSL
	MOVWF	INDAT
	RRF	INDAT,F
	BTFSS	ADANSH,0 ; ビットデータが0の時, 0を立てる
	BCF	INDAT,7
	BTFSC	ADANSH,0 ; ビットデータが1の時, 1を立てる
	BSF	INDAT,7
;    (2) (1)変数をセンターゼロに補正する INDAT=>LPDAT
;      1)前進の場合
	BTFSS	ADANSH,1 ; A/D Converterの10ビットめが1の時(512->1023)
	GOTO	PROG1A
;         補正なし)
	MOVFW	INDAT
	MOVWF	LPDAT
	GOTO	PROG1B
;      2)後進の場合 
PROG1A	; A/D Converterの10ビットめが0の時(0->511)	
;         補正2)INDAT;0=>FF,,,,FF=>0;(FF-INDAT)
	MOVLW	H'FF'
	MOVWF	LPDAT
	MOVFW	INDAT
	SUBWF	LPDAT,F
;
PROG1B	
;  3.モータを回転させる
;   a)FE回ループ
	MOVLW	H'FE'
	MOVWF	LP1
PROG1C	
;    (1)モータを初期化（停止状態）
	CALL	MOFF
;    (2)スピード変数(LPDAT > LP1)ならモーターを動かす
	MOVFW	LP1
	SUBWF	LPDAT,W
	BTFSC	STATUS,C
	CALL	MMOVE
;    (3)Wait(パルス幅を成型) 
	CALL	TIMER
;    (4)ループの判定 
	DECFSZ	LP1,F
	GOTO	PROG1C

	RETURN
;******************************************************************************************
;   Function Name : MMOVE
;   Title         : モーターを動かす
;   Input         : 
;   Output        : 
;   Disctiption   : 
;******************************************************************************************
MMOVE
;    (1)前進
	BTFSC	ADANSH,1 ; A/D Converterの10ビットめが1の時(512->1023)	
	CALL	MFON	
;    (2)後進 
	BTFSS	ADANSH,1 ; A/D Converterの10ビットめが1の時(0->511)	
	CALL	MBON	
	RETURN
;******************************************************************************************
;   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
	MOVLW	H'0A'
	MOVWF	CNT1
TIMER1
	MOVLW	H'0A'
	MOVWF	CNT
TIMER2
	DECFSZ	CNT,F
	GOTO	TIMER2 
	DECFSZ	CNT1,F
	GOTO	TIMER1

	RETURN

	END
