;****************************************************
;****************************************************
;****************************************************
;
; アヴァンシア メーターオープニングセレモニー プログラム     
;
;	 Ver 1.0 	2008/06/21
;
;****************************************************
;****************************************************
;****************************************************

	LIST	P=PIC16F628
	INCLUDE	"P16F628.INC"
        __CONFIG _CP_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_OFF & _WDT_OFF & _HS_OSC & _MCLRE_OFF


;*******************************************
;  レジスタ割付
;*******************************************

SAVE_W		EQU	20H			; 割込用 W     レジスタ保存
SAVE_STATUS	EQU	21H			; 割込用 STATUSレジスタ保存
SAVE_PCLATH	EQU	22H			; 割込用 PCLATHレジスタ保存
SAVE_FSR	EQU	23H			; 割込用 FSR   レジスタ保存

cSP_ANGLE	EQU 24H 		; 速度計 角度
cSP_ADJ		EQU 25H 		;       角度 補正後
cSP_SIN		EQU	26H			;       SIN値 
cSP_COS		EQU	27H			;       COS値

cTA_ANGLE	EQU 28H 		; 回転計 角度
cTA_ADJ		EQU 25H 		;       角度 補正後
cTA_SIN		EQU	2AH			;       SIN値 
cTA_COS		EQU	2BH			;       COS値

cOUT_CNT	EQU	2CH			; 出力用ループカウンタ
cOUT_WAIT	EQU 2DH			; 出力用ウェイト時間

cPB_DATA	EQU	2FH			; Port-B 出力データ

cLOOP_CNT	EQU	30H	
CNT1		EQU	34H			; COUNTER FOR TIMER
CNT2		EQU	35H			;


;*******************************************
;  変数、定数定義
;*******************************************

SET_PORTA	EQU	B'00000000'	; PORTA設定 RA7..RA0 Out
SET_PORTB	EQU	B'00000000'	; PORTB設定 RB7..RB0 Out

SET_OPTION	EQU	B'00000111'	; Optionレジスタ設定 Bit-7:Port-Bﾌﾟﾙｱｯﾌﾟ  ... 0:有効
							;                     6:RB0割込エッジ  ... 0:↓
							;                     5:TMR0ｸﾛｯｸｿｰｽ    ... 0:命令クロック
							;                     4:TMR0ｸﾛｯｸｿｰｽｴｯｼﾞ... 0:↑
							;                     3:ﾌﾟﾘｽｹｰﾗ        ... 0:TMR0に使用
							;                     2-0:ﾌﾟﾘｽｹｰﾗﾚｰﾄ     ... 111:1/256
SET_INT		EQU B'00000000'	; 割り込みレジスタ 	7:Global Interrupt Enable = 1
							;				5:TMR0 = 1
				
TMR0_COUNT	EQU	H'3C'		; タイマ０ カウンタ値 (10mS,ﾌﾟﾘｽｹｰﾗ=255)


METER_WAIT_UP	EQU	.25		; メーター上昇時速度
METER_WAIT_DOWN	EQU	.40		; メーター下降時速度
METER_SP_MAX	EQU	.205	; 速度計 角度最大値
METER_TA_MAX	EQU	.205	; 回転計 角度最大値

;*******************************************
;*******************************************
;*******************************************
;*******************************************

	org	0               	; メイン処理開始アドレス
	GOTO	MAIN

;---------------------------------------------


;****************************************************************************
; SIN データテーブル 0～180° 
;****************************************************************************
	ORG	0FFH
GET_SIN
	addwf	PCL,F	;
