kuroの覚え書き

96の個人的覚え書き

タコメータプログラムVer2



とりあえず作成してみた。未だ動作試験はしていない。データ送信する前にBCD変換をした方があとの処理が良いような気もするが、時間が足りるかちょっと心配なのであった。


LIST P=PIC16F648A
INCLUDE "P16F648A.INC"
__CONFIG _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _INTOSC_OSC_NOCLKOUT & _MCLRE_ON

CBLOCK 020H ;先頭の番地を指定
TEMPH
TEMPL
ENDC ;定義終わり

ORG 0
GOTO START

ORG 4
GOTO INTRPT

START
CLRF PORTA

;PORT init TRISA,TRISB(バンク1)
BSF STATUS,RP0 ;バンク1に移動
MOVLW 0AH ;00001010 ONLY RB1,3 INPUT (RXD,CCP)
MOVWF TRISB ;PORTB SET
MOVLW 018H ;00011000 ONLY RA3,4 INPUT
MOVWF TRISA ;PORTA SET

;割り込みのinit PIE1 (バンク1)

BCF PIE1,TMR1IE ;TMR1オーバーフロー割り込み禁止
BSF PIE1,CCP1IE ;CCP1キャプチャ割り込み許可

;USART INI TXSTA, SPBRG(バンク1),RCSTA(バンク0)
MOVLW 024H ;00100100 非同期モード、高速通信モード
MOVWF TXSTA ;set TX mode
MOVLW 019H ;4MHz, 9600bps, BRGH=1
MOVWF SPBRG ;ボーレートセット
BCF STATUS,RP0 ;バンク0に移動
MOVLW 090H ;10010000 非同期モード
MOVWF RCSTA ;set RX mode
CLRF PORTB ;ALL CLEAR

;COMPARATOR init CMCON(バンク0)
MOVLW 07H ;00000111
MOVWF CMCON ;コンパレータをすべてオフ

;TMR1 init T1CON(バンク0)
MOVLW 030H ;タイマ1初期化 00110000
MOVWF T1CON ;内部クロック、プリスケール8、とりあえず停止

;CCP1 init CCP1CON(バンク0)
MOVLW 06H ;CCP1初期化 00000110
MOVWF CCP1CON ;CCP1CONの設定

TMRSTART
MOVLW 0H
MOVWF TMR1H
MOVLW 0H
MOVWF TMR1L ;TMR1リセット
BSF INTCON,PEIE ;周辺割り込み許可
BSF INTCON,GIE ;全体割り込み許可
BSF T1CON,TMR1ON ;TMR1スタート
LP1
NOP
GOTO LP1

INTRPT
BCF PIR1,CCP1IF ;CCP割り込みフラグクリア
MOVF CCPR1H,W ;上位バイト
MOVWF TEMPH
MOVF CCPR1L,W ;下位バイト
MOVWF TEMPL
BCF T1CON,TMR1ON ;TMR1ストップ
MOVLW 0H
MOVWF TMR1H
MOVLW 0H
MOVWF TMR1L ;TMR1リセット
BSF T1CON,TMR1ON ;TMR1スタート
MOVF TEMPH,W
CALL SEND
MOVF TEMPL,W
CALL SEND
MOVLW 02CH ;コンマ
CALL SEND
RETFIE

;**************************
;シリアル通信ルーチン
;Wに入っている数値を送信
;**************************
SEND
BSF STATUS,RP0 ; Bank 1 へ切替
LPTX
BTFSS TXSTA,TRMT ; 送信可能であるかチェック(1:可能, 0:禁止)
GOTO LPTX ; 禁止であれば LPTX のラベル間を繰り返す
BCF STATUS,RP0 ; Bank 0 へ戻す
MOVWF TXREG ;シリアル送信
RETURN
END