Свежие обсуждения
Микроконтроллеры

Непрерываная передача данных через UART PICа

1 2

Делаю приставку, которая отображает текстовую информацию, отправленную с ПК.
Прошивку пишу на С (PIC-CCS).
Возникла проблема.
Если в порт (к МК) посылать отдельные байты, то программа отлично работает, но если послать подряд несколько байт (без задержки между байтами), то МК зависает (где - понять не могу, но в разных функциях премма и обработки данных зависает одинаково). После этого МК не реагирует на новые байты из ПК и ничего не шлет в ответ.
Подряд принимает 4-5 байт и зависает.
Это отлаживается на макете (PIC16F877A), где есть только дисплей (AC162*) и преобразователь уровней на базе MAX232.
Изменение скорости (2400, 9600) на ситуацию никак не влияет.

У меня возникает мысль, что базовые библиотечные функции не успевают обрабатывать приятые байты...
Кто-нибудь на Си принимал подряд пару десятков байт с таким компилятором?

 

Приложите архив с проектом. Вставьте контрольные точки в прогу по этому методу и сразу найдете где прога у вас виснет.

 

да, правильно. Происходит переполнение буфера приема (OERR=1)
вот только почему... ведь на скорости 9600бит/с МК успевает выполнить 833 инструкции...

Да и сам код предельно простой:
unsigned char Ch,i;
unsigned char buffer[64];
.....
Ch=getch();
i=0;
while (Ch!=0)
{ if (Ch>47) buffer[i]=Ch;
Ch=getch();
i++;
if (i>63) break;
}

Karados: и сразу найдете где прога у вас виснет
когда бит OERR устанавливается в "1" прием информации прекращается. Завтра попробую сбрасывать этот бит, но это не выход. Теряются байты

 

Лучше приложите весь исходник, ошибка-то не обязательно в этом куске может быть. Кстати, уже видна одна проблема - i++ нужно тоже делать в теле if

 

chav1961: i++ нужно тоже делать в теле if
нет. Здесь считается вся принятая информация.
Эта же проблема возникает и в других местах программы, как только начинает передаватся от ПК несколько байт без паузы между ними. Такое ощущение, что обработка принятой информации библиотечными функциями компилятора занимает очень много времени.

 

А для чего тогда пропускать ее запись в буфер? Получается, что если код символа больше 47, мы в буфер заносим принятый символ, а если код меньше, мы в буфере оставляем неведомую фигню. I-то у Вас в любом случае сдвигается!

 

это кусок для отладки, изначально там вместо "buffer[i]=Ch" байт выводился сразу на ЖК.
Сейчас содержимое буфера выводится на экран ниже по тексту и "if (Ch>47)" снова повторяется. Согласен можно и убрать " if (Ch>47)". Но дело сейчас не в этом.

Моих прерываний нету.
Если создать небольшую задержку между байтами - информация нормально принимается.

 

Сергей, давайте все-таки весь исходник. Вывод на экран тоже не мгновенно делается. Не исключено, что проблема где-то в другом месте.

 

исходник будет позже.

chav1961: Вывод на экран тоже не мгновенно делается
поэтому я вывел функцию вывода на дисплей за пределы цикла.

 

Сергей, ради интереса попробуйте вот такой трюк:

getch(); // И так раз двадцать...
getch();
...
Ch = getch();
if (Ch == 0xAA) вывести на ЖКИ "ДА"; else вывести на ЖКИ "НЕТ"

Потом выплюньте в контроллер 20 байт 0xAA без пауз. Если дойти до вывода на ЖКИ не удастся - меняйте компилер или вставляйте ассемблерный кусок. Удастся - разбирайтесь с программой.