/** \file com_io.c
 * \brief Библиотека ввода-вывода для USART
 * \par
 * Реализует "интерфейс по умолчанию" для функций printf() и т.п.
 * По умлочанию устанавливаетя скорость, задаваемая макросом #BAUD, и модуль USART1 (если их 2)
 * \par
 * \author ARV
 * \note
 * \n Схема:
 * \n \date	05.02.2009 ... 	__.__.2008
 * \par
 * \version 1.0 beta	\n
 * Copyright 2008 © ARV. All rights reserved. </b>
 * \par
 * Для компиляции требуется:\n
 * 	-# WinAVR-20080411 или более новая версия
 *
 */
#include <avr/io.h>
#include "com_io.h"

/// Выводит символ
static int uart_putchar(char c, FILE *stream);

/// Структура устройства ввода-вывода
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);

/** Вывод одного символа с переводом строки при необходимости (локальная функция)
 *
 * @param c выводимый символ
 * @param stream поток для вывода
 * @return всегда возвращает 0
 */
static int uart_putchar(char c, FILE *stream){
  if (c == '\n')
	uart_putchar('\r', stream);
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR = c;
  return 0;
}

/** Автоматическая инициализация модуля.
 *
 */
static void __attribute__((naked, section(".init7"))) init_io(void){
	/// Вызывать из основного модуля эту функцию не нужно.
	stdout = &mystdout;
#include <util/setbaud.h>
   UBRRH = UBRRH_VALUE;
   UBRRL = UBRRL_VALUE;
#if USE_2X
   UCSRA |= (1 << U2X);
#else
   UCSRA &= ~(1 << U2X);
#endif
}




