реклама на сайте
подробности

 
 
> Проблема с софтовым UART на Mega8, Проблема с софтовым UART на Mega8
Ruslan Konovalov
сообщение Jul 28 2008, 22:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 25-07-07
Пользователь №: 29 364



Уважаемые форумчане.

Софтовый уарт принимает не корректно.
Передача происходит без проблем, а принимает вместо:
Пример: Должен принять 000102030405
принимает FFFFFFFFFFFFF
В чем проблема, так и не понял(может настройки пррываний ?).
Компилятор IAR. Проверял на Proteus 7.2

Или быть может у кого нибудь есть рабочий софтовый уарт.
Скорость нужна макс. 115200.
Буду признателен любой помощи.

С Уважением,
Руслан.
Прикрепленные файлы
Прикрепленный файл  soft_uart.zip ( 2.35 килобайт ) Кол-во скачиваний: 42
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bgc
сообщение Jul 28 2008, 22:35
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 313
Регистрация: 30-07-06
Из: Москва
Пользователь №: 19 188



Скорость великовата для софтового... Проверьте на 2400.
при большой загрузке процессора это предел. При малой наверное потянет 19200. Но точно не проверял.


--------------------
Окружающий мир - не иссякающий источник сюрпризов!
Go to the top of the page
 
+Quote Post
Ruslan Konovalov
сообщение Jul 28 2008, 23:27
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 25-07-07
Пользователь №: 29 364



Цитата(bgc @ Jul 29 2008, 01:35) *
Скорость великовата для софтового... Проверьте на 2400.
при большой загрузке процессора это предел. При малой наверное потянет 19200. Но точно не проверял.


Пробовал на 115200. Передает нормально а прием нет.
У меня есть другой софтовый уарт так он работает как раз на 19200.
Неужели 19200 предел ? Кстати прием и передача работают по очереди.
Неужели если только принимать, то не получится принять на большей чем 19200 скорости ?



А это оригинальный софтовый уарт.
Потом я его переделал под IAR(предыдущий аттачмент).
Может я где-то напартачил ?
Прикрепленные файлы
Прикрепленный файл  suart_1_.zip ( 2.13 килобайт ) Кол-во скачиваний: 55
 
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 29 2008, 13:06
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Ruslan Konovalov @ Jul 29 2008, 02:27) *
У меня есть другой софтовый уарт так он работает как раз на 19200.
Неужели если только принимать, то не получится принять на большей чем 19200 скорости ?

С кварцем 14.7456 должно тянуть 57600.

ЗЫ: А почему не используете аппаратный?

Цитата(=GM= @ Jul 29 2008, 15:42) *
Ну почему отказаться, приём по прерываниям, основная работа в фоне. Для приёма на таких скоростях лучше, конечно, чтобы других прерываний не было.

5 выборок надо делать. 115200 x 5 = 576kHz (будет всего 16Mhz / 576 = с натягом 32 такта на выборку).
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 29 2008, 13:43
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(defunct @ Jul 29 2008, 12:06) *
5 выборок надо делать. 115200 x 5 = 576kHz (будет всего 16Mhz / 576 = с натягом 32 такта на выборку)

5-то зачем? Ну, для 1Мбода длительность одного бита 16МЦ(тактов), вполне хватит на приём по прерыванию.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 29 2008, 14:59
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Jul 29 2008, 16:43) *
5-то зачем?

Для того чтобы соответствовать стандарту (обеспечить нормальную работу при 2% отклонении частоты приемника и 2% отклонении частоты передатчика (суммарно 4% отклонение) ).

Цитата
Ну, для 1Мбода длительность одного бита 16МЦ(тактов), вполне хватит на приём по прерыванию.

ну ну, хватит ровно на чтение из порта одной выбоки и задвигание в регистр.
Даже на анализ старт/стоп не хватит.
Работать будет так же г...но плохо как и то, что в примере автора ветки.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 29 2008, 15:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Jul 29 2008, 17:59) *
Для того чтобы соответствовать стандарту (обеспечить нормальную работу при 2% отклонении частоты приемника и 2% отклонении частоты передатчика (суммарно 4% отклонение) ).

В стандарте не прописано число выборок. Вообще нет такого понятия. Хотя, аппаратно используется обычно 5. % отклонения частоты также никак не связан с числом выборок.

Очевидно, что чем больше выборок, тем точнее восстановление сигнала (в плане помехозащищённости), но если принять за основу что сигнал идёт без помех, то число выборок не влияет ни на что (при обнаружении старта). А 3 вполне достаточно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 29 2008, 16:10
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SasaVitebsk @ Jul 29 2008, 18:55) *
В стандарте не прописано число выборок. Вообще нет такого понятия. Хотя, аппаратно используется обычно 5. % отклонения частоты также никак не связаны с числом выборок.

Связаны если выборками отлавливать момент смены сигнала.
И связаны ровно настолько, насколько интервалов разбивается один бит этими выборками.
при пяти выборках получим сл. картину (каждая выборка покрывает 20% интервала одного бита):

[1][2][3][4][5]

Если в [1] словили смену сигнала, и начали читать данные в момент [3], то у нас есть запас 40% отклонения интервала в обе стороны. И если смены сигнала более за кадр не произойдет (напр передается 0xFF или 0x00), то к приему последнего "стоп" бита сигнал может уплыть на 40% в любую сторону без риска искажения данных. Теперь что такое 40%, - это 40% / 10 бит на кадр = 4% отклонение частоты приемника от передатчика.

Цитата
Очевидно, что чем больше выборок, тем точнее восстановление сигнала (в плане помехозащищённости), но если принять за основу что сигнал идёт без помех, то число выборок не влияет ни на что (при обнаружении старта). А 3 вполне достаточно.

я не говорил о выборках с последующим усреднением.
Я использую несколько выборок для подсихронизации.

Например если смена сигнала произошла на выборке [1] бита i, см иллюстрацию ниже, то устойчивое состояние бита можно брать с выборки [3], затем для бита i+1 смена сигнала проиcходит на выбоке [2], значит устойчивое состояние бита нужно бать уже не с выборки [3], а с выборки [4].

Код
[----бит-i----][----бит-i+1--]....
[1][2][3][4][5][1][2][3][4][5]....
-------^-----------------^----....

_|----------------|___________ сигнал
  
--------------------------------------->t
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 29 2008, 16:29
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(defunct @ Jul 29 2008, 22:10) *
Связаны если выборками отлавливать момент смены сигнала.


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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 29 2008, 16:53
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(AHTOXA @ Jul 29 2008, 19:29) *
При таком подходе точность даже больше, чем при пяти выборках на бит.

Теоретически - больше.
А на практике - определяется "скоростью реакции обработчика и точностью установки/переустановки таймера". плюс нет подсинхронизации по каждой смене уровня сигнала, а значит на кадрах 0x55 и подобных (где смены уровня происходят чаще одного раза) точность будет хуже.

Цитата(=GM= @ Jul 29 2008, 19:20) *
Времени хватит на всё, даже на сохранение принятого байта в циклическом буфере, если надо.

Вы оптимист.
4 такта вход в прерывание, 5 тактов выход (сохранение SREG учтено), 3 такта макс джиттер (прерывание в момент выполнения длинной команды)
остается 4-7 тактов на полезную работу, считайте на что их хватит.

Цитата
Ну старт бит я ещё понимаю, а стоп-бит зачем анализировать?

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

Цитата
Программа написана Питером Данеггером, я его знаю более 10 лет, и бился с ним время от времени на одном из английских сайтов, нормальный кодер, и программы делает добротные.

Что-то не пойму, неправильная работа программы, может быть оправдана квалификацией автора?!
Если автор "нормальный кодер", то программа не может быть нерабочей, это только нам кажется, что она нерабочая и принимает 0xFF FF FF вместо посылаемых данных?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 29 2008, 18:18
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(defunct @ Jul 29 2008, 22:53) *
Теоретически - больше.
А на практике - определяется "скоростью реакции обработчика и точностью установки/переустановки таймера".


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

OCR = ICR + 1_5_BIT_TICKS;

а потом

OCR += 1_BIT_TICKS;

, то есть, все интервалы отмеряются строго от момента начала старт-бита.

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


Ну, подсинхронизация - это чересчур. На сколько должны расползтись частоты приёмника и передатчика, чтобы за 8.5 бит выехать за пределы бита?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 29 2008, 19:03
Сообщение #12


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(AHTOXA @ Jul 29 2008, 21:18) *
Скорость входа в обработчик - да, влияет. Но это мизер.

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

Цитата
Погрешность установки и переустановки там отсутствует, ибо делается сначала
OCR = ICR + 1_5_BIT_TICKS;

Ну не стоит так громко.
Как минимум возможна погрешность в полтакта. На низких скоростях конечно чепуха, а на высоких (115200) это почти 1%.
Насчет ICR, это конечно здорово если он есть, а там где нет?

Цитата
На сколько должны расползтись частоты приёмника и передатчика, чтобы за 8.5 бит выехать за пределы бита?

Не бита, а половины бита (читаем же по-середине). Всего лишь на 2.5% приемник, и настолько же передатчик от заданной.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 29 2008, 19:56
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(defunct @ Jul 30 2008, 01:03) *
Не мизер, если имеются другие обработчики прерываний.


Ну это конечно. Для больших скоростей придётся отключитьsmile.gif

Цитата
Ну не стоит так громко.
Как минимум возможна погрешность в полтакта. На низких скоростях конечно чепуха, а на высоких (115200) это почти 1%.


Это уже придирки. Естественно, говоря "отсутствует", я имел в виду - с точностью до такта процессора. И не 1%, а менее 0.5%, ибо полтакта smile.gif

