Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Пт июн 26, 2009 12:34:42

Спасибо всем ответившим. Буду изучать.

Отдельное спасибо Настя и DrWatson

Будут вопросы, напишу

Re: Конвертер скорости USART

Чт дек 27, 2012 21:09:45

ну и чё как решилась эта тема то???? я то же хо че зделать конвертор из скорости 10400 на какую нибуть другую для применения в k-line так как программы диагностики невидят на скорости 10400 ничего такого. блогородные люди соотечественники помощь ваша нужна помагите пожалуйста мушкитёру

Re: Конвертер скорости USART

Чт дек 27, 2012 23:56:24

Ну не знаю. UART - это и вправду элементарно, но если спрашивающим тут и вправду ничего в голову не приходит, то внесу свои пять копеек.

Для начала стоит выбрать МК с двумя USART'ами. Ибо я не понимаю, зачем мучатся с программной реализацией, когда даже в самые задрипанные МК их пихают по четыре штуки, но это так, отступление.

Если ближе к делу, то скажу, как я бы организовал такой переходник - преобразователь скорости. Во всех МК модули USART устроены одним образом: есть регистр приема и регистр отправки, плюс прерывание при приеме очередного символа (RX) и прерывание при готовности к отправке очередного символа (TX). Кроме двух модулей USART (назовем их А и Б), нам понадобиться два буфера для временного хранения передаваемых данных (назовем их АБ и БА). О конкретном способе организации этих буферов чуть позже, а пока посмотрим, как в общих чертах может выглядеть программа:

Функция main:
0. Инициализация периферии.
1. Инициализация буферов данных.
2. Включение приемников обоих USART модулей (TX прерывания выключены).
3. Пустой бесконечный цикл.

Прерывание RX для USART А:
0. Добавляем принятый символ в буфер АБ.
1. Разрешаем прерывание TX для USART Б.

Прерывание RX для USART Б:
0. Добавляем принятый символ в буфер БА.
1. Разрешаем прерывание TX для USART А.

Прерывание TX для USART А:
0. Отправляем очередной символ из буфера БА.
1. Если буфер пуст - выключаем прерывания TX для USART А.

Прерывание TX для USART Б:
0. Отправляем очередной символ из буфера АБ.
1. Если буфер пуст - выключаем прерывания TX для USART Б.

Теперь про буферы. Их организация будет зависеть от наиболее приемлемого для нас поведения. Мне видится два варианта:
- Кольцевой буфер. При переполнении буфера будет теряться самый "старый" символ. Более сложен в реализации.
- Линейный буфер. При переполнении будет теряться самый "новый" символ. Легок в реализации.

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

Если известен формат данных, которые будут переходить через конвертер, то можно организовать буферизацию не отдельных символов, а скажем так по-пакетно. В этом случае, при переполнении, из конвертера не будет выходить мусор в виде обрезанных данных, из него просто ничего не будет выходить. Но это уже сложнее реализовать, да и я не вижу каких-то особых преимуществ. Вот так вот.

Ах да. Это все верно для полнодуплексной передачи (RS232), для полудуплексной (RS485) суть останется та же, но реализация будет немного сложнее. Наверное придется накапливать в буферах некоторое кол-во данных, а затем как-нибудь переключаться между приемом и отправкой.

Re: Конвертер скорости USART

Пт дек 28, 2012 18:08:58

уважаемый menzoda что вот это значит? как это понимать?
Иначе, необходимо придерживаться правила, что размер буфера прямо пропорционален разнице конвертируемых скоростей и интенсивности потока данных через конвертер.

