|
Проблема с софтовым UART на Mega8, Проблема с софтовым UART на Mega8 |
|
|
|
Jul 29 2008, 18:18
|

фанат дивана
     
Группа: Свой
Сообщений: 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 бит выехать за пределы бита?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 29 2008, 19:03
|

кекс
     
Группа: Свой
Сообщений: 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% приемник, и настолько же передатчик от заданной.
|
|
|
|
|
Jul 29 2008, 19:56
|

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

|
Цитата(defunct @ Jul 30 2008, 01:03)  Не мизер, если имеются другие обработчики прерываний. Ну это конечно. Для больших скоростей придётся отключить  Цитата Ну не стоит так громко. Как минимум возможна погрешность в полтакта. На низких скоростях конечно чепуха, а на высоких (115200) это почти 1%. Это уже придирки. Естественно, говоря "отсутствует", я имел в виду - с точностью до такта процессора. И не 1%, а менее 0.5%, ибо полтакта  Цитата Насчет ICR, это конечно здорово если он есть, а там где нет? Там просто не получится достичь таких скоростей. С другой стороны, в MSP-шке ещё лучше, там можно аппаратно захватывать состояние ноги ICP по прерыванию сравнения. То есть, время входа в прерывание не имеет значения (в пределах длины бита ессна). Цитата Не бита, а половины бита (читаем же по-середине). Всего лишь на 2.5% приемник, и настолько же передатчик от заданной. Всё же битов не 10, а 8.5. Потому запас побольше выйдет  Короче, моё имхо - работать на 115.200 должно (96 МЦ на бит), хоть и с напрягом. А не работает скорее всего из-за протеуса.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 29 2008, 20:36
|

кекс
     
Группа: Свой
Сообщений: 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. Потому запас побольше выйдет  Все же битов 10. Или первый интервал в 1.5 бита вы не считаете? От того что вы его не считаете, он никуда не делся (его ошибка ничем не скомпенсирована). Цитата Короче, моё имхо - работать на 115.200 должно (96 МЦ на бит), хоть и с напрягом. А не работает скорее всего из-за протеуса. Может быть. Не обратил внимания, что тестирование на протеусе сделано ;>
|
|
|
|
|
Jul 29 2008, 21:10
|

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х. Вы снова готовы принимать байты. Ну, вроде всё, должно помочь горю. Держите нас в курсе.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 29 2008, 21:23
|

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

|
Цитата(defunct @ Jul 30 2008, 02:36)  Почему же не получится. Без всяких ICR - пускаем 8-ми битный таймер на 5-ти кратной частоте UART'a... Я так тоже делаю, только на 4-кратной. Когда надо быстрее, то обхожусь 3-кратной  Плюс ещё в том, что работает на всех контроллерах. Но с ICR-то получше всё же. Цитата Можно обслуживать сразу несколько каналов. Никаких телодвижений с таймером - один раз заправили и забыли. Ну да, только скорость пропорционально уменьшится. Цитата Тратить серьезный таймер на один UART, гм... ;> Ну он там не целиком, всего один модуль захвата/сравнения из кучи Цитата Все же битов 10. Или первый интервал в 1.5 бита вы не считаете? От того что вы его не считаете, он никуда не делся (его ошибка ничем не скомпенсирована). Ошибка копится не на битах, а на интервалах  А интервалов - 8.5 (полуторный до середины первого бита + 7 одинарных). Стоп-бит меня не интересует, ибо пока не придёт единица, захвата следующего старт-бита не произойдёт. Цитата Может быть. Не обратил внимания, что тестирование на протеусе сделано ;>
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 30 2008, 10:57
|
;
     
Группа: Участник
Сообщений: 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) если посылка правильная, выставляем флаг.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|