Software UART Library
The mikroPascal PRO for 8051 provides routines for implementing 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.
Note: The Software UART library implements time-based activities, so interrupts need to be disabled when using it.
External dependencies of Software UART Library
| The following variables must be defined in all projects using Software UART Library: | Description: | Example : |
|---|---|---|
var Soft_UART_RX: sbit; sfr; bdata; external; |
Receive line. | var Soft_UART_RX: sbit at P3_0_bit; |
var Soft_UART_TX: sbit; sfr; bdata; external; |
Transmit line. | var Soft_UART_TX: sbit at P3_1_bit; |
Library Routines
Soft_UART_Init
| Prototype |
function Soft_UART_Init(baud_rate: dword; inverted: byte): word; |
|---|---|
| Returns |
|
| Description |
Configures and initializes the software UART module. Parameters :
Software UART routines use Delay_Cyc routine. If requested baud rate is too low then calculated parameter for calling If requested baud rate is too high then rounding error of |
| Requires |
Global variables:
|
| Example |
var Soft_UART_TX: sbit at P3_1_bit; var Soft_UART_RX: sbit at P3_0_bit; var error : byte; ... // Initialize Software UART communication on pins Rx, Tx, at 9600 bps error := Soft_UART_Init(9600, 0); |
Soft_UART_Read
| Prototype |
function Soft_UART_Read(var error: byte): byte; |
|---|---|
| Returns |
Byte received via UART. |
| 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 :
|
| Requires |
Software UART must be initialized before using this function. See the Soft_UART_Init routine. |
| Example |
var data : byte;
error : byte;
...
// wait until data is received
repeat
data := Soft_UART_Read(error);
until (error=0);
// Now we can work with data:
if ( data ) then
begin
...
end
|
Soft_UART_Write
| Prototype |
procedure Soft_UART_Write(udata: byte); |
|---|---|
| Returns |
Nothing. |
| Description |
This routine sends one byte via the Software UART bus. Parameters :
|
| 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 |
var some_byte : byte; ... // Write a byte via Soft UART some_byte := 0x0A; Soft_UART_Write(some_byte); |
Soft_UART_Break
| Prototype |
procedure Soft_UART_Break(); |
|---|---|
| Returns |
Nothing. |
| Description |
Soft_UART_Read is blocking routine and it can block the program flow. Call this routine from interrupt to unblock the program execution. This mechanism is similar to WDT. Note: Interrupts should be disabled before using Software UART routines again (see note at the top of this page). |
| Requires | Nothing. |
| Example |
var data1, error, counter : byte ;
procedure Timer1InterruptHandler(); org IVT_ADDR_ET1;
begin
counter := 0;
if (counter >= 20) then
begin
Soft_UART_Break();
counter := 0; // reset counter
end
else
Inc(counter); // increment counter
end;
begin
TR1_bit := 0; // Stop Timer1
ET1_bit := 1; // Enable Timer1 interrupt
TH1 := 0x00; // Set Timer1 high byte
TL1 := 0x00; // Set Timer1 low byte
TR1_bit := 1; // Run Timer1
EA_bit := 0; // Interrupt disable
...
Soft_UART_Init(9600);
Soft_UART_Write(0x55);
...
// try Soft_UART_Read with blocking prevention mechanism
EA_bit := 1; // Interrupt enable
data1 := Soft_UART_Read(&error);
EA_bit := 0; // Interrupt disable
...
end.
|
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 mikroPascal PRO for 8051 USART Terminal Tool.
program Soft_UART;
// Soft UART connections
var Soft_Uart_RX : sbit at P3_0_bit;
var Soft_Uart_TX : sbit at P3_1_bit;
// End Soft UART connections
var i, error, byte_read : byte; // Auxiliary variables
begin
Soft_UART_Init(4800, 0); // Initialize Soft UART at 4800 bps
for i := 48 to 122 do // Send bytes from '0' downto '9'
begin
Soft_UART_Write(i);
Delay_ms(100);
end;
while TRUE do // Endless loop
begin
byte_read := Soft_UART_Read ( error ); // Read byte, then test error flag
if (error <> 0) then // If error was detected
P0 := 0xAA // signal it on PORT0
else
Soft_UART_Write(byte_read); // If error was not detected, return byte read
end;
end.
What do you think about this topic ? Send us feedback!