я щас пробую в протеусе этот конвертор реализовать на atmega128 там 2 uart сть. Так вот я для проверки первый uart настроил на 9600 второй uart на 19200 подключил к обоим терминалки . скоростя у нерминалок как и у тортов 9600 и 19200 соответственно. и при посылании в первый уарт (9600) данный (цифри с клавиатуры) обнаружил что на второй терминал (19200) приходит не то что отсылаю :( для отправки применил в основном цикле вот так putchar(getchar()); типа эхо, получаю с первого порта(9600) и сразу передаю на второй(19200)
думаю надо буфер применить так как скорость прихода меньше скорости ослыла. надо при приходе символа в порт (9200) поместить его в буфер и поставить какую небуть метку что он не пустой а уже в основном цикле программы сматреть если метка эта стоит(буфер приёма не пуст) то отсылать сиимвол из буфера во второй порт(19200). как то так.
а как зависит размер этих буферов от скорости приёма отсыла? от конвертации? что значит прямо пропорционален размер?

Re: Конвертер скорости USART

Пт дек 28, 2012 20:05:41

to Ziper, положим у нас есть UART1, работающий на 9600 бит/с (800 байт/с) и UART2 работающий на 2400 бит/с (200 байт/с).
Допустим время передачи 1 с. Тогда из UART1 выйдет 800 Б, а UART2 всего 200.
Для конвертации нужно суметь принять и запомнить как 800, так и 200 Б. UART1 успеет это сделать, а UART2 нет(если ограничить время 1 секундой).
Поэтому и требования к буферу соответствующие

Re: Конвертер скорости USART

Пт дек 28, 2012 20:10:29

Всё вроди реализовал конвертор как и задумал в протеусе всё работает завтра куплю атмегу128 проверю на железе :) буфер там вообще ненужен никакой всё горяздо проще. есть два урата со скоростями 9600 и 19200 в прерывыния на приём символа (байта) пищем следуещее
для уарта0

char dat, point;
if(point==0){
dat=data;
point=1;
}
где data переменная прерывания приёма. заносим в сваю переменную dat значение data и ставим метку point=1 значит буфер не пустой а в основном цикле пишем

if(point){
poutput=USART1;
putchar(dat); // отсылаем в порт 19200 приняли на 9600
point=0;
}
nenf мы смотрим если буфер не пуст отсылаем байт в другой порт. так же делаем вписываем в прерывание приёма другова порта и дописываем основной цикл. и всё имеем конвертор скорости uart как в одну сторону так и в другую двунаправленный он . (туда сюда обратно тебе и мне приятно) :))
тока вот чёто жалко тратить целую атмегу128 на конвертор из 10строк кода и корпус у неё не есть гуд не припаяишься толком и памети свободной куча останеться :shock: хотелосьбы токой прекраснейший конвертор иметь хотяб на атюни2313 тама один uart есть а другой програмно нада реализовывать попробую это зделать пригодиться потома. а на ноги свободных портов можно навесить светодиодов разноцветных чтоб знать как и куда идёт обмен данными или можно павесить пищалку и пищать музон тимати :shock: ну это уже для тех кто совсема наглухо и камы нечем заняться :))) друзья, гордамарины всех с наступающим новым годом 8)
Вложения
2uarta.rar
симуляция в протеусе
(25.58 KiB) Скачиваний: 171

Re: Конвертер скорости USART

Пт дек 28, 2012 22:04:15

Спасибо, Meteor, что все объяснил. А Ziper'у скажу, что при разнице скоростей отличной от нуля буфер в любом случае нужен. Да даже если скорости одинаковы, то буфер все равно нужен. Если вы считаете, что он не нужен, то вы ошибаетесь. Вот так.

Re: Конвертер скорости USART

Сб дек 29, 2012 01:51:42

умная девочка menzoda :love:
я возможно просто не так выразился и вы не поняли моей гениальнейшней идее!!! просто у меня этот буфер реализован одной переменной размером char!!!! одна переменная всего лишь без массива!!! без этой переменной у меня тоже ничего неработало :( приняли char загнали его в переменную поставили флаг а в основном цикле глянули если флаг стоит то выгнали её в другой порт который настроен на другую скорость!!! в приложенном архиве есть симуляция в протеусе проверь сама помоему работает:)

Re: Конвертер скорости USART

Сб дек 29, 2012 02:35:27

Если скорость приема выше скорости передачи, то есть реальный шанс переполнить буфер любого размера, тем более что большинство МК не блещут объемами встроенной оперативной памяти. Чтобы добиться действительно надежной работы конвертера, следует реализовать управление потоком (программное или аппаратное, неважно).

