Сотая тема об Atmega и UART

Обсуждаем контроллеры компании Atmel.
germess2006
Родился
Сообщения: 10
Зарегистрирован: Чт ноя 03, 2016 17:07:48

Сотая тема об Atmega и UART

Сообщение germess2006 »

Привет уважаемые Коты, у меня проблема с uart. Подключил Атмега8 через uart к ноутбуку, в терминале отправляю поочерёдно 1 2 3 4 5, а в ответ получаю в том же терминале L f & s M. Пробовал 3 терминала, во всех одинаково.
Схема подключения стандартная, как во многих примерах, Атмега8 с кварцевым резонатором на 8 МГц, 2 конденсатора на 22 пФ, питание от USB ноутбука, 1 кОм резистор между RESET и +5 В, Rx Tx подключил к Tx Rx переходника (кабель USB - COM), кабель в ноутбук, дрова стоят.
Кабель проверял, Tx Rx замыкал, всё отправленное возвращается в точности.
Первый контроллер был SMD, выпаял запаял аналогичный, опять то же, потом собрал ту же схему на DIP - опять то же.

Минус виртуального ком порта и схемы пробовал соединять, ничего не меняется (они все равно в USB одного и того же ноутбука вставляются), внутрисхемный программатор отцеплял.

Фьюзы уже по всякому перепробовал от отчаяния. В код вижене стоит правильная частота, в коде правильная, фьюзы вроде правильные, но не помогает.

Пробовал и на внутренней частоте 4 и 8, и с разными кварцами 4, 8, и с идеальными частотами которые без помех, всё одно, выводит совсем не то что посылаю, а если подаю питание контроллера не от ноута а от от телефонной зарядки 5 В на 2,1 А, то идуд непрерывно кракозябли в терминал, пока общий минус не соединён у источника питания и USB-COM кабеля.

Разные программы уже перепробовал, и просто UDR = '1' и ="1" ни что не помогает, менял местами Rx Tx.

Пробовал в протеусе, там и фьюзы нормально и программа нормально идёт, там всё работает без проблем, но вот в реальности ерунда выходит. Купил для сравнения Ардуино УНО, там сразу эта программа с тем же кабелем USB-COM в терминале всё возвращает, светодиодиком пробовал мигать по входящим данным 1 и 0 итд уже 4 дня гуглю везде сравниваю, у всех проблемма обычно с частотой подключения или контроллера, вроде всё перепроверил. Пытаюсь на 9600 подключаться но в общем весь диапазон перебрал на всякий случай, но 9600 явно адекватнее идёт, с неё и расчёт в программе.

ПОМОГИТЕ пожалуйста кто сможет допереть что не так кроме кривых рук!

Вот код:

#include <mega8.h>
#include <io.h>
#include <delay.h>
#include <stdio.h>

#define F_CPU 8000000 // Рабочая частота контроллера
#define BAUD 9600 // Скорость обмена данными
#define UBRRL_value (F_CPU/(BAUD*16))-1

int init_UART(void) // Инициализация
{
UBRRL = UBRRL_value; //Младшие 8 бит UBRRL_value
UBRRH = UBRRL_value >> 8; //Старшие 8 бит UBRRL_value

UCSRA=0b00000000;
UCSRB=0b00011000;
UCSRC=0b10000110;
}

void send_Uart(unsigned char c) // Отправка байта
{
while(!(UCSRA&(1<<UDRE))) // Устанавливается, когда регистр свободен
{}
UDR = c;
}

void send_Uart_str(unsigned char *s)// Отправка строки
{
while (*s != 0) send_Uart(*s++);
}

void send_int_Uart(unsigned int c)// Отправка числа от 0000 до 9999
{
unsigned char temp;
c=c%10000;
temp=c/100;
send_Uart(temp/10+'0');
send_Uart(temp%10+'0');
temp=c%100;;
send_Uart(temp/10+'0');
send_Uart(temp%10+'0');
}

unsigned char getch_Uart(void)// Получение байта
{
while(!(UCSRA&(1<<RXC))) // Устанавливается, когда регистр свободен
{}
return UDR;
}

