Pic tutorial :: Serial communication

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 connector

 
1. 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.

/*  SOURCE : WWW.ROMUX.COM
    AUTHOR : romux team     */ 
    
    

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.

 







anonymous   said:
5 years ago

Very useful explanation, thanks

Points :   0




Post Your Comments Here :
 


User Login

Username :


Password :