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

 
 
> проблема UART на ADuC814
хардварщик
сообщение May 19 2007, 06:55
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 19-05-07
Пользователь №: 27 824



Всем привет.

Дело в следующем, есть схема на 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++);
}
------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
хардварщик
сообщение May 19 2007, 12:05
Сообщение #2





Группа: Новичок
Сообщений: 5
Регистрация: 19-05-07
Пользователь №: 27 824



сорри, маленько ошибся босле бессонной ночи sad.gif
Должно быть EA=0, тогда по идее все должно работать. Но не работает.
Go to the top of the page
 
+Quote Post
KRS
сообщение May 21 2007, 10:40
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Так у вас в прерывании флаг чиститься, а в основной программе проверяется!
Если прерывание быстрей очистит, то while(!TI); зациклится

Раз вы работаете полингом, надо убрать преывание и перенсти его код, за while(!TI);
Код
for (i=0;i<8;i++)
{
  SBUF = i;
  while(!TI);
  TI = 0;
}
Go to the top of the page
 
+Quote Post
хардварщик
сообщение Jun 1 2007, 05:22
Сообщение #4





Группа: Новичок
Сообщений: 5
Регистрация: 19-05-07
Пользователь №: 27 824



Спасибо за ответ.
Почему-то не сработало уведомление 07.gif

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


Короче, стыдно признаваться, что я так и не понял в чем дело, но в один прекрасный момент все заработало на ура при любой длине пакета, т.е. как надо.
Правда, в принципе теперь реализация именно "с точностью до наоборот": время от времени проверяется TI, если 1, сбрасываю и передаю очередной байт.

Сообщение отредактировал хардварщик - Jun 1 2007, 05:22
Go to the top of the page
 
+Quote Post

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

 


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


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