Xmega: Работа с дисплеем Winstar WH1602 на контроллере HD44780

Posted by Reason89 | Posted in , ,

 
    Разъяснять о дисплее ничего не буду, информации в сети просто уйма. Самый распространенный контроллер для LCD. Дисплее встретить можно везде и повсеместно. На момент подписания подобные дисплее 16х2 можно с китая заказать за 90 рублей за штуку.
    Подключаются все практически однотипно, единственный косяк есть в том что у некоторых моделей VCC и GND поменяны местами, если перепутать сгорает моментально.
    Изучал подобный дисплей еще в универе, тогда было проще) Макетка заранее настроена, все библиотеки подключены, печатаешь все согласно методичке и все работает)
    Решил подключить сей девайс к Xmega. Как подключать, включать подсветку, настраивать контрастность и выводить кириллицу найти не проблема.
    Моя первая и главная ошибка была в том, что я много времени убил на поиск готовой библиотеки, которых на самом деле не мало. Нашел даже для контроллеров Xmega Но любые попытки подключить уже что то готовое разбивались в пух и прах. То компилятору что то не нравилось, то не хватало какой то библиотеки и.т.д. В итоге плюнул, освоил с нуля документацию и начал писать сам. Совету вчитаться в команды и расшифровать их, а не в лоб использовать готовые.
 
    Второе на что следует обратить внимание это то, что дисплей мягко говоря заторможен. После любой отправленной ему команды необходимо выдерживать приличную паузу.
Смотрите даташит и ставите с запасом и не прогадаете.
Ну и собственно несколько функций для приятной работы по 8 битной шине данных:
Пытался выложить по как обычно через виджет, но он исковеркал код до неузнаваемости, итого выложу так.

Включение преобразований c типом float в Atmel Studio

Posted by Reason89 | Posted in , , ,

    На днях столкнулся с проблемой вывода числа с плавающей запятой на LCD дисплей WH1602.
    При преобразовании обычного десятичного числа, на LCD выводилось все как нужно.
long int Temp = 0x7777;
char st_Temp[6] = "";
itoa(Temp, st_Temp, 10);
LCD_Data(st_Temp[0]);
LCD_Data(st_Temp[1]);
LCD_Data(st_Temp[2]);
LCD_Data(st_Temp[3]);
    После преобразования в число с плавающей  запятой на WH1602 выводился знак вопроса и ряд пробелов.
long int Temp = 0x7777;
char st_Temp[10] = "";
float Temp_float = 0;
Temp_float = (float)Temp / 100; 
sprintf(st_Temp, "%01.2f", Temp_float );
LCD_Data(st_Temp[0]);
LCD_Data(st_Temp[1]);
LCD_Data(st_Temp[2]);
LCD_Data(st_Temp[3]);
LCD_Data(st_Temp[4]);
LCD_Data(st_Temp[5]);
    После долгих поисков проблемы, скачал DEV C++ и скомпилировал проект там с выводом в консоль. Все вывелось, как и было задумано.
    Получается проблема была в компиляторе Atmel Studio. Версия была у меня 6.0.1703
    Так как контроллеры Atmel сами по себе не умеют работать с числами с плавающей запятой, то такие преобразования выполняются сугубо программно.
    Функции преобразования типа float, такие как sprintf, ftoa, snprintf и.т.д. отнимают много ресурсов контроллера от того их использовать не рекомендуется и они по умолчанию отключены в Atmel Studio.
    Можно  постоянно делить число 10, и проверять результат деления больше или меньше он 10. Чтобы своевременно самому выставить запятую, но для этого нужно городить несколько циклов и условий, а в ресурсах МК я не был ограничен.
     Потому для решения проблемы я скачал Atmel Studio 6.2( в 6.0.1703 такие опции я не нашел).
    Переходим на вкладку параметров проекта ALT+F7.
    В меню AVR/GNU linker- General клацаем галочку на против Use vprintf library
     Затем в AVR/GNU linker- Library добавляем 2 библиотеки: printf_flt и scanf_flt
    Компилируем проект, получаем пару предупреждений об использовании типа float и собственно все. На LCD результат выводит с плавающей запятой.