UART ATmega8
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: UART ATmega8
Я на телефоне и без ДШ. На сколько я помню ,при приеме в любом случае три выборки на бит. Значение бита определяется голосованием. В идеале, одна выборка точно в середине, две по бокам от нее. П ри выключенной удвоенной скорости эти выборки стоят более плотно из-за большего количества стробов на бит.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: UART ATmega8
Не похоже. Частота 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
Не середина такта, а середина бита. В дш где-то были пикчи со стробами, их количество на один бит в обоих режимах и при каких стробах происходит выборка. Собственно это знать совсем не обязательно, достаточно соблюдать соотношение частот приемника и передатчика.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: UART ATmega8
Делать несколько выборок на бит - бессмысленно. При рассинхронизации более чем на полбита (уход за среднюю выборку), не спасёт даже 1000 выборок. Тогда зачем их делать больше одной ? 

- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: UART ATmega8
Это Вы тогда к разрабам МК. Но сделали они это для помехоустойчивости. Рассинхронизации не должно быть в принципе.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: UART ATmega8
Именно от них и отталкиваюсь. Да и по логике, при одинарной скорости получается 2 строба на бит, при двойной - 1 строб на бит. При максимальной скорости контроллер физически не успеет больше 1 строба на бит.В дш где-то были пикчи со стробами, их количество на один бит в обоих режимах и при каких стробах происходит выборка.
Три выборки на бит нужно не для точности по времени, а для защиты от помех - вдруг в момент выборки возникнет случайный всплеск, тогда "боковые" отсчеты скомпенсируют.Делать несколько выборок на бит - бессмысленно. При рассинхронизации более чем на полбита
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: UART ATmega8
Чуть телефон не разбил об стенку пока картинку вставлял
Смотрите, в медленном режиме 16 стробов на один бит, в быстром 8. В обоих случаях три выборки. В медленном выборки ближе к середине. Конечно эта середина будет "сползать" с каждым последующим битом кадра из-за разницы тактовых частот устройств.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: UART ATmega8
То есть существенной разницы нет? В "медленном" режиме выборка близко к середине, в "быстром" сама середина может оказаться ближе к реальной.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: UART ATmega8
Ну вроде как да. Я ж говорю данную инфу знать совсем не обязательно ,чтобы UART использовать. Есть небольшая разница в допустимости отклонения частот.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: UART ATmega8
Допустимое отклонение частот не должно влиять. При "некруглом" кварце (а он частенько некруглый если UART - "бесплатный довесок") двойная скорость позволяет точнее настроить частоту, а одинарная точнее попадает в центр своей.
Тогда возвращаемся к вопросу: зачем нужна одинарная частота?
Тогда возвращаемся к вопросу: зачем нужна одинарная частота?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: UART ATmega8
В Дш разные формулы для расчетадопуска частоты и соотвественно разные готовые табличные значения.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: UART ATmega8
тяжкое наследие сторонников "чистого программирования", которым на все случаи жизни не достаточно функций... вот им и сделали процедуры и одинарную частоту USARTCOKPOWEHEU писал(а):зачем нужна
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: UART ATmega8
Да какие там разные формулы! В одной деление на 16, в другой - на 8. Одно и то же, зато самим же макросы писать дольше пришлось.
Лучше бы разрядность UBRR увеличили, если кому-то 12 бит не хватает. Или это в каких-то доисторических первых AVR сделали UART с одинарной скоростью, а потом по мере надобности допилили посовершеннее и оставили "режим совместимости"?тяжкое наследие сторонников "чистого программирования"
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: UART ATmega8
Какие разные вы легко увидитев ДШ, скриншот вставлять больше не буду , муторно.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: UART ATmega8
Вот скриншот для ATmega8. Как видите, одно и то же, только в одном случае делится на 16, в другом на 8.
- Вложения
-
- screen.jpg
- (38.38 КБ) 450 скачиваний
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: UART ATmega8
Вы меня не поняли. Я Вам по допустимое отклонение, допустимую погрешность, ошибку если угодно. А не расчетное значение регистра. Повторюсь, это значение разное для двух режимов . Эти формулы и уже готовые значение предельные и предельно рекомендуемые, лежат в ДШ сразу после откуда я взял свой скриншот. А вот то что формулы разные, я ошибся.
Re: UART ATmega8
Задача была решена, спасибо 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
Изначально имеется число конечный результат и число временный результат, причём последнее равно нулю. Как только приходит символ, то производится его анализ. Возможные варианты:
1) пришедший символ — десятичная цифра. Временный результат умножаем на 10, декодируем цифру и прибавляем её к временному результату. При желании можно сделать проверку на предмет, не вышел ли результат за допустимые пределы.
2) пришедший символ — запятая. Копируем временный результат в конечный результат и обнуляем временный результат.
3) пришедший символ — ни то, ни другое. Выдаём какое-нибудь сообщение об ошибке или просто игнорим пришедший символ. Можно сбросить временный результат в ноль, не сохраняя его значение.
Данный алгоритм реализуется внутри прерывания с помощью трёх-четырёх "ифов". Никакие буфера приёма не нужны.
1) пришедший символ — десятичная цифра. Временный результат умножаем на 10, декодируем цифру и прибавляем её к временному результату. При желании можно сделать проверку на предмет, не вышел ли результат за допустимые пределы.
2) пришедший символ — запятая. Копируем временный результат в конечный результат и обнуляем временный результат.
3) пришедший символ — ни то, ни другое. Выдаём какое-нибудь сообщение об ошибке или просто игнорим пришедший символ. Можно сбросить временный результат в ноль, не сохраняя его значение.
Данный алгоритм реализуется внутри прерывания с помощью трёх-четырёх "ифов". Никакие буфера приёма не нужны.
Re: UART ATmega8
Ды вот теоретиков много, а работающий код помог сделать только Mishany.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: UART ATmega8
Вот же реализация, как раз по алгоритму B@R5uk'a , давным-давно написана, правда без проверок правильности цифр, но это 2 if'а.
Какое еще решение нужно?
Какое еще решение нужно?