Re: Конвертер скорости USART

Сб дек 29, 2012 15:15:20

Goldsmith. Управление потоком - это идеальный, но более сложный, не всегда реализуемый, и не всегда лучший (по соотношению результат/трудозатраты) вариант.

Ziper. Не сказал бы, что буфер размером в одну ячейку - гениальная идея. Например, нам нужно конвертировать 57600 в 9600. При этом, вряд ли мы будем гонять туда-сюда по одному символу в несколько секунд. Скорее всего гулять будут пачки из N символов. Передача одного символа на скорости 57600 занимает порядка 174 микросекунды, на скорости 9600 - 1044 микросекунды. Теперь представьте такую ситуацию: со скорость 57600 приходит пачка из четырех символов. Первый символ помещается в буферную переменную, оттуда сразу в выходной регистр, а оттуда в сдвиговый регистр, и там уже потихоньку отправляется. Второй символ попадает в буферную переменную, оттуда в выходной регистр. В регистре сдвига в этот момент все еще отправляется первый символ. Третий символ попадает в буферную переменную, выходной регистр занят вторым символом, а в сдвиговом регистре все так же томится первый символ. Приходит четвертый символ и... Переполнение! Четвертый символ теряется.

Возможно в вашем случае разница скоростей меньше, и пачки символов тоже меньше, поэтому буфер из двух элементов (да-да из двух, не забываем выходной регистр) будет с высокой вероятностью справляться со своей задачей. Но это хождение по лезвию - стоит увеличить количество подряд идущих символов, как сразу начнутся потери.

Re: Конвертер скорости USART

Сб янв 12, 2013 17:14:19

Теперь представьте такую ситуацию: со скорость 57600 приходит пачка из четырех символов. Первый символ помещается в буферную переменную, оттуда сразу в выходной регистр, а оттуда в сдвиговый регистр, и там уже потихоньку отправляется. Второй символ попадает в буферную переменную, оттуда в выходной регистр. В регистре сдвига в этот момент все еще отправляется первый символ. Третий символ попадает в буферную переменную, выходной регистр занят вторым символом, а в сдвиговом регистре все так же томится первый символ. Приходит четвертый символ и... Переполнение! Четвертый символ теряется.


Так оно по моему у меня и получаеться :( Зделал я конвертер се на Atmega8 применил один аппаратный UART и один программный 10400<->19200. так вот конвертация 10400->19200 происходит просто великолено :) а 19200->10400 глюковато :( Наверное всё происходит как опасала мною многоуважаемая menzoda. Я симулирую в протеусе и если отсылать 19400->10400 символы с клавиатуры медленно кождый раз нажимать кнопку то всё работает а если нажать и держать её чтоб слать постоянно то данные искажаються((((( происходит переполнение буфера. Так как же реализовать задачу конвертации 19200->10400??? Видемо надо буфер увеличить. Может кто поможем мне в этой теме кто знает как? Задача такая надо конвертировать 19200->10400. где-то 4раза в секунду отправляеться посылка max 10 байтов на скорости 19200 и её надо принять на скорости 10400. вот в чём она заключаеться. Помагите пожалуйста люди добрые, вам обязательно воздасться!!!!!!!!! :oops:
Вложения
SUart-Mega8-Proteus.rar
Симуляция в протеусе
(29.55 KiB) Скачиваний: 152

Re: Конвертер скорости USART

Сб янв 12, 2013 19:00:43

Эээ... Я мальчик, но ничего, я согласен, что Menzoda смахивает на женское имя. А вообще это исковерканная итальянская фамилия Mendoza. Так что у нас ничего с тобой не выйдет грязный извращенец! :)) Шутка. Насчет извращенца. Насчет того, что у нас ничего не выйдет я не шутил.

А про буфер я говорил! Только не понимаю в чем трудность его приделать? Мне кажется, выше, я достаточно понятно все описал. Расскажи давай, что у тебя конкретно не получается, я тебе более подробную инструкцию дам. А готовый код не дам, извини. Во-первых, я никогда не использовал Атмелы и не хочу с ними знакомиться, а во-вторых - это не по джедайски. :))
Ответить