Software UART Library
The mikroC PRO for PIC32 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.
Important : The Software UART library implements time-based activities, so interrupts need to be disabled when using it. |
Library Routines
Soft_UART_Init
Prototype |
char Soft_UART_Init(unsigned long *port, unsigned long rx, unsigned long tx, unsigned long baud_rate, unsigned int inverted); |
---|---|
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 If requested baud rate is too high then rounding error of |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
This will initialize software UART and establish the communication at 9600 bps: char error; ... error = Soft_UART_Init(&PORTF, 4, 5, 14400, 0); // Initialize Soft UART at 14400 bps |
Notes |
The Software UART library implements time-based activities, so interrupts need to be disabled when using it. |
Soft_UART_Read
Prototype |
char Soft_UART_Read(char *error); |
---|---|
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 |
|
Returns |
Byte received via UART. |
Requires |
Software UART must be initialized before using this function. See the Soft_UART_Init routine. |
Example |
char data_; char error; ... // wait until data is received do data = Soft_UART_Read(&error); while (error); // Now we can work with data: if (data_) {...} |
Notes |
The Software UART library implements time-based activities, so interrupts need to be disabled when using it. |
Soft_UART_Write
Prototype |
void Soft_UART_Write(char udata); |
---|---|
Description |
This routine sends one byte via the Software UART bus. |
Parameters |
|
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 |
char some_byte = 0x0A; ... // 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 |
void Soft_UART_Break(); |
---|---|
Description |
Soft_UART_Read is blocking routine and it can block the program flow. Calling |
Parameters |
None. |
Returns |
Nothing. |
Requires | Nothing. |
Example |
char data1, error, counter = 0; void Timer1Int() org IVT_ADDR_T1INTERRUPT { if (counter >= 20) { Soft_UART_Break(); counter = 0; // reset counter } else counter++; // increment counter T1IF_bit = 0; // Clear Timer1 overflow interrupt flag } void main() { ... if (Soft_UART_Init(&PORTF, 4, 5, 14400, 0) = 0) Soft_UART_Write(0x55); ... // try Soft_UART_Read with blocking prevention mechanism IPC0 = IPC0 | 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 } |
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 mikroC PRO for PIC32 USART communication terminal, launch it from the drop-down menu Tools › USART Terminal or simply click the USART Terminal Icon .
void Tone1() {
Sound_Play(659, 250); // Frequency = 659Hz, duration = 250ms
}
void Tone2() {
Sound_Play(698, 250); // Frequency = 698Hz, duration = 250ms
}
void Tone3() {
Sound_Play(784, 250); // Frequency = 784Hz, duration = 250ms
}
void Melody() { // Plays the melody "Yellow house"
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3();
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3();
Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
}
void ToneA() {
Sound_Play( 880, 50);
}
void ToneC() {
Sound_Play(1046, 50);
}
void ToneE() {
Sound_Play(1318, 50);
}
void Melody2() {
unsigned short i;
for (i = 9; i > 0; i--) {
ToneA(); ToneC(); ToneE();
}
}
void main() {
CHECON = 0x32;
AD1PCFG = 0xFFFF; // Configure AN pins as digital
TRISB = 0xF8; // Configure RB7..RB3 as input
LATB = 0;
Sound_Init(&PORTD, 3);
Sound_Play(880, 1000); // Play sound at 880Hz for 1 second
while (1) {
if (Button(&PORTB,7,1,1)) // RB7 plays Tone1
Tone1();
while (RB7_bit); // Wait for button to be released
if (Button(&PORTB,6,1,1)) // RB6 plays Tone2
Tone2();
while (RB6_bit); // Wait for button to be released
if (Button(&PORTB,5,1,1)) // RB5 plays Tone3
Tone3();
while (RB5_bit); // Wait for button to be released
if (Button(&PORTB,4,1,1)) // RB4 plays Melody2
Melody2();
while (RB4_bit); // Wait for button to be released
if (Button(&PORTB,3,1,1)) // RB3 plays Melody
Melody();
while (RB4_bit); // Wait for button to be released
}
}
What do you think about this topic ? Send us feedback!