UART ATmega8

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: UART ATmega8

Сообщение Z_h_e »

Я на телефоне и без ДШ. На сколько я помню ,при приеме в любом случае три выборки на бит. Значение бита определяется голосованием. В идеале, одна выборка точно в середине, две по бокам от нее. П ри выключенной удвоенной скорости эти выборки стоят более плотно из-за большего количества стробов на бит.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: UART ATmega8

Сообщение COKPOWEHEU »

Не похоже. Частота UART в "быстром" режиме определяется формулой BAUD = F_CPU/( 8 * ( UBRR + 1 ) ), то есть от F_CPU/32768 до F_CPU/8. При максимальной частоте тактовая UART равна тактовой контроллера. Не будет же контроллер в середине такта выборку делать.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: UART ATmega8

Сообщение Z_h_e »

Не середина такта, а середина бита. В дш где-то были пикчи со стробами, их количество на один бит в обоих режимах и при каких стробах происходит выборка. Собственно это знать совсем не обязательно, достаточно соблюдать соотношение частот приемника и передатчика.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: UART ATmega8

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

Делать несколько выборок на бит - бессмысленно. При рассинхронизации более чем на полбита (уход за среднюю выборку), не спасёт даже 1000 выборок. Тогда зачем их делать больше одной ? :dont_know:
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: UART ATmega8

Сообщение Z_h_e »

Это Вы тогда к разрабам МК. Но сделали они это для помехоустойчивости. Рассинхронизации не должно быть в принципе.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: UART ATmega8

Сообщение COKPOWEHEU »

В дш где-то были пикчи со стробами, их количество на один бит в обоих режимах и при каких стробах происходит выборка.
Именно от них и отталкиваюсь. Да и по логике, при одинарной скорости получается 2 строба на бит, при двойной - 1 строб на бит. При максимальной скорости контроллер физически не успеет больше 1 строба на бит.
Делать несколько выборок на бит - бессмысленно. При рассинхронизации более чем на полбита
Три выборки на бит нужно не для точности по времени, а для защиты от помех - вдруг в момент выборки возникнет случайный всплеск, тогда "боковые" отсчеты скомпенсируют.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: UART ATmega8

Сообщение Z_h_e »

Изображение
Чуть телефон не разбил об стенку пока картинку вставлял
Смотрите, в медленном режиме 16 стробов на один бит, в быстром 8. В обоих случаях три выборки. В медленном выборки ближе к середине. Конечно эта середина будет "сползать" с каждым последующим битом кадра из-за разницы тактовых частот устройств.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: UART ATmega8

Сообщение COKPOWEHEU »

То есть существенной разницы нет? В "медленном" режиме выборка близко к середине, в "быстром" сама середина может оказаться ближе к реальной.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: UART ATmega8

Сообщение Z_h_e »

Ну вроде как да. Я ж говорю данную инфу знать совсем не обязательно ,чтобы UART использовать. Есть небольшая разница в допустимости отклонения частот.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: UART ATmega8

Сообщение COKPOWEHEU »

Допустимое отклонение частот не должно влиять. При "некруглом" кварце (а он частенько некруглый если UART - "бесплатный довесок") двойная скорость позволяет точнее настроить частоту, а одинарная точнее попадает в центр своей.
Тогда возвращаемся к вопросу: зачем нужна одинарная частота?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: UART ATmega8

Сообщение Z_h_e »

В Дш разные формулы для расчетадопуска частоты и соотвественно разные готовые табличные значения.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: UART ATmega8

Сообщение ARV »

COKPOWEHEU писал(а):зачем нужна
тяжкое наследие сторонников "чистого программирования", которым на все случаи жизни не достаточно функций... вот им и сделали процедуры и одинарную частоту USART
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: UART ATmega8

Сообщение COKPOWEHEU »

Да какие там разные формулы! В одной деление на 16, в другой - на 8. Одно и то же, зато самим же макросы писать дольше пришлось.
тяжкое наследие сторонников "чистого программирования"
Лучше бы разрядность UBRR увеличили, если кому-то 12 бит не хватает. Или это в каких-то доисторических первых AVR сделали UART с одинарной скоростью, а потом по мере надобности допилили посовершеннее и оставили "режим совместимости"?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: UART ATmega8

Сообщение Z_h_e »

Какие разные вы легко увидитев ДШ, скриншот вставлять больше не буду , муторно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: UART ATmega8

Сообщение COKPOWEHEU »

Изображение
Вот скриншот для ATmega8. Как видите, одно и то же, только в одном случае делится на 16, в другом на 8.
Вложения
screen.jpg
(38.38 КБ) 450 скачиваний
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: UART ATmega8

Сообщение Z_h_e »

Вы меня не поняли. Я Вам по допустимое отклонение, допустимую погрешность, ошибку если угодно. А не расчетное значение регистра. Повторюсь, это значение разное для двух режимов . Эти формулы и уже готовые значение предельные и предельно рекомендуемые, лежат в ДШ сразу после откуда я взял свой скриншот. А вот то что формулы разные, я ошибся.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Gin87
Открыл глаза
Сообщения: 74
Зарегистрирован: Вс янв 24, 2010 21:29:07

Re: UART ATmega8

Сообщение Gin87 »

Задача была решена, спасибо Mishany. Собственно его идея взята. Код раскладывает по переменным посылку типа 25,100,1,1;

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

//=========
ISR(USART_RXC_vect)   //прерывание по приему
{
   temp[i]=UDR;
   if (temp[i]==';')
   {
   //собираем число примерно так:
   data = 0;
   S = 1;
   for(i--; i!=255; i--)
   {
     if(temp[i]==',')
    {
     f++;
     if(f==1) start=data;
     if(f==2) napravlenie=data;
          if(f==3) frequency=data, f=0;
     data=0;
     S=1;
     i--;
    }
     data = data+(temp[i]-48)*S;
     S = S*10;
   }
   i=0;
   }
   else
   {
   i++;
   }

}

//==========
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: UART ATmega8

Сообщение B@R5uk »

Изначально имеется число конечный результат и число временный результат, причём последнее равно нулю. Как только приходит символ, то производится его анализ. Возможные варианты:
1) пришедший символ — десятичная цифра. Временный результат умножаем на 10, декодируем цифру и прибавляем её к временному результату. При желании можно сделать проверку на предмет, не вышел ли результат за допустимые пределы.
2) пришедший символ — запятая. Копируем временный результат в конечный результат и обнуляем временный результат.
3) пришедший символ — ни то, ни другое. Выдаём какое-нибудь сообщение об ошибке или просто игнорим пришедший символ. Можно сбросить временный результат в ноль, не сохраняя его значение.

Данный алгоритм реализуется внутри прерывания с помощью трёх-четырёх "ифов". Никакие буфера приёма не нужны.
Gin87
Открыл глаза
Сообщения: 74
Зарегистрирован: Вс янв 24, 2010 21:29:07

Re: UART ATmega8

Сообщение Gin87 »

Ды вот теоретиков много, а работающий код помог сделать только Mishany.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: UART ATmega8

Сообщение COKPOWEHEU »

Вот же реализация, как раз по алгоритму B@R5uk'a , давным-давно написана, правда без проверок правильности цифр, но это 2 if'а.
Какое еще решение нужно?
Ответить

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