Мне нужно использовать UART для соединения ATMega8A с модулем. ARV написал пример, я его добавил в проект, но у меня он не работает.
com_io.h
Код: Выделить всё
/** \file com_io.h
* \brief Заголовочный файл библиотеки ввода-вывода для USART
*
* \author ARV
* \date 05.02.2009
* \version 1.0 beta
* \copyright 2008 © ARV
* Для компиляции требуется:\n
* -# WinAVR-20080411 или более новая версия
*
*/
#ifndef COM_IO_H_
#define COM_IO_H_
#include <stdio.h>
/// Если не используется WDT, эту опцию установить в ноль
#define USE_WDT 0
/// Если ввод не требуется, эту опцию надо установить в единичку
#define ONLY_OUT 1
/// Скорость обмена по USART
#define BAUD 38400UL
#endif /* COM_IO_H_ */Код: Выделить всё
/** \file com_io.c
* \brief Библиотека ввода-вывода для USART
*
* Реализует "интерфейс по умолчанию" для функций printf() и т.п.
* По умлочанию устанавливаетя скорость, задаваемая макросом #BAUD
* \author ARV
* \date 05.02.2009 ...
* \version 1.0 beta
* \copyright 2008 © ARV
* Для компиляции требуется:\n
* -# WinAVR-20080411 или более новая версия
*
*/
#include <avr/io.h>
#include <avr/wdt.h>
#include "com_io.h"
#include <stdio.h>
/// Выводит символ
static int uart_putchar(char c, FILE *stream);
#if ONLY_OUT == 0
static int uart_getchar(FILE *stream);
#endif
/// Структура устройства ввода-вывода
#if ONLY_OUT != 0
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
#else
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
#endif
/** Вывод одного символа с переводом строки при необходимости (локальная функция)
*
* @param c выводимый символ
* @param stream поток для вывода
* @return всегда возвращает 0
*/
static int uart_putchar(char c, FILE *stream){
if (c == '\n')
uart_putchar('\r', stream);
while(bit_is_clear(UCSR0A, UDRE0))
#if USE_WDT != 0
wdt_reset();
#endif
;
UDR = c;
return 0;
}
#if ONLY_OUT == 0
static int uart_getchar(FILE *stream){
while(bit_is_clear(UCSRA, RXC))
#if USE_WDT != 0
wdt_reset();
#endif
;
return UDR;
}
#endif
/** Автоматическая инициализация модуля.
* Вызывать из основного модуля эту функцию не нужно.
*/
/// Функция настройки параметров USART и инициализации ввода-вывода.
static void __attribute__((naked, used, section(".init7"))) stdio_init(void){
UCSRA = 0;
#include <util/setbaud.h>
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
UCSRB |= _BV(TXEN);
#if ONLY_OUT == 0
UCSRB |= _BV(RXEN);
#endif
UCSRC = 0x86;
stdout = &mystdout;
stdin = stdout;
}Код: Выделить всё
#include "com_io.h"
int main(void){
printf("\nHello, world!");
}Если что, вот Fuses ATMega8A

Так как у меня нет преобразователя USB-UART, но есть Arduino Uno я использовал такой
Arduino Sketch
Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial PhysicalSerial(2, 3); // RX | TX
void setup()
{
// communication with the host computer
Serial.begin(9600);
// Start the software serial for communication with the ATMega8A
PhysicalSerial.begin(38400);
}
void loop()
{
// listen for communication from the ATMega8A and then write it to the serial monitor
if ( PhysicalSerial.available() ) { Serial.write( PhysicalSerial.read() ); }
// listen for user input and send it to the ATMega8A
if ( Serial.available() ) { PhysicalSerial.write( Serial.read() ); }
}
Я уже и другие ATMega8A использовал, так же проверял порты PD0 и PD1 у ATMega8A, настроив их на вывод, и устанавливал у них то высокий, то низкий уровень, подключив к ним, через резисторы, светодиоды. Так же подключал напрямую модуль к 2-му и 3-му пинам Arduino Uno, и работал с ним через SoftwareSerial.
Почему тогда UART не работает в самом ATMega8A, в чём может быть причина?




