Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 05.01.2017, 22:34   #1
Dmitry.P
Junior Member
 
Регистрация: 01.10.2016
Сообщений: 4
Вес репутации: 82/0
Dmitry.P will become famous soon enough
По умолчанию UART MikroC Непонятное поведение

Всех с новогодними праздниками.

Немного предыстории.
Решил я свой небольшой девайсу сделать апгрейд в виде Nextion HMI.

Все начиналось хорошо. Нарисовал интрефес тестовый, и начал внедрять в основной код программы (pic16f886) чтение/отправление данных по уарт.

Сделал в начале кода, автоматическое определение наличия дисплея, в виде посылке цифры на дисплей, а он в свою очередь отправляет ее обратно. Все хорошо работало.

Далее тучи начали сгущаться, появилась следующая функция которая отправляет на этот дисплей еще с десяток переменных для отображения/визуализации.

И вот тут ступор, то что работало изначально. Перестало работать).
Подключил USB-UART, начал слушать что на выходе, дабы определить кто виноват Nextion или контроллер. Вычислил что хандрит контроллер.

Код:
UART1_Write_Text("page page0");
end_tx();
UART1_Write(0x0A);
Delay_ms(1000);

UART1_Write_Text("test_d.val=222");
end_tx();
UART1_Write(0x0A);
Delay_ms(1000);

UART1_Write_Text("t1_vers.txt=ver-1.00");
end_tx();
UART1_Write(0x0A);
Delay_ms(1000);
А на выходе получаем:

page page0яяя
test_d.val=222яяя
яяя

P.S. Пример page page0 команда яяя завершение передачи 0xff 0xff 0xff

Первый две строчки верно, а последняя съедается и перед "яяя", отображается стрелочка.

Если меняешь местами передачи, то другая отображается, но какая то теряется.

Но если убрать функцию в которой отправляется группа переменных, то все (передачи в начале) волшебным образом начинает работать.

Delay и перевод строки, для более наглядного отображения в терминале.

В чем может быть проблема?
Dmitry.P вне форума   Ответить с цитированием
Старый 06.01.2017, 18:11   #2
dosikus
Senior Member
 
Аватар для dosikus
 
Регистрация: 05.06.2007
Возраст: 45
Сообщений: 3,620
Вес репутации: 5909/134
dosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond repute
По умолчанию Re: UART MikroC Непонятное поведение

Зная, что микроС компилятор языка похожего на С, но не С, я бы в первую очередь поинтересовался поддерживает ли это убожество нультерминэйтед стринг, а так же что является терминатором строки для Uart1_Write_Text.
dosikus вне форума   Ответить с цитированием
Старый 06.01.2017, 19:40   #3
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,660
Вес репутации: 5212/158
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: UART MikroC Непонятное поведение

Цитата:
Сообщение от Dmitry.P Посмотреть сообщение
Код:
UART1_Write_Text("page page0");
end_tx();
UART1_Write(0x0A);
Delay_ms(1000);

UART1_Write_Text("test_d.val=222");
end_tx();
UART1_Write(0x0A);
Delay_ms(1000);

UART1_Write_Text("t1_vers.txt=ver-1.00");
end_tx();
UART1_Write(0x0A);
Delay_ms(1000);
А на выходе получаем:

page page0яяя
test_d.val=222яяя
яяя
скорее всего, всё портит этот end_tx(). он выключает ногу передатчика и там сифонит.
надо его (их) убрать
Greg вне форума   Ответить с цитированием
Старый 07.01.2017, 20:42   #4
Ssserge
Member
 
Регистрация: 15.12.2008
Возраст: 42
Сообщений: 57
Вес репутации: 169/34
Ssserge has a spectacular aura aboutSsserge has a spectacular aura about
По умолчанию Re: UART MikroC Непонятное поведение

А что это вообще за end_tx()? Такой функции в стандартных UART-либах MicroC нет.
Ssserge вне форума   Ответить с цитированием
Старый 08.01.2017, 17:23   #5
Dmitry.P
Junior Member
 
Регистрация: 01.10.2016
Сообщений: 4
Вес репутации: 82/0
Dmitry.P will become famous soon enough
По умолчанию Re: UART MikroC Непонятное поведение

end_tx(); это все го лишь завершение передачи
за ней скрывается

Код:
UART1_Write(0xff);
UART1_Write(0xff);
UART1_Write(0xff);
Если разобрать пакет отправлений:

Код:
UART1_Write_Text("page page0"); //передаем page page0
end_tx();                                   //передаем яяя(завершение передачи)
UART1_Write(0x0A);                   //перевод строки
Delay_ms(1000);                       //задержка

