ATMega8A пытаюсь использовать UART, но он не работает

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 14
Зарегистрирован: Сб мар 23, 2019 08:28:43

Сообщение Wireless »

Здравствуйте.

Мне нужно использовать 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_ */
com_io.c

Код: Выделить всё

/** \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;
}
main.c

Код: Выделить всё

#include "com_io.h"

int main(void){
   printf("\nHello, world!");
}
После сборки, получил
main.hex
(4.26 КБ) 433 скачивания
загрузил в ATMega8A

Если что, вот 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() ); }
}
Собрал схему, открыл Монитор порта в Arduino IDE, но туда ничего не приходит. Пытался менять и скорость, и определение новой строки.
Изображение


Я уже и другие ATMega8A использовал, так же проверял порты PD0 и PD1 у ATMega8A, настроив их на вывод, и устанавливал у них то высокий, то низкий уровень, подключив к ним, через резисторы, светодиоды. Так же подключал напрямую модуль к 2-му и 3-му пинам Arduino Uno, и работал с ним через SoftwareSerial.

Почему тогда UART не работает в самом ATMega8A, в чём может быть причина?
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1407
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Проверьте сначала эхо по очереди на той и другой стороне, замкнув RX с TX.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

У вас этот код не должен был собраться по причине
while(bit_is_clear(UCSR0A, UDRE0))
Родился
Аватара пользователя
Сообщения: 14
Зарегистрирован: Сб мар 23, 2019 08:28:43

Сообщение Wireless »

OKF то есть вот так соединить?

Изображение

Dimon456 да, меня то что он собрался, навело меня на мысль, что com_io.c не используется

После того как в main.c дописал
#include "com_io.c"

ошибка появилась, однако даже исправив на
while(bit_is_clear(UCSRA, UDRE))

и пересобрав проект и загрузив новый main.hex, всё равно в Монитор порта ничего не приходит.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Wireless писал(а):После того как в main.c дописал
#include "com_io.c"
это свидетельствует о том, что вы не умеете создавать многофайловые проекты. в какой IDE работаете?

что касается неработоспосбности вашего варианта кода, то вам уже указывали на неоднозначность проверки. избавьтесь от слабого места - вашего "проекта на ардуино", или докажите, что он безгрешен. я не уверен, что вы все сделали правильно. соберите хотя бы простейший преборазователь TTL-RS232, раз готового переходника у вас нет, и проверяйте в обычном терминале.
Изображение
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Аватара пользователя
Сообщения: 14
Зарегистрирован: Сб мар 23, 2019 08:28:43

Сообщение Wireless »

ARV собираю на avr-gcc (WinAVR 20100110) 4.3.3

Вот последний hex с исправлением
main.hex
(4.74 КБ) 477 скачиваний
У меня большая просьба, может кто-нибудь загрузить мой hex в свою ATmega8 для проверки работоспособности в терминале, или

вот весь проект
USART_t.zip
(8.16 КБ) 219 скачиваний
включая Makefile, можно собрать свой hex

ARV RS232 у меня нет, нужно собирать USB RS232

Я вот думаю, если я в Вашем примере включу ввод, и PD1 замкну на PD0, добавив условие, что если есть что-то на входе установить PC0 в высокий уровень, а к нему светодиод для проверки. Так же можно что-то проверить? Пока складывается ощущение что ничего не идет с PD1, типа UART не отправляет туда данные.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я могу сделать наоборот: собрать простейший хелловорд и дать вам хекс - тогда вы сможете точно знать, что прошивка МК у вас рабочая, и плясать от этого

Добавлено after 1 minute 25 seconds:
Wireless писал(а):нужно собирать USB RS232
не нужно, нужно его купить: у китайцев меньше 70 рублей за штучку.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Аватара пользователя
Сообщения: 14
Зарегистрирован: Сб мар 23, 2019 08:28:43

Сообщение Wireless »

Re: у китайцев меньше 70 рублей за штучку.

ARV, жду его по почте.

Если Вы сможете дать hex, попробую его загрузить.

Добавлено after 1 minute 41 second:
А без кварцевого резонатора UART что-то же должен отправлять? Имеется ввиду на внутреннем если собираю.
Последний раз редактировалось Wireless Вт апр 09, 2019 15:44:14, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

да и покупать не нужно, в ардуине он есть, должен на ноги 0 и 1 выходить... (точно ноги не помню - они должны быть подключены и к меге и к маленькой микре, что у юсб разъёма, соббсна она и есть этот преобразователь) ресет ардуины замкнуть на минус, чтобы не мешала.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Родился
Аватара пользователя
Сообщения: 14
Зарегистрирован: Сб мар 23, 2019 08:28:43

Сообщение Wireless »

Ivanoff-iv, так а можно же через SoftwareSerial тогда RESET и замыкать не надо?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

в смысле скетч такой залить? так ты это делал...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Родился
Аватара пользователя
Сообщения: 14
Зарегистрирован: Сб мар 23, 2019 08:28:43

Сообщение Wireless »

Ivanoff-iv, я через вот такой проверял:

Код: Выделить всё

#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() ); }
}
В монитор порта Arduino IDE ни один Hello, world! не пришёл.
Последний раз редактировалось Wireless Вт апр 09, 2019 15:53:03, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

порядок действий такой:
замкнуть ресет арду. на минус, замкнуть между собой входы 0 и 1 и проверить в терминале наличие эха.

Добавлено after 56 seconds:
если будет - пол дела сделано, работающий преобразовктель имеем.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Родился
Аватара пользователя
Сообщения: 14
Зарегистрирован: Сб мар 23, 2019 08:28:43

Сообщение Wireless »

Ivanoff-iv, между 0 и 1 выводами резистор нужен для защиты?
OKF
Это не хвост, это антенна
Сообщения: 1407
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="Wireless",url="/forum/viewtopic.php?p=3611823#p3611823"]OKF то есть вот так соединить?[/uquote]
) Ну, не должны вы так ТУПО тыкаться, как вам говорят. Хоть немного ведь нужно же представлять что и как работает! Иначе, вы будете на уровне обезьяны. Извините.
UART ведь это простейший интерфейс. Прочтите и разберитесь что он из себя представляет и как он работает. Ну это ведь как 2х2. И тогда всё станет ясно. И себя вы человеком будете считать.)
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

думаю, что иногда стоит и в режиме обезьяны поработать, чтобы начать... (сам вон за СТМки взяться не могу, нырну с головой, вырырну и отложу на потом... а по шагам может быть и осилил бы)
резистор не обязательно, ну воткни для перестраховки на 100-300 Ом...

Добавлено after 1 minute 9 seconds:
килоомник при попытке передавать на хорошей скорости может стать непреодолимым препятствием.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Вот это для примера пусть зальет в ардуино
Спойлер

Код: Выделить всё

int incomingByte = 0;   // для хранения полученного байта
 
void setup() {
    Serial.begin(9600); // устанавливаем последовательное соединение
    Serial.println("Hello, world!");
}
 
void loop() {
    if (Serial.available() > 0) {  //если есть доступные данные
        // считываем байт
        incomingByte = Serial.read();
 
        // отсылаем то, что получили
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
    }
}
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

во-первых, лучше всего тестировать сомнительные вещи в протеусе - ничего покупать не надо и реальный COM-порт не требуется.
во-вторых, прилагаю архив с HEX-ами - проверено протеусом :)
в-третьих, от встроенного RC-генератора на скорости 38400 я бы не рекомендовал работать, поэтому на всякий случай в архиве есть второй HEX на 9600

собрано из ваших (то есть моих) исходников без правки.

отпишитесь о результатах :)
Вложения
Debug.zip
(4.33 КБ) 219 скачиваний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1407
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="ARV",url="/forum/viewtopic.php?p=3612170#p3612170"]в-третьих, от встроенного RC-генератора на скорости 38400 я бы не рекомендовал работать...[/uquote]
Особенно при заводских 1-мгц фьюзах.)
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

в-третьих, от встроенного RC-генератора на скорости 38400 я бы не рекомендовал работать,

У мню работает прекрасно 38400@8MHz RC внутренний.
Я всё-всё узнAю и стану профессором.
Ответить

Вернуться в «AVR»