kuroの覚え書き

96の個人的覚え書き

シリアル通信モニター



PICやPCからのシリアル通信データをLCDに表示させる簡易モニターを作りたい。PICとLCDを毎回直接接続するのではなく、LCD表示専門のPICとLCDをモジュール化しておいて、PICからシリアル通信でデータを送ってLCDに表示させるようにするとなにかと使えるのではないかということで。

16F648でシリアル通信を受信して、16文字2行のLCDパネルに表示するプログラムを考える。

1行目の先頭アドレスが80で2行目の先頭がC0なのでそのままでは1行目から2行目には繋がって表示できないし、2行目がいっぱいになっても書き換えができないのでその辺の工夫がいる。


;16F648A使用シリアル通信モニター
;1行16文字のデータを受信してLCDに表示
LIST P=PIC16F648A
INCLUDE "P16F648A.INC"
__CONFIG _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _INTOSC_OSC_NOCLKOUT & _MCLRE_OFF

CBLOCK 020H ;先頭の番地を指定
DPDT ;液晶表示データ
CNT1 ;タイマ用カウンタ
CNT2
;CNT3
;CNT4
TEMP ;TEMPOLARY WORK
LCD_POINT
ENDC ;定義終わり

ORG 0
GOTO START

ORG 4
GOTO INTRPT
INTRPT RETURN

START
CLRF PORTA

;----各種初期設定----

;----PORT init TRISA,TRISB(バンク1)
; ┌─┰─┐
;LCD(4) RA2/AN2/Vref ┥ ┝ RA1/AN1 LCD(5)
;未使用 RA3/AN3/CMP1 ┥ ┝ RA0/AN0 LCD(6)
;未使用 RA4/T0CKI/CMP2 ┥ ┝ RA7/OSC1/CLKIN 未使用
;未使用 RA5/MCLR ┥PIC16F┝ RA6/OSC0/CLKOUT 未使用
;GND Vss ┥ 648A ┝ Vdd 5.0V
;未使用 RB0/INT ┥ ┝ RB7/T1OSI/PGD LCD(14)
;Rx RB1/Rx/DT ┥ ┝ RB6/T1OSO/T1CKI/PGC LCD(13)
;(Tx) RB2/Tx/CK ┥ ┝ RB5 LCD(12)
;未使用 RB3/CCP1 ┥ ┝ RB4/PGM LCD(11)
; └───┘
BSF STATUS,RP0 ;バンク1に移動
MOVLW 02H ;00000010 ONLY RB1,3 INPUT (RXD)
MOVWF TRISB ;PORTB SET
MOVLW 018H ;00011000 ONLY RA3,4 INPUT
MOVWF TRISA ;PORTA SET

;USART INI TXSTA, SPBRG(バンク1),RCSTA(バンク0)
MOVLW 024H ;00100100 非同期モード、高速通信モード
MOVWF TXSTA ;set TX mode
;TXSTA: Transmit Status and Control Register
;bit 7 CSRC: Clock Source Select bit
; Asynchronous mode
; Don’t care
; Synchronous mode
; 1 = Master mode (Clock generated internally from BRG)
; 0 = Slave mode (Clock from external source)
;bit 6 TX9: 9-bit Transmit Enable bit
; 1 = Selects 9-bit transmission
; 0 = Selects 8-bit transmission
;bit 5 TXEN: Transmit Enable bit
; 1 = Transmit enabled
; 0 = Transmit disabled
; Note: SREN/CREN overrides TXEN in SYNC mode.
;bit 4 SYNC: USART Mode Select bit
; 1 = Synchronous mode
; 0 = Asynchronous mode
;bit 3 Unimplemented: Read as '0'
;bit 2 BRGH: High Baud Rate Select bit
; Asynchronous mode
; 1 = High speed
; 0 = Low speed
; Synchronous mode
; Unused in this mode
;bit 1 TRMT: Transmit Shift Register Status bit
; 1 = TSR empty
; 0 = TSR full
;bit 0 TX9D: 9th bit of transmit data. Can be parity bit.

MOVLW 019H ;4MHz, 9600bps, BRGH=1
MOVWF SPBRG ;ボーレートセット
;Desired Baud rate = Fosc / (64 (X + 1))
;example
; 9600 = 16000000 / (64 (X + 1))
; X = [25.042] = 25
;Calculated Baud Rate = 16000000 / (64 (25 + 1))
; = 9615
;Error = (Calculated Baud Rate - Desired Baud Rate) / Desired Baud Rate
; = (9615 - 9600) / 9600
; = 0.16%

BCF STATUS,RP0 ;バンク0に移動
MOVLW 090H ;10010000 非同期モード
MOVWF RCSTA ;set RX mode
;RCSTA: Receive Status and Control Register
;bit 7 SPEN: Serial Port Enable bit
; 1 = Serial port enabled (Configures RX/DT and TX/CK pins as serial port pins)
; 0 = Serial port disabled
;bit 6 RX9: 9-bit Receive Enable bit
; 1 = Selects 9-bit reception
; 0 = Selects 8-bit reception
;bit 5 SREN: Single Receive Enable bit
; Asynchronous mode
; Don’t care
; Synchronous mode - master
; 1 = Enables single receive
; 0 = Disables single receive
; This bit is cleared after reception is complete.
; Synchronous mode - slave
; Unused in this mode
;bit 4 CREN: Continuous Receive Enable bit
; Asynchronous mode
; 1 = Enables continuous receive
; 0 = Disables continuous receive
; Synchronous mode
; 1 = Enables continuous receive until enable bit CREN is cleared (CREN overrides SREN)
; 0 = Disables continuous receive
;bit 3 Unimplemented: Read as '0'
;bit 2 FERR: Framing Error bit
; 1 = Framing error (Can be updated by reading RCREG register and receive next valid byte)
; 0 = No framing error
;bit 1 OERR: Overrun Error bit
; 1 = Overrun error (Can be cleared by clearing bit CREN)
; 0 = No overrun error
;bit 0 RX9D: 9th bit of received data, can be parity bit.

CLRF PORTB ;ALL CLEAR

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

;----メインルーチン----
CALL LCD_INI ;RESET LCD
LCD1 MOVLW 080H ;1行目先頭に
CALL LCD_CMD ;カーソル移動
CALL RCV ;受信
MOVWF TEMP ;いったん待避
CALL LCD_CLR ;LCD全消去(新たなデータを受信したときのみ画面クリアする)
MOVF TEMP,W ;待避した受信データを持ってくる
CALL LCD_DATA ;表示
MOVLW 0FH ;2文字目からのカーソル位置カウント用(15文字分)
MOVWF LCD_POINT
LCD1LP CALL RCV
CALL LCD_DATA
DECFSZ LCD_POINT
GOTO LCD1LP
LCD2 MOVLW 0C0H ;2行目先頭に
CALL LCD_CMD ;カーソル移動
MOVLW 010H ;カーソル位置カウント用(16文字分)
MOVWF LCD_POINT
LCD2LP CALL RCV
CALL LCD_DATA
DECFSZ LCD_POINT
GOTO LCD2LP
GOTO LCD1

;