UART1_Write_Text("test_d.val=222");
end_tx();
UART1_Write(0x0A);
Delay_ms(1000);

UART1_Write_Text("t1_vers.txt=ver-1.00");
end_tx();
UART1_Write(0x0A);
Delay_ms(1000);
Код:
page page0яяя      //Все верно
test_d.val=222яяя //Все верно
яяя                     //Теряется, вместо этого перед яяя символ(он не копируется)
Мне кажется тут проблема в самом MikroC.
Сегодня буду опять пляски с бубном устраивать.
Dmitry.P вне форума   Ответить с цитированием
Старый 08.01.2017, 19:15   #6
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 46
Сообщений: 1,699
Вес репутации: 1677/68
petrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant futurepetrd has a brilliant future
Отправить сообщение для petrd с помощью ICQ
По умолчанию Re: UART MikroC Непонятное поведение

Цитата:
Сообщение от Dmitry.P Посмотреть сообщение
Мне кажется тут проблема в самом MikroC.
Сегодня буду опять пляски с бубном устраивать.
Не надо с бубном, не тратьте зря время. Если есть опасения, то задайте вопрос на форуме mikroE http://forum.mikroe.com/viewforum.php?f=88 или создайте тикет в их техподдержку http://helpdesk.mikroe.com/index.php?/Default и проблема обязательно решится. Только не забудьте рассказать, чем все закончилось.
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 08.01.2017, 20:49   #7
Dmitry.P
Junior Member
 
Регистрация: 01.10.2016
Сообщений: 4
Вес репутации: 82/0
Dmitry.P will become famous soon enough
Lightbulb Re: UART MikroC Непонятное поведение

Вроде с этой проблемой разобрался.
Блин потратил почти все новогодние праздники на это)

Ему оказывается не нравилась запись типа:

Код:
if (temp==0) {UART1_Write_Text("0"); return;}
Суть вообще обмена данными с nextion, он принимает все данные в ASCII
Соответственно если надо передать туда какую то переменную для отображения/визуализации необходимо отправить что-то вроде.

perem.val=233
где
perem - имя переменной
val - параметр который меняем
233 - значение

(Каждая передача должна заканчиваться 0xFF 0xFF 0xFF)

Итого мы должны отправить следующею посылку:
UART1_Write_Text("perem.val=233яяя")
Но так как у нас значение переменной не статичное, надо слепить эту передачу из разных частей.

Итого выглядит это вот так:

UART1_Write_Text("r_valve.val=");
Send_ASCII(r_Valve);

Функцией UART1_Write_Text отправляем r_valve.val=
Далее берем эту переменную и отправляем в следующею функцию

Код:
void Send_ASCII(unsigned char temp)
{
unsigned char n100, n10, n1;

n100=temp/100;
n10 =(temp-(n100*100))/10;
n1  =(temp-(n100*100))%10;

temp_send(n100);
temp_send(n10);
temp_send(n1);

UART1_Write(0xff);
UART1_Write(0xff);
UART1_Write(0xff);
}
Тут разделяем число на составные части сотни десятки и единицы.

А вот дальше был затык(компилировался без проблем)
Здесь мы эти отдельные числа отправляем в ASCII

это уже рабочая версия
Код:
void temp_send (unsigned char temp)
{
if (temp==0) {UART1_Write(48); return;}
if (temp==1) {UART1_Write(49); return;}
if (temp==2) {UART1_Write(50); return;}
if (temp==3) {UART1_Write(51); return;}
if (temp==4) {UART1_Write(52); return;}
if (temp==5) {UART1_Write(53); return;}
if (temp==6) {UART1_Write(54); return;}
if (temp==7) {UART1_Write(55); return;}
if (temp==8) {UART1_Write(56); return;}
if (temp==9) {UART1_Write(57); return;}
}
Далее завершение передачи
Код:
UART1_Write(0xff);
UART1_Write(0xff);
UART1_Write(0xff);
Может это кто-то видит сделать более простыми инструментами), хотя для меня простота отчасти заключается в понятности и логичности)
Спасибо откликнувшимся.
Dmitry.P вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC16F628A + XC8 непонятное поведение andro_bro Продукция MICROCHIP 29 04.07.2016 13:34
Непонятное поведение Subversion, заколдованная папка DL36 Общетехнические вопросы 0 14.02.2014 23:54
Проблема с прерыванием от UART на ds pic 30f2011 Zlodei Продукция MICROCHIP 2 14.08.2011 01:33
программный uart в mikroc jobdead Продукция MICROCHIP 8 05.12.2008 21:28
Непонятное поведение PIC12F675 и 74HC595. KYV Общетехнические вопросы 10 12.09.2007 16:54


Часовой пояс GMT +3, время: 02:35.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot