UART test program til 16F628

Funktion
Programmet sender en startmeddelelse og går så over til at returnere de tegn, som sendes via RS232 (ekkofunktion).

Hardware
Testprint K4 monteres med resetkomponenter og en IC til RS232 kommunikation. De 4 x 1 uF kondensatorer, som er forbundet til MAX232, kan reduceres til 100 nF typer, hvis MAX232A eller ST232 anvendes. De 4 pile på diagrammet viser signalernes retning. 


Testprint K4 monteret til 628uart.asm

Software i assembler
;*******************************************************************
; Function:  Sends alive message, then echoes characters at 9600 bps
; Processor: PIC16F628 at 4 MHz using internal RC oscillator
; Hardware:  Testboard K4
; Filename:  628uart.asm
; Author:    Lars Petersen, oz1bxm@pobox.com
; Website:   www.qsl.net/oz1bxm/PIC/pic.htm
; Credit:    Tony Nixon's test program at
;            www.piclist.com/techref/microchip/16f877/setup.htm
;*******************************************************************

        LIST P=16F628, R=DEC    ; Use the PIC16F628 and decimal system

        #include "P16F628.INC"  ; Include header file

        __config  _INTRC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON

        CBLOCK 0x20             ; Declare variable addresses starting at 0x20
          dataL
        ENDC

        ORG    0x000            ; Program starts at 0x000
;
; --------------------------------
; SET ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;
        movlw 7
        movwf CMCON             ; CMCON=7 set comperators off
;
; ----------------
; INITIALIZE PORTS
; ----------------
;
        movlw b'00000000'       ; set up portA
        movwf PORTA

        movlw b'00000100'       ; RB2(TX)=1 others are 0
        movwf PORTB

        bsf STATUS,RP0          ; RAM PAGE 1

        movlw 0xFF
        movwf TRISA             ; portA all pins input

        movlw b'11110010'       ; RB7-RB4 and RB1(RX)=input, others output
        movwf TRISB

; ------------------------------------
; SET BAUD RATE TO COMMUNICATE WITH PC
; ------------------------------------
; Boot Baud Rate = 9600, No Parity, 1 Stop Bit
;
        movlw 0x19              ; 0x19=9600 bps (0x0C=19200 bps)
        movwf SPBRG
        movlw b'00100100'       ; brgh = high (2)
        movwf TXSTA             ; enable Async Transmission, set brgh

        bcf STATUS,RP0          ; RAM PAGE 0

        movlw b'10010000'       ; enable Async Reception
        movwf RCSTA
;
; ------------------------------------
; PROVIDE A SETTLING TIME FOR START UP
; ------------------------------------
;
        clrf dataL
settle  decfsz dataL,F
        goto settle

        movf RCREG,W
        movf RCREG,W
        movf RCREG,W            ; flush receive buffer
;
; ---------
; MAIN LOOP
; ---------
;
        call message            ; send "16F628 alive"
loop    call receive            ; wait for a char
        call send               ; send the char
        goto loop
;
; -------------------------------------------
; RECEIVE CHARACTER FROM RS232 AND STORE IN W
; -------------------------------------------
; This routine does not return until a character is received.
;
receive btfss PIR1,RCIF         ; (5) check for received data
        goto receive

        movf RCREG,W            ; save received data in W
        return
;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; -------------------------------------------------------------
;
send    movwf TXREG             ; send data in W

TransWt bsf STATUS,RP0          ; RAM PAGE 1
WtHere  btfss TXSTA,TRMT        ; (1) transmission is complete if hi
        goto WtHere

        bcf STATUS,RP0          ; RAM PAGE 0
        return
;
; -------
; MESSAGE
; -------
;
message movlw  '1'
        call send
        movlw  '6'
        call send
        movlw  'F'
        call send
        movlw  '6'
        call send
        movlw  '2'
        call send
        movlw  '8'
        call send
        movlw  ' '
        call send
        movlw  'a'
        call send
        movlw  'l'
        call send
        movlw  'i'
        call send
        movlw  'v'
        call send
        movlw  'e'
        call send
        movlw  0x0D ; CR
        call send
        movlw  0x0A ; LF
        call send
        return

        END
Noter
Kredsen ST232 bruges til seriel kommunikation da den omsætter niveauerne i RS232 til TTL-niveauer. En MAX232 kan også bruges. Hvis man vælger en DS275 bliver opsætningen endnu simplere - der er et eksempel på denne hjemmeside: Wichit Sirichote. Terminalprogrammet (HyperTerminal) indstilles på 9600 baud med 8 databit, ingen paritet, ingen  flowcontrol og 1 stopbit.


Portindstilling i HyperTerminal


Startmeddelelsen i HyperTerminal

Det samme program skrevet i C findes her.

Download
Download 628art.zip som indeholder sourcekoden i assembler og hexfilen.

Fejlfinding
Du kan finde hjælp til fejlfinding på siden PIC16F628 UART trouble shooting (engelsk).

Tak
Jeg har lavet programmet på basis af Tony Nixon's UART test program, som kan findes her: http://www.piclist.com/techref/microchip/16f877/setup.htm.

Anvendelseseksempel
Hein Ragas viser på sin hjemmeside Buffered USART communications hvordan ovenstående testprogram kan indgå i mere avanceret software (morseblinker med 16 byte cirkulær buffer).



Denne side er skrevet 14/10-2002 af Lars Petersen, oz1bxm@pobox.com
Sidst opdateret 7/1-2007.

Tilbage til PIC eksperimenter