Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
_VoRoN_
Есть МК AT89S8252 и есть задача, в соответствии с которой необходимо получать байт данных по последовательному каналу, а затем сразу же его передавать, т.о. образом получается как бы буфер. Скорости обмена: 9600, 38400 и 115200.
Частота кварца 22118,2 кГц (хотя пробывал и на 24000кГц).
Проблема состоит в следующем: отказывается правильно работать с данными на скорости 115200. Хотя, на 9600 работает нормально (ошибки 5%), а на 38400 просто работает (ошибки ~20%). Если судить по осциллографу, то получается что передаваемые МК данные искажены по сравнению с поступающими на вход Rx. Следствие это ошибки при приеме или передаче, или в обоих случаях определить не удалось. Такое ощущение, что просто не попадаю с частотой, но данные беру из даташитов, да и вычислениями проверял - все сходится. И что я только не пробывал, результата нет.
Вот примеры, как я инициализирую UART и настраиваю скорость обмена:

Версия для Т1:

SCON=0xd8; //reg. UART - 3, razr. priema., 9-i bit=1
TMOD=0x21; //T1 - reg.2, T0 - reg.1
TCON=0;
PCON=0x80; //skorost` *2
TL1=TH1=0xff; //115200
TR1=1; //run timer UART
IP=0;
IE=0x90; //Global, UART

Версия для Т2:

T2MOD = 0x00;
PCON = 0x80; //бит SMOD. Удвоение скорости обмена UART
SCON = 0xd8; //настройка UART. Режим 3 - 9-бит, разрешение приема, 9-й бит=1
TH2 = RCAP2H = 0xff; //загрузка Т2 исходя из выбранной скорости обмена-115200
TL2 = RCAP2L = 0xfa; //
T2CON = 0x30; //настройка Т2. Т2-задающий генератор UART
TI=RI = 0; //cброс флагов прерывания UART
TR2 = 1;
//настройка прерываний
IE = 0x90; //Общее, UART

Были попытки синхронизировать прием и передачу от разных таймеров (Т0 и Т1), результат опять же отрицательный.
Если кто-нибудь чем нибудь сможет помочь, буду очень благодарен help.gif
lks
Цитата(_VoRoN_ @ Aug 11 2006, 09:15) *


мне приходилось программировать этот МК на скорости 9600 - проблем не было.
можно попробовать вместо резонатора поставить внешний генератор тактовых сигналов и посмотреть насколько это влияет на ошибки.
и второй путь - попробовать поставить качественный компаратор прямо перед входом Rx.
Есть еще один путь - попробовать реализовать канал программным путем - я так один раз делел. Подать на вход линии прерывания INT1 (допустим) и еще на другой любой вход - сигнал Rx. После прихода стартового бита и перехода по прерыванию - обрабатываете эту ситуацию программно. Преимущество в том, что можно задержки немного "подвигать туда-сюда".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.