;******************************************************************************************
;  三角波オシレータサンプル (16F88)
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H18.09.30
;   History      :
;******************************************************************************************
;  (1)Descript I/O 
;      B0～B7 : D/A Converter Output
;      A0  : Signal Output
;      A1  : Sirial Data 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	GETFLG
;  2.波形を出力する
	CALL	MKWAVE

	GOTO	MAIN

;******************************************************************************************
;   Function Name : GETWVAL
;   Title         : 三角波の波形の大きさを設定する
;   Input         : 
;   Output        : 
;******************************************************************************************
GETWVAL
	ADDWF	PCL,F
	RETLW	D'100'	; 00
	RETLW	D'104'	; 01
	RETLW	D'118'	; 02
	RETLW	D'112'	; 03
	RETLW	D'116'	; 04
	RETLW	D'120'	; 05
	RETLW	D'124'	; 06
	RETLW	D'128'	; 07
	RETLW	D'132'	; 08
	RETLW	D'136'	; 09
	RETLW	D'140'	; 10
	RETLW	D'144'	; 11
	RETLW	D'148'	; 12
	RETLW	D'152'	; 13
	RETLW	D'156'	; 14
	RETLW	D'160'	; 15
	RETLW	D'164'	; 16
	RETLW	D'168'	; 17
	RETLW	D'172'	; 18
	RETLW	D'176'	; 19
	RETLW	D'180'	; 20
	RETLW	D'184'	; 21
	RETLW	D'188'	; 22
	RETLW	D'192'	; 23
	RETLW	D'196'	; 24
	RETLW	D'200'	; 25
	RETLW	D'196'	; 26
	RETLW	D'192'	; 27
	RETLW	D'188'	; 28
	RETLW	D'184'	; 29
	RETLW	D'180'	; 30
	RETLW	D'176'	; 31
	RETLW	D'172'	; 32
	RETLW	D'168'	; 33
	RETLW	D'164'	; 34
	RETLW	D'160'	; 35
	RETLW	D'156'	; 36
	RETLW	D'152'	; 37
	RETLW	D'148'	; 38
	RETLW	D'144'	; 39
	RETLW	D'140'	; 40
	RETLW	D'136'	; 41
	RETLW	D'132'	; 42
	RETLW	D'128'	; 43
	RETLW	D'124'	; 44
	RETLW	D'120'	; 45
	RETLW	D'116'	; 46
	RETLW	D'112'	; 47
	RETLW	D'108'	; 48
	RETLW	D'104'	; 49
	RETLW	D'100'	; 50
	RETLW	D'096'	; 51
	RETLW	D'092'	; 52
	RETLW	D'088'	; 53
	RETLW	D'084'	; 54
	RETLW	D'080'	; 55
	RETLW	D'076'	; 56
	RETLW	D'072'	; 57
	RETLW	D'068'	; 58
	RETLW	D'064'	; 59
	RETLW	D'060'	; 60
	RETLW	D'056'	; 61
	RETLW	D'052'	; 62
	RETLW	D'048'	; 63
	RETLW	D'044'	; 64
	RETLW	D'040'	; 65
	RETLW	D'036'	; 66
	RETLW	D'032'	; 67
	RETLW	D'028'	; 68
	RETLW	D'024'	; 69
	RETLW	D'020'	; 70
	RETLW	D'016'	; 71
	RETLW	D'012'	; 72
	RETLW	D'008'	; 73
	RETLW	D'004'	; 74
	RETLW	D'000'	; 75
	RETLW	D'004'	; 76
	RETLW	D'008'	; 77
	RETLW	D'012'	; 78
	RETLW	D'016'	; 79
	RETLW	D'020'	; 80
	RETLW	D'024'	; 81
	RETLW	D'028'	; 82
	RETLW	D'032'	; 83
	RETLW	D'036'	; 84
	RETLW	D'040'	; 85
	RETLW	D'044'	; 86
	RETLW	D'048'	; 87
	RETLW	D'052'	; 88
	RETLW	D'056'	; 89
	RETLW	D'060'	; 90
	RETLW	D'064'	; 91
	RETLW	D'068'	; 92
	RETLW	D'072'	; 93
	RETLW	D'076'	; 94
	RETLW	D'080'	; 95
	RETLW	D'084'	; 96
	RETLW	D'088'	; 97
	RETLW	D'092'	; 98
	RETLW	D'096'	; 99
	RETLW	D'100'	; 100
	RETLW	D'000'	; 
	RETLW	D'000'	; 
;******************************************************************************************
;   Function Name : GETFLG
;   Title         : 波形の間隔時間変数を設定する
;   Input         : 
;   Output        : 
;******************************************************************************************
GETFLG
	MOVLW	H'01'
	MOVWF	WTIND

; 1.SWからの設定
	BTFSS	PORTA,2
	GOTO	GETFLGS2
	MOVLW	H'01'	; 536Hz
	MOVWF	WTLOP
	RETURN
GETFLGS2  
	BTFSS	PORTA,3
	GOTO	GETFLGS3
	MOVLW	H'11'	;101Hz	
	MOVWF	WTLOP
	RETURN
GETFLGS3
	BTFSS	PORTA,4
	GOTO	GETFLGS4
	MOVLW	H'25'	; 50Hz	
	MOVWF	WTLOP
	RETURN
GETFLGS4
	BTFSS	PORTA,5
	GOTO	GETFLGSER
	MOVLW	H'D0'	; 10Hz	
	MOVWF	WTLOP
	RETURN
GETFLGSER
	BTFSS	PORTA,1
	GOTO	GETFLGCHK
;
GETFLGCHK
	MOVFW	WTLOP
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	GETFLG

	RETURN

;******************************************************************************************
;   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	WAVWAT
	DECFSZ	LPWAV0,F
	GOTO	MKWAVE2

	RETURN

;******************************************************************************************
;   Function Name : WAVWAT
;   Title         : 波形の長さを設定する(WAITする)
;   Input         : 
;   Output        : 
;******************************************************************************************
WAVWAT
	MOVFW	WTIND
	MOVWF	LPWAVWATB
WAVWATB
	MOVFW	WTLOP
	MOVWF	LPWAVWATA
WAVWATA
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	LPWAVWATA,F
	GOTO	WAVWATA
	DECFSZ	LPWAVWATB,F
	GOTO	WAVWATB
	RETURN

	END
