Цитата(lancode @ Nov 21 2008, 00:23)

Ага. Инициализация была пропущена. Я не заметил
Сейчас результы работы UART такие:
Тестировал прием данных на порты по-отдельности:
Порт P1.0 и P1.1 принимают данные без ошибок.
Порт P1.2 - не получается правильно принять данные. Прерывание вызывается, обрабатывается, но что-то работает неверно - байты искажаются.
Нашел ошибку при копировании, необходимо исправить:
Код
{
SBUF2sr_temp>>=1;
SBUF2sr_tempMSB=Rx2sft_pin;
switch(RX0_state)//здесь ошибка!!! должно быть RX2_state
Цитата
Соединил перемычкой P1.0 и P1.1. Хотел таким образом протестировать одновременный прием данных по обоим линиям.
На P1.0 все в порядке, а на P1.1 - неверные данные.
Пока нет возможности протестировать одновременный прием разных данных на все порты, но потом я это сделаю.
Перещелкивание пинов, которое использовалось для отладки на осцилографе я удалил. Больше не знаю как можно оптимизировать по скорости.
Так я и знал

. После того как запостил, подумал-подумал и вот что приходит на ум. Если на каждую обработку бита уходит по 2.5 мкс, а длительность бита около 8 мкс, то при одновременном приеме приемник №1 (и тем более №2) обновляют свои счетчики (PCA0CPх+=HALFBITTIME;)на это время позднее (для №2 это вообще больше 5мкс). Поэтому эти процедуры нужно как-то вынести в самое начало обработчика прерывания, однако это увеличит длительность обработки. Стоит ли это делать, все равно в некоторых ситуациях при ПОЧТИ одновременном приеме возможна задержка обработки в максимуме почти на это-же время и, соответственно, срыв синхронизации. Улучшить ситуацию можно (кажется так и сделано в апноте), если не считывать стартовый бит, а после фронта старта отсчитывать 1,5 длительности бита до первого бита данных. Тогда максимально узкое место по времени будет 8мкс - длительность 1 бита, а не 4мкс - длительность 0,5 бита. Чуть ухудшится помехозащищенность, но она и так никакая, так что ничего страшного

. Вобщем, как-то мне страшновато стало 3 приемника, 2 я думаю, можно потянуть, был бы камень побыстрей, тогда...
А вот замкнуть два входа приемников я не догадался

, а сейчас кит использован, не начем погонять

Цитата
Подозреваю что прием работает неправильно из-за вот этих настроек:
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xe9;
sfr16 PCA0CP2=0xeb;
Я не понял почему задержки именно такие. Каким образом они вычислялись? Попробовал эксперементально подобрать числа - не получилось.
Это не задержки, это адреса модулей, чтобы с ними можно было общаться как с 16битным числом, подробнее почитайте в "Cx51 Compiler" (у меня файл называется "c51.pdf") - возможно он есть и у Вас на компе. Поставляется вместе с кейлом, либо в нете легко найти. Только обратите внимание, что они хранятся не в том порядке байтов, как обычный "int", но это так, на будущее.
Цитата
ps. Можно ли принимать данные на разных скоростях? Например на одном порту 115200, на другом - 9600, а на третьем - 19200. Пока мне это не нужно делать, просто интересная идея возникла.

конечно разные скорости возможны. Для этого вводить не одно определение #define BITTIME (SYSCLK/BAUDRATE), а соответствующие. Главное, чтобы не получилось больше 65536, Т.е. в нашем случае минимальный бодрейт получается 366 бит/с. Если переделать, что на старте отсчитывать 1,5 бита, получим 549.