Hardware
The testboard K4 is
set up with reset circuit and a MAX232 for RS232 communication. The 4 capacitors connected to MAX232 are 1 uF
types; if you use MAX232A or ST232, they can be 100 nF values. The 4 arrows in the circuit diagram indicate signal direction.
Testboard K4 configured for 628uart.asm
Software in 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
Remarks
The ST232 is used for RS232 communication.
An MAX232 can also be used. A simpler circuit can be set up using DS275,
see the homepage of Wichit
Sirichote from Thailand.
A terminal program (HyperTerminal)
is set up for 9600 baud with 8 data bits, no parity, no flowcontrol and
1 stop bit.
Port settings in HyperTerminal
The alive message displayed in HyperTerminal
The same program written in C is here.
Download
Download 628art.zip
containing the source code in assembler and the hexfile.
Trouble shooting
You might find this trouble shooting
page useful: PIC16F628 UART trouble shooting
Credit
Tony Nixon's UART test program at
http://www.piclist.com/techref/microchip/16f877/setup.htm
was my source for the above program. Thanks!