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

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

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

#1

Сообщение eugeneb » 11.11.2016{, 16:21}

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

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







Эффект проявляется только при включенном центрировании.
Наверное ошибка в нём. Или где-то рядом.
Вложения
Res.flp
(59.07 КБ) 53 скачивания
4019019.jpg
5434988.jpg
5337121.jpg
9328309.png

Evgesha
Лейтенант
Сообщения: 525
Зарегистрирован: 29.10.2015{, 09:57}
Репутация: 20
Откуда: Kazakhstan
Имя: Evgesha

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

#2

Сообщение Evgesha » 11.11.2016{, 19:14}

eugeneb, какую версию ide используете? такое замечал если использовал выше 1.6.3.
Последний раз редактировалось Evgesha 11.11.2016{, 19:14}, всего редактировалось 1 раз.
ПОМОЩЬ ПРОЕКТУ FLPROG:
http://flprog.ru/pomoshh-proektu/

Аватара пользователя
eugeneb
Лейтенант
Сообщения: 481
Зарегистрирован: 15.08.2016{, 11:20}
Репутация: 21
Откуда: Нижний Новгород
Имя: Евгений

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

#3

Сообщение eugeneb » 11.11.2016{, 20:42}

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

Предположительно 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.04.2016{, 19:43}
Репутация: 0
Откуда: Рогачёв

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

#4

Сообщение alikshk » 05.03.2017{, 17:38}

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

Добавлено (05.03.2017, 17:38)
---------------------------------------------
eugenebhttp://forum.flprogwiki.ru/viewtopic.php?f=5&t=1856 Посмотри если ещё актуально.
Вложения
RES_1.14-ide_1..ino
(1.08 КБ) 59 скачиваний
RES_2.1-ide_1.6.ino
(1.1 КБ) 55 скачиваний

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 787
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#5

Сообщение support » 13.03.2017{, 09:27}

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

Ответить

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