TOP > PIC > 同期通信

 ノリタケ伊勢電子のSCK25616L-Aに16F877AアセンブラでUSART同期通信でデータ転送について試してみました。
 16F877Aの同期通信についてサイトを探し回ったが見つけることができなかったのとPICアセンブラも初めてなのでけっこうはまってしまいました。

;=========================================================
;       SCK25616L-Aのテストプログラム
;       同期通信モードでデータ転送のテスト
;       2008/5/11
;=========================================================
        list            p=16F877A       ; list directive to define processor
        #include        <p16F877A.inc>  ; processor specific variable definitions

        __CONFIG    _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

cnt     EQU     0x20
EN      equ     4
LAT     equ     5
;**********************************************************************
        ORG     0x000             ; processor reset vector
        goto    main              ; go to beginning of program

main
;=========================================================
;       初期化部
;=========================================================
;       変数の初期化
        clrf    cnt             ;cntクリア

        bsf     STATUS, RP0     ;バンク1にする
;=============================================================
;       TRISレジスタの設定
;       RC3,RC4,RC5を出力に設定
;=============================================================
        bcf     TRISC, 3
        bcf     TRISC, 4
        bcf     TRISC, 5
;=============================================================
;       USART初期化
;=============================================================
        movlw   0x04            ;同期モード500kbps
        movwf   SPBRG
        bsf     TXSTA, CSRC     ;マスターモード
        bsf     TXSTA, SYNC     ;同期モード
        bcf     STATUS, RP0     ;バンク0にする
        bsf     RCSTA, SPEN     ;シリアルポートイネーブル
        bsf     STATUS, RP0     ;バンク1にする
        bsf     TXSTA, TXEN
        bcf     STATUS, RP0     ;バンク0にする
        bsf     PORTC, 3        ;LED ON
;=============================================================
;       VFDへデータ転送
;       転送されたデータはVFDの下からbit7〜0の順番で表示される
;=============================================================
loop1
        movlw   B'00001111'     ;転送データ下半分
        call    txreg_write
        movlw   B'00000000'     ;転送データ上半分
        call    txreg_write
        decfsz  cnt, f
        goto    loop1
	btfss	PIR1, TXIF
	goto	$-1
	bsf	STATUS, RP0	;バンク1セレクト
	btfss	TXSTA, TRMT	;TRMTが空のチェックを行わないと
	goto	$-1		;データが欠落する
        bsf     PORTC, LAT      ;ラッチパルス送出
        bcf     PORTC, LAT
        bsf     PORTC, EN       ;表示イネーブル
        bcf     PORTC, 3        ;LED OFF
        goto    $
;===================================================================
;       サブルーチン名	txreg_write
;       機能          	wレジスタの値をTXIFがセットされるのを待ってTXREGに書き込む
;       2008.05.11
;       TXREGにデータ書き込み後、TXIFに反映されるまでには1サイクル必要
;===================================================================
txreg_write
        btfss   PIR1, TXIF
        goto    txreg_write
        movwf   TXREG
        return
        end

RC3に接続されているLEDは試験用に取り付けたものなので、意味はありません。