Ошибка вывода на LCD

В этот форум переносятся темы из форума "Новые" которые при рассмотрении модератором или автором признанны либо не верными, либо ошибочными.
Ответить
Аватара пользователя
eugeneb
Лейтенант
Сообщения: 481
Зарегистрирован: 15 авг 2016, 11:20
Откуда: Нижний Новгород
Имя: Евгений

Ошибка вывода на LCD

Сообщение eugeneb »

Простая программка - беру данные с потенциометра,
масштабирую до 0..255 и вывожу на I2C LCD-дисплей с центрированием.

[spoiler=Спойлер][/spoiler]
Вывожу в две разные строки, но это не принципиально.

Так вот, ежели беспорядочно крутить потенциометром, то иногда,
как я понял, при увеличении количества отображаемых разрядов с одного до двух, с двух до трёх),
появляется паразитный символ. Обычно '0'. Но иногда и '1' и '2' и '3'.







Эффект проявляется только при включенном центрировании.
Наверное ошибка в нём. Или где-то рядом.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Evgesha
Лейтенант
Сообщения: 525
Зарегистрирован: 29 окт 2015, 09:57
Откуда: Kazakhstan
Имя: Evgesha

Ошибка вывода на LCD

Сообщение Evgesha »

eugeneb, какую версию ide используете? такое замечал если использовал выше 1.6.3.
Последний раз редактировалось Evgesha 11 ноя 2016, 19:14, всего редактировалось 1 раз.
ПОМОЩЬ ПРОЕКТУ FLPROG:
http://flprog.ru/pomoshh-proektu/
Аватара пользователя
eugeneb
Лейтенант
Сообщения: 481
Зарегистрирован: 15 авг 2016, 11:20
Откуда: Нижний Новгород
Имя: Евгений

Ошибка вывода на LCD

Сообщение eugeneb »

Эх, неудачно я задвинул пост под выходные... Это всё у меня
на работе. А на память я не помню.

Предположительно 1.0.5
Но точно буду знать в понедельник.

Так, так, вы навели меня на мысль...

Я упростил схему - убрал масштабирование.
Вот кусочек кода из loop(), который генерит FLProg:



Код: Выделить всё

if (1) {
    _dispTempLength1 = (((String( (analogRead (0)), DEC)))).length();
    if (_disp1oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp1oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0);
    _lcd1.print(((String( (analogRead (0)), DEC))));
  } else {
    ...
  }
Мы видим, что в каждом цикле аналоговый вход читается дважды:
- один раз чтобы определить длину строки и принять
решение о зачистке места;
- второй раз, чтобы её вывести.

И если между этими двумя чтениями длина строки изменится в большую сторону, то и случается сдвиг.

Ещё раз, проигрываем программу:
Потенциометр крутим вверх.

Цикл N
1. Прочитали первый раз строку. Строка "99". Её длина - 2.
2. Эта длина не меньше предыдущей, допустим "98". Решение о зачистке места не принимается.
3. Вычисляем начальную позицию курсора
{16-2}/2=7
4. Повторно читаем входную строку. Она уже "100".
5. Печатаем "100" с седьмой позиции. Занимаются позиции 7, 8 и 9.

Цикл N+1
1. Прочитали первый раз строку. Строка "110". Её длина - 3.
2. Эта длина не меньше предыдущей. Решение о зачистке места не принимается.
3. Вычисляем начальную позицию курсора
{16-3}/2=6
4. Повторно читаем входную строку. Пусть она по-прежнему "110".
5. Печатаем "110" с шестой позиции. Занимаются позиции 6, 7, 8.

А в девятой позиции остался '0' с предыдущего цикла!
Получаем картинку как на второй фотографии.
И он там останется на все последующие циклы, пока не уменьшится длина строки и будет принято решение о зачистке места. Или не произойдёт более
удачное увеличение длины строки.

Выводы пока делать не берусь. Надо обдумать.

Автор?

Добавлено (11.11.2016, 20:42)
---------------------------------------------
P.S. А на счёт версии IDE я обшибся. Это в системе
стоит 1.0.5. А в FLProg как у всех - 1.6.4. Это же виртуальная машина
alikshk
Рядовой
Сообщения: 40
Зарегистрирован: 13 апр 2016, 19:43
Откуда: Рогачёв

Ошибка вывода на LCD

Сообщение alikshk »

Один компилирован вFlprog 2.1, а второй в 1.14. К чему подстава DEC? У меня такая-же проблема с блоком CHAR, при переносе проекта из версии 1.14 в последующие.

Добавлено (05.03.2017, 17:38)
---------------------------------------------
eugenebhttp://forum.flprogwiki.ru/viewtopic.php?f=5&t=1856 Посмотри если ещё актуально.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
support
Супермодератор
Сообщения: 1905
Зарегистрирован: 03 янв 2018, 11:45
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Ошибка вывода на LCD

Сообщение support »

При создании кода я пытался максимально уменьшить занимаемую память. Создавать временную переменную для входного значения посчитал неразумным. Ведь в большинстве случаев на вход блока дисплея УЖЕ подаются значения переменных. К тому же так же в большинстве случаев значения на аналоговых входах не изменяются так быстро и на большую величину. 
В тех же случаях когда это происходит могу посоветовать сначала значение с аналогового входа положить в переменную, а её уже подавать на вход блока дисплея.
Автор программы FLProg.
Ответить

Вернуться в «Не принятые»

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

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