112 lines
2.1 KiB
C
112 lines
2.1 KiB
C
/*
|
|
* uart.c
|
|
*
|
|
* Asynchronous UART example tested on ATMega328P (16 MHz)
|
|
*
|
|
* Toolchain: avr-gcc (4.3.3)
|
|
* Editor: Eclipse Kepler (4)
|
|
* Usage:
|
|
* Perform all settings in uart.h and enable by calling initUART(void)
|
|
* Compile:
|
|
* make all
|
|
*
|
|
* Functions:
|
|
* - First call initUART() to set up Baud rate and frame format
|
|
* - initUART() calls macros TX_START() and RX_START() automatically
|
|
* - To enable interrupts on reception, call RX_INTEN() macros
|
|
* - Call functions getByte() and putByte(char) for character I/O
|
|
* - Call functions writeString(char*) and readString() for string I/O
|
|
*
|
|
* Created on: 21-Jan-2014
|
|
* Author: Shrikant Giridhar
|
|
*/
|
|
|
|
#include "uart.h"
|
|
|
|
// Debug Mode; comment out on Release
|
|
//#define _DEBUG 0
|
|
|
|
|
|
/*! \brief Configures baud rate (refer datasheet) */
|
|
void initUART(void)
|
|
{
|
|
// Not necessary; initialize anyway
|
|
DDRD |= _BV(PD1);
|
|
DDRD &= ~_BV(PD0);
|
|
|
|
// Set baud rate; lower byte and top nibble
|
|
UBRR0H = ((_UBRR) & 0xF00);
|
|
UBRR0L = (uint8_t) ((_UBRR) & 0xFF);
|
|
|
|
TX_START();
|
|
RX_START();
|
|
|
|
// Set frame format = 8-N-1
|
|
UCSR0C = (_DATA << UCSZ00);
|
|
|
|
}
|
|
|
|
/*! \brief Returns a byte from the serial buffer
|
|
* Use this function if the RX interrupt is not enabled.
|
|
* Returns 0 on empty buffer
|
|
*/
|
|
uint8_t getByte(void)
|
|
{
|
|
// Check to see if something was received
|
|
while (!(UCSR0A & _BV(RXC0)));
|
|
return (uint8_t) UDR0;
|
|
}
|
|
|
|
|
|
/*! \brief Transmits a byte
|
|
* Use this function if the TX interrupt is not enabled.
|
|
* Blocks the serial port while TX completes
|
|
*/
|
|
void putByte(unsigned char data)
|
|
{
|
|
// Stay here until data buffer is empty
|
|
while (!(UCSR0A & _BV(UDRE0)));
|
|
UDR0 = (unsigned char) data;
|
|
|
|
}
|
|
|
|
/*! \brief Writes an ASCII string to the TX buffer */
|
|
void writeString(const char *str)
|
|
{
|
|
while (*str != '\0')
|
|
{
|
|
putByte(*str);
|
|
++str;
|
|
}
|
|
}
|
|
|
|
const char* readString(void)
|
|
{
|
|
static char rxstr[RX_BUFF];
|
|
static char* temp;
|
|
temp = rxstr;
|
|
|
|
while((*temp = getByte()) != '\n')
|
|
{
|
|
++temp;
|
|
}
|
|
|
|
return rxstr;
|
|
}
|
|
|
|
#if _DEBUG
|
|
|
|
int main(void)
|
|
{
|
|
initUART();
|
|
while(1)
|
|
{
|
|
writeString(readString());
|
|
putByte('\r');
|
|
putByte('\n');
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#endif
|