Цитата
Насчет ICR, это конечно здорово если он есть, а там где нет?


Там просто не получится достичь таких скоростей. С другой стороны, в MSP-шке ещё лучше, там можно аппаратно захватывать состояние ноги ICP по прерыванию сравнения. То есть, время входа в прерывание не имеет значения (в пределах длины бита ессна).

Цитата
Не бита, а половины бита (читаем же по-середине). Всего лишь на 2.5% приемник, и настолько же передатчик от заданной.


Всё же битов не 10, а 8.5. Потому запас побольше выйдетsmile.gif

Короче, моё имхо - работать на 115.200 должно (96 МЦ на бит), хоть и с напрягом. А не работает скорее всего из-за протеуса.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 29 2008, 20:36
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(AHTOXA @ Jul 29 2008, 22:56) *
Там просто не получится достичь таких скоростей.

Почему же не получится. Без всяких ICR - пускаем 8-ми битный таймер на 5-ти кратной частоте UART'a. делаем 5 выборок, ловим старт, устанавливаем значащую выборку и все, читаем, складываем до тех пор пока нет стопа. Дергаем псевдообработчик принятого байта.
До тех пор пока есть 50 тактов на одну выборку - производительности хватит, т.е. 57600 @14.7456 гарантированно будет работать, причем с использованием всего одного 8-ми битного таймера.
Можно снизить количество выборок до трех, тогда не исключено что потянет и 115200.

Можно обслуживать сразу несколько каналов. Никаких телодвижений с таймером - один раз заправили и забыли.
Цитата
С другой стороны, в MSP-шке ещё лучше, там можно аппаратно захватывать состояние ноги ICP по прерыванию сравнения. То есть, время входа в прерывание не имеет значения (в пределах длины бита ессна).

Тратить серьезный таймер на один UART, гм... ;>

Цитата
Всё же битов не 10, а 8.5. Потому запас побольше выйдетsmile.gif

Все же битов 10. Или первый интервал в 1.5 бита вы не считаете?
От того что вы его не считаете, он никуда не делся (его ошибка ничем не скомпенсирована).

Цитата
Короче, моё имхо - работать на 115.200 должно (96 МЦ на бит), хоть и с напрягом. А не работает скорее всего из-за протеуса.
Может быть. Не обратил внимания, что тестирование на протеусе сделано ;>
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 29 2008, 21:23
Сообщение #15


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(defunct @ Jul 30 2008, 02:36) *
Почему же не получится. Без всяких ICR - пускаем 8-ми битный таймер на 5-ти кратной частоте UART'a...


Я так тоже делаю, только на 4-кратной. Когда надо быстрее, то обхожусь 3-кратной smile.gif Плюс ещё в том, что работает на всех контроллерах. Но с ICR-то получше всё же.

Цитата
Можно обслуживать сразу несколько каналов. Никаких телодвижений с таймером - один раз заправили и забыли.


Ну да, только скорость пропорционально уменьшится.

Цитата
Тратить серьезный таймер на один UART, гм... ;>

Ну он там не целиком, всего один модуль захвата/сравнения из кучиsmile.gif

Цитата
Все же битов 10. Или первый интервал в 1.5 бита вы не считаете?
От того что вы его не считаете, он никуда не делся (его ошибка ничем не скомпенсирована).


Ошибка копится не на битах, а на интервалахsmile.gif А интервалов - 8.5 (полуторный до середины первого бита + 7 одинарных). Стоп-бит меня не интересует, ибо пока не придёт единица, захвата следующего старт-бита не произойдёт.

Цитата
Может быть. Не обратил внимания, что тестирование на протеусе сделано ;>


yeah.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ruslan Konovalov   Проблема с софтовым UART на Mega8   Jul 28 2008, 22:32
|- - =GM=   Цитата(Ruslan Konovalov @ Jul 28 2008, 22...   Jul 29 2008, 12:32
||- - MrYuran   Цитата(=GM= @ Jul 29 2008, 16:32) для пол...   Jul 29 2008, 12:36
||- - =GM=   Цитата(MrYuran @ Jul 29 2008, 11:36) Если...   Jul 29 2008, 12:42
|- - =GM=   defunct ну ну, хватит ровно на чтение из порта одн...   Jul 29 2008, 16:20
- - Ruslan Konovalov   Огромное спасибо всем кто отозвался. Мне было бы д...   Jul 29 2008, 18:14
|- - =GM=   Цитата(Ruslan Konovalov @ Jul 29 2008, 17...   Jul 29 2008, 21:10
- - _Pasha   Цитата(AHTOXA @ Jul 29 2008, 19:29) Потом...   Jul 30 2008, 10:57
- - AHTOXA   Цитата(_Pasha @ Jul 30 2008, 16:57) В общ...   Jul 30 2008, 11:27


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01555 секунд с 7
ELECTRONIX ©2004-2016