Easyelectronics.ru

Электроника для всех
Текущее время: 24 сен 2019, 01:16

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
 Заголовок сообщения: Вывод текста на символьный дисплей
СообщениеДобавлено: 19 авг 2014, 22:33 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Как бы поизящнее текст выводить? Пока стандартные либы не использую, так как сразу идет расход флеша и ОЗУ. На данный момент я пока парюсь так:
Код:
// *.h

//========================================================================
extern void _PrintFStr (u08 x, u08 __flash *ptr );
#define PrintFStr(y, x, ptr) _PrintFStr(((y)-1)*MaxX+((x)-1), (ptr))
//========================================================================

extern u08 __flash MsgTeny [];

// *.c

//========================================================================
void _PrintFStr (u08 x, u08 __flash *ptr)
{
   while (*ptr)
   {
      dsp_buf[x] = *ptr;
      ptr++;
      dsp_buf [x++];
   }
      init_dsp_buf ();
}
//========================================================================

u08 __flash MsgTeny [] =                      "ТЭНЫ";

// Пример использования:
   PrintFStr (2, 2, MsgTeny);


Хотелось бы что-то вроде:
Код:
   PrintFStr (2, 2, "ТЭНЫ");


Кто что подскажет?


Последний раз редактировалось demiurg1978 20 авг 2014, 20:49, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 00:57 
Заглядывает иногда

Зарегистрирован: 15 июл 2014, 15:27
Сообщения: 124
Цитата:
dsp_buf [x++];
А что должна делать такая конструкция?
Цитата:
init_dsp_buf ();
что это, вывод строки disp_bus на экран? Почему бы не переписать эту процедуру с учетом различного расположения входной строки, чтобы избежать одного лишнего копирования?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 02:10 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
demiurg1978 писал(а):
Код:
extern void _PrintFStr (u08 x, u08 __flash *ptr)
{
  ... ...
}

... ...

// Пример использования:
   PrintFStr (2, 2, MsgTeny);
Кто что подскажет?
Пример использования функции не соответствует её прототипу.
Спецификатор "extern" в определении функции лишний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 06:16 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
COKPOWEHEU писал(а):
Код:
dsp_buf [x++];

А что должна делать такая конструкция?

Э-э-з, написано давно, с тех пор не заглядывал. Уже не помню, почему именно так написал. Конечно, нужно так:
Код:
x++;


COKPOWEHEU писал(а):
Код:
init_dsp_buf ();

что это, вывод строки disp_bus на экран?

Так как идет обновление ЖКИ посимвольно раз в 1 мс (полное обновление при 20х4 раз в 84 мс), чтобы после вывода в буфер ЖКИ не с какой-то части дисплея начало показывать, а сначала.

AlexPM писал(а):
Пример использования функции не соответствует её прототипу.

Все соответствует:
Код:
#define PrintFStr(y, x, ptr) _PrintFStr(((y)-1)*MaxX+((x)-1), (ptr))

AlexPM писал(а):
Спецификатор "extern" в определении функции лишний.

???

Гхаспада! Критикуя, предлагайте. По моему вопросу ни слова...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 06:29 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Вспомнил. Я тогда то ли экспериментировал, то ли что-то не работало. Скомпилировал и проверил, работает:
Код:
//========================================================================
extern void _PrintFStr (u08 x, u08 __flash *ptr)
{
   while (*ptr)
   {
      dsp_buf [x++] = *ptr;
      ptr++;
//      dsp_buf [x++];
   }
      init_dsp_buf ();
}
//========================================================================


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 06:45 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
extern значит что функцию щас откуда нибудь импортируют, а не напишут здесь же.
Зачем обновлять посимвольно жки каждую мс и почему строки во флеше?
Код:
void print_lcd(u08 x, u08 y, char * data)
{
   u08 i;
   u08 len = strlen(data);//или sizeof
   setXY(x,y);
   for(i = 0;i < len;i++)
   {
      send_to_lcd(data[i]);
   }
}

вопрос четко сформулируйте, а то гадать что вам нужно можно долго.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 06:58 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
celeron366 писал(а):
extern значит что функцию щас откуда нибудь импортируют, а не напишут здесь же.

Именно. Прототип в одном файле, функция используется в другом.

celeron366 писал(а):
Зачем обновлять посимвольно жки каждую мс и почему строки во флеше?

Как бы ни защищали по питанию ЖКИ, в условиях промышленного применения возможно засерание ОЗУ ЖКИ мусором. Если дисплей не обновлять, он начинает местами показывать кракозябры. Полное обновление занимает много времени. Ну а так как мне не мультики выводить, посимвольно, раз в 1 мс. 1 мс это дискретность системного таймера.
Строки во флеше для экономии флеша и ОЗУ, возможности выводить текст на МК с маленьким объемом флеша.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 07:43 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
celeron366 писал(а):
...

Чувак! Дай пять! Пожму тебе лапу. Благодарю! Усе получилось. Теперь станет проще жить. Есть же разница?
Код:
//   show_msg_heat ();                                  // НАГР.
//   show_msg_form ();                                  // ФОРМ.
//   show_msg_pnevm ();                                 // ПНЕВМ.

   Print_Buf (2, 1, "НАГР");
   Print_Buf (3, 1, "ФОРМ");
   Print_Buf (4, 1, "ПНЕВ");


На скору руку сляпал на основе твоего примера:
Код:
extern void _Print_Buf (u08 x, char *data );
#define Print_Buf(y, x, data) _Print_Buf(((y)-1)*MaxX+((x)-1), (data))

void _Print_Buf (u08 x, char *data)
{
   u08 i;
   u08 len = strlen (data); //или sizeof

   for (i = 0; i < strlen (data); i++)
   {
      dsp_buf [x++] = data [i];
   }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 08:47 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Ай не нарадуюсь, теперь хоть код стал более-менее выглядеть. Сразу понятно, где какой текст выводится.
celeron366 писал(а):
...

Слушай, строка же нулем заканчивается, почему у тебя нет проверки на ноль? Вместо strlen?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 08:55 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Ну, все правильно, строка нулем заканчивается.
Код:
void _Print_Buf (u08 x, char *data)
{
   u08 i = 0;
//   u08 len = strlen (data); //èëè sizeof

//   for (i = 0; i < strlen (data); i++)
   while (data [i])
   {
      dsp_buf [x++] = data [i++];
   }

   init_dsp_buf ();
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 11:04 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
demiurg1978 писал(а):
Код:
   Print_Buf (2, 1, "НАГР");
   Print_Buf (3, 1, "ФОРМ");
   Print_Buf (4, 1, "ПНЕВ");


А на АРВ разве эти строки во флеш уйдут? Я думаю нет, будут в оперативу подгружаться и место занимать.
Код:
   for (i = 0; i < strlen (data); i++)
{
      dsp_buf [x++] = data [i];
}

так лучше не делать. В цикле вызывать функцию strlen не эффективно.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 12:26 
Старожил

Зарегистрирован: 05 апр 2012, 16:47
Сообщения: 402
Откуда: Киев
да, они будут подгружаться в ОЗУ.

кстати, а так не проще записать? хотя я не вкурил что такое init_dsp_buf (); и зачем эта функция.

void _Print_Buf(char* data)
{
while(*data) dsp_buf++ = *data++;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 13:07 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
Kino писал(а):
кстати, а так не проще записать? хотя я не вкурил что такое init_dsp_buf (); и зачем эта функция.

void _Print_Buf(char* data)
{
while(*data) dsp_buf++ = *data++;
}

Да это по сути тоже самое, что и выше написано. Только хуже читается.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 13:20 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
demiurg1978 писал(а):
celeron366 писал(а):
extern значит что функцию щас откуда нибудь импортируют, а не напишут здесь же.
Именно. Прототип в одном файле, функция используется в другом.
С этой целью "extern" приписывают к прототипу (объявлению) функции - в хедере или в месте использования функции в другом сишнике.
Но у Вас "extern" вписан прямо в саму функцию, в её определение. Вот это лишнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 13:24 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Йопт, забыл совсем про этот момент. Весь текст у меня в ОЗУ (: Только что прошелся по всему проекту, переделывал, скомпилировал и увидел в симуляторе. Кто решал в IAR? Как реализовать, чтобы во flash текст был?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 13:30 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
AlexPM писал(а):
"extern" вписан прямо в саму функцию, в её определение. Вот это лишнее.

Только сейчас обратил внимание. Функция была написана несколько месяцев назад. Копипастил из *.h Забыл extern убрать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 13:34 
Старожил

Зарегистрирован: 05 апр 2012, 16:47
Сообщения: 402
Откуда: Киев
так как у вас в первом посте. сначала объявить, потом вызывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 13:53 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Все, решил.
Options - C/C ++ Compiler - Extra Options. Поставить галочку Use command line options. И вписать:
--string_literals_in_flash

Код:
// *.h
extern void _Print_Buf (u08 x, char __flash *data);
#define Print_Buf(y, x, data) _Print_Buf(((y)-1)*MaxX+((x)-1), (data))

// *.c
void _Print_Buf (u08 x, char __flash *data)
{
   u08 i = 0;

   while (data [i])
   {
      dsp_buf [x++] = data [i++];
   }

   init_dsp_buf (); // Эта строка для меня, не обращайте на нее внимания.
}

   Print_Buf (4, 1, "СТОП");


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 19:47 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
demiurg1978 писал(а):
Слушай, строка же нулем заканчивается, почему у тебя нет проверки на ноль? Вместо strlen?

strlen Это функция из библиотеки string.h возвращает размер строки до нуль терминатора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вывод текста на символьный дисплей
СообщениеДобавлено: 20 авг 2014, 19:55 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
celeron366 писал(а):
strlen Это функция из библиотеки string.h возвращает размер строки до нуль терминатора.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB