; ***************************************************************
; Logi_picas 20211106
; Language: PIC-AS (v2.32)
; MPLABX (v5.50)
;
; MPLAB X IDE 設定の追加:
; project properties ダイアログ pic-as Linker の
; Custom linker options 欄に以下の2文を追加する
; -pPor_Vec=0h -pIsr_Vec=4h
; ***************************************************************
PROCESSOR 16F18326
a#include <xc.inc>
Cflag equ 0x00
Zflag equ 0x02
; *********************** Bank RAMエリア ************
; CBLOCK 0x20 ; Bank 0x10 Linear 2500
bRxbuf0 equ 0x20 ; コマンド受信バッファ
bRxbuf1 equ 0x21
bRxbuf2 equ 0x22
bRxbuf3 equ 0x23
bRxbuf4 equ 0x24
bRxbuf5 equ 0x25
bRxbuf6 equ 0x26
iFSR0L equ 0x27 ; 割込み処理で使用のFSR0 退避用
iFSR0H equ 0x28 ; 割込み処理で使用のFSR0 退避用
bErr_Cmd equ 0x29 ; 受信文字列のエラー確認
;
; *********************** 共通RAMエリア **************
; CBLOCK 0x70
cRxComd equ 0x70 ; コマンド受信フラグ
cRxDATA equ 0x71 ; 受信データ一時保管
cDATAptr equ 0x72 ; メッセージ送信ポインタ
cTemp_1 equ 0x73 ; 共用変数メモリ
cTemp_2 equ 0x74 ; 共用変数メモリ
cTemp_3 equ 0x75 ; 共用変数メモリ
cFreRun equ 0x76 ; フリーラン モード
cBfrAqH equ 0x77 ; トリガ前収集数
cBfrAqL equ 0x78 ; トリガ前収集数
cAftAqH equ 0x79 ; トリガ後収集数
cAftAqL equ 0x7A ; トリガ後収集数
;
; *********************** config **************************
config FEXTOSC = OFF, RSTOSC = HFINT32, CLKOUTEN = OFF
config CSWEN = ON , FCMEN = ON , MCLRE = ON
config PWRTE = OFF , WDTE = OFF , LPBOREN = OFF
config BOREN = OFF , BORV = LOW , PPS1WAY = OFF
config STVREN = ON , DEBUG = OFF , WRT = OFF
config LVP = ON , CP = OFF , CPD = OFF
; 電源ONリセット 開始番地 ----------------
PSECT Por_Vec,class=CODE,delta=2
Start:
GOTO Main
; 割り込み処理 開始番地 ---------------
PSECT Isr_Vec,class=CODE,delta=2
IsrVec:
MOVLB 0x10 ; Bank 16
MOVF iFSR0L, W ; 割り込みに使用している
MOVWF FSR0L ; FSR0 の値をロード
MOVF iFSR0H, W
MOVWF FSR0H
MOVLB 0x0 ; Bank 0 PIR1
BTFSS RCIF ; uart 受信からの割り込みか
GOTO RTNINT ; 受信で無いなら復帰
; 受信なら ------------------------
MOVLB 0x3 ; Bank 3 RC1STA
BTFSS OERR ; OERR 受信エラーか
GOTO RX_OK ; 受信エラー無しなら
BCF CREN ; エラーなら CREN OFF/ONで RC1STA
BSF CREN ; エラークリア
GOTO RTNINT ; 復帰
; 正常受信なら -----------------------
RX_OK:
MOVLB 0x3 ; Bank 3
MOVF BANKMASK(RC1REG), W
MOVWF cRxDATA ; 受信データをRxDataに保管;
XORLW 0x21 ; '!' STOP か
BTFSC STATUS, Zflag ; '!' なら Zflag
GOTO CASRST ; case re-startへ
MOVF cRxDATA, W
XORLW 0x0A ; 'CR' か
BTFSC STATUS, Zflag ; 'CR' か
GOTO C_CRLF ; case C_CRLFへ
MOVF cRxDATA, W
XORLW 0x0D ; 'LF' か
BTFSC STATUS, Zflag ; 'LF' なら
GOTO C_CRLF ; case C_CRLFへ
GOTO C_OTHR
CASRST:
RESET ; デバイスのリセット
GOTO RTNINT
C_CRLF:
MOVF FSR0L, W ; 受信ポインタを W に
XORLW 0x07 ; 受信データ数を
BTFSC STATUS, Zflag ; 確認
BSF cRxComd, 0 ; 7 ならフラグセット
CLRF FSR0L ; 受信ポインタをリセット
GOTO RTNINT
C_OTHR:
MOVLW 0x07 ; Buff満杯か
SUBWF FSR0L, w ; ポインタを確認
MOVF cRxDATA, W ; 受信データを W に
BTFSS STATUS, Cflag ; 満杯でなければ
MOVWF INDF0 ; Buffに保存
INCF FSR0L, F ; 満杯でもポインタは進める
GOTO RTNINT
RTNINT:
MOVLB 0x10 ; Bank 16
MOVF FSR0L, W ; PUSH FSR0 退避する
MOVWF iFSR0L
MOVF FSR0H, W
MOVWF iFSR0H
RETFIE
;void main =====================================
Main:
MOVLB 0x1 ; Bank 1
MOVLW 0x3F ; 0b111111;
MOVWF BANKMASK(TRISA) ; すべて入力
MOVLW 0x3F ; 0b111111;
MOVWF BANKMASK(TRISC) ; Port すべて入力
MOVLB 0x3 ; Bank 3
CLRF BANKMASK(ANSELA) ; すべてデジタル
CLRF BANKMASK(ANSELC) ; すべてデジタル
MOVLB 0x4 ; Bank 4
MOVLW 0xF ; 0b001111;
MOVWF BANKMASK(WPUA) ; RA0-RA3 弱プルアップ ON
MOVLW 0x20 ; 0b100000;
MOVWF BANKMASK(WPUC) ; RC5 弱プルアップ ON
MOVLB 0x1C ; Bank 1C
MOVLW 0x4 ; RXPPS = 0x04;
MOVWF BANKMASK(RXPPS) ; RA4->EUSART RX
MOVLB 0x1D ; Bank 1D
MOVLW 0x14 ; RA5PPS = 0x14;
MOVWF BANKMASK(RA5PPS) ; RA5->EUSART TX
;
;//------------ Initialize timer 0 -------------------------------
MOVLB 0x0 ; Bank 0x0 選択
MOVLW 0x4D ; 0b01001101;
MOVWF BANKMASK(T0CON1) ; Fosc/4 Sync PreS 1/8192
CLRF BANKMASK(T0CON0) ; T0 OFF 8bit Post 1/1
MOVLW 0xFF ; TMR0 PR を FF にセット
MOVWF BANKMASK(TMR0H) ; TMR0H = 0xFF
;
;//------------ Initialize UART ----------------------------
MOVLB 0x3 ; Bank 3
MOVLW 0x90 ; 0b10010000;
MOVWF BANKMASK(RC1STA) ; 8 bit 連続受信
MOVLW 0x24 ; 0b00100100;
MOVWF BANKMASK(TX1STA) ; 非同期送受信 High Baud Rate選択
MOVLW 0x8 ; 0b00001000;
MOVWF BANKMASK(BAUD1CON) ; 115200 baud
CLRF BANKMASK(SP1BRGH) ; SP1BRGH = 0;
MOVLW 0x44
MOVWF BANKMASK(SP1BRGL) ; SP1BRG = 68;
; CLC 設定 ------------------------------------
MOVLB 0x1C ; Bank 0x1C
MOVLW 0x10
MOVWF BANKMASK(CLCIN0PPS) ; RC0->CLCIN0
MOVLW 0x11
MOVWF BANKMASK(CLCIN1PPS) ; RC1->CLCIN1
MOVLW 0x12
MOVWF BANKMASK(CLCIN2PPS) ; RC2->CLCIN2
;// Set the CLC1
MOVLB 0x1E ; Bank 0x1E
MOVLW 0x2
MOVWF BANKMASK(CLC1POL) ; G2出力は負極性 他出力は正極性
CLRF BANKMASK(CLC1SEL0) ; LC1D1S (CLCIN0PPS)
MOVLW 0x1
MOVWF BANKMASK(CLC1SEL1) ; LC1D2S (CLCIN1PPS)
MOVLW 0x2
MOVWF BANKMASK(CLC1SEL2) ; LC1D3S (CLCIN2PPS)
MOVLW 0x18
MOVWF BANKMASK(CLC1SEL3) ; LC1D4S T0_overflow
MOVLW 0x80
MOVWF BANKMASK(CLC1GLS0) ; G1D1-3 Vss G1D4 正接続
MOVLW 0x2
MOVWF BANKMASK(CLC1GLS1) ; G2D1 負接続 G2D2-4 Vss
CLRF BANKMASK(CLC1GLS2) ; 全てVss
CLRF BANKMASK(CLC1GLS3) ; 全てVss
MOVLW 0x84
MOVWF BANKMASK(CLC1CON) ; 1-input D ff
;// Set the CLC2
MOVLW 0x2
MOVWF BANKMASK(CLC2POL)
CLRF BANKMASK(CLC2SEL0)
MOVLW 0x4
MOVWF BANKMASK(CLC2SEL1) ; LC1_out
MOVLW 0x2
MOVWF BANKMASK(CLC2SEL2)
MOVLW 0x18
MOVWF BANKMASK(CLC2SEL3)
MOVLW 0x80
MOVWF BANKMASK(CLC2GLS0)
MOVLW 0x5 ; G1D1-2 正接続 G2D3-4 Vss
MOVWF BANKMASK(CLC2GLS1)
CLRF BANKMASK(CLC2GLS2)
CLRF BANKMASK(CLC2GLS3)
MOVLW 0x84
MOVWF BANKMASK(CLC2CON)
; 変数初期設定 ------------------------------------
CLRF cRxComd ; コマンド受信フラグ
CLRF cTemp_1
MOVLB 0x10 ; Bank 16
CLRF iFSR0L ; 受信ポインタ(FSR0退避)をリセット
MOVLW 0x25
MOVWF iFSR0H
; UART Rx 割込みを使用許可
MOVLB 0x1 ; Bank 1
BSF RCIE ; UART Rx 割込みを使用許可 PIE1
BSF PEIE ; 周辺機能割込みの使用許可 INTCON
BSF GIE ; 全割込みの使用許可 INTCON
; !!\r\n 準備完了を送信
CLRW
CALL PRINT_MSG
; // ----------- メイン 繰返し ---------------------
LOOP:
BTFSS cRxComd, 0 ; コマンドを受信したか
GOTO LOOP ; 否 繰返しに戻る
BCF cRxComd, 0 ; フラグ クリア
call CkValidity
MOVLB 0x10 ; Bank 16 設定
BTFSS bErr_Cmd, 0
goto Cmd_OK
Cmd_NG:
movlw 0x1 ; コマンドエラー検知
call PRINT_MSG ; 1 ![CRLF]を送信
goto LOOP ; コマンド受信待ちへ
Cmd_OK:
MOVLW 0x6 ; コマンド OK
call PRINT_MSG ; #[CRLF]を送信
CALL SetTrigger ; トリガ条件の設定
call SetSampRate ; サンプルレートの設定
CALL SetTrgPosition ; トリガ位置の設定
CALL Aquition ; データの取得
CALL OutAqData ; データの送信
GOTO LOOP ; LOOP を繰り返す
; ***********************************************
cTstNum equ cTemp_1 ; テスト文字変換数値
PrePtn equ BANKMASK(CLC1GLS1) ; CLC1 Gate2 入力
PstPtn equ BANKMASK(CLC2GLS1) ; CLC2 Gate2 入力
TrgChn equ BANKMASK(CLC2SEL0) ; CLC2 入力1 選択
; // ----------- 各ChのTrigger条件設定 --------
SetTrigger:
MOVLW 0x25 ; FSR0 にBank RAM番地
MOVWF FSR0H ; 設定し受信データ取得
MOVLW 0x03 ; FSR0 = 2503
MOVWF FSR0L ; 3chから処理開始
MOVLB 0x1E ; CLC ファイルの Bank
CLRF PrePtn ; CLC1 Gate2 入力 クリア
CLRF PstPtn ; CLC2 Gate2 入力 クリア
CLRF TrgChn ; CLC2 入力1 選択 クリア
TrgDo:
LSLF PrePtn, F ; PrePtnを左シフト
LSLF PrePtn, F ; PrePtnを左シフト
MOVIW FSR0-- ; 設定文字を取得
ANDLW 0x07 ; 設定文字を数値に変換
MOVWF cTstNum ; 設定数値を保存
; 立上り の設定
CALL PreData ; PreData取得
IORWF PrePtn, F ; PrePtnに結合
; PrePtn の設定
MOVF cTstNum, W ; 処理する数値を取得
xorlw 0x3 ; 立上り'3'指定か
btfss STATUS, Zflag ; 立上りはスキップ
goto TgCk4 ; 異なれば、次
movlw 0x05 ; Ch CLC1out 反転入力
movwf PstPtn ; CLC2 Gate2 入力 に設定
movf FSR0L, W ; Ch番号 - 1
movwf TrgChn ; CLC2 入力1 選択に設定
TgCk4: ; 立下り の設定
MOVF cTstNum, W ; 処理する数値を取得
xorlw 0x4 ; 立下り'4'指定か
btfss STATUS, Zflag
goto TgCkNx
movlw 0x06
movwf PstPtn
movf FSR0L, W
movwf TrgChn
TgCkNx: ; Ch処理の終了か
MOVF FSR0L, F ; 次処理Chを取得
BTFSS STATUS, Zflag ; ch 0 で終了
GOTO TrgDo ; 0 でなければ次のchを処理
return
PreData:
BRW
IRP number,0,1,2,2,1
retlw number
ENDM
;
; // ----------- サンプルレート設定 --------------
; TMR0 の プリスケラーとPR(TMR0H) を設定する
; // -------------------------------------------
SetSampRate:
MOVLB 0x10 ; Bank 16
MOVF bRxbuf5, W ; 受信データSampRateを取得
ANDLW 0x0F ; 設定文字を数値に変換
MOVWF cTstNum ; 設定数値を保存
call T0_CON1 ; T0CON1設定値に変換
MOVLB 0x0 ; Bank 0
MOVWF BANKMASK(T0CON1) ; T0CON1設定を保存
movf cTstNum, W ; 設定数値を取得
call TMR0_H ; TMR0H設定値に変換
MOVWF BANKMASK(TMR0H) ; TMR0H設定を保存
RETURN
T0_CON1: ; サンプルレート毎の T0CON1 設定値
BRW ; 1us, 2, 5, 10, 20, 50, 100, 200, 500, 1ms
IRP number,0x40,0x40,0x40,0x43,0x43,0x43,0x43,0x43,0x45,0x45
retlw number
ENDM
TMR0_H: ; サンプルレート毎の TMR0H 設定値
BRW ; 1us, 2, 5, 10, 20, 50, 100, 200, 500, 1ms
IRP number,0x7, 0xF,0x27, 0x9,0x13,0x31,0x63,0xC7,0x7C,0xF9
retlw number
ENDM
; =========================================
; トリガ前後の収集数を設定
; cBfrAqH cBfrAqL ; トリガ前収集数
; cAftAqH cAftAqL ; トリガ後収集数
; フリーラン時は cFreRun [1]にする
; =========================================
SetTrgPosition:
clrf cFreRun ; フリーラン解除
MOVLB 0x10 ; Bank 16
movf bRxbuf6, W
ANDLW 0x07 ; 設定文字を数値に変換
MOVWF cTstNum ; 設定数値を保存
call Bfr_AqH ; cBfrAqH 設定値に変換保存
MOVWF cBfrAqH ;
movf cTstNum, W ; 設定数値を取得
call Bfr_AqL ; cBfrAqL 設定値に変換保存
MOVWF cBfrAqL ;
movf cTstNum, W ; 設定数値を取得
call Aft_AqH ; cAftAqH 設定値に変換保存
MOVWF cAftAqH ;
movf cTstNum, W ; 設定数値を取得
call Aft_AqL ; cAftAqL 設定値に変換保存
MOVWF cAftAqL ;
movf cTstNum, W ; 設定数値を取得
xorlw 0x03
BTFSC STATUS, Zflag ; フリーラン なら
bsf cFreRun, 0 ; フリーランフラグ設定
RETURN
Bfr_AqH: ; トリガ前データ取得 パス 設定値
BRW ; 前, 1, 2,Free,中央, 後
IRP number, 0x01,0x01,0x01,0x04,0x03,0x04
retlw number
ENDM
Bfr_AqL: ; トリガ前データ取得 端数 設定値
BRW ; 前, 1, 2,Free,中央, 後
IRP number,0x64,0x01,0x01,0x00,0x26,0xE8
retlw number
ENDM
Aft_AqH: ; トリガ後データ取得 パス 設定値
BRW ; 前, 1, 2,Free,中央, 後
IRP number,0x04,0x08,0x0C,0x01,0x02,0x01
retlw number
ENDM
Aft_AqL: ; トリガ後データ取得 端数 設定値
BRW ; 前, 1, 2,Free,中央, 後
IRP number,0x9C,0x84,0x6C,0x01,0xDA,0x18
retlw number
ENDM
; データ収集 ===============================================
Aquition:
MOVLB 0x0 ; Bank 0x0 設定 T0CON0
BSF T0EN ; Timer1スタート
MOVLW 0x20 ; FSR0 に番地設定
MOVWF FSR0H
MOVLW 0x00
MOVWF FSR0L
MOVLB 0x0 ; Bank 0x0 設定 PIR0
BCF TMR0IF ; TMR0IF リセット
; -------------- トリガ前保存 および FreeRun --------------
BfrTrg:
BTFSS TMR0IF ; 取得タイミングを待つ
GOTO BfrTrg
BCF TMR0IF ; TMR0IF リセット
MOVF PORTC, W ; PORTC 取得
MOVWI FSR0++ ; データを保存
movlw 0x23 ; リングバッファ
andwf FSR0H, f ; のための処理
DECFSZ cBfrAqL, F ; 保存数を確認
GOTO BfrTrg ; 端数を確認
DECFSZ cBfrAqH, F ; パス数を確認
GOTO BfrTrg
BTFSC cFreRun, 0 ; cFreRun なら
RETURN ; FreeRun時は、収集完了
; ---------------- トリガ条件の確認 ------------------
WatTrg:
MOVLB 0x0 ; Bank 0x0 設定
WaitTm:
BTFSS TMR0IF ; 取得タイミングを
GOTO WaitTm ; 待つ
BCF TMR0IF ; TMR0IF リセット
MOVF PORTC, W ; PORTC 取得
MOVWI FSR0++ ; データを保存
movlw 0x23 ; リングバッファ
andwf FSR0H, f ; のための処理
MOVLB 0x1E ; Bank 0x1E 設定 CLC2CON
BTFSS LC2OUT ; LC2OUT 確認
GOTO WatTrg
MOVLB 0x0 ; Bank 0x0 設定
; -------------- トリガ後保存 -------------------------
AftTrg:
BTFSS TMR0IF ; 取得タイミングを PIR0
GOTO AftTrg ; 待つ
BCF TMR0IF ; TMR0IF リセット
MOVF PORTC, W ; PORTC 取得
MOVWI FSR0++ ; データを保存
movlw 0x23 ; リングバッファ
andwf FSR0H, f ; のための処理
DECFSZ cAftAqL, F ; 保存数を循環
GOTO AftTrg
DECFSZ cAftAqH, F
GOTO AftTrg
RETURN ; 収集完了
;--------------------------------------------------
; 収集データを送信
; ESR0 に、送信開始あそれえ雨を持っている
; cTemp_1 cTemp_2 に
;--------------------------------------------------
OutAqData:
MOVLW 0x40 ; 行の文字数を
MOVWF cTemp_1 ; 64文字に設定
MOVLW 0x10 ; 行数を16行にし
MOVWF cTemp_2 ; 64 x 16行 = 1024
OutAq1:
moviw FSR0++ ; データを読み
ANDLW 0x1F ; 不要ビットを削除
IORLW 0x40 ; @ からの文字に変換
call PUTCH ; === 一文字出力 ===
movlw 0x23 ; FSR0 の
andwf FSR0H, f ; リングバッファ処理
DECFSZ cTemp_1, F ; 64文字送信したか
GOTO OutAq1 ; まだなら戻る
MOVLW 0x40 ; 次の準備で
MOVWF cTemp_1 ; cTemp_1 初期化
MOVLW 0x2 ; 行末の
call PRINT_MSG ; CRLFを送信
DECFSZ cTemp_2, F ; 16行送信したか
GOTO OutAq1 ; まだなら戻る
MOVLW 0x5 ; データ送信完了したので
call PRINT_MSG ; ##[CRLF]を送信
RETURN
;--------------------------------------------------
; コマンドを処理
;
;--------------------------------------------------
CkValidity:
MOVLB 0x10 ; Bank 16
bsf bErr_Cmd, 0 ; エラー『有』に設定
CkCha0:
MOVF bRxbuf0, W ; 受信データ1を取得
XORLW '#'
BTFSS STATUS, Zflag ; '#' か
RETURN ; 否 ならエラーで復帰
CkCha4:
MOVF bRxbuf4, W ; 受信データ1を取得
XORLW '#'
BTFSS STATUS, Zflag ; '#' か
RETURN ; 否 ならエラーで復帰
clrf bErr_Cmd ; エラー『無』に設定
movlw 0x5 ; 5 以上はエラー
movwf cTemp_1
MOVF bRxbuf1, W ; 受信データ1を取得
call CkRange
MOVF bRxbuf2, W ; 受信データ2を取得
call CkRange
MOVF bRxbuf3, W ; 受信データ3を取得
call CkRange
movlw 0xA ; A 以上はエラー
movwf cTemp_1
MOVF bRxbuf5, W ; 受信データ5を取得
call CkRange
movlw 0x6 ; 6 以上はエラー
movwf cTemp_1
MOVF bRxbuf6, W ; 受信データ6を取得
call CkRange
RETURN ; 復帰
CkRange: ; 上下限を確認し、超えていればエラービットをセット
sublw 0x2F ; L - W 下限確認 0以上でOK
BTFSC STATUS, Cflag ; 引くことができれば C set
GOTO Rerror ; エラー
addwf cTemp_1, w ; 上限確認
BTFSS STATUS, Cflag ; 引くことができれば C set
Rerror:
bsf bErr_Cmd, 0 ; エラービットをセット
return
;--------------------------------------------------
; 送信
; WREG に送信する文字の先頭番号を持ってCALL
;--------------------------------------------------
PRINT_MSG:
MOVWF cDATAptr ; 文字INDEXを 設定
P_NEXT:
MOVF cDATAptr,W ; 文字INDEXを W に取得
CALL MSG_DT ; 文字を W に取得
MOVF WREG,F ; 文字終端かテスト
BTFSC STATUS, Zflag ; 終端文字なら
RETURN ; リターン
; 送信する文字なら
CALL PUTCH ; 一文字出力
; 次の文字を準備
INCF cDATAptr,F ; 文字INDEXを +1
GOTO P_NEXT ; 次の文字へ
MSG_DT:
BRW ; ! ! \r \n ,0x00, # # \r \n ,0x00
IRP number,0x21,0x21,0x0A,0x0D,0x00,0x23,0x23,0x0A,0x0D,0x00
retlw number
ENDM
;--------------------------------------------------
; 一文字出力 WREG に送信する文字を持ってCALL
;--------------------------------------------------
PUTCH:
MOVLB 0x0 ; BANK 0 を選択 PIR1
W_TXIF:
BTFSS TXIF ; 送信終了待ち
GOTO W_TXIF
MOVLB 0x3 ; BANK 3 選択
MOVWF BANKMASK(TX1REG) ; 文字出力
RETURN
END Start