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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Проблема с софтовым UART на Mega8, Проблема с софтовым UART на Mega8
AHTOXA
сообщение Jul 29 2008, 18:18
Сообщение #16


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

Группа: Свой
Сообщений: 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
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 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
Сообщение #18


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

Группа: Свой
Сообщений: 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
Сообщение #19


кекс
******

Группа: Свой
Сообщений: 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
=GM=
сообщение Jul 29 2008, 21:10
Сообщение #20


Ambidexter
*****

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



Цитата(Ruslan Konovalov @ Jul 29 2008, 17:14) *
Мне было бы достаточно работать на скорости 115200

Ладно, шут с ним с Питером, пусть сидит в своём Берлине(:-). Давайте не будем никого слушать и поступим следующим образом.

0) Отказываемся от данеггеровской программы.

1) Подключаете вход RX к INTх, которая срабатывает на 1-0 перепад.

2) В подпрограмме обработки прерывания от INTх пишете настройку таймера на переполнение через ПОЛТОРА периода вашей скорости 115200, т.е. таймер должен сработать по переполнению через 13 мкс, bitcounter=8, запрещаете прерывания от INTх и выходите. Больше ничего.

3) В подпрограмме обработки прерывания от переполнения таймера пишете занесение текущего принятого бита в srxdata, как-то так

srxdata=srxdata<<1;
if(srxpin&0x01) srxdata++;

скручиваете счётчик бит, если счётчик бит скручен, останавливаете таймер и взводите флаг srxdone.
if((bitcounter--)==0) {stoptimer(); srxdone=1}; else настраиваете таймер на переполнение через ОДИН период, т.е. 8.68 мкс и выходите.

4) В фоне опрашиваете флаг srxdone, если он взведен, читаете принятый байт, сбрасываете флаг srxdone и разрешаете прерывания от INTх. Вы снова готовы принимать байты.

Ну, вроде всё, должно помочь горю. Держите нас в курсе.


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


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

Группа: Свой
Сообщений: 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
_Pasha
сообщение Jul 30 2008, 10:57
Сообщение #22


;
******

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



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

В общем, как делаю я (скорость до 19200 - больше не проверял.)
0) прерывание по старт - биту. Засекли 1/2 длит. бита (в таймер)
1) прерыв по таймеру - если имеем "0" на входе RxD_2, продолжаем прием, для чего засекли длит 1 бита в таймер
2) прием информационных бит по прерыванию таймера
3) прием стоп-битов с их верификацией на лету, аналогично приему старт-бита.
4) если посылка правильная, выставляем флаг.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 30 2008, 11:27
Сообщение #23


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

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



Цитата(_Pasha @ Jul 30 2008, 16:57) *
В общем, как делаю я (скорость до 19200 - больше не проверял.)


Ну в общем всё то же самое, плюс проверка старт-битаsmile.gif. Для случая отсутствия помех это не обязательно.


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

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:17
Рейтинг@Mail.ru


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