SIN_TABLE
	DT	.1,.4,.8,.13,.17,.22,.26,.31,.35,.39
	DT	.44,.48,.53,.57,.61,.65,.70,.74,.78,.83
	DT	.87,.91,.95,.99,.103,.107,.111,.115,.119,.123
	DT	.127,.131,.135,.138,.142,.146,.149,.153,.156,.160
	DT	.163,.167,.170,.173,.177,.180,.183,.186,.189,.192
	DT	.195,.198,.200,.203,.206,.208,.211,.213,.216,.218
	DT	.220,.223,.225,.227,.229,.231,.232,.234,.236,.238
	DT	.239,.241,.242,.243,.245,.246,.247,.248,.249,.250
	DT	.251,.251,.252,.253,.253,.254,.254,.254,.254,.254
	DT	.254,.254,.254,.254,.254,.254,.253,.253,.252,.251
	DT	.251,.250,.249,.248,.247,.246,.245,.243,.242,.241
	DT	.239,.238,.236,.234,.232,.231,.229,.227,.225,.223
	DT	.220,.218,.216,.213,.211,.208,.206,.203,.200,.198
	DT	.195,.192,.189,.186,.183,.180,.177,.173,.170,.167
	DT	.163,.160,.157,.153,.149,.146,.142,.138,.135,.131
	DT	.127,.123,.119,.115,.111,.107,.103,.99,.95,.91
	DT	.87,.83,.78,.74,.70,.66,.61,.57,.53,.48
	DT	.44,.39,.35,.31,.26,.22,.17,.13,.8,.4
 	DT	.1

;****************************************************************************
; 角度補正用データテーブル 0..255°
;****************************************************************************
	ORG	1FFH
SP_CONV
	addwf	PCL,F	;
SP_TABLE
	DT	.0,.1,.1,.2,.2,.3,.3,.4,.4,.5,.5,.6,.6,.7,.7,.8
	DT	.8,.9,.9,.10,.10,.11,.11,.12,.12,.13,.13,.14,.14,.15,.15,.17
	DT	.18,.20,.21,.22,.23,.24,.26,.27,.28,.29,.30,.32,.33,.34,.35,.36
	DT	.38,.39,.40,.41,.42,.44,.45,.46,.47,.48,.50,.51,.52,.53,.54,.56
	DT	.57,.58,.59,.60,.62,.63,.64,.65,.66,.68,.69,.70,.71,.72,.74,.75
	DT	.76,.77,.78,.80,.81,.82,.83,.84,.86,.87,.88,.89,.90,.92,.93,.94
	DT	.95,.96,.98,.99,.100,.101,.102,.104,.105,.106,.107,.108,.110,.111,.112,.113
	DT	.114,.116,.117,.118,.119,.120,.122,.123,.124,.125,.126,.128,.129,.130,.131,.132
	DT	.134,.135,.136,.137,.138,.140,.141,.142,.143,.144,.146,.147,.148,.149,.150,.152
	DT	.153,.154,.155,.156,.158,.159,.160,.161,.162,.164,.165,.166,.167,.168,.170,.171
	DT	.172,.173,.174,.176,.177,.178,.179,.180,.182,.183,.184,.185,.186,.187,.187,.188
	DT	.188,.189,.189,.190,.190,.191,.191,.192,.192,.193,.193,.194,.194,.195,.195,.196
	DT	.196,.197,.197,.198,.198,.199,.199,.200,.200,.201,.201,.202,.202,.203,.203,.204
	DT	.204,.205,.205,.206,.206,.207,.207,.208,.208,.209,.209,.210,.210,.211,.211,.212
	DT	.212,.213,.213,.214,.214,.215,.215,.216,.216,.217,.217,.218,.218,.219,.219,.220
	DT	.220,.221,.221,.222,.222,.223,.223,.224,.224,.225,.225,.226,.226,.227,.227,.228

;*******************************************
;
; 	メイン処理
;
;*******************************************
MAIN
;-----------------------------------
 	BSF		STATUS,RP0  	; Bank 1 へ切替

	MOVLW	SET_OPTION		; オプションレジスタ設定
	MOVWF	OPTION_REG	 

 	MOVLW	SET_PORTA		; PORTA の設定
	MOVWF	TRISA

	MOVLW	SET_PORTB		; PORTB の設定
	MOVWF	TRISB

	MOVLW	SET_INT			; 割り込みレジスタ の設定
	MOVWF	INTCON

 	BCF  	STATUS,RP0  	; Bank 0 へ戻す
	
	CLRF	PORTA
	CLRF	PORTB

	CLRF	cPB_DATA
;------------------------------	
; メモリ初期化
;------------------------------	
 	BCF  	STATUS,RP1  	; Bank 0 へ戻す
 	BCF  	STATUS,RP0  	; Bank 0 へ戻す

	CLRF	cSP_ANGLE
	CLRF	cTA_ANGLE


;------------------------------------------
; バックライト・信号切り替えリレー ON
;------------------------------------------
	BSF		PORTA,1

;------------------------------------------
; 回転計・速度計 0° でちょっと待つ
;------------------------------------------
	CLRF	cSP_ANGLE
	CLRF	cTA_ANGLE

	MOVLW	.20
	MOVWF	cOUT_WAIT

	MOVLW	.255	
	MOVWF	cLOOP_CNT	

STAT_1

	CALL	PULSE_CALC
	CALL	PULSE_OUT

	DECFSZ	cLOOP_CNT,F
	GOTO	STAT_1

;------------------------------------------
; 回転計 0 -> MAX
;------------------------------------------
	CLRF	cTA_ANGLE

	MOVLW	METER_WAIT_UP		; 上昇時速度
	MOVWF	cOUT_WAIT

	MOVLW	METER_TA_MAX		; 角度最大値
	MOVWF	cLOOP_CNT	

STAT_2
	INCF	cTA_ANGLE,f

	CALL	PULSE_CALC
	CALL	PULSE_OUT

	DECFSZ	cLOOP_CNT,F
	GOTO	STAT_2

	
;------------------------------------------
; 速度計 0 -> MAX
;------------------------------------------
	CLRF	cSP_ANGLE

	MOVLW	METER_WAIT_UP		; 上昇時速度
	MOVWF	cOUT_WAIT

	MOVLW	METER_SP_MAX		; 角度最大値
	MOVWF	cLOOP_CNT	

STAT_3
	INCF	cSP_ANGLE,f

	CALL	PULSE_CALC
	CALL	PULSE_OUT

	DECFSZ	cLOOP_CNT,F
	GOTO	STAT_3

;------------------------------------------
; MAXでちょっと待つ
;------------------------------------------
	MOVLW	METER_WAIT_UP
	MOVWF	cOUT_WAIT

	MOVLW	.50
	MOVWF	cLOOP_CNT	

STAT_4

	CALL	PULSE_CALC
	CALL	PULSE_OUT

	DECFSZ	cLOOP_CNT,F
	GOTO	STAT_4



;------------------------------------------
; 回転計・速度計  0° へ
;------------------------------------------
	MOVLW	METER_WAIT_DOWN				; 下降時速度
	MOVWF	cOUT_WAIT

	MOVLW	METER_SP_MAX				
	MOVWF	cLOOP_CNT	

STAT_6

	DECF	cTA_ANGLE,f
	DECF	cSP_ANGLE,f

	CALL	PULSE_CALC
	CALL	PULSE_OUT

	DECFSZ	cLOOP_CNT,F
	GOTO	STAT_6

;------------------------------------------
; ちょっと待つ
;------------------------------------------
	MOVLW	METER_WAIT_UP
	MOVWF	cOUT_WAIT

	MOVLW	.50
	MOVWF	cLOOP_CNT	

STAT_7

	CALL	PULSE_CALC
	CALL	PULSE_OUT

	DECFSZ	cLOOP_CNT,F
	GOTO	STAT_7

;------------------------------------------
; バックライト・信号切り替えリレー OFF
;------------------------------------------
	BCF		PORTA,1


;------------------------------------------
; 終了（無限ループ)
;------------------------------------------
ALL_END  
	CALL	PULSE_CALC
	CALL	PULSE_OUT

	GOTO	ALL_END 


;------------------------------------------
; パルス幅計算
;------------------------------------------
PULSE_CALC
	MOVF	PCLATH,	w
	MOVWF	SAVE_PCLATH

; 角度補正
	MOVLW	high SP_TABLE
	MOVWF	PCLATH

	MOVF	cTA_ANGLE,w
	CALL	SP_CONV
	MOVWF	cTA_ADJ

	MOVF	cSP_ANGLE,w
	CALL	SP_CONV
	MOVWF	cSP_ADJ

	MOVLW	high SIN_TABLE
	MOVWF	PCLATH

; === 回転計 ===
TA_SIN
	MOVLW	.180
	SUBWF	cTA_ANGLE,w		; w = ANGLE - 180
	BTFSC	STATUS,C		; if w>=0 then GOTO MINUS
	GOTO	TA_SIN_MINUS

TA_SIN_PLUS					; sin 0..180 度
	BSF		cPB_DATA,4
	BCF		cPB_DATA,5
	MOVF	cTA_ANGLE,w
	GOTO	TA_SIN_SET

TA_SIN_MINUS				; sin 181..255度 (角度データは255度まで)
	BCF		cPB_DATA,4
	BSF		cPB_DATA,5

TA_SIN_SET
	CALL	GET_SIN
	MOVWF	cTA_SIN

TA_COS
	MOVLW	.90
	SUBWF	cTA_ANGLE,w		; w = ANGLE - 90
	BTFSC	STATUS,C		; if w>=0 then GOTO MINUS
	GOTO	TA_COS_MINUS

TA_COS_PLUS					; cos 0..90 度
	BSF		cPB_DATA,6
	BCF		cPB_DATA,7
	MOVF	cTA_ANGLE,w
	ADDLW	.90				; sinの角度に変換する　Cos0 = sin90
	GOTO	TA_COS_SET

TA_COS_MINUS				; cos 91..255 (角度データは255度まで)
	BCF		cPB_DATA,6
	BSF		cPB_DATA,7

TA_COS_SET

	CALL	GET_SIN
	MOVWF	cTA_COS


; === 速度計 ===

SP_SIN
	MOVLW	.180
	SUBWF	cSP_ADJ,w		; w = ANGLE - 180
	BTFSC	STATUS,C		; if w>=0 then GOTO MINUS
	GOTO	SP_SIN_MINUS

SP_SIN_PLUS					; sin 0..180 度
	BSF		cPB_DATA,0
	BCF		cPB_DATA,1
	MOVF	cSP_ADJ,w
	GOTO	SP_SIN_SET

SP_SIN_MINUS				; sin 181..255度 (角度データは255度まで)
	BCF		cPB_DATA,0
	BSF		cPB_DATA,1

SP_SIN_SET
	CALL	GET_SIN
	MOVWF	cSP_SIN


SP_COS
	MOVLW	.90
	SUBWF	cSP_ADJ,w		; w = ANGLE - 90
	BTFSC	STATUS,C		; if w>=0 then GOTO MINUS
	GOTO	SP_COS_MINUS

SP_COS_PLUS					; cos 0..90 度
	BSF		cPB_DATA,2
	BCF		cPB_DATA,3
	MOVF	cSP_ADJ,w
	ADDLW	.90				; sinの角度に変換する　Cos0 = sin90
	GOTO	SP_COS_SET

SP_COS_MINUS				; cos 91..255 (角度データは255度まで)
	BCF		cPB_DATA,2
	BSF		cPB_DATA,3

SP_COS_SET
	CALL	GET_SIN
	MOVWF	cSP_COS

CALC_END
	MOVF	SAVE_PCLATH,w
	MOVWF	PCLATH

	RETURN

;------------------------------------------
; パルス出力
;------------------------------------------
PULSE_OUT
	CLRF	cOUT_CNT

OUT_LOOP
	MOVF	cPB_DATA,w
	MOVWF	PORTB

OUT_WAIT			
	MOVF	cOUT_WAIT,w
	MOVWF	CNT1		
OUT_WAIT_LP
	DECFSZ	CNT1,f
	GOTO	OUT_WAIT_LP
	
; 速度計SIN
OUT_SP_SIN
	DECFSZ	cSP_SIN,F
	GOTO	OUT_SP_COS

	BCF		cPB_DATA,0	; SIN 出力終了
	BCF		cPB_DATA,1

; 速度計COS
OUT_SP_COS
	DECFSZ	cSP_COS,F
	GOTO	OUT_TA_SIN

	BCF		cPB_DATA,2	; COS 出力終了
	BCF		cPB_DATA,3


; 回転計SIN
OUT_TA_SIN
	DECFSZ	cTA_SIN,F
	GOTO	OUT_TA_COS

	BCF		cPB_DATA,4	; SIN 出力終了
	BCF		cPB_DATA,5

; 回転計COS
OUT_TA_COS
	DECFSZ	cTA_COS,F
	GOTO	OUT_NEXT

	BCF		cPB_DATA,6	; COS 出力終了
	BCF		cPB_DATA,7

OUT_NEXT

	DECFSZ	cOUT_CNT,F
	GOTO	OUT_LOOP

OUT_END
	RETURN




	
;=================================
	end
