;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		オーディオジェネレータ　Ver０．１	ＪＡ０ＱＯＮ
;
;
;		内蔵ＤＡＣによる低周波信号発生プログラム
;
;		実験回路２　低周波生成部
;
;		PIC12F1822 32MHZ（内部オシレータ）
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC12F1822
		INCLUDE	P12F1822.INC

;		
;CONFIGURATION WORD 1(ADDRESS:8007H)マニュアル50ページ
;					設定
;bit13		FCMEN	0	Fail-Safe Clock Monitor
;						1=有効,0=無効
;bit12		IESO	0	内部･外部切替スイッチモード
;						1=有効,0=無効
;bit11		CLKOUTEN 1	クロックアウトイネーブルビット
;						1=無効　RA4I/O使用可
;						0=有効　システムクロックがCLKPUTピンに出力される
;bit10-9	BOREN	00	ブラウンアウト設定
;						11=有効
;						10=スリープ時以外有効
;			___			00=無効
;bit8		CPD		1	データメモリプロテクション
;			__			1=無効,0=有効
;bit7		CP		1	プログラムメモリプロテクション　
;						1=無効,0=有効
;bit6		MCLRE	0	RA3/MCLRピン選択ビット
;			_____		1=MCLR有効,0=RA3有効(Digital input)
;bit5		PWRTE	0	power_up timer　使います。
;						1=無効,0=有効
;bit4-3		WDTE	00	Watchdog Timer
;						11=有効
;						10=ランニング中に有効、スリープ中は無効
;						01=レジスタによるコントロール
;						00=無効
;bit2-0		FOSC	100	発振器選択ビット
;						111=ECH:外部クロック入力（4-32MHZ)、RA4I/O可
;						110=ECM:外部クロック入力（0.5-4MHZ)、RA4I/O可
;						101=ECL:外部クロック入力（0-0.5MHZ)、RA4I/O可
;						100=INTOSC:内部発振、RA4-RA5I/O可
;						011=EXTRC:外部RC発振、RA4I/O可、RA5不可
;						010=HS：外部発振子、I/O不可
;						001=XT：　〃
;						000=LP：　〃
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  0  1  0  0  1  1  0  0  0  0  １  0  0
;
;
	__CONFIG _CONFIG1,	B'0000100110000100'
;
;CONFIGURATION WORD 2(ADDRESS:8008H)マニュアル52ページ
;					設定
;bit13		LVP		0	低電圧プログラミング設定
;						1=有効
;			_____		0=無効、高電圧必要
;bit12		DEBUG	1	インサーキット･デバッガ モード設定
;						1=無効
;						0=有効、RA0-1をデバッガに使用
;bit11					Unimplemented
;bit10		BORV	0	ブラウンアウト･リセット電圧選択ビット（Vbor参照)
;						1=低電圧で動作
;						0=高電圧で動作
;bit9		STVREN	0	スタック･オーバーフロー･リセット設定
;						1=有効
;						0=無効
;bit8		PLLEN	0	PLL設定
;						1=4xPLL有効
;						0=4xPLL無効
;bit7-5					Unimplemented
;bit4					Reserved
;bit3-2					Unimplemented
;bit1-0		WRT		11	フラッシュメモリ プロテクション設定（EECONレジスタ参照)
;						11=無効
;						10=0h-1FFh有効
;						01=0h-3FFh有効
;						00=0h-7FFh有効
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  1  0  0  0  0  0  0  0  0  0  0  1  1
;
;
	__CONFIG _CONFIG2,	B'0001000000000011'


;		ワークエリア定義
;
;		BANK0	20h-7Fh
;
;		使用していないのもあります
;

hex0		equ		020h		;取得HEXデータ
hex1		equ		021h		;
hex2		equ		022h
hex3		equ		023h
cnt0		equ		024h		;時間待ちルーチン用
cnt1		equ		025h
cnt2		equ		026h
cnt3		equ		027h
tmp0		equ		028h		;雑用
tmp1		equ		029h
flg			equ		02ah		;エラー＆設定フラグ
mode		equ		02bh		;実行モード設定
TMC			equ		02ch		;タイマオーバーフローカウンタ
CYC0		equ		02dh		;呼び出し周期カウンタ
CYC1		equ		02eh		;呼び出し周期カウンタ
DCO			equ		02fh		;DAC逐次設定データ
;

			ORG		0h
			goto	init
			ORG		04h
			goto	INT			;実験回路２用
			org		05h
			
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			データ補正テーブル
;
;	注意			このルーチンのアドレス範囲の設定が必要
;				PCLATHにその上位アドレスを入れること
;	入力			Wレジスタに4ビットバイナリデータを入れてコール
;	出力			Wレジスタに補正データを入れてリターン
;
;	機能			DAC入力三角波データを、いびつなサイン波に補正
;
;				6サイクル
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_rev
;			andlw	0fh		;下位4ビット取り出し
			addwf	PCL,F
			retlw	00h		;0
			retlw	00h		;1
			retlw	01h		;2
			retlw	02h		;3
			retlw	04h		;4
			retlw	06h		;5
			retlw	09h		;6
			retlw	0ch		;7
			retlw	0fh		;8
			retlw	012h	;9
			retlw	015h	;A
			retlw	017h	;B
			retlw	01ah	;C
			retlw	01ch	;D
			retlw	01eh	;E
			retlw	01fh	;F

			retlw	01fh	;10
			retlw	01fh	;11
			retlw	01eh	;12
			retlw	01ch	;13
			retlw	01ah	;14
			retlw	017h	;15
			retlw	015h	;16
			retlw	012h	;17
			retlw	0fh		;18
			retlw	0ch		;19
			retlw	09h		;1A
			retlw	06h		;1B
			retlw	04h		;1C
			retlw	02h		;1D
			retlw	01h		;1E
			retlw	00h		;1F
			retlw	00h		;20

;
;		割込み処理
;		割込み受付はRA2/INTピンを使用する
;
;		INTCONレジスタ(#2)　コア　00BH　マニュアル93ページ
;			bit7	GIE		全割込制御
;							1許可、0禁止
;			bit6	PEIE	周辺装置割込制御
;							1許可、0禁止
;			bit5	TMR0IE	タイマ0割込許可制御
;							1許可、0禁止
;			bit4	INTE	RA2外部割込許可制御
;							1許可、0禁止
;			bit3	IOCIE	I/Oポート状態変化割込許可制御
;							1許可、0禁止	
;			bit2	TMR0IF	タイマ0割込みフラグ(#1)
;							1オーバーフロー
;							0オーバーフローなし
;			bit1	INTF	RA2外部割込みフラグ(#1)
;							1割込み発生
;							0割込み発生なし
;			bit0	IOCIF	I/Oポート状態変化割込フラグ(#1)
;							1割込発生
;							0割込無
;
;							#1)ソフトウエアでリセット必要
;							#2)初期値=0なので、初期設定で0設定する必要は無い
;
;			ポートの割り振り
;			PORTA0	DAC出力
;			PORTA1	データ0入力
;			PORTA2	INT,↓でトリガ
;			PORTA3	データ1入力
;			PORTA4	データ2入力
;			PORTA5	データ3入力


;
;		割込み処理
;
;		ここではI/Oポートから発生周波数データを読み込む。
;		RA2は常時'1'で'0'になると割込みが発生する。
;		データ入力ポートは4ビットパラレルなので、12ビットデータを3分割して取得する
;
;		入力シーケンス
;		RA2/INT=1	通常時
;			↓
;		RA2/INT=0	割込み発生感知
;			↓		割込みベクタに来るまで4-5サイクル消費
;		9サイクル経過	周波数データ下位4ビット取得
;			↓		送信側は2.0us経過してから上位ビット送信
;		RA2/INT=1	周波数データ上位4ビット取得
;			↓
;		RA2/INT=0	制御データ4ビット取得
;			↓
;		RA2/INT=1	データ通信終了処理
;
;		出力データ		hex0　周波数データ8ビット
;					mode　制御データ4ビット
;
;	注意
;	シーケンスがうまくいかない場合、ハマります。
;	それに対する対処が、今の所されていません。
;

INT
			;INT=0
			movlb	0h
			call	w02u
			movf	PORTA,W		;PORTA読込
			movwf	hex0
			bcf		hex0,2		;割込みでRA2=0となっているが念のため
			lsrf	hex0,F
			lsrf	hex0,F		;RA1=C
			btfsc	STATUS,C
			bsf		hex0,0		;RA1=1をセット
			movf	hex0,W		;下位4ビットに集約
			andlw	0fh
			movwf	hex0

int1
			;INT/RA2=1になったら受信開始
			btfss	PORTA,2
			goto	int1
			call	w02u
			movf	PORTA,W		;PORTA読込
			movwf	hex1
			bcf		hex1,2		;
			lsrf	hex1,F
			lsrf	hex1,F		;RA1=C
			btfsc	STATUS,C
			bsf		hex1,0		;RA1=1をセット
			swapf	hex1,W		;上位下位入れ替え
			andlw	0f0h		;上位4ビット有効
			iorwf	hex0,F		;hex0に8ビットデータ集約
			
int2
			;INT/RA2=0になったら受信開始
			btfsc	PORTA,2
			goto	int2
			call	w02u
			movf	PORTA,W		;PORTA読込
			movwf	mode
			bcf		mode,2		;
			lsrf	mode,F
			lsrf	mode,F		;RA1=C
			btfsc	STATUS,C
			bsf		mode,0		;RA1=1をセット
			movf	mode,W		;
			andlw	0fh			;
			movwf	mode		;下位4ビットに集約

int3
			;データ受信終了処理
			btfss	PORTA,2		;INT/RA2=1になるまで待機
			goto	int3
			call	set_mode			
			bcf		INTCON,INTF	;RA2/INTピン割込みフラグクリア
			retfie



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC12F1822　イニシャライズ
;
;		OSCCON(BANK1　099H) マニュアル69ページ
;			bit7	SPLLEN	ソフトウエアPLL設定ビット
;							1 = 4xPLL有効
;							0 = 4xPLL無効(リセット後)
;			＊コンフィグレーションワードPLLEN=1の時、この設定は無視される。
;			bit6-3	IRCF	内部発振器クロック選択ビット
;							000x = 31KHZ LF
;							0010 = 31.25KHZ MF
;							0011 = 31.25KHZ HF
;							0100 = 62.5KHZ MF
;							0101 = 125KHZ MF
;							0110 = 250KHZ MF
;							0111 = 500KHZ MF（デフォルト）
;							1000 = 125kHZ HF
;							1001 = 250kHZ HF
;							1010 = 500kHZ HF
;							1011 = 1MHZ HF
;							1100 = 2MHZ HF
;							1101 = 4MHZ HF
;							1110 = 8MHZ or 32MHZ HF
;							1111 = 16MHZ HF
;			bit2			Unimplemented
;			bit1-0	SCS		システムクロック選択ビット
;							1x = 内部発振器
;							01 = タイマ1発振器
;							00 = FOSCで指定された発振器(リセット後)
;			(注)詳細はマニュアルあるいは当局HP内解説を参照
;							HF=HFINTOSC（16MHZ)
;							MF=MFINTOSC(500KHZ)
;							LF=LFINTOSC(32KHZ)
;
;
;			32MHZ内部発振設定
;		コンフィグレーションワード1		FOSC=100
;		OSCCON				SCS=00
;		OSCCON				IRCF=1110
;		OSCCON				SPLLEN=1(#1)
;		コンフィグレーションワード2		PLLEN=1(#1)
;						(#1)設定はどちらかでOKだが、PLLEN=1とすると、
;							OSCCONのSPLLEN=0の設定は無効となる。
;							また、8MHZのHFINTOSCは選択の余地が無い。
;							
;
;
;
;		CM1CON0(BANK2　0111H)　マニュアル172ページ
;			bit7	C1ON	コンパレータ イネーブルビット
;							1=有効
;							0=無効（リセット後）
;			bit6	C1OUT	コンパレータ出力ビット
;							反転極性
;							1=C1VP < C1VN
;							0=C1VP > C1VN
;							非反転極性
;							1=C1VP > C1VN
;							0=C1VP < C1VN
;			bit5	C1OE	コンパレータ出力イネーブルビット
;							1=C1OUTはC1OUTピンに出力される
;							0=C1OUTは内部のみ（ピンに出力されない）
;			bit4	C1POL	コンパレータ出力反転ビット
;							1=出力反転
;							0=出力非反転
;			bit3			Unimplemented(read=0)
;			bit2	C1SP	コンパレータスピード選択ビット
;							1=ハイスピードモード
;							0=ロースピードモード
;			bit1	C1HYS	コンパレータ ヒステリシス イネーブルビット
;							1=ヒステリスス有効
;							0=ヒステリシス無効
;			bit0	C1CYNC	コンパレータ同期出力設定ビット
;							1=有効
;							0=無効
;
;		CM1CON1(BANK2　0112H)　マニュアル173ページ　リセット時すべて0
;			bit7	C1INTP	コンパレータ +割込み設定ビット
;							1=有効
;							0=無効
;			bit6	C1INTN	コンパレータ -割込み設定ビット
;							1=有効
;							0=無効
;			bit5-4	C1PCH	コンパレータ+入力選択ビット
;							00=C1VPはC1INピンに接続
;							01=C1VPはDACに接続
;							11=C1VPはFVRバッファ2に接続
;			bit3-2			Unimplemented(read=0)
;			bit1-0	C1NCH	コンパレータ-入力選択ビット
;							0=C1VNはC1IN0ピンに接続
;							1=C1VNはC1IN1ピンに接続
;
;		PORTA(BANK0　00CH）　マニュアル126ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	デジタルI/O、アナログ入力
;			bit3	RA3		デジタルInputのみ
;			bit2	RA2-1	デジタルI/O、アナログ入力
;			bit0	RA0		デジタル･アナログI/O,DAコンバータ出力
;
;		TRISA(BANK1　08CH)　マニュアル126ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	1=入力、0=出力
;			bit3	RA3		常に1
;			bit2	RA2-0	1=入力、0=出力
;
;		LATA(BANK2　10CH)　データラッチﾚｼﾞｽﾀ　マニュアル127ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	出力データ保持
;			bit3	Unimplemented(read=0)
;			bit2	RA2-0	出力データ保持
;							（このラッチデータはTRISAレジスタ設定で各ピンに反映される）
;
;
;		ANSELA(BANK3　18CH)　マニュアル127ページ
;			bit7-5	Unimplemented(read=0)
;			bit4	ANSA3/RA4	アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			bit3	Unimplemented(read=0)
;			bit2-0	ANSA2-0/RA2-0アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;
;		WPUA(BANK4　20CH)　ポートAプルアップ設定ビット
;			bit7-6	Unimplemented(read=0)
;			bit5-0			1=PORTA各ビットプルアップ有効
;					 _____	0=PORTA各ビットプルアップ無効
;					*WPUENビットが有効の時のみ、設定有効となる。
;
;		FVRCONレジスタ(BANK2　117H)
;			bit7	FVREN	FVRイネーブルビット
;							1有効、0無効
;			bit6	FVRRDY	FVR準備フラグビット(#1)書込み不可
;							1使用可能、0使用不可能あるいは禁止されている
;			bit5	TSEN	温度表示器イネーブルビット
;							1有効、0無効
;			bit4	TSRNG	温度表示器測定レンジ選択ビット
;							1=High Range:Vout=VDD-4VT
;							0=Low Range:Vout=VDD-2VT
;			bit3-2	CDAFVR	コンパレータとDACへのFVR電圧選択ビット
;							00 = FVR出力OFF
;							01 = FVR出力 1x(1.024V)
;							10 = FVR出力　2x(2.048V)#2
;							11 = FVR出力　4x(4.096V)#2
;			bit1-0	ADFVR	ADCへのFVR電圧選択ビット
;							00 = FVR出力OFF
;							01 = FVR出力 1x(1.024V)
;							10 = FVR出力　2x(2.048V)#2
;							11 = FVR出力　4x(4.096V)#2
;
;							#1)12F1822/16F1823では常に"1"
;							#2)FVR電圧出力はVDDを超える事は出来ない
;
;		DACCON0レジスタ(BANK2　11AH)　マニュアル158ページ
;		bit7	DACEN	DACイネーブルビット　P156 Fig17-1参照
;						1=許可
;						0=禁止
;		bit6	DACLPS	電圧指定
;						1=DAC出力電圧は+sourecと同等
;						0=DAC出力電圧は-sourceと同等
;		bit5	DACOE	DAC電圧出力イネーブルビット
;						1=DAC出力電圧をDACOUTピンに接続される
;						0=DAC出力電圧はDACOUTピンに接続されない
;		bit4	Un		Read as '0'
;		bit3-2	DACPSS	DAC Vsource+接続選択ビット
;						00 = VDD
;						01 = VREF+ピン(RA1)
;						10 = FVRバッファ2出力
;						11 = 使用不可
;		bit1-0	Un		Read as '0'
;
;
;		ADCON1レジスタ(BANK1　09EH)マニュアル
;		bit7	ADFM	変換結果格納指定
;						1=右詰
;						0=左詰め
;		bit6-4	ADCS	A/D変換クロック選択ビット
;						000	= Fosc/2
;						001 = Fosc/8
;						010 = Fosc/32
;						011 = Frc
;						100 = Fosc/4
;						101 = Fosc/16
;						110 = Fosc/64
;						111 = Frc
;		bit3-2	Unimplemented(read=0)
;		bit1-0	ADPREF	参照正電圧指定
;						00 = VDD
;						01 = Reserved
;						10 = 外部VREF+ (RA1)
;						11 = 内部FVRモジュール
;
;
;		OPTION_REG(BANK1　095H)　マニュアル177ページ
;					_____
;			bit7=1	WPUEN	プルアップ グローバル設定ビット
;							0=有効,1=無効
;			bit6=0	INTEDG	INTピン割り込み信号エッジ
;							1=↑
;							0=↓
;			bit5=0	TMR0CS	TMR0クロックソース選択ビット
;							1=外部入力RA2/T0CKI
;							0=内部システムクロック(Fosc/4)
;			bit4=1	TMR0SE	TMR0ソースエッジ選択ビット
;							1=RA4/T0CKIピンが↑の時インクリメント
;							0=RA4/T0CKIピンが↓の時インクリメント
;			bit3=0	PSA		プリスケーラ割当ビット
;							1=WDT
;							0=TMR0
;			bit2-0	PS		プリスケーラ分周比	000 1/2
;										001	1/4
;										010	1/8
;										011	1/16
;										100	1/32
;										101	1/64
;										110	1/128
;										111	1/256
;
;
;
;		INTCONレジスタ(#2)　コア　00BH　マニュアル93ページ
;			bit7	GIE		全割込制御
;							1許可、0禁止
;			bit6	PEIE	周辺装置割込制御
;							1許可、0禁止
;			bit5	TMR0IE	タイマ0割込許可制御
;							1許可、0禁止
;			bit4	INTE	RA2外部割込許可制御
;							1許可、0禁止
;			bit3	IOCIE	I/Oポート状態変化割込許可制御
;							1許可、0禁止	
;			bit2	TMR0IF	タイマ0割込みフラグ(#1)
;							1オーバーフロー
;							0オーバーフローなし
;			bit1	INTF	RA2外部割込みフラグ(#1)
;							1割込み発生
;							0割込み発生なし
;			bit0	IOCIF	I/Oポート状態変化割込フラグ(#1)
;							1割込発生
;							0割込無
;
;							#1)ソフトウエアでリセット必要
;							#2)初期値=0なので、初期設定で0設定する必要は無い
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
init
;			各レジスタ初期設定

			;クロック設定
			movlb	01h			;BANK１に切替
			movlw	0f0h		;1111000B
			movwf	OSCCON		;内部発振器は8MHZに設定
								;4xPLL=ON

			;I/Oポート初期化(実験回路2用）
			movlb	0h			;BANK0
			clrf	PORTA		;Init PORT
			movlb	02h			;BANK2
			clrf	LATA		;出力ラッチﾚｼﾞｽﾀ
			movlb	03h			;BANK3
			movlw	01h			;00000001B
			movwf	ANSELA		;RA0,アナログ
								;RA1-5,デジタルI/O
			movlb	01h			;BANK1
			movlw	0ffh
			movwf	TRISA		;すべて入力

			;TMR0およびプルアップ
			movlb	01h			;BANK1
			movlw	090h		;10010000b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/2にセット

			;ADC（実験回路1用で実験回路2の時は不要)
			movlb	01h			;BANK1
			movlw	020h		;0010000B
			movwf	ADCON1		;左詰め、基準電圧VDD
								;ADCクロック　Fosc/32=1us(32MHZ)

			;FVR
			movlb	02h			;BANK2
			movlw	088h		;10001000B
			movwf	FVRCON		;FVRイネーブル
								;DACとCPSに2.048V
								;ADCにはOFF
			;DAC
			movlb	02h			;BANK2
			movlw	0a8h		;10101000B
			movwf	DACCON0		;DACイネーブル
			movlb	0h			;基準電圧はFVR
			
;			初期値セット
;
;		スタートアップ シーケンス
;		制御PIC			生成PIC
;		初期化中			初期化中
;		出力ポート初期設定	100msウエイト
;		100msウエイト		入力ポート準備OK
;		100msウエイト		データ入力待ち		
;		データ転送開始		データ受信
;


			clrf	INTCON		;割込みOFF&クリア
			call	wait100m	;制御PIC安定化待ち
			clrf	DCO
        	clrf	flg
        	movlw	019h
        	movwf	FSR0L
        	movlw	01h
        	movwf	FSR0H		;FSR0=DACCON1
;        	goto	coldst


;
;		メインルーチン（ループ）
;
;		タイマ0のオーバーフロー時間間隔でDAC駆動
;		
;		タイマ0プリスケーラ初期設定は1/16
;		TMR0はインストラクションクロックの1/16で動作
;
;		使用変数
;		hex0	BANK0	TMR0プリセットデータ
;		使用レジスタ
;		TMR0	BANK0
;
;		初期生成周波数設定値
;		周波数	1KHZ
;		TMR0=87H
;		PS=1/2
;
coldst
			movlw	087h		;暫定値設定
			movwf	hex0
			movwf	TMR0		;TMR0スタート
			movlw	090h
			movwf	INTCON		;GIE=1(割込みイネーブル)
								;RA2割込み許可
mloop		;メインループ
			incf	DCO,F
			movf	DCO,W
			call	get_rev		;5サイクル
			movwf	INDF0
			movf	DCO,W
			xorlw	020h
			btfsc	STATUS,Z
			clrf	DCO
mlp01		
			;TMR0オーバーフロー待ち
			btfss	INTCON,TMR0IF
			goto	mlp01		;TMR0カウント中
			;TMR0オーバーフロー処理
			bcf		INTCON,TMR0IF
			movf	hex0,W		;
			movwf	TMR0		;TMR0リスタート
			goto	mloop		;
			

		

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			タイマ０プリスケーラ設定
;
;		変数modeの指定値でタイマ０のプリスケーラを設定する
;		
;		TMR0設定(BANK0　015h）
;				
;		OPTION_REG(BANK1　095H)　マニュアル177ページ
;					_____
;			bit7=1	WPUEN	プルアップ グローバル設定ビット
;							0=有効,1=無効
;			bit6=0	INTEDG	INTピン割り込み信号エッジ
;							1=↑
;							0=↓
;			bit5=0	TMR0CS	TMR0クロックソース選択ビット
;							1=外部入力RA2/T0CKI
;							0=内部システムクロック(Fosc/4)
;			bit4=1	TMR0SE	TMR0カウントエッジ選択ビット
;							1=↑
;							0=↓
;			bit3=0	PSA		プリスケーラ割当ビット
;							1=WDT
;							0=TMR0
;			bit2-0	PS		プリスケーラ分周比	000 1/2
;										001	1/4
;										010	1/8
;										011	1/16
;										100	1/32
;										101	1/64
;										110	1/128
;										111	1/256
;
;		modeによる設定値
;
;		mode=1000		PS=xxx	分周比 1/1
;		mode=1001		ps=000	分周比 1/2
;		mode=1010		PS=001	分周比 1/4
;		mode=1011		ps=010	分周比 1/8
;		mode=1100		PS=011	分周比 1/16
;		mode=1101		ps=100	分周比 1/32
;		mode=1110		PS=101	分周比 1/64
;		mode=1111		ps=110	分周比 1/128
;		mode=1xxx		プリスケーラ変更処理する
;		mode=0xxx		プリスケーラ変更処理しない
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

set_mode
			btfss	mode,3		;bit3が1の時は処理開始
			return				;bit3が0の時は何もしない
			movf	mode,W
 			andlw	07h			;下位３ビット有効
 			movwf	mode
 			iorlw	0h			;mode=0？
 			btfsc	STATUS,Z
 			goto	psm1		;プリスケーラ1/1
			 					;decfはCフラグに反応しない
 			decf	mode,F		;
			btfsc	STATUS,Z	;
			goto	psm2		;プリスケーラ1/2へ行く

 			decf	mode,F		;
			btfsc	STATUS,Z	;
			goto	psm4		;

 			decf	mode,F		;
			btfsc	STATUS,Z	;
			goto	psm8		;

 			decf	mode,F		;
			btfsc	STATUS,Z	;
			goto	psm16		;

 			decf	mode,F		;
			btfsc	STATUS,Z	;
			goto	psm32		;

 			decf	mode,F		;
			btfsc	STATUS,Z	;
			goto	psm64		;

psm128		;PS=1/128
			movlb	01h
			movlw	096H		;10010110b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/128にセット
			movlb	0h
			return

psm1		;TMR0プリスケーラOFF
			movlb	01h
			movlw	09fH		;10011111b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→WDT
								;プリスケーラ分周1/256にセット
			movlb	0h
			return

psm2		;PS=1/2
			movlb	01h
			movlw	090H		;10010000b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/2にセット
			movlb	0h
			return

psm4		;PS=1/4
			movlb	01h
			movlw	091H		;10010001b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/4にセット
			movlb	0h
			return

psm8		;PS=1/8
			movlb	01h
			movlw	092H		;10010010b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/8にセット
			movlb	0h
			return

psm16		;PS=1/16
			movlb	01h
			movlw	093H		;10010011b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/16にセット
			movlb	0h
			return

psm32		;PS=1/32
			movlb	01h
			movlw	094H		;10010100b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/32にセット
			movlb	0h
			return

psm64		;PS=1/64
			movlb	01h
			movlw	095H		;10010101b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/64にセット
			movlb	0h
			return

			

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			Ｄ／Ａ変換サブルーチン
;
;		アナログ出力ポート		AN0/RA0
;
;
;		DACCON0レジスタ(BANK2　11AH)
;		bit7	DACEN	DACイネーブルビット　P156 Fig17-1参照
;						1=許可
;						0=禁止
;		bit6	DACLPS	電圧指定
;						1=DAC出力電圧は+sourecと同等
;						0=DAC出力電圧は-sourceと同等
;		bit5	DACOE	DAC電圧出力イネーブルビット
;						1=DAC出力電圧をDACOUTピンに接続される
;						0=DAC出力電圧はDACOUTピンに接続されない
;		bit4	Un		Read as '0'
;		bit3-2	DACPSS	DAC Vsource+接続選択ビット
;						00 = VDD
;						01 = VREF+ピン(RA1)
;						10 = FVRバッファ2出力
;						11 = 使用不可
;		bit1-0	Un		Read as '0'
;
;
;		DACCON1レジスタ(BANK2　119H)
;		bit7-5	Un		Read as '0'
;		bit4-0	DACR	DAC出力電圧設定ビット
;
;
;
;		使用方法
;		このルーチンを呼び出す度に、DAC出力電圧を順次変化させていく。
;		このルーチンでは時間管理はしない。
;		呼び出す側で時間を管理する必要がある。
;		最大電圧はFVRの2.048V使用する。
;		最小電圧はGNDとなる。
;		アナログ入力、プルアップONにすると、出力波形がおかしくなります。
;
;		使用変数およびレジスタ
;		DCO			X軸進行カウンタ
;		DAC出力データ	00H-1FH（データテーブルより取得）
;		FSR0レジスタ	DACCON1（119H)アドレスを登録（初期設定）
;		INDF0レジスタ	DACCON1レジスタへの入出力窓口として使用
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;		消費サイクル　16cycles(2.0us)
;		call,returnを含む
put_dac
			incf	DCO,F
			movf	DCO,W
			call	get_rev		;5サイクル
			movwf	INDF0		;DACにデータセット
			movf	DCO,W
			xorlw	020h
			btfsc	STATUS,Z
			clrf	DCO			;DCO=20Hなのでリセット
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;			Ａ／Ｄ変換サブルーチン
;
;		アナログ入力ポート		RA1/AN1/CH1
;		結果格納方法		ADFM=0/左詰め/ADRESHのみ取得
;		出力データ			hex0
;
;		ADCON0レジスタ（BANK1　09DH)　マニュアル147ページ
;		bit7	Unimplemented(read=0)
;		bit6-2	CHSx	アナログチャンネル指定
;						00000 = AN0/RA0
;						00001 = AN1/RA1
;						00010 = AN2/RA2
;						00011 = AN3/RA3
;						00100 = AN4/RC0(#1)
;						00101 = AN5/RC1(#1)
;						00110 = AN6/RC2(#1)
;						00111 = AN7/RC3(#1)
;						01000 = Reserved.No channel connected
;						    ・
;						11100 = Reserved.No channel connected
;						11101 = 温度表示器(#4)
;						11110 = DAC出力(#2)
;						11111 = FVRバッファ1出力(#3)
;		bit1	GO/DONE	A/D変換ステータスビット
;						1=変換開始指令（１にすると変換動作開始）
;						0=変換完了(変換完了すると０になる）
;		bit0	ADON	A/D変換ステータスビット
;						1=A/Dコンバータ動作
;						0=A/Dコンバータ停止
;
;		(#1)PIC16F1823のみ
;		(#2)ADC入力はDAC出力に接続される。
;		(#3)ADC入力はFVRバッファ1に接続される。
;		(#4)ADC入力は温度表示モジュール出力に接続される。
;
;		ADCON1レジスタ(BANK1　09EH)
;		bit7	ADFM	変換結果格納指定
;						1=右詰
;						0=左詰め
;		bit6-4	ADCS	A/D変換クロック選択ビット
;						000	= Fosc/2
;						001 = Fosc/8
;						010 = Fosc/32
;						011 = Frc
;						100 = Fosc/4
;						101 = Fosc/16
;						110 = Fosc/64
;						111 = Frc
;		bit3-2	Unimplemented(read=0)
;		bit1-0	ADPREF	参照正電圧指定
;						00 = VDD
;						01 = Reserved
;						10 = 外部VREF+ (RA1)
;						11 = 内部FVRモジュール
;
;		使用ワーク		;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;			VRによる分圧電圧取得

get_adc
			movlb	01h
			movlw	05h			;00000101b
								;左詰め、基準電圧VDD、
								;AN1(RA1)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	w10u		;サンプリング電圧安定化待ち
			call	w10u
			movlb	01h
			bsf		ADCON0,GO	;A/D変換開始指令
aloop
			btfsc	ADCON0,GO	;A/D変換完了待ち 
			goto	aloop		;GO=0ならば次へ
			movf	ADRESH,W	;データ上位８ビット
			bcf		ADCON0,ADON	;A/DコンバータOFF
			movlb	0h
			movwf	hex0		;上位８ビットをhex0に保存
			return				;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	32MHZ用
;
;		1cycle	= 0.125us
;		使用レジスタ	= cnt2,cnt3
;		BSR		=0(BANK0)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			movlw	09h			;1
			movwf	cnt2		;1
			movlb	0h
			nop
			nop					;3
w100u		nop					;
			call	w10u		;10*9=90us(ここだけ命令ステップを数えない）
			decfsz	cnt2,F		;4*8+3=31cycles
			goto	w100u
			return				;2+5+31+2=40cycles=20us

wait50u							;呼び出しも含めて、50us
			call	wait25u
wait25u							;呼び出しも含めて、25us
			call	w10u
			call	w10u
			movlw	0bh			;5us=0.125us*40cycles			
			movwf	cnt2		;
w25u		decfsz	cnt2,F		;ループ 2+10*3+2=34cycles
			goto	w25u
			nop
			nop
			return				;2+34+2+2=40cycles=5us

wait5m							; 5ms 
			movlb	0h
			movlw	05h
			movwf	cnt2
w5m			call	w1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms
			movlb	0h
			movlw	d'10'
			movwf	cnt2
w10m		call	w1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms
			movlb	0h
			movlw	d'20'
			movwf	cnt2
w20m		call	w1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms
			movlb	0h
			movlw	d'50'
			movwf	cnt2
w50m		call	w1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms
			movlb	0h
			movlw	d'100'
			movwf	cnt2
w100m		call	w1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms
			movlb	0h
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s
			movlb	0h
			movlw	d'10'
			movwf	cnt3
w1s			call	wait100m
			decfsz	cnt3,F
			goto	w1s
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1ms 基本ウェイト
;			呼び出しを含めて1msとなる。 
;
;		clock	= 32MHz(0.03125usec)
;		1cycle	= 0.125usec
;		1ms		= 0.125usec * 8000cycles
;
;			使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
w1m
			movlb	0h
			movlw	08h
			movwf	cnt0		;
;			外周ループ
w1m0		movlw	0c7h		;199d
			movwf	cnt1		;
;			内周ループ
w1m1		nop					;
			nop					;5cycles*cnt1
			decfsz	cnt1,F		;2+5*198+4=996c/s
			goto	w1m1		;
;
			decfsz	cnt0,F		;
			goto	w1m0		;2+7*999+998=7993cycles
			nop
			return					;other=(3+4)cycles
									;Total 8000*0.125us=1ms
									

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us 基本ウェイト
;			呼び出し（call　w10u)も含めて、10usとなる。
;
;		clock	= 32MHZ(0.03125us)
;		1cycle	= 0.125us
;		10us	= 0.125us * 80cycles
;		使用変数　cnt0,cnt1
;		'goto','call','return'は2サイクル消費する
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

w10u
			movlb	0h
			movlw	018h		;18H=24
			movwf	cnt0		;
w10u0		decfsz	cnt0,F		;3*23+2=71
			goto	w10u0		;
			nop
			nop
			return				;2+3+71+2+2=80cycles
			
;
w05u		;5us		
			movlw	0bh			;5us=0.125us*40cycles			
			movwf	cnt0		;
w05u0		decfsz	cnt0,F		;ループ 2+3*10+2=34cycles
			goto	w05u0
			nop
			nop
			return				;2+34+2+2=40cycles=5us
w02u		;2us
			movlb	0h
			movlw	03h			;2us=0.125us*16cycles			
			movwf	cnt0		;
w02u0		decfsz	cnt0,F		;ループ 2+3+2*3+2+2=15cycles
			goto	w02u0
			nop
			return				;2+34+2+2=40cycles=5us
w01u		;1us
			nop					;1us=0.125us*8cycles
			nop					;2+4+2=8cycles
			nop
			nop
			return			
;
			END
			
