Software UART Library

mikroBasic PRO for dsPIC30/33 and PIC24 provides library which implements Software UART communication. These routines are hardware independent and can be used with any MCU. The Software UART Library provides easy communication with other devices via the RS232 protocol.

Important : The Software UART library implements time-based activities, so interrupts need to be disabled when using it.

Library Routines

Soft_UART_Init

Prototype

sub function Soft_UART_Init(dim byref port as word, dim rx, tx as word, dim baud_rate as longword, dim inverted as word)

Description

Configures and initializes the software UART module.

Software UART routines use Delay_Cyc routine. If requested baud rate is too low then calculated parameter for calling Delay_Cyc exceeds Delay_Cyc argument range.

If requested baud rate is too high then rounding error of Delay_Cyc argument corrupts Software UART timings.

Parameters
  • port: software UART port address
  • rx: receiver pin
  • tx: transmiter pin
  • baud_rate: requested baudrate. Maximum baud rate depends on the MCU’s clock and working conditions
  • inverted: if set to non-zero value, indicates inverted logic on output
Returns
  • 2 - error, requested baud rate is too low
  • 1 - error, requested baud rate is too high
  • 0 - successful initialization
Requires

Nothing.

Example

This will initialize software UART and establish the communication at 9600 bps:

' Initialize Software UART communication on pins RB1(Rx), RB2(Tx), at 9600 bps
Soft_UART_Init(PORTB, 1, 2, 9600, 0)
Notes

The Software UART library implements time-based activities, so interrupts need to be disabled when using it.

Soft_UART_Read

Prototype

sub function Soft_UART_Read(dim byref error as byte) as byte

Description

The function receives a byte via software UART.

This is a blocking function call (waits for start bit). Programmer can unblock it by calling Soft_UART_Break routine.

Parameters
  • error: Error flag. Error code is returned through this variable. Values :
  • 0 - no error
  • 1 - stop bit error
  • 255 - user abort, Soft_UART_Break called
Returns

Byte received via UART.

Requires

Software UART must be initialized before using this function. See the Soft_UART_Init routine.

Example
dim data_ as byte
    error as word
  ...
  ' wait until data is received
do
  data_ = Soft_UART_Read(error)
loop until (error = 0)

          
Notes

The Software UART library implements time-based activities, so interrupts need to be disabled when using it.

Soft_UART_Write

Prototype

sub procedure Soft_UART_Write(dim udata as byte)

Description

This routine sends one byte via the Software UART bus.

Parameters
  • udata: data to be sent.
Returns

Nothing.

Requires

Software UART must be initialized before using this function. See the Soft_UART_Init routine.

Be aware that during transmission, software UART is incapable of receiving data – data transfer protocol must be set in such a way to prevent loss of information.

Example
dim some_byte as byte
...
some_byte = $0A
' Write a byte via Soft UART
Soft_UART_Write(some_byte)
Notes

The Software UART library implements time-based activities, so interrupts need to be disabled when using it.

Soft_UART_Break

Prototype

sub procedure Soft_UART_Break()

Description

Soft_UART_Read is blocking routine and it can block the program flow. Calling Soft_UART_Break routine from the interrupt will unblock the program execution. This mechanism is similar to WDT.

Parameters

None.

Returns

Nothing.

Requires Nothing.
Example
dim data1, error, counter as byte

sub procedure Timer1Int() org IVT_ADDR_T1INTERRUPT
  counter = 0
  if (counter >= 20) then
    Soft_UART_Break()
    counter = 0              ' reset counter
  else
    Inc(counter)                  ' increment counter
  end if
  T1IF_bit = 0                 ' Clear Timer1 overflow interrupt flag
end sub

main:

  ...

  if (Soft_UART_Init(PORTF, 2, 3, 14400, 0) = 0) then
    Soft_UART_Write(0x55)
  end if
  ...

  ' try Soft_UART_Read with blocking prevention mechanism
  IPC0   = IPC0 or 0x1000       ' Interrupt priority level = 1 
  T1IE_bit = 1                 ' Enable Timer1 interrupts
  T1CON = 0x8030               ' Timer1 ON, internal clock FCY, prescaler 1:256
  data1 = Soft_UART_Read(&error)
  T1IE_bit = 0                 ' Disable Timer1 interrupts
end.
Notes

The Software UART library implements time-based activities, so interrupts need to be disabled when using it.

Library Example

This example demonstrates simple data exchange via software UART. If MCU is connected to the PC, you can test the example from the mikroBasic PRO for dsPIC30/33 and PIC24 USART communication terminal, launch it from the drop-down menu Tools › USART Terminal or simply click the USART Terminal Icon USART Terminal Icon.

program Soft_UART

dim error_ as byte
    counter, byte_read as byte             ' Auxiliary variables

main:
  ADPCFG = 0xFFFF                          ' Configure AN pins as digital I/O

  TRISB = 0x00                             ' Set PORTB as output (error signalization)
  PORTB = 0                                ' No error

  error_ = Soft_UART_Init(PORTF, 2, 3, 14400, 0) ' Initialize Soft UART at 14400 bps
  if (error_ > 0) then
    PORTB = error_                         ' Signalize Init error
    while TRUE
      nop                                  ' Stop program
    wend
  end if
  Delay_ms(100)

  for counter = "z" to "A" step-1          ' Send bytes from "z" downto "A"
    Soft_UART_Write(counter)
    Delay_ms(100)
  next counter

  while TRUE                               ' Endless loop
    byte_read = Soft_UART_Read(error_)     ' Read byte, then test error flag
    if (error_ <> 0) then                  ' If error was detected
      PORTB = error_                       '   signal it on PORTB
    else
      Soft_UART_Write(byte_read)           ' If error was not detected, return byte read
    end if
  wend
end.
Copyright (c) 2002-2012 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code