void main(void)
{
char data;
PORTB=0x00;
DDRB=0x01;
init_UART(); // инициализация UART
delay_ms(1000); // задержка 1c
send_Uart_str("abc-defg");// отправка строки
send_Uart(13); // перенос строки
send_int_Uart(2013); // отправка числа
send_Uart(13); // перенос строки

while(1)
{

if(UCSRA&(1<<RXC)) // если пришёл байт по UART
{
send_Uart(getch_Uart());

PORTB = 0b00000001;
delay_ms(50);

PORTB = 0b00000000;
}

}
}
Вложения
3.jpg
(184.84 КБ) 478 скачиваний
2.jpg
Фьюзы на встроеный, 8 МГц
(162.03 КБ) 531 скачивание
1.jpg
Фьюзы на кварц 8 МГц
(155.12 КБ) 310 скачиваний
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Сотая тема об Atmega и UART

Сообщение Аlex »

А вот это вот :

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

send_Uart_str("abc-defg");// отправка строки
send_Uart(13); // перенос строки
send_int_Uart(2013); // отправка числа
send_Uart(13); // перенос строки
нормально приходит ?
менял местами Rx Tx
А это вот зря делали :?
Реклама
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Сотая тема об Atmega и UART

Сообщение Vov123 »

Есть техническая сторона проблемы, не знаю с чем связана, но многие ноутбуки не правильно работают с преобразователями USB - RS232, даже на FT232.
Использовал различные драйвера и сертифицированное программное обеспечение для частотных преобразователей и промышленных контроллеров, но мой нетбук DNS не видел этих устройств, а снифер показывал о передачи какой-то лажи.
Короче выбросить этот нетбук хотел.
По оконцовке напоследок поставил на него SSD-диск. Мало того, что загружаться стал влёт, так и все мои программы заработали корректно.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Сотая тема об Atmega и UART

Сообщение Mishany »

Кроме скорости есть еще куча настроек в терминале....бит четности, стоп бит......
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Сотая тема об Atmega и UART

Сообщение akl »

germess2006
По мне, у Вас стоят неправильно стоят FUSE-биты
RC-генератор сейчас работает на частоте 2МГц
RC_8MHz_mega8.PNG
(8.96 КБ) 455 скачиваний
Для кварца >1МГц
Q8MHz_mega8.PNG
(5.96 КБ) 471 скачивание
Последний раз редактировалось akl Сб ноя 05, 2016 01:45:08, всего редактировалось 2 раза.
Реклама
germess2006
Родился
Сообщения: 10
Зарегистрирован: Чт ноя 03, 2016 17:07:48

Re: Сотая тема об Atmega и UART

Сообщение germess2006 »

Аlex писал(а):А вот это вот :

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

send_Uart_str("abc-defg");// отправка строки
send_Uart(13); // перенос строки
send_int_Uart(2013); // отправка числа
send_Uart(13); // перенос строки
нормально приходит ?
менял местами Rx Tx
А это вот зря делали :?

Нет, указанный код приходит при включении контроллера в виде кракозяблей различных, но в протеусе приходит нормально.

На последнем контроллере, который сейчас стоит, не менял Rx Tx местами. А вообще, на что это может повлиять? можно убить UART ?

Добавлено after 5 minutes 2 seconds:
Vov123 писал(а):Есть техническая сторона проблемы, не знаю с чем связана, но многие ноутбуки не правильно работают с преобразователями USB - RS232, даже на FT232.
Использовал различные драйвера и сертифицированное программное обеспечение для частотных преобразователей и промышленных контроллеров, но мой нетбук DNS не видел этих устройств, а снифер показывал о передачи какой-то лажи.
Короче выбросить этот нетбук хотел.
По оконцовке напоследок поставил на него SSD-диск. Мало того, что загружаться стал влёт, так и все мои программы заработали корректно.
У меня не нет бук, а ноутбук, то же асус, только чистый (DNS, по крайней мере до переименования в DEXP, заказывали ноуты у ASUS, даже гарантия была 2 года по началу, как на ASUS).

У меня врятли с переходником проблема, так как с ним ардуино работает и при замыкании р т он возвращает то же самое без глюков.

Добавлено after 2 minutes 43 seconds:
Mishany писал(а):Кроме скорости есть еще куча настроек в терминале....бит четности, стоп бит......
В терминале выставляю так же как в программе. Скрин от риты приложил, но я пользовал 3 терминала они все так себя ведут.

Добавлено after 51 minute 2 seconds:
akl писал(а):germess2006
По мне, у Вас стоят неправильно стоят FUSE-биты
RC-генератор сейчас работает на частоте 2МГц
Вложение RC_8MHz_mega8.PNG больше недоступно
Для кварца >1МГц
Вложение Q8MHz_mega8.PNG больше недоступно
Можно провести тест передачи одного байта из mega8 простой программой
Спойлер

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

.include "m8def.inc"

.equ	Fo=8000000
;.equ	Fo=14745600

.org	0
RESET:
;	RJMP	START

START:
	IN	R16,UCSRC
	CBR	R16,7
	OUT	UCSRC,R16

	LDI	XH,HIGH(Fo/16/9600-1)
	LDI	XL,LOW(Fo/16/9600-1)
	OUT	UBRRH,XH
	OUT	UBRRL,XL

	LDI	R16,1<<TxEN
	OUT	UCSRB,R16
LOAD_UDR:
	CBI	UCSRA,TxC

	LDI	R16,$49
	OUT	UDR,R16
WAIT:
	SBIS	UCSRA,TxC
	RJMP	WAIT

	SBIW	Y,1
	BRNE	PC-1
	RJMP	LOAD_UDR
.EXIT

4.jpg
(109.71 КБ) 434 скачивания
ХЗ на счёт фьюзов, вроде перепроверял должны быть как у меня.. но перепрошил на ваши фьюзы, ничего не поменялось, ни частота мигания светодиода ни глюки UARTа.

Пробовал ваш файл прошить cvavr выдаёт что-то про переполнение буфера, если ASM код ваш пробую впихнуть в новый проект на кодвижене, то тоже что-то про флэш память пишет, может он ассемблер просто так не прошивает? может настроить что-то нужно... на C++ программы шьются без этой ошибки.
Реклама
Аватара пользователя
Vga
Встал на лапы
Сообщения: 132
Зарегистрирован: Сб сен 12, 2009 18:38:12

Re: Сотая тема об Atmega и UART

Сообщение Vga »

Какой переходник? Если это действительно USB-COM, а не USB-UART, то необходим еще транслятор уровней. Для проверки достаточно измерить напряжение на TX переходника при отсутствии передачи. Если -5..-12В - труЪ RS232, если 0В - "китайский" RS232, если +3.3-5В - TTL UART. Без транслятора будет работать только в последнем варианте.
germess2006 писал(а):На последнем контроллере, который сейчас стоит, не менял Rx Tx местами. А вообще, на что это может повлиять? можно убить UART ?
Если нет токоограничивающих резисторов в линиях TX/RX - как нефиг делать.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Сотая тема об Atmega и UART

Сообщение YS »

Я бы для начала посоветовал убрать все и написать что-то типа такого:

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


void main(void)
{
  uint8_t b;

  UCSR0B=(1<<RXEN0) | (1<<TXEN0);
  UBRR0=51; //9600BPS @ 8MHz MCU clock

  while (1)
  {
    while (!(UCSR0A & (1<<RXC0)));

    b=UDR0;

    UDR0=b;

    while (!(UCSR0A & (1<<TXC0)));
  }
}
У вас в коде есть скользкое место:

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

if(UCSRA&(1<<RXC)) // если пришёл байт по UART
{
send_Uart(getch_Uart());
...
getch_Uart() и так проверяет RXC, так что смысла в дополнительной проверке особо нет.

И еще... Я бы так не писал:

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

while (*s != 0) send_Uart(*s++);
Да, это круто и красиво, но, во-первых, меня всегда напрягает, когда нельзя уверенно сказать, в каком порядке будут выполняться операторы (за этим надо лезть в справку...), а, во-вторых, тут нет защиты от неверно сформированной строки.

Ну и я не буду говорить про то, что писать в регистры конфигурации значения в стиле 0b00011000 нехорошо. Это очень затрудняет анализ кода.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
germess2006
Родился
Сообщения: 10
Зарегистрирован: Чт ноя 03, 2016 17:07:48

Re: Сотая тема об Atmega и UART

Сообщение germess2006 »

Попробовал самый простой код, сгенерировал код виженом, убрал лишнее



#include <mega8.h>
#include <delay.h>
#include <stdio.h>

void main(void)
{
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x33;

while (1)
{
UDR='2';
PORTB.0=1;
delay_ms(1000);
PORTB.0=0;
delay_ms(1000);
}
}

Мигает с частотой раз в секунду, визуально. В терминал выдаёт вместо "1" букву "g" вместо "2" цифру "3"
При том что со старым кодом выдавал вместо 1 - L, вместо 2 - f

Фьюзы прошил и со второй галочкой и без галочек в кодвижене, ни чего не изменилось, проверил, отпаял резонатор, контроллер стал невидимкой, значит шились фьюзы под резонатор.

Добавлено after 2 minutes 11 seconds:
Vga писал(а):Какой переходник? Если это действительно USB-COM, а не USB-UART, то необходим еще транслятор уровней. Для проверки достаточно измерить напряжение на TX переходника при отсутствии передачи. Если -5..-12В - труЪ RS232, если 0В - "китайский" RS232, если +3.3-5В - TTL UART. Без транслятора будет работать только в последнем варианте.
germess2006 писал(а):На последнем контроллере, который сейчас стоит, не менял Rx Tx местами. А вообще, на что это может повлиять? можно убить UART ?
Если нет токоограничивающих резисторов в линиях TX/RX - как нефиг делать.
Кабель USB-COM выдаёт -5 В
Аватара пользователя
Vga
Встал на лапы
Сообщения: 132
Зарегистрирован: Сб сен 12, 2009 18:38:12

Re: Сотая тема об Atmega и UART

Сообщение Vga »

Для публикации кода есть тег code. Читать кашу без индентов желания мало.
germess2006 писал(а):Кабель USB-COM выдаёт -5 В
Все правильно. MAX232 в помощь.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Сотая тема об Atmega и UART

Сообщение COKPOWEHEU »

Попробовал самый простой код, сгенерировал код виженом
Зря
убрал лишнее
Не заметно. Как были бесполезные комментарии так и остались. Как были выражения (0<<RXC) так и остались. Как не было форматирования, так и не появилось.
Кабель USB-COM выдаёт -5 В
В таком случае соберите переходник COM-UART на max232 либо транзисторах.
Аватара пользователя
Vga
Встал на лапы
Сообщения: 132
Зарегистрирован: Сб сен 12, 2009 18:38:12

Re: Сотая тема об Atmega и UART

Сообщение Vga »

COKPOWEHEU писал(а):Как были выражения (0<<RXC) так и остались.
Э нет. Там было UCSRA = 0b00000000. Это большая разница. Хотя эти ненужные нули замусоривают, но теперь хотя бы не требуется изучать даташит для выяснения, какие биты ставятся.

К тому же, выкинута большая куча сомнительного кода, проверить оставшиеся 10 строк на корректность куда проще.

Но меня несколько удивляют получаемые данные. По моим прикидкам, '1' должно превращаться в 'p'. Возможно, есть еще косяки с битрейтом.
germess2006
Родился
Сообщения: 10
Зарегистрирован: Чт ноя 03, 2016 17:07:48

Re: Сотая тема об Atmega и UART

Сообщение germess2006 »

COKPOWEHEU писал(а):
Попробовал самый простой код, сгенерировал код виженом
Зря
убрал лишнее
Не заметно. Как были бесполезные комментарии так и остались. Как были выражения (0<<RXC) так и остались. Как не было форматирования, так и не появилось.
Кабель USB-COM выдаёт -5 В
В таком случае соберите переходник COM-UART на max232 либо транзисторах.
Выходит мой кабелина китайский имитирует реальный COM порт? А почему ардуина работает с этим кабелем?
Аватара пользователя
Vga
Встал на лапы
Сообщения: 132
Зарегистрирован: Сб сен 12, 2009 18:38:12

Re: Сотая тема об Atmega и UART

Сообщение Vga »

А что у тебя за ардуино, собственно, и как ты к ней кабель подключаешь? Насколько я знаю, старые имели полноценный ком-порт (и, соответственно, имели RS232-драйвер), а новые имеют свой USB-COM, к которому Rx/Tx и подключены.
Morroc
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Re: Сотая тема об Atmega и UART

Сообщение Morroc »

Так и у него вроде такой же usb-com и он конечно нормально с мегой работать должен. Может у меги просто частота внутреннего генератора кривая сильно ? Я бы кварц влепил на попробовать.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
Vga
Встал на лапы
Сообщения: 132
Зарегистрирован: Сб сен 12, 2009 18:38:12

Re: Сотая тема об Atmega и UART

Сообщение Vga »

Начнем с того, что чипов USB-COM я еще не видел. Даже у китайцев. Есть чипы USB-UART, и с МК они совместимы непосредственно. Но вот с COM-портом они не совместимы, поэтому в правильных переходниках помимо USB-UART мостика стоит RS-232 драйвер. Скажем, MAX211. Потому для использования такого переходника с МК требуется драйвер и со стороны МК.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Сотая тема об Atmega и UART

Сообщение Vov123 »

Я понимаю что это троллинг, но всё-же, товарищ пытается сделать соединение RS232(TTL) с USB портом ноутбука, а не USB с портом RS232 PC.
Причём здесь MAX?

И ТС надо проверить свой девайс при работе с обычным PC.
Аватара пользователя
Vga
Встал на лапы
Сообщения: 132
Зарегистрирован: Сб сен 12, 2009 18:38:12

Re: Сотая тема об Atmega и UART

Сообщение Vga »

Vov123 писал(а):Я понимаю что это троллинг
Лучше бы понимать матчасть, тогда и троллинг не почудится.
Vov123 писал(а):Причём здесь MAX?
При том, что ТС (если, конечно, проведенные им измерения корректны) использует переходник USB-COM, а не USB-UART. Который, внезапно, реализует спецификацию COM-порта, тобишь RS-232, а не TTL UART.
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

Re: Сотая тема об Atmega и UART

Сообщение alex_ »

Чтобы разгребсти всю эту кашу и понять в чем проблема, необходимо:
1) фото переходника крупным планом чтобы видно было какие микросхемы там стоят, а то достойные коты устали уже гадать на кофейной гуще, что у вас там на самом деле.
2) для тестирования переходника необходимо замкнуть контакты TX и RX на переходнике и в любой программе "терминала" попробовать по отправлять что нибудь и посмотреть что придет. Придти должно все что отправили иначе проблема в переходнике.
germess2006
Родился
Сообщения: 10
Зарегистрирован: Чт ноя 03, 2016 17:07:48

Re: Сотая тема об Atmega и UART

Сообщение germess2006 »

Извиняюсь, торопился в прошлый раз из дома выходить замерил в подключенном состоянии, сейчас отключил микросхему от кабеля, у кабеля между Rx и минусом 0 В, между Tx и минусом 0 В.

Уважаемые коты, переходник такой нашел в тырнете, ссылку прилагаю, модель HL-340, а судя по описанию в тырнет магазине, он позиционируется как "Кабель HL-340 (USB в RS232)"

http://dalincom.ru/goods-3731.html

Контакты я замыкал уже сто раз, всё в терминале возвращается, кабель этот подсоединял к Arduino UNO, с ней он работал чётко.

Если этот злодейский кабель мне неделю моЦк парил из-за RS232, то что мне делать? как для подключения к обычному COM порту MAX232 подпаять?
Ответить

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