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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 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,539
Вес репутации: 5510/128
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,578
Вес репутации: 5056/154
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/33
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
Адрес: Воронеж
Возраст: 45
Сообщений: 1,643
Вес репутации: 1486/65
petrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud of
Отправить сообщение для 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 вне форума   Ответить с цитированием
Старый 08.01.2017, 21:49   #8
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 45
Сообщений: 1,643
Вес репутации: 1486/65
petrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud of
Отправить сообщение для petrd с помощью ICQ
По умолчанию Re: UART MikroC Непонятное поведение

Цитата:
Сообщение от Dmitry.P Посмотреть сообщение
Код:
if (temp==0) {UART1_Write_Text("0"); return;}
Ааааа! Уважаемый Вам на ТНТ надо, экстрасенсы там живут.
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 08.01.2017, 23:02   #9
Dmitry.P
Junior Member
 
Регистрация: 01.10.2016
Сообщений: 4
Вес репутации: 82/0
Dmitry.P will become famous soon enough
По умолчанию Re: UART MikroC Непонятное поведение

Извиняйте, поторопил. Проблема не решена(.
Все по прежнему осталось. Как только раскоментил все переменные для передачи.

Написал на форум mikroe, жду одобрения модератора.
Dmitry.P вне форума   Ответить с цитированием
Старый 10.01.2017, 16:18   #10
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 45
Сообщений: 1,643
Вес репутации: 1486/65
petrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud ofpetrd has much to be proud of
Отправить сообщение для petrd с помощью ICQ
По умолчанию Re: UART MikroC Непонятное поведение

Цитата:
Сообщение от Dmitry.P Посмотреть сообщение
Написал на форум mikroe, жду одобрения модератора.
Были некоторые сомнения с самого начала. А теперь увидел на mikroe Ваш код, который подтвердил мои сомнения.
Для такого написания кода типа
Код:
UART1_Write_Text("t1_vers.txt=ver-1.00");
и для такого количества переменных по моим подсчетам с памятью данных в 886 быстро должны были начаться проблемы, что и подтвердилось при компиляции:
Код:
0 1511 IRP bit must be set manually for indirect access to '?lstr3_set_timer' variable set_timer.c
0 1511 IRP bit must be set manually for indirect access to '?lstr4_set_timer' variable set_timer.c
а вот дальнейших действий по манипуляции IRP не видно. Не очень приятная особенность архитектуры PIC16. Но Вы на это не обращаете внимание. Это проблема программиста, а не компилятора. Надо переделывать программу или менять контроллер на PIC18 или на вообще не PIC.
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 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, время: 16:26.


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