Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема UART на ADuC814
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
хардварщик
Всем привет.

Дело в следующем, есть схема на aduc814, нужно в нее "вдохнуть душу".
Одна из функций - связь с сервером, грубо говоря нужно выплюнуть пакет из 8 байт по запросу. Но выплюнуть быстро, то есть задержка как в коде ниже неприемлема.

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

Кстати,
1. дело не в приемнике(сервере), т.к. судя по осциллографу выплевываются а) именно 4 байта и б) без разрыва между ними.
2. при изменении длины посылки ситуация не меняется - теряются байты м-у 3-м и последним
3. пробовал "вестись" от T0/T1 - та же фигня.
4. симулятор ничего такого не обнаруживает.


Что это за фокусы?? Помогите, плз!!! help.gif
Склоняюсь к мысли написать эмулятор хотя это смахивает на мазохизм sad.gif


тестовый код:
------------
void main (void)
{
char i;

//частота 16М
PLLCON = 0;

//таймер2, данные из даташита, стр.56
RCAP2H = 0xFF;
RCAP2L = 0xC9;
TH2 = 0xFF;
TL2 = 0xC9;
//запуск таймера2
T2CON = 0x34;

//таймер1
SCON = 0x52; //почему без него не работает???

//прерывания
ES = 1;
EA = 1;


for (i=0;i<8;i++)
{
SBUF = i;
while(!TI);
}

while(1);
}


void UART_INT(void) interrupt 4
{
// unsigned int i;
TI=0;

//если тут ввести задержку ~0.1с, работает нормально
// for (i = 0; i < 1500; i++);
}
------------
хардварщик
сорри, маленько ошибся босле бессонной ночи sad.gif
Должно быть EA=0, тогда по идее все должно работать. Но не работает.
KRS
Так у вас в прерывании флаг чиститься, а в основной программе проверяется!
Если прерывание быстрей очистит, то while(!TI); зациклится

Раз вы работаете полингом, надо убрать преывание и перенсти его код, за while(!TI);
Код
for (i=0;i<8;i++)
{
  SBUF = i;
  while(!TI);
  TI = 0;
}
хардварщик
Спасибо за ответ.
Почему-то не сработало уведомление 07.gif

Кстати, я поправился - все прерывания запрещены (ЕА=0), а вот вопрос ждать до или после открыт. Я выбрал после, т.к. 1) это тестовый пример, и 2) ожидание TI=1 ДО передачи попросту завесит MCU, потому что TI=0 сначала. Теоретически. Надо проверить.


Короче, стыдно признаваться, что я так и не понял в чем дело, но в один прекрасный момент все заработало на ура при любой длине пакета, т.е. как надо.
Правда, в принципе теперь реализация именно "с точностью до наоборот": время от времени проверяется TI, если 1, сбрасываю и передаю очередной байт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.