;********************************************* ; ; USART test program using USART module. ; Test condition is below ; Mode : Asyncronous transfer mode only ; Speed: 1200,2400,9600,19K bps switchable ; Bit : startx1 datax8 stopx1 ; Not use interrupt ; ;********************************************* ; LIST P=PIC16C73A INCLUDE "P16C73A.INC" ;*********************************** ; Define Variables ; Register is from 20H to 7FH ;*********************************** TEMP EQU 020H ;work area POINT EQU 021H ;pointer of table ;*********************************** ; Receive Buffer ; Bank1 20 to 7F = 96bytes ;*********************************** BUFFER EQU 020H ;buffer ORG 0 ;*********************************** ; Initialize ; Baud rate setting is below ; Clock 10MHz 20MHz ; Baud SPBRG SPBRG ; 1200 81H FFH ; 2400 40H 81H ; 9600 0FH 20H ; 19K 07H 0FH ;*********************************** INIT BSF STATUS,RP0 ;Set Bank 1 MOVLW 081H ;set portc MOVWF TRISC ;PORTC ; MOVLW 020H ;Set Async mode MOVWF TXSTA ;Set TX mode MOVLW 07H ;Set Baud Rate 19Kbps MOVWF SPBRG ;Set BRG BCF STATUS,RP0 ;Set Bank 0 MOVLW 090H ;Set Async mode MOVWF RCSTA ;Set RX mode ;*********************************** ; Main routine ; Test is below ; Receive Command data ; Proceed Command ; Transmit answer by Command ;*********************************** MAIN ;****** Wait Receive data ****** MOVLW 0A0H ;set buffer top address MOVWF FSR ;to indirect pointer LPRCV BCF PORTC,5 ;LED on ; BTFSS PIR1,RCIF ;check receive end flag GOTO LPRCV ; BSF PORTC,5 ;LED off ;**** error check **** BTFSC RCSTA,FERR ;framing error check GOTO FRAME BTFSC RCSTA,OERR ;overrun error GOTO OVER ;***** get data and save ***** MOVF RCREG,W ;get received data MOVWF INDF ;save in buffer SUBLW 0DH ;CR code? BTFSC STATUS,Z ;data=CR? GOTO SEND ;to transfer ;**** if buffer full then end ***** CHKBF INCF FSR,F ;pointer+1 BTFSS STATUS,Z ;buffer full? GOTO LPRCV GOTO SEND ;full then end ;******** ERROR PROCES ****** ;**** framing error FRAME MOVF RCREG,W ;dumy input & reset FERR MOVLW '?' MOVWF INDF ;save ? BTFSS RCSTA,OERR ;check more error? GOTO CHKBF ;to next ;***** overrun error OVER BCF RCSTA,CREN ;reset OERR BSF RCSTA,CREN MOVLW '?' MOVWF INDF ;save ? GOTO CHKBF ;to next ;************************* ;****** Send answer ****** SEND MOVLW 0A0H ;reset pointer MOVWF FSR LPSD BCF PORTC,5 ;LED on MOVF INDF,W ;get data CALL TX ;send execute BSF PORTC,5 ;LED off MOVF INDF,W ;re-get data SUBLW 0DH ;CR? BTFSC STATUS,Z ;end check GOTO TEXT ;end text send ;**** if buffer end then end ***** INCF FSR,F ;pointer+1 BTFSS STATUS,Z ;buffer end? GOTO LPSD ;loop GOTO TEXT ;end ;************ text send process ***** TEXT CLRF POINT ;reset table pointer LPTEX MOVF POINT,W ;get pointer offset ANDLW 0FH ;limit upper CALL TABLE ;get text data ADDLW 0 ;test zero? BTFSC STATUS,Z ;end zero? GOTO MAIN CALL TX ;send INCF POINT,F ;pointer+1 GOTO LPTEX ;***** text data table ***** TABLE ADDWF PCL,F ;PC+offset DT "End of TX",0,0,0,0,0,0,0,0 ;********************************** ; Transmit subroutine ; Data is setted in buffer. ;********************************** TX MOVWF TEMP ;data save BSF STATUS,RP0 ;switch to Bank1 LPTX BTFSS TXSTA,TRMT ;ready check GOTO LPTX ; BCF STATUS,RP0 ;return to Bank0 MOVF TEMP,W ;get data MOVWF TXREG ;start send RETURN END