Страница 1 из 2

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

Добавлено: Чт ноя 03, 2016 17:15:49
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;
}

}
}

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

Добавлено: Чт ноя 03, 2016 21:24:39
Аlex
А вот это вот :

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

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

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

Добавлено: Пт ноя 04, 2016 00:52:41
Vov123
Есть техническая сторона проблемы, не знаю с чем связана, но многие ноутбуки не правильно работают с преобразователями USB - RS232, даже на FT232.
Использовал различные драйвера и сертифицированное программное обеспечение для частотных преобразователей и промышленных контроллеров, но мой нетбук DNS не видел этих устройств, а снифер показывал о передачи какой-то лажи.
Короче выбросить этот нетбук хотел.
По оконцовке напоследок поставил на него SSD-диск. Мало того, что загружаться стал влёт, так и все мои программы заработали корректно.

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

Добавлено: Пт ноя 04, 2016 05:43:40
Mishany
Кроме скорости есть еще куча настроек в терминале....бит четности, стоп бит......

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

Добавлено: Пт ноя 04, 2016 06:49:36
akl
germess2006
По мне, у Вас стоят неправильно стоят FUSE-биты
RC-генератор сейчас работает на частоте 2МГц
RC_8MHz_mega8.PNG
(8.96 КБ) 457 скачиваний
Для кварца >1МГц
Q8MHz_mega8.PNG
(5.96 КБ) 472 скачивания

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

Добавлено: Пт ноя 04, 2016 10:11:11
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 КБ) 437 скачиваний
ХЗ на счёт фьюзов, вроде перепроверял должны быть как у меня.. но перепрошил на ваши фьюзы, ничего не поменялось, ни частота мигания светодиода ни глюки UARTа.

Пробовал ваш файл прошить cvavr выдаёт что-то про переполнение буфера, если ASM код ваш пробую впихнуть в новый проект на кодвижене, то тоже что-то про флэш память пишет, может он ассемблер просто так не прошивает? может настроить что-то нужно... на C++ программы шьются без этой ошибки.

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

Добавлено: Пт ноя 04, 2016 10:30:16
Vga
Какой переходник? Если это действительно USB-COM, а не USB-UART, то необходим еще транслятор уровней. Для проверки достаточно измерить напряжение на TX переходника при отсутствии передачи. Если -5..-12В - труЪ RS232, если 0В - "китайский" RS232, если +3.3-5В - TTL UART. Без транслятора будет работать только в последнем варианте.
germess2006 писал(а):На последнем контроллере, который сейчас стоит, не менял Rx Tx местами. А вообще, на что это может повлиять? можно убить UART ?
Если нет токоограничивающих резисторов в линиях TX/RX - как нефиг делать.

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

Добавлено: Пт ноя 04, 2016 10:36:53
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 нехорошо. Это очень затрудняет анализ кода.

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

Добавлено: Пт ноя 04, 2016 11:13:51
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 В

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

Добавлено: Пт ноя 04, 2016 11:58:37
Vga
Для публикации кода есть тег code. Читать кашу без индентов желания мало.
germess2006 писал(а):Кабель USB-COM выдаёт -5 В
Все правильно. MAX232 в помощь.

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

Добавлено: Пт ноя 04, 2016 12:00:16
COKPOWEHEU
Попробовал самый простой код, сгенерировал код виженом
Зря
убрал лишнее
Не заметно. Как были бесполезные комментарии так и остались. Как были выражения (0<<RXC) так и остались. Как не было форматирования, так и не появилось.
Кабель USB-COM выдаёт -5 В
В таком случае соберите переходник COM-UART на max232 либо транзисторах.

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

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

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

Но меня несколько удивляют получаемые данные. По моим прикидкам, '1' должно превращаться в 'p'. Возможно, есть еще косяки с битрейтом.

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

Добавлено: Пт ноя 04, 2016 13:45:21
germess2006
COKPOWEHEU писал(а):
Попробовал самый простой код, сгенерировал код виженом
Зря
убрал лишнее
Не заметно. Как были бесполезные комментарии так и остались. Как были выражения (0<<RXC) так и остались. Как не было форматирования, так и не появилось.
Кабель USB-COM выдаёт -5 В
В таком случае соберите переходник COM-UART на max232 либо транзисторах.
Выходит мой кабелина китайский имитирует реальный COM порт? А почему ардуина работает с этим кабелем?

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

Добавлено: Пт ноя 04, 2016 14:15:42
Vga
А что у тебя за ардуино, собственно, и как ты к ней кабель подключаешь? Насколько я знаю, старые имели полноценный ком-порт (и, соответственно, имели RS232-драйвер), а новые имеют свой USB-COM, к которому Rx/Tx и подключены.

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

Добавлено: Пт ноя 04, 2016 14:28:31
Morroc
Так и у него вроде такой же usb-com и он конечно нормально с мегой работать должен. Может у меги просто частота внутреннего генератора кривая сильно ? Я бы кварц влепил на попробовать.

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

Добавлено: Пт ноя 04, 2016 14:38:36
Vga
Начнем с того, что чипов USB-COM я еще не видел. Даже у китайцев. Есть чипы USB-UART, и с МК они совместимы непосредственно. Но вот с COM-портом они не совместимы, поэтому в правильных переходниках помимо USB-UART мостика стоит RS-232 драйвер. Скажем, MAX211. Потому для использования такого переходника с МК требуется драйвер и со стороны МК.

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

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

И ТС надо проверить свой девайс при работе с обычным PC.

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

Добавлено: Пт ноя 04, 2016 15:52:39
Vga
Vov123 писал(а):Я понимаю что это троллинг
Лучше бы понимать матчасть, тогда и троллинг не почудится.
Vov123 писал(а):Причём здесь MAX?
При том, что ТС (если, конечно, проведенные им измерения корректны) использует переходник USB-COM, а не USB-UART. Который, внезапно, реализует спецификацию COM-порта, тобишь RS-232, а не TTL UART.

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

Добавлено: Пт ноя 04, 2016 18:27:09
alex_
Чтобы разгребсти всю эту кашу и понять в чем проблема, необходимо:
1) фото переходника крупным планом чтобы видно было какие микросхемы там стоят, а то достойные коты устали уже гадать на кофейной гуще, что у вас там на самом деле.
2) для тестирования переходника необходимо замкнуть контакты TX и RX на переходнике и в любой программе "терминала" попробовать по отправлять что нибудь и посмотреть что придет. Придти должно все что отправили иначе проблема в переходнике.

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

Добавлено: Пт ноя 04, 2016 21:30:00
germess2006
Извиняюсь, торопился в прошлый раз из дома выходить замерил в подключенном состоянии, сейчас отключил микросхему от кабеля, у кабеля между Rx и минусом 0 В, между Tx и минусом 0 В.

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

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

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

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