Serial Communication
SCI is an abbreviation for Serial Communication Interface and, as a special subsystem, it exists on most microcontrollers. When it is not available, as is the case with PIC16F84, it can be created in software.
As with hardware communication, we use standard NRZ (Non Return to Zero) format also known as 8 (9)-N-1, or 8 or 9 data bits, without parity bit and with one stop bit. Free line is defined as the status of logic one. Start of transmission - Start Bit, has the status of logic zero. The data bits follow the start bit (the first bit is the low significant bit), and after the bits we place the Stop Bit of logic one. The duration of the stop bit 'T' depends on the transmission rate and is adjusted according to the needs of the transmission. For the transmission speed of 9600 baud, T is 104 uS.
Pin designations on RS232 connector1. CD | (Carrier Detect) |
2. RXD | (Receive Data) |
3. TXD | (Transmit Data) |
4. DTR | (Data terminal Ready) |
5. GND | (Ground) |
6. DSR | (Data Set Ready) |
7. RTS | (Request To Send) |
8. CTS | (Clear To Send) |
9. RI | (Ring Indicator) |
In order to connect a microcontroller to a serial port on a PC computer, we need to adjust the level of the signals so communicating can take place. The signal level on a PC is -10V for logic zero, and +10V for logic one. Since the signal level on the microcontroller is +5V for logic one, and 0V for logic zero, we need an intermediary stage that will convert the levels. One chip specially designed for this task is MAX232. This chip receives signals from -10 to +10V and converts them into 0 and 5V.
The circuit for this interface is shown in the diagram below:
Connecting a microcontroller to a PC via a MAX232 line interface chip
File RS232.inc contains a group of macros used for serial communication.
CONSTANT LF = .10 ;Line Feed
CONSTANT CR = .13 ;Carriage Return
CONSTANT TAB = .9 ;Tabulator
CONSTANT BS = .8 ;Backspace
RS232INIT MACRO
BSF STATUS,RPO ;bank 1
BCF TXTRIS ;TX pin is output
BCF STATUS ,RPO ;bank 0
BSF TXPORT ;Initial state on TX logical "1"
SENDW ;sendw sends value of W register
MOVWF TXD ;TX Data-register
BCF TXPORT ;start bit
CALL BITDELAY
LOCAL I=0
WHILE I<8 ;8 times starting from LSB bit
BTFSC TXD,I
CALL SEND1 ;If i bit equals 1, call SEND1
BTFSS TXD,I
CALL SENDO ;If i bit equals 0, call SENDO
I=I+L
ENDW
BSF TXPORT ;stop bit
CALL BITDELAY
CALL BITDELAY ;Re-Synchronizati on
RETURN
SEND1
BSF TXPORT ;Set line to 1
CALL BITDELAY ;Delay for duration of sending 1 bit
RETURN
SENDO
BCF TXPORT ;Set line to 0
CALL BITDELAY ;Delay for duration of sending 1 bit
RETURN
BITDELAY ;104us pause necessary for sending 1 bit
MOVLW OXIE ;Total delay between 2 bits
MOVWF RS232TEMP ;9600 baud ==> 104 us
WAITLOOP
DECFSZ RS232TEMP,F
GOTO WAITLOOP
RETURN
RS232TEXT MACRO TEXT ;This macro prints the text from the
;parameter, of up to 16 characters
LOCAL MESSAGE
LOCAL START
LOCAL EXIT
LOCAL I=0
GOTO START
RUKA DT TEXT
DT .0 ;0 marks the end of the text
START
WHILE I<16 ;16 times..
MOVLW HIGH MESSAGE
MOVWF PCLATH
CALL RUKA+I ;Read and send i ASCII character
ADDLW .0
BZ EXIT ;until 0, marking the end of the text
CALL SENDW
I=I+L
ENDW ;END of the text
EXIT
ENDM
RS232BYTE MACRO ARGL
DIGBYTE ARGL
MOVF DIGL,W
ADDLW 0X30 ;Find the ASCII value of the number
CALL SENDW ;Send the hundreds digit
MOVF DIG2,W
ADDLW 0X30 ;Find the ASCII value of the number
CALL SENDW ;Send the tens digit
MOVF DIG3,W
ADDLW 0X30 ;Find the ASCII value of the number
CALL SENDW ;Send the ones digit
ENDM
Using the macro for serial communication:
rs232init | Macro for initializing the pin for transmitting data (TX-pin). |
Example: | RS232init |
Sendw | Sending ASCII value of data found in W register. |
Example: | movlw 't' |
call Sendw | |
rs232text | Sending ASCII value of a specified text |
Example: | rs232 "Romux" |
rs232byte | Sending ASCII value of decimal digits of 8-bit variable |
Example: | movlw .123 |
movwf TXdata | |
rs232byte TXdata ;Send '1', '2', '3' |
When rs232.inc file is used, it is necessary to declare variables Rstemp and TXD at the beginning of the main program.
Example:
As a demonstration of a serial communication, we have an example which sends text and the content of variable cnt. Text is sent via macro rs232text, while variable cnt is sent via macro rs232byte. This operation repeats itself after 500ms, with incrementing cnt in the process. This example can be easily modified to have button(s) for sending specified data.
User Comments
No Posts found !Login to Post a Comment.