;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		「ＰＩＣ　ＥＹＥ」製作用実験ボード		ＪＡ０ＱＯＮ
;
;		PIC16F688 20MHZ
;
;		変換データはシリアル出力(ビット幅10us割込み版)		
;			A/D出力データは上位8ビットまで
;			hex0	AGCデータ
;			hex1	VR-REDデータ
;			hex2	VR-GREENデータ
;			hex3	VR-BLUEデータ
;			７セグ基板へのFLGコマンドはありません
;
;		7セグボードの表示フォーマット
;		チャンネル０表示	右から１－2ケタ（7セグ0,1)
;		チャンネル１表示	右から３－４ケタ（7セグ2,3)
;		チャンネル２表示	右から５－６ケタ（7セグ4,5)
;		チャンネル３表示	右から７－８ケタ（7セグ6,7)
;
;		機能
;		A/Dコンバータ	入力０	AGC電圧を＋０~５Ｖに変換した電圧入力
;					入力１	VR-REDからの電圧入力
;					入力２	VR-GREENからの電圧入力
;					入力３	VR-BLUEからの電圧入力
;		mode0	入力０~３の４チャンネル分データを７セグボードCH0-3に表示
;				３色VRからの電圧データに基づき、フルカラーLEDを変調発光
;		mode1	入力０~１の２チャンネル分データを７セグボードCH0-1に表示
;				VR-RED電圧による、色Ｓを模擬発光
;				色Ｓ番号（0-15)を7セグボードCH2に表示
;		mode2	入力０の電圧を7セグボードCH0に表示し、フルカラーLEDを発光
;				色Ｓモードによる変調で模擬発光
;				現在の変調データを7セグCH2-4に表示
;		mode4	入力０の電圧を7セグボードCH0に表示し、フルカラーLEDを発光
;				チューニングモードによる変調で、模擬発光
;				現在の変調データを7セグCH2-4に表示
;		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC16F688
		INCLUDE	P16F688.INC

;
;CALIBRATION WORD(ADDRESS:2008H)今回は設定しません。
;bit13		Unimplemented
;bit12-6	FCAL	内部発振器調整
;					0111111=最大発振周波数
;					.
;					0000000=中間
;					.
;					1111111=最小発振周波数
;bit5		Unimplemented
;bit4-3		POR		パワーオンリセット電圧調整
;					00=最小電圧
;					11=最大電圧
;bit2-0		BOD		ブラウンアウト電圧調整
;					000=Reservd
;					001=最小電圧
;					111=最大電圧
;
;		
;CONFIGURATION WORD(ADDRESS:2007H)
;					設定
;bit13-12	Unimplemented
;bit11		FCMEN	0	Fail-Safe Clock Monitor
;						1=有効,0=無効
;bit10		IESO	0	内部･外部切替スイッチモード
;						1=有効,0=無効
;bit9-8		BODEN	00	ブラウンアウト設定
;						11=有効
;						10=スリープ時以外有効
;						01=PCONレジスタSBODENビットでコントロールされる
;						00=無効
;bit7		CPD		1	データメモリプロテクション
;						1=無効,0=有効
;bit6		CP		1	プログラムメモリプロテクション　
;						1=無効,0=有効
;bit5		MCLRE	0	RA3/MCLRピン選択ビット
;						1=MCLR有効,0=RA3有効(Digital input)
;bit4		PWRTE	0	power_up timer　使います。
;						1=無効,0=有効
;bit3		WDTE	0	Watchdog Timer　使いません。
;						1=有効,0=無効
;bit2-0		FOSC	010	発振器選択ビット、今回はHSを使用
;						111=RC:2pinでRC発振、3pinCLKOUT、I/O不可
;						110=RCIO:　〃　RA4I/O可
;						101=INTOSC:内部発振　3pinCLKOUT、RA5I/O可
;						100=INTOSCIO:内部発振、RA4-5I/O可
;						011=EC:2pin外部クロック入力、RA4I/O可
;						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  0  0  0  0  1  1  0  0  0  0  1  0
;

		__CONFIG	B'0000000011000010'
	

;		ワークエリア定義
;
;		BANK0	20h-7Fh
;
;		使用していないのもあります
;

hex0		equ		020h		;HEXデータ
hex1		equ		021h		;
hex2		equ		022h
hex3		equ		023h
colum		equ		028h		;現在の桁位置
cnt0		equ		029h		;時間待ちルーチン用
cnt1		equ		02ah
cnt2		equ		02bh
cnt3		equ		02ch
tmp0		equ		02dh		;雑用
tmp1		equ		02eh
bcdw0		equ		02fh		;BCD変換ルーチン用
bcdw1		equ		030h
cary1		equ		031h
cary2		equ		032h
cary3		equ		033h
shift		equ		034h		;送信ルーチンでのシフトカウンタ用
work1		equ		035h
work2		equ		036h
bsyc0		equ		037h
bsyc1		equ		038h
tcnt0		equ		039h
tcnt1		equ		03ah
tcnt2		equ		03bh		;表示基板への伝達フラグ
flg			equ		03ch		;エラー＆設定フラグ
mode		equ		03dh		;プリスケーラ設定
gtime		equ		03eh		;ｹﾞｰﾄタイム設定
pscnt		equ		03fh		;プリスケーラ残カウント
hexw0		equ		040h		;HEXデータ演算用ワーク
hexw1		equ		041h
hexw2		equ		042h
hexw3		equ		043h
CY			equ		044h		;PMW用カウンタ
CYC			equ		045h
RL			equ		046h		;赤カウンタ
RLC			equ		047h
GL			equ		048h		;緑カウンタ
GLC			equ		049h
BL			equ		04ah		;青カウンタ
BLC			equ		04bh
TUNC		equ		04ch		;チューニング用カウンタ
rotc		equ		04dh
;

			ORG		0h
			goto	init
			ORG		04h
			goto	init

			org		05h
			



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F688　イニシャライズ			
;
;		CMCON0_REG(マニュアル参照のこと)
;			bit7	C2OUT	コンパレータ2出力ビット
;			bit6	C1OUT	コンパレータ１出力ﾋﾞｯﾄ
;			bit5	C2INV	コンパレータ2出力反転ビット
;			bit4	C1INV	コンパレータ１出力反転ビット
;			bit3	CIS		コンパレータ入力スイッチビット
;			bit2-0	CM		コンパレータモード　RA0-1、RC0-1入力を設定
;							000		reset　アナログ入力　出力OFF
;							001		すべてアナログ入力　出力ON　CIS有効
;							010		すべてアナログ入力　出力ON　CIS有効
;							011		RA0デジタル、他アナログ入力　出力ON
;							100		すべてアナログ入力　出力ON
;							101		RA0-1デジタル、RC0-1アナログ入力
;							110		RA0未定、他アナログ入力　出力RA2、RC4
;							111b	Off　入力はすべてデジタル
;										
;
;		ANSEL_REG(91H)
;			bit7-0	ANSx	アナログ選択ビット
;							1=アナログ入力
;							0=デジタルI/O
;			bit7=0	ANS7/RC3
;			bit6=1	ANS6/RC2
;			bit5=1	ANS5/RC1
;			bit4=1	ANS4/RC0
;			bit3=0	ANS3/RA4
;			bit2=1	ANS2/RA2
;			bit1=0	ANS1/RA1
;			bit0=0	ANS0/RA0
;
;		ADCON1_REG(9FH)
;			bit7	Unimplemented
;			bit6-4	ADCS	A/D変換クロック選択
;							000 = Fosc/2
;							001 = Fosc/8
;							010 = Fosc/32
;							x11 = Frc
;							100 = Fosc/4
;							101 = Fosc/16
;							110 = Fosc/64
;			bit3-0	Unimplemented
;
;		TRISA_REG	1=input mode,0=output mode
;			bit7=0	Unimplemented
;			bit6=0	Unimplemented
;			bit5=0	RA5	I/O	設定条件あり、コンフィグレーションワード参照
;			bit4=0	RA4	I/O　設定条件あり、　〃
;			bit3=1	RA3	Inputのみ
;			bit2=1	RA2	I/O	外部割込み入力
;			bit1=0	RA1	I/O
;			bit0=0	RA0	I/O
;
;		TRISC_REG	1=input mode,0=output mode
;			bit7=0	Unimplemented
;			bit6=0	Unimplemented
;			bit5=0	RC5	I/O
;			bit4=0	RC4	I/O
;			bit3=0	RC3	I/O
;			bit2=1	RC2	I/O
;			bit1=1	RC1	I/O
;			bit0=1	RC0	I/O
;
;		OPTION_REG
;			bit7=1	RAPU	POTRAプルアップOFF
;							0=enabled,1=disabled
;			bit6=0	INTEGE	INT割り込み信号エッジ↑
;							1=↑,0=↓
;			bit5=0	T0CS	TMR0クロックは内部
;							1=外部入力RA2,0=内部
;			bit4=0	T0SE	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
;
;		INTCONレジスタ(#2)
;			bit7	GIE		全割込制御
;							1許可、0禁止
;			bit6	PEIE	周辺割込制御
;							1許可、0禁止
;			bit5	T0IE	タイマ0割込許可制御
;							1許可、0禁止
;			bit4	INTE	RA2外部割込許可制御
;							1許可、0禁止
;			bit3	RAIE	RAポート状態変化割込許可制御
;							1許可、0禁止	
;			bit2	T0IF	タイマ0割込みフラグ(#1)
;							1オーバーフロー、0オーバーフローなし
;			bit1	INTF	RA2外部割込みフラグ(#1)
;							1割込み発生、0割込み発生なし
;			bit0	RAIF	RAポート状態変化割込フラグ(#1)
;							1割込発生、0割込無
;
;							#1)ソフトウエアでリセット必要
;							#2)初期値=0なので、初期設定で0設定する必要は無い
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
init
			bcf		STATUS,RP0	;Bank0
			clrf	PORTA		;Init PORTA
			clrf	PORTC		;Init PORTC
			clrf	INTCON		;割込みOFF
			movlw	05h			;CMx=101
			movwf	CMCON0		;コンパレータC1_OFF　RA0-1　digital
								;コンパレータC2_ON　RC0-1　analog
			bsf		STATUS,RP0	;バンク１に切替
			movlw	083H		;10000011b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/16にセット
								;
			movlw	060h		;01100000b
			movwf	ADCON1		;64Tosc = 3.2us at 20MHz
			movlw	0eh			;00001110b
			movwf	TRISA		;RA0出力、RA1-3入力モード
			movlw	07h			;00000111b
			movwf	TRISC		;RC0-2入力 RC3-5出力モード
			movlw	074h		;01110100b
			movwf	ANSEL		;RA2,RC0-RC3アナログ、他デジタルI/O
			bcf		STATUS,RP0	;バンク０に切替
			bcf		ADCON0,ADON	;A/DコンバータOFF

;			初期状態セット

			bsf		PORTA,0		;DATA_H
			bsf		PORTC,3		;RED_OFF
			bsf		PORTC,4		;GREEN_OFF
			bsf		PORTC,5		;BLUE_OFF
			movlw	0ffh		;1サイクルのカウント数初期値セット、0-ffh
			movwf	CY			;1サイクルは最大255分割される
								;RL,GL,BLの最大長もCY値に合わせる事
			clrf	CYC
			clrf	RLC
			clrf	GLC
			clrf	BLC

;
;			初期動作モード設定
;
;			スイッチOFFのままで立ち上げるとシミュレーションモード
;			スイッチONのままで立ち上げると実験モード
;
;			シミュレーションモードとなった場合、真空管ヒータ発熱までの
;			時間を利用して、ちょっとLEDでお遊びします。
;
;			RGB原色のみによる発色(全7色)
;			RC5	RC4	RC3		H=OFF,L=ON
;			青	緑	赤		発色
;			OFF	OFF	OFF		無
;			OFF	OFF	ON		赤
;			OFF	ON	OFF		緑
;			OFF	ON	ON		黄
;			ON	OFF	OFF		青
;			ON	OFF	ON		マゼンダ
;			ON	ON	OFF		水色
;			ON	ON	ON		白


coldst     	btfss	PORTA,3		;スイッチチェック
			goto	main

			movlw	064h		;100(1秒)
			call	emitw
			
			movlw	032h		;50(0.5秒)
			call	emitw
			call	emitw
			
			movlw	019h		;25(0.25秒)
			call	emitw
			call	emitw
			call	emitw

			movlw	0ah			;10(0.1秒)
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			
			movlw	05h
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			
			movlw	01h
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			
			clrf	PORTC		;白点灯
			call	wait1s		;1秒待ち
			movlw	038h
			movf	PORTC
			goto	main_agc


;
;		実験モード
;
;	mode=0	AGC入力および各色VR入力電圧をデジタル表示し、LED発光制御
;	mode=1	VR-REDによる色S発光実験
;			発光方法はプログラム内で指定された方法
;
main
			call	get_mode
			call	get_adc		;電圧サンプリング
			call	preset		;データをセット
			call	ledmod		;LED発光制御
			goto	main

;
;		シミュレーションモード
;
;		AGC電圧でLED駆動
;		mode=2の場合、色Sモード
;		mode=4の場合、強弱発光モード
;
main_agc
			call	get_mode2
			call	get_adc2
			call	ledmod
			goto	main_agc
			
;
;			Wreg×10msのインタバルで6色を発光
;
;			使用変数　rotc
;
emitw
			movwf	rotc
;			赤色
			bcf		PORTC,3		;赤点灯
			call	waitx		;10ms×(W)

;			黄色(赤緑)
			bcf		PORTC,4		;緑点灯(追加)
			movf	rotc,W
			call	waitx		;

;			緑色
			bsf		PORTC,3		;赤消灯
			movf	rotc,W
			call	waitx		;

;			水色(青緑)
			bcf		PORTC,5		;青点灯
			movf	rotc,W
			call	waitx		;

;			青色
			bsf		PORTC,4		;緑消灯
			movf	rotc,W
			call	waitx		;

;			マゼンダ（赤青）
			bcf		PORTC,3		;赤点灯
			movf	rotc,W
			call	waitx
			bsf		PORTC,3		;赤消灯
			nop
			bsf		PORTC,5		;青消灯
			movf	rotc,W
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			動作設定
;
;		TMR0設定
;				プリスケーラ		1/256
;				カウント回数		100h-xxh（アップカウンタなので差分をセット）
;
;		使用ワーク
;				動作モード		mode0	00h		VRによるLED点灯
;							mode1	01h		VRによる色S点灯
;							mode2	02h		AGCによる色S点灯
;							mode4	04h		AGCによるチューニング点灯
;				1サイクル中の割込み回数		CY		01-ffh
;				1サイクル中の赤発光時間		RL		01-ffh
;				1サイクル中の緑発光時間		GL		01-ffh
;				1サイクル中の青発光時間		BL		01-ffh
;				
;		INTCONレジスタ(#2)
;			bit7	GIE		全割込制御
;							1許可、0禁止
;			bit6	PEIE	周辺割込制御
;							1許可、0禁止
;			bit5	T0IE	タイマ0割込許可制御
;							1許可、0禁止
;			bit4	INTE	RA2外部割込許可制御
;							1許可、0禁止
;			bit3	RAIE	RAポート状態変化割込許可制御
;							1許可、0禁止	
;			bit2	T0IF	タイマ0割込みフラグ(#1)
;							1オーバーフロー、0オーバーフローなし
;			bit1	INTF	RA2外部割込みフラグ(#1)
;							1割込み発生、0割込み発生なし
;			bit0	RAIF	RAポート状態変化割込フラグ(#1)
;							1割込発生、0割込無
;
;							#1)ソフトウエアでリセット必要
;							#2)初期値=0なので、初期設定で0設定する必要は無い
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_mode	;実験モード用
			btfsc	PORTA,3		;スイッチチェック
			goto	mode1
mode0		clrf	mode		;SW_ON(L)で発光データ作成モード　
			return				;mode=0
mode1      	movlw	1			;SW_OFF(H)で模擬発光モード
			movwf	mode		;mode=1
			return

get_mode2	;シミュレーションモード用
			btfss	PORTA,3		;スイッチチェック
			goto	mode4		;SW_ON(L)でチューニング点灯モード
mode2		movlw	2			;AGC電圧による色S点灯モード
			movwf	mode		;mode=2
			return
mode4		movlw	4			;AGC電圧によるチューニング点灯モード
			movwf	mode		;mode=4
			return
			
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;			Ａ／Ｄ変換サブルーチン
;
;		アナログ入力ポート		RA2/AN2/CH2	AGC入力
;						RC0/AN4/CH4	VR-RED入力
;						RC1/AN5/CH5	VR-GREEN入力
;						RC2/AN6/CH6	VR-BLUE入力
;		結果格納方法		ADFM=0/左詰め/ADRESHのみ取得
;		出力データ			hex0/AGC
;						hex1/VR-RED
;						hex2/VR-GREEN
;						hex3/VR-BLUE
;
;		ADCON0ﾚｼﾞｽﾀ
;		bit7	ADFM	変換結果格納指定
;						1=右詰
;						0=左詰め
;		bit6	VCFG	参照電圧指定
;						1=VREF pin(RA1)
;						0=VDD
;		bit5	Un		Read as '0'
;		bit4-2	CHSx	チャンネル指定
;						000 = CH0(AN0/RA0)
;						001 = CH1(AN1/RA1)
;						010 = CH2(AN2/RA2)
;						011 = CH3(AN3/RA4)
;						100 = CH4(AN4/RC0)
;						101 = CH5(AN5/RC1)
;						110 = CH6(AN6/RC2)
;						111 = CH7(AN7/RC3)
;		bit1	GO/DONE	A/D変換ステータスビット
;						1=変換開始指令（１にすると変換動作開始）
;						0=変換完了(変換完了すると０になる）
;		bit0	ADON	A/D変換ステータスビット
;						1=A/Dコンバータ動作
;						0=A/Dコンバータ停止
;
;
;		ADCON1ﾚｼﾞｽﾀ
;		bit7	Unimplemented
;		bit6-4	ADCSx	A/Dコンバータ変換クロック選択
;						000 = Fosc/2
;						001 = Fosc/8
;						010 = Fosc/32
;						x11 = Frc
;						100 = Fosc/4
;						101 = Fosc/16
;						110 = Fosc/64
;		bit3-0	Unimplemented:Read as '0'
;
;
;		使用ワーク		;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;
;			A/Dコンバータによる各チャンネルの電圧取得
;			mode0-1用
;
get_adc
;			PWMサイクルチェック
			clrw				;CYCゼロチェック
			addwf	CYC,W
			btfss	STATUS,Z	;CYC=0ならサンプリング開始
			return				;CYCがゼロでないなら何もしない			

;			電圧サンプリング開始
adc_agc
			movlw	09h			;00001001b
								;左詰め、基準電圧VDD、
								;CH2(RA2)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	d10u		;サンプリング電圧安定化待ち
			call	d10u
			bsf		ADCON0,GO	;A/D変換開始指令
adcalp
			btfsc	ADCON0,GO	;A/D変換完了待ち 
			goto	adcalp		;GO=0ならば次へ
			movf	ADRESH,W	;データ上位８ビット
			movwf	hex0		;
			
adc_red
			movlw	011h		;00010001b
								;左詰め、基準電圧VDD、
								;CH4(RC0)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	d10u		;サンプリング電圧安定化待ち
			call	d10u
			bsf		ADCON0,GO	;A/D変換開始指令
adcrlp
			btfsc	ADCON0,GO	;A/D変換完了待ち 
			goto	adcrlp		;GO=0ならば次へ
			movf	ADRESH,W	;データ上位８ビット
			movwf	hex1		;
			btfss	mode,0		;modeチェック
			goto	adc_grn		;mode=0ならばadc_grnへジャンプ

			movf	hex0,W		;AGCをhex3に仮保存
			movwf	hex3
			movf	hex1,W		;VR-REDをhex0に移動、Sデータ取得
			movwf	hex0
			call	sset		;現在のhex0値からRL-BL値を取得
			movf	bcdw0,W
			movwf	hex2		;現在S値をhex2にセット
			movf	hex3,W		;hex3は使用しない
			movwf	hex0		;hex0にAGCデータをセット
			clrf	hex3
			call	tx_data		;準備したデータ表示
			return
			
adc_grn
			movlw	015h		;00010101b
								;左詰め、基準電圧VDD、
								;CH5(RC1)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	d10u		;サンプリング電圧安定化待ち
			call	d10u
			bsf		ADCON0,GO	;A/D変換開始指令
adcglp
			btfsc	ADCON0,GO	;A/D変換完了待ち 
			goto	adcglp		;GO=0ならば次へ
			movf	ADRESH,W	;データ上位８ビット
			movwf	hex2		;

adc_ble
			movlw	019h		;00011001b
								;左詰め、基準電圧VDD、
								;CH6(RC2)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	d10u		;サンプリング電圧安定化待ち
			call	d10u
			bsf		ADCON0,GO	;A/D変換開始指令
adcblp
			btfsc	ADCON0,GO	;A/D変換完了待ち 
			goto	adcblp		;GO=0ならば次へ
			movf	ADRESH,W	;データ上位８ビット
			movwf	hex3		;
adc_off		bcf		ADCON0,ADON	;A/DコンバータOFF
			call	tx_data		;サンプリングデータを送信
			return

;
;			取得値を指定変数レジスタにセット
;			ただし、上位4ビットのみ有効(事実上1/16となる)
;			実験モードのみ有効
;
preset16
			swapf	hex1,W		;RED
			andlw	0fh
			movwf	RL
			swapf	hex2,W		;GREEN
			andlw	0fh
			movwf	GL
			swapf	hex3,W		;BLUE
			andlw	0fh
			movwf	BL
			return

;
;			取得値を指定変数レジスタにセット
;			ただし、上位6ビットのみ有効(事実上1/4となる)
;			実験モードのみ有効
;
preset4
			rrf		hex1,F		;RED
			rrf		hex1,W
			andlw	03fh
			movwf	RL
			rrf		hex2,F		;GREEN
			rrf		hex2,W
			andlw	03fh
			movwf	GL
			rrf		hex3,F		;BLUE
			rrf		hex3,W
			andlw	03fh
			movwf	BL
			return

;
;			取得値を指定変数レジスタにセット
;			ただし、上位7ビットのみ有効(事実上1/2となる)
;			実験モードのみ有効
;
preset2
			rrf		hex1,W		;RED
			andlw	07fh
			movwf	RL
			rrf		hex2,W		;GREEN
			andlw	07fh
			movwf	GL
			rrf		hex3,W		;BLUE
			andlw	07fh
			movwf	BL
			return

;
;			取得値を指定変数レジスタにセット
;			実験モード（mode=0)時のみ有効
;
preset
			btfsc	mode,0		;mode=1の時はRL-BL値は決定済み
			return				;よってmode=0の時のみ動作
			movf	hex1,W		;RED
			movwf	RL
			movf	hex2,W		;GREEN
			movwf	GL
			movf	hex3,W		;BLUE
			movwf	BL
			return



;
;			AGC電圧データにより色データ設定
;

get_adc2
;			PWMサイクルチェック
			clrw				;CYCゼロチェック
			addwf	CYC,W
			btfss	STATUS,Z	;CYC=0ならサンプリング開始
			return				;CYCがゼロでないなら何もしない			

aport
			movlw	09h			;00001001b
								;左詰め、基準電圧VDD、
								;CH2(RA2)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	d10u		;サンプリング電圧安定化待ち
			call	d10u
			bsf		ADCON0,GO	;A/D変換開始指令
aloop
			btfsc	ADCON0,GO	;A/D変換完了待ち 
			goto	aloop		;GO=0ならば次へ
			movf	ADRESH,W	;データ上位８ビット
			movwf	hex0		;
			bcf		ADCON0,ADON	;A/DコンバータOFF

;			modeチェック
			btfss	mode,2		;mode4ならチューニング処理へ
			goto	sset		;mode4以外なら色S処理へ

;			強弱発光モード			好みで色々変化させて楽しみます・・・(^^♪
cset		movf	hex0,W
			movwf	TUNC
			movlw	0h			;発光色データ変化設定
			movwf	RL			;赤　00-00-ffｈ
;			movlw	0h			;
			movwf	GL			;緑　00-ff-ffh
			movlw	0ffh
			movwf	BL			;青　ff-00-ffｈ

			movlw	033h
			subwf	TUNC,F
			btfss	STATUS,C	;ボロー(C=0)が発生したら、0hにする
			clrf	TUNC
			incf	TUNC,F
			;
cloop1		decfsz	TUNC,F		;1'stステージ
			goto	cset1
			goto	RGB_DSP
cset1		movlw	04h
			subwf	BL,F		;BLは4ずつ減算
			addwf	GL,F		;GLは４ずつ加算
			btfss	STATUS,C	;GLのO.Fチェック
			goto	cloop1
			movlw	0ffh		;ステージ終値の整理
			movwf	GL
			clrf	BL
			
cloop2		decfsz	TUNC,F		;2'stステージ
			goto	cset2
			goto	RGB_DSP
cset2		movlw	04h
			addwf	RL,F
			btfss	STATUS,C
			goto	cloop2
			movlw	0ffh		;ステージ終値の整理
			movwf	RL

cloop3		decfsz	TUNC,F		;3'stステージ
			goto	cset3
			goto	RGB_DSP
cset3		movlw	04h
			addwf	BL,F
			btfss	STATUS,C
			goto	cloop3
			movlw	0ffh		;最終値の整理
			movwf	BL			;RL=FFH
			goto	RGB_DSP		;GL=FFH
								;BL=FFH
								
								
;			色Sモード
;			AGC電圧分別

sset		movlw	047h		;計算上アナログ1.0V=33H、電位差0.1V=5H
			subwf	hex0,W		;F-W=Wで負ならC=0、正ならC=1
			btfss	STATUS,C
			goto	s00			;47H未満ならs00へGO

			movlw	04dh		;AGC=0.8V以下
			subwf	hex0,W
			btfss	STATUS,C
			goto	s01			;4DH未満ならs01
			
			movlw	054h		;AGC=1.0V以下
			subwf	hex0,W
			btfss	STATUS,C
			goto	s02			;54H未満ならs02
			
			movlw	05bh
			subwf	hex0,W
			btfss	STATUS,C
			goto	s03			;5BH未満ならs03
			
			movlw	061h		;AGC=1.93V以下
			subwf	hex0,W
			btfss	STATUS,C
			goto	s04

			movlw	068h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s05
			
			movlw	072h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s06
			
			movlw	7ch
			subwf	hex0,W
			btfss	STATUS,C
			goto	s07
			
			movlw	086h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s08
			
			movlw	090h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s09
			
			movlw	09dh
			subwf	hex0,W
			btfss	STATUS,C
			goto	s10
			
			movlw	0abh
			subwf	hex0,W
			btfss	STATUS,C
			goto	s11
			
			movlw	0b8h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s12
			
			movlw	0c9h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s13
			
			movlw	0fbh
			subwf	hex0,w
			btfss	STATUS,C
			goto	s14
			
s15			movlw	0ffh		;白
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	0ffh
			movwf	BL
			movlw	015h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP

s14			movlw	080h		;灰
			movwf	RL
			movlw	064h
			movwf	GL
			movlw	047h
			movwf	BL
			movlw	014h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP
			
s13			movlw	0ffh		;薄ピンク
			movwf	RL
			movlw	030h
			movwf	GL
			movlw	034h
			movwf	BL
			movlw	013h
			movwf	bcdw0		;現在のSポジション
			btfss	mode,1
			return
			goto	RGB_DSP

s12			movlw	0ffh		;ピンク
			movwf	RL
			movlw	0eh
			movwf	GL
			movlw	02ah
			movwf	BL
			movlw	012h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP
			
s11			movlw	0ffh		;薄赤
			movwf	RL
			movlw	010h
			movwf	GL
			movlw	0h
			movwf	BL
			movlw	011h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP
						
s10			movlw	0ffh		;赤
			movwf	RL
			movlw	0h
			movwf	GL
			movlw	0h
			movwf	BL
			movlw	010h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP
			
s09			movlw	0ffh		;薄オレンジ
			movwf	RL
			movlw	07eh
			movwf	GL
			movlw	0h
			movwf	BL
			movlw	09h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP

s08			movlw	0ffh		;オレンジ
			movwf	RL
			movlw	052h
			movwf	GL
			movlw	0h
			movwf	BL
			movlw	08h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP
			
s07			movlw	0ffh		;黄
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	0h
			movwf	BL
			movlw	07h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP

s06			movlw	03eh		;薄黄（黄緑）
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	0h
			movwf	BL
			movlw	06h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP

s05			movlw	0h			;薄緑（青緑）
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	046h
			movwf	BL
			movlw	05h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP

s04			movlw	0h			;緑
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	0h
			movwf	BL
			movlw	04h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP

s03			movlw	060h		;薄紫
			movwf	RL
			movlw	032h
			movwf	GL
			movlw	0ffh
			movwf	BL
			movlw	03h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP
			
s02			movlw	03ah		;紫
			movwf	RL
			movlw	0h
			movwf	GL
			movlw	0ffh
			movwf	BL
			movlw	02h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP

s01			movlw	024h		;薄青
			movwf	RL
			movlw	02dh
			movwf	GL
			movlw	0ffh
			movwf	BL
			movlw	01h
			movwf	bcdw0		;現在のSポジション
			goto	RGB_DSP

s00			movlw	0h			;青
			movwf	RL
			movlw	0h
			movwf	GL
			movlw	0ffh
			movwf	BL
			movlw	0h
			movwf	bcdw0		;現在のSポジション

;
;		取得したRGBデータを7セグ基板に送信
;		シミュレーションモード専用
;		
RGB_DSP
			movlw	06h			;modeチェック
			andwf	mode,W		;mode0-1の時は何もしない
			btfsc	STATUS,Z
			return
			movf	RL,W
			movwf	hex1
			movf	GL,W
			movwf	hex2
			movf	BL,W
			movwf	hex3
			call	tx_data
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			フルカラーＬＥＤ発光色コントロール
;
;		角型ＬＥＤ	OSTA71A1D-A	アノードコモンを想定
;			RED		RC0	Input	VF	1.8-2.4
;			Green	RC1	Input	VF	2.8-3.6
;			Blue	RC2	Input	VF	2.9-3.6
;
;		使用変数
;			割込み周期カウンタ		CY	0-255(最長16ms)
;			明るさ設定	赤素子	RL	0-255
;					緑素子	GL	0-255
;					青素子	BL	0-255
;			内部パルス幅カウンタ	CYC,RLC,GLC,BLC
;
;
;		想定呼出方法
;			60us以下を想定　60us*255=15300us(約65HZ)
;			呼出周期が長いと、LEDがチラつきます。
;			明るさ設定RL,GL,BLを設定してから呼び出す
;			この、RL,GL,BLの組み合わせで概ね発色が決まる
;			このルーチンでは時間は管理できず、1周期の時間は呼出ルーチンで決定される
;			よって、基本的には割込み処理ルーチンからの呼出を想定している
;			最長255回呼出されると1周期終了と認識し、次の周期処理をする
;			各色明るさカウンタは指定の回数分の時間ONとし、デクレメントされる
;			明るさカウンタがゼロになると1サイクル終了までOFFとする
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;		フルカラーLEDの発行色を変えるためのPWM変調
ledmod

;
;		モードチェック
;		mode0	00h		VRによるLED点灯
;		mode1	01h		VRによる色S点灯
;		mode2	02h		AGCによる色S点灯
;		mode4	04h		AGCによるチューニング点灯
;
;			btfss	mode,0
;			goto	ckcyc		;mode1以外なら次の処理
;			bsf		PORTC,3		;mode1なのでLED_OFFとし、
;			bsf		PORTC,4		;何もせず終了
;			bsf		PORTC,5
;			return

;		サイクル内かどうかチェック
ckcyc
			clrw				;CYCゼロチェック
			addwf	CYC,W
			btfss	STATUS,Z
			goto	cying			
									

;		サイクル初期化
;
;		一旦初期化すると１サイクルが終了するまで設定変数はリロードされない
;
cyst		movf	CY,W		;1サイクルは最長255カウントされる
			movwf	CYC

cystr		movf	RL,W		;movfはZフラグに影響を与える
			movwf	RLC
			btfss	STATUS,Z
			goto	redon
redof		bsf		PORTC,3		;最初からRL=0なのでRed　off
			goto	cystg
redon		bcf		PORTC,3		;Red on

cystg		movf	GL,W
			movwf	GLC
			btfss	STATUS,Z
			goto	greon
greof		bsf		PORTC,4		;最初からGL=0なのでgreen　off
			goto	cystb
greon		bcf		PORTC,4		;Green on

cystb		movf	BL,W
			movwf	BLC
			btfss	STATUS,Z
			goto	bluon
bluof		bsf		PORTC,5		;最初からBL=0なのでblue　off
			goto	cying
bluon		bcf		PORTC,5		;blue on

;		サイクル処理中
cying		decf	CYC,F		;サイクルカウンタを減算

rlport		clrw				;赤ポート(RC0)処理
			addwf	RLC,W		;RLC値ゼロチェック
			btfsc	STATUS,Z
			goto	glport		;RLCがすでに0ならば緑ポート処理へ
			decf	RLC,F		;RLCを減算
			btfss	STATUS,Z	;減算結果が↓
			goto	glport		;RLC=0でないのでONのまま緑へ
			bsf		PORTC,3		;RLC=0となったので赤OFF
		
glport		clrw				;緑ポート(RC1)処理
			addwf	GLC,W
			btfsc	STATUS,Z	;GLC値ゼロチェック
			goto	blport		;GLCがすでに0ならば青ポート処理へ
			decf	GLC,F		;GRLCを減算
			btfss	STATUS,Z	;減算結果が↓
			goto	blport		;GLC=0でないのでONのまま青へ
			bsf		PORTC,4		;GLC=0となったので緑OFF

blport		clrw				;青ポート(RC2)処理
			addwf	BLC,W		;BLC値ゼロチェック
			btfsc	STATUS,Z
			return				;RLがすでに0ならば終了
			decf	BLC,F		;RLを減算
			btfss	STATUS,Z	;減算結果が↓
			return				;RL=0でないのでONのまま終了へ
			bsf		PORTC,5		;RL=0となったので青OFF
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			シリアルデータ転送サブルーチン(ビット幅10us版)
;
;		入力		hex0	16進バイナリ24ビット
;				hex1	hex0-3は保存されます
;				hex2
;				hex3
;		出力		W=0	送信成功
;				W=1	送信失敗
;
;		データ線	RA0		1bit width = 10us
;		使用ワーク	bsyc0
;		送信は上位バイトの上位ビットから送信
;		受信側のコントロールは受けない
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tx_data
;		hexデータ保存
			movf	hex3,W
			movwf	hexw3
			movf	hex2,W
			movwf	hexw2
			movf	hex1,W
			movwf	hexw1
			movf	hex0,W
			movwf	hexw0
;
;		送信開始
;
;		クロック20MHZなので、1c/s=0.2us、よって1ビットは10us=50c/s
;

tx_start
			bcf		PORTA,0	;スタートビット　セット
			movlw	0dh			;時間調整'13'
			movwf	bsyc0
			nop
txb13		decfsz	bsyc0,F
			goto	txb13		;3+3*12+2=41c/s

;		hexw3

			movlw	08H			;8ビット分
			movwf	shift		;左シフトカウンタ

txb10		nop						;tx loop　ここから送信まで7c/s
			nop
			rlf		hexw3,F		;左シフトで最上位ビットはキャリーへ
			btfss	STATUS,C	;キャリービット　チェック
			GOTO	send10
			nop
send11		bsf		PORTA,0		;DATA 1 send
			nop
			goto	txb11
send10		bcf		PORTA,0		;DATA 0 send
			nop
			nop
txb11							;txb10からここまで10c/s			
			movlw	0ch			;時間調整'12'
			movwf	bsyc0		;2+3*11+2=37cycles
txb12		decfsz	bsyc0,F
			goto	txb12
		
			decfsz	shift,F		;(shift-1)=0 then return 
			goto	txb10		;(10+3）+37=50cycles
								;最終ビット送出から41c/s経過

;		hexw2

		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txb20	nop						;tx loop　ここから送信まで7c/s
		nop
		rlf			hexw2,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		send20
		nop
send21	bsf			PORTA,0		;DATA 1 send
		nop
		goto		txb21
send20	bcf			PORTA,0		;DATA 0 send
		nop
		nop						;txb20からここまで10c/s
txb21			
		movlw		0ch			;時間調整
		movwf		bsyc0		;2+3*11+2=37cycles
txb22	decfsz		bsyc0,F
		goto		txb22
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txb20		;(10+3）+37=50cycles
								;最終ビット送出から41c/s経過


;		hexw1

		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txb30	nop						;tx loopここから送信まで7c/s
		nop
		rlf			hexw1,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		send30
		nop
send31	bsf			PORTA,0		;DATA 1 send
		nop
		goto		txb31
send30	bcf			PORTA,0		;DATA 0 send
		nop
		nop						;txb0からここまで10c/s
txb31			
		movlw		0ch			;時間調整
		movwf		bsyc0		;2+3*11+2=37cycles
txb32	decfsz		bsyc0,F
		goto		txb32
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txb30		;(10+3）+37=50cycles
								;最終ビット送出から17c/s経過

;		hex0

		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txb40	nop						;tx loopここから送信まで7c/s
		nop
		rlf			hexw0,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		send40
		nop
send41	bsf			PORTA,0		;DATA 1 send
		nop
		goto		txb41
send40	bcf			PORTA,0		;DATA 0 send
		nop
		nop						;txb0からここまで10c/s
txb41			
		movlw		0ch			;時間調整
		movwf		bsyc0		;2+3*11+2=37cycles
txb42	decfsz		bsyc0,F
		goto		txb42
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txb40		;(10+3）+37=50cycles
								;最終ビット送出から17c/s経過

;
;		送信終了
;

		bsf			PORTA,0		;ストップビット　セット
		call		d10u
		retlw		0h			;送信終了

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン
;
;		clock = 20MHz(0.05us)
;		1cycle = 0.2us
;		use work reg = cnt0,cnt1,cnt2,cnt3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			movlw	09h			;1
			movwf	cnt2		;1
w1u			nop					;
			nop					;
			call	d10u		;10*9=90us(ここだけ命令ステップを数えない）
			decfsz	cnt2,F		;5*8+4=44cycles
			goto	w1u
			return				;2+44+4=50cycles=10us

wait50u							;呼び出しも含めて、50us
			call	wait25u
wait25u							;呼び出しも含めて、25us
			call	d10u
			call	d10u
								;5us=0.2us*25cycles			
			movlw	06h			;1
			movwf	cnt2		;1
w02u		decfsz	cnt2,F		;1+1+3*5+2=19cycles
			goto	w02u
			nop
			nop
			return				;2+19+1+1+2=25cycles=5us

wait2m
			movlw	02h
			movwf	cnt2
w2m			call	d1m
			decfsz	cnt2,F
			goto	w2m
			return

wait5m							; 5ms delay
			movlw	05h
			movwf	cnt2
w5m			call	d1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms delay
			movlw	d'10'
			movwf	cnt2
w10m		call	d1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms delay
			movlw	d'20'
			movwf	cnt2
w20m		call	d1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms delay
			movlw	d'50'
			movwf	cnt2
w50m		call	d1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms delay
			movlw	d'100'
			movwf	cnt2
w100m		call	d1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms delay
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s delay
			movlw	d'10'
			movwf	cnt3
w1s			call	wait100m
			decfsz	cnt3,F
			goto	w1s
			return

;			Wregで指定した回数10msウェイトルーチンを呼び出す
waitx
			movwf	work1		;
wtx			call	wait10m
			decfsz	work1
			goto	wtx
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1ms 基本ウェイト 
;
;		clock = 20MHz(0.05us)
;		1cycle = 4clock = 0.2us
;		1ms	= 0.2us * 5000cycles
;
;		# 'goto' and 'call' and 'return' = 2cycles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
d1m
			movlw	04h			;loop0
			movwf	cnt0		;

d1m0		movlw	d'249'		;loop1 1246cycles
			movwf	cnt1		;
d1m1		nop					;5cycles*cnt1
			nop					;5*249=1245
			decfsz	cnt1,F		;1245+2-1=1246
			goto	d1m1		;

			decfsz	cnt0,F		;(-1+3)*cnt0
			goto	d1m0		;(1246+3)*4=4996cycles

			return				;other=6cycles
								;Total 5002c/s*0.2us=1.004ms

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us 基本ウェイト
;			呼び出しも含めて、10usとなる。
;
;		clock = 20MHZ(0.05us)
;		1cycle = 4clock = 0.2us
;		10usec = 0.2us * 50cycles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

								;"call" inst = 2cycles
d10u		nop					;1
			movlw	0Bh			;1
			movwf	cnt0		;1
d10u0		nop					;4*10+3=43
			decfsz	cnt0,F		;
			goto	d10u0		;
			return				;2+1+1+1+43+2=50cycles
;
			END
			
