The microcontroller PIC16F84A has no hardware UART module, but we can use software UART to send/receive data to/from the PC via RS232 cable (COM port). This topic shows a simple example for the use of the UART protocol with the PIC16F84A MCU.
Hardware Required:
- PIC16F84A microcontroller
- 8MHz crystal
- 2 x 22pF ceramic capacitors
- 10K ohm resistor
- MAX232 — datasheet
- 4 x 10uF polarized capacitor
- Female RS232 connector
- Breadboard
- 5V power source
- Jumper wires
UART Example for PIC16F84A microcontroller circuit:
Hi, I'm trying to apply a software UART on my ATMEGA8 by refering to ATMEL Application Note:AVR305. The example code uses assembly language. So i written it as follow in ICCAVR. The objective of all this is to get a command-line interface through an RS232 serial port on an AVR. I'm experimenting with things that resemble POTS modems in. Feb 02, 2011 //softuart.c // AVR-port of the generic software uart written in C // Generic code from // Colin Gittins, Software Engineer, Halliburton Energy Services // (has been available from iar.com web-site - application notes). Dec 29, 2008 Atmel's website offers application note AVR304 (interrupt driven software UART) and it has an included C code implementing the appnote. However, the example code does not use CodeVisionAVR, i've been trying to 'convert' it to CodeVisionAVR syntax but i found i could not continue because the header files used are not for CodeVision.
To interface the PIC16F84A MCU with the PC we need MAX232 signal level converter as shown in the circuit diagram. There are 2 lines between the PIC16F84A and the MAX232 and also two lines between the MAX232 and the female COM connector. One line for data transmit and the other one for data receive.
The female COM connector is connected to the PC using RS232 cable, this cable has to be male-female because the PC RS232 port type is male.
In this example the PIC16F84A MCU runs with 8MHz crystal oscillator.
Avr Software Uart In C Language
UART Example for PIC16F84A microcontroller C code:
The function #use rs232(xmit = PIN_B4, rcv = PIN_B5, baud = 2400) is used to configure the UART protocol. Here software UART is used.
where:
xmit is the transmit pin (RB4)
rcv is the receive pin (RB5)
2400 is the baud rate.
The functions used in the C code are:
printf: sends a string of characters over RS232 transmission pin (TX).
putc: send a character over RS232 transmission pin (TX).
getc(): read character if available.
Complete C code for CCS C compiler is below.
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 | #fuses HS, NOWDT, PUT, NOPROTECT #use fast_io(B) #use rs232(xmit = PIN_B4, rcv = PIN_B5, baud = 2400) constcharmessage[]='***** PIC16F84A microcontroller UART example *****'; voidmain(){ delay_ms(2000);// Wait 2 seconds // Print text printf('nr');// Start new line while(message[i]!='0'){// Loop until the end of the string delay_ms(100);// Wait 100 ms } printf('nr');// Start new line printf('%unr',i);// Print i and start new line } // Receive and send character via UART j=getc();// UART read character } |
I expect most AVR developers are familiar with using PWM, where the output pin is toggled at a given duty cycle, independent of the code execution. The technique behind my full-duplex UART is using the waveform generation mode so the timer/counter hardware sets the OC0A pin at the appropriate time for each bit to be transmitted. TIM0_COMPA interrupt runs after each bit is output. The ISR determines if the next bit is a 0 or a 1. For a 1 bit, TCCR0A is configured to set OC0A on compare match. For a 0 bit, TCCR0A is configured to clear OC0A on compare match. The ISR also updates OCR0A with the appropriate timer count for the next bit. To allow for simultaneous receiving, the TIM0_COMPA transmit ISR is made interruptible (the first instruction is 'sei').
The receiving is handled by PCINT0, which triggers on the received start bit, and TIM0_COMPB interrupt which runs for each received bit. I wrote this ISR in assembler in order to ensure the received bit is read at the correct time, taking into consideration interrupt latency. If any other interrupts are enabled, they must be interruptible (ISR_NOBLOCK if written in C). I've implemented a two-level receive FIFO, which can be queried with the rx_data_ready() function. A byte can be read from the FIFO with rx_read().
Avr Software Uart In China
The code is written to work with the ATtiny13, ATtiny85, and ATtiny84. Only PCINT0 is supported, which on the t84 means that the receive pin must be on PORTA. With a few modifications to the code, PCINT1 could be used for receiving on PORTB with the t84. The total time required for both the transmit and the receive ISRs is 52 cycles. Adding an average interrupt overhead of 7 cycles for each ISR means that there must be at least 66 cycles between bits. At 8Mhz this means the maximum baud rate is 8,000,000/66 = 121kbps. The lowest standard baud rate that can be used with an 8Mhz clock is 9600bps.
The wgmuart application implements an example echo program running at the default baud rate of 57.6kbps. In addition to echoing back each character received, it prints out a period '.' every second along with toggling an LED.
Avr Software Uart In C Pdf
I've published the code on github.