00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <avr/io.h>
00011 #include <avr/interrupt.h>
00012 #include <stdlib.h>
00013 #include <stdarg.h>
00014 #include <stdio.h>
00015
00016
00017 #define USART_UBBR_CALC(baud) (F_CPU / ((baud << 4)) - 1u)
00018 #define USART0_BAUD_RATE (19200ul)
00019 #define USART_PRINTF_BUF_SIZE (128)
00020
00021
00022
00023
00024
00025 void USART0_init (void)
00026 {
00027
00028 UBRR0H = (uint8_t) (USART_UBBR_CALC (USART0_BAUD_RATE) >> 8u);
00029 UBRR0L = (uint8_t) USART_UBBR_CALC (USART0_BAUD_RATE);
00030
00031
00032 UCSR0C = (0 << USBS0) | (1 << UCSZ01) | (1 << UCSZ00);
00033
00034
00035 UCSR0B = (1 << RXEN0) | (1 << TXEN0);
00036 }
00037
00038
00039
00040
00041
00042
00043 unsigned char USART0_getc (void)
00044 {
00045
00046 while (!(UCSR0A & (1 << RXC0)));
00047
00048
00049 return UDR0;
00050 }
00051
00052
00053
00054
00055
00056
00057 void USART0_putc (unsigned char data)
00058 {
00059
00060 while (!(UCSR0A & (1 << UDRE0)));
00061
00062
00063 UDR0 = data;
00064 }
00065
00066
00067
00068
00069
00070
00071 void USART0_puts (const char *data)
00072 {
00073 while (*data)
00074 {
00075 USART0_putc (*data);
00076 data++;
00077 }
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 void USART0_printf (const char *fmt, ...)
00090 {
00091 static va_list valist;
00092 char buf[USART_PRINTF_BUF_SIZE];
00093
00094 va_start (valist, fmt);
00095 vsnprintf (buf, sizeof (buf), fmt, valist);
00096 va_end (valist);
00097 USART0_puts (buf);
00098 }
00099