;******************************************************************************************
;  オシレータサンプル (16F88) 
;    Ｓｉｎ波・外部クロック動作バージョン
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H18.09.30
;   History      :
;******************************************************************************************
;  (1)Descript I/O 
;      B0～B7 : D/A Converter Output
;      A1  : OSC Input
;      A2  : Push SW (1)
;      A3  : Push SW (2)
;      A4  : Push SW (3)
;      A5  : Push SW (4)
;
;******************************************************************************************

	LIST	P=PIC16F88,ST=OFF,R=DEC
	INCLUDE	"P16F88.inc"	
	__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
;	__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC
	__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF
;
WTIND	EQU	20H
WTLOP	EQU	21H
TMP1	EQU	22H
LPWAV0	EQU	23H
LPWAVWATA EQU	24H
LPWAVWATB EQU	25H

	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
; Bank0での設定
	BANKSEL	PORTA	; (Bank0)
	CLRF	PORTA	; PortAの初期化
	CLRF	PORTB	; PortBの初期化

; Bank1での設定
	BANKSEL	ANSEL	; (Bank1)
	MOVLW	B'01111110'	;内部OSC選択,内部OSCに8MHzを選択
	MOVWF	OSCCON
	MOVLW	B'00000000'	; 全てをDegitalに設定
	MOVWF	ANSEL	; Degital Inputに設定(Bank1)
	MOVLW	B'11111110'
	MOVWF	TRISA	; PortAのI/O設定(Bank1)
	MOVLW	B'00000000'
	MOVWF	TRISB	; PortBのI/O設定(Bank1)
; Bank0に戻す
	BANKSEL	PORTA	; PortAのBankを選択する
;
	CLRF	WTLOP
	BCF	PORTA,0
MAIN
;  1.波形を出力する
	CALL	MKWAVE

	GOTO	MAIN

;******************************************************************************************
;   Function Name : GETWVAL
;   Title         : SIN波の波形の大きさを設定する
;   Input         : 
;   Output        : 
;******************************************************************************************
GETWVAL
	ADDWF	PCL,F
	RETLW	D'100'	; 00
	RETLW	D'106'	; 01
	RETLW	D'113'	; 02
	RETLW	D'119'	; 03
	RETLW	D'125'	; 04
	RETLW	D'131'	; 05
	RETLW	D'137'	; 06
	RETLW	D'143'	; 07
	RETLW	D'148'	; 08
	RETLW	D'154'	; 09
	RETLW	D'159'	; 10
	RETLW	D'164'	; 11
	RETLW	D'168'	; 12
	RETLW	D'173'	; 13
	RETLW	D'177'	; 14
	RETLW	D'181'	; 15
	RETLW	D'184'	; 16
	RETLW	D'188'	; 17
	RETLW	D'190'	; 18
	RETLW	D'193'	; 19
	RETLW	D'195'	; 20
	RETLW	D'197'	; 21
	RETLW	D'198'	; 22
	RETLW	D'199'	; 23
	RETLW	D'200'	; 24
	RETLW	D'200'	; 25
	RETLW	D'200'	; 26
	RETLW	D'199'	; 27
	RETLW	D'198'	; 28
	RETLW	D'197'	; 29
	RETLW	D'195'	; 30
	RETLW	D'193'	; 31
	RETLW	D'190'	; 32
	RETLW	D'188'	; 33
	RETLW	D'184'	; 34
	RETLW	D'181'	; 35
	RETLW	D'177'	; 36
	RETLW	D'173'	; 37
	RETLW	D'168'	; 38
	RETLW	D'164'	; 39
	RETLW	D'159'	; 40
	RETLW	D'154'	; 41
	RETLW	D'148'	; 42
	RETLW	D'143'	; 43
	RETLW	D'137'	; 44
	RETLW	D'131'	; 45
	RETLW	D'125'	; 46
	RETLW	D'119'	; 47
	RETLW	D'112'	; 48
	RETLW	D'106'	; 49
	RETLW	D'100'	; 50
	RETLW	D'094'	; 51
	RETLW	D'087'	; 52
	RETLW	D'081'	; 53
	RETLW	D'075'	; 54
	RETLW	D'069'	; 55
	RETLW	D'063'	; 56
	RETLW	D'057'	; 57
	RETLW	D'052'	; 58
	RETLW	D'046'	; 59
	RETLW	D'041'	; 60
	RETLW	D'036'	; 61
	RETLW	D'031'	; 62
	RETLW	D'027'	; 63
	RETLW	D'023'	; 64
	RETLW	D'019'	; 65
	RETLW	D'015'	; 66
	RETLW	D'012'	; 67
	RETLW	D'009'	; 68
	RETLW	D'007'	; 69
	RETLW	D'005'	; 70
	RETLW	D'003'	; 71
	RETLW	D'002'	; 72
	RETLW	D'001'	; 73
	RETLW	D'000'	; 74
	RETLW	D'000'	; 75
	RETLW	D'000'	; 76
	RETLW	D'001'	; 77
	RETLW	D'002'	; 78
	RETLW	D'003'	; 79
	RETLW	D'005'	; 80
	RETLW	D'007'	; 81
	RETLW	D'010'	; 82
	RETLW	D'012'	; 83
	RETLW	D'016'	; 84
	RETLW	D'019'	; 85
	RETLW	D'023'	; 86
	RETLW	D'027'	; 87
	RETLW	D'032'	; 88
	RETLW	D'036'	; 89
	RETLW	D'041'	; 90
	RETLW	D'047'	; 91
	RETLW	D'052'	; 92
	RETLW	D'058'	; 93
	RETLW	D'063'	; 94
	RETLW	D'069'	; 95
	RETLW	D'075'	; 96
	RETLW	D'081'	; 97
	RETLW	D'088'	; 98
	RETLW	D'094'	; 99
	RETLW	D'100'	; 100
	RETLW	D'000'	; 
	RETLW	D'000'	; 

;******************************************************************************************
;   Function Name : MKWAVE
;   Title         : 波形を出力する
;   Input         : 
;   Output        : 
;******************************************************************************************
MKWAVE
; 1.100回ループ設定
	MOVLW	H'64'
	MOVWF	LPWAV0
MKWAVE2
; 2.波形の大きさを設定する
;  (1)テーブルの加算値を計算(100-LPWAV0=>Wreg) 
	MOVLW	H'64'
	MOVWF	TMP1
	MOVFW	LPWAV0
	SUBWF	TMP1,W
;  (2)波形の大きさを得る(0=>200;0V=>3.92V)
	CALL	GETWVAL
;  (3)波形の振幅をオペアンプ(LM356)に合わせて補正する
	MOVWF	TMP1
	RRF	TMP1,F	; 振幅を半分にする(0V=>1.96V)
	MOVLW	D'26'	; 0.5V程度の下駄を履かせる
	ADDWF	TMP1,W
;  (4)D/A　Converterに出力する
	MOVWF	PORTB
; 3.波形の長さを設定する
	CALL	CHKPLS
	DECFSZ	LPWAV0,F
	GOTO	MKWAVE2

	RETURN

;******************************************************************************************
;   Function Name : CHKPLS
;   Title         : 入力波形をチェックする(WAITする)
;   Input         : 
;   Output        : 
;******************************************************************************************
CHKPLS
; 1.パルスが'H'
	BTFSC	PORTA,1
	GOTO	$-1
; 2.パルスが'L'
	BTFSS	PORTA,1
	GOTO	$-1
;
	RETURN

	END

