Простая программка - беру данные с потенциометра,
масштабирую до 0..255 и вывожу на I2C LCD-дисплей с центрированием.
[spoiler=Спойлер][/spoiler]
Вывожу в две разные строки, но это не принципиально.
Так вот, ежели беспорядочно крутить потенциометром, то иногда,
как я понял, при увеличении количества отображаемых разрядов с одного до двух, с двух до трёх),
появляется паразитный символ. Обычно '0'. Но иногда и '1' и '2' и '3'.
Эффект проявляется только при включенном центрировании.
Наверное ошибка в нём. Или где-то рядом.
Ошибка вывода на LCD
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Ошибка вывода на LCD
У вас нет необходимых прав для просмотра вложений в этом сообщении.
С уважением,
Евгений Бобков
Евгений Бобков
-
- Лейтенант
- Сообщения: 537
- Зарегистрирован: 29 окт 2015, 09:57
- Откуда: Kazakhstan
- Имя: Evgesha
Ошибка вывода на LCD
eugeneb, какую версию ide используете? такое замечал если использовал выше 1.6.3.
Последний раз редактировалось Evgesha 11 ноя 2016, 19:14, всего редактировалось 1 раз.
- eugeneb
- Лейтенант
- Сообщения: 486
- Зарегистрирован: 15 авг 2016, 11:20
- Откуда: Нижний Новгород
- Имя: Евгений
- Благодарил (а): 1 раз
Ошибка вывода на LCD
Эх, неудачно я задвинул пост под выходные... Это всё у меня
на работе. А на память я не помню.
Предположительно 1.0.5
Но точно буду знать в понедельник.
Так, так, вы навели меня на мысль...
Я упростил схему - убрал масштабирование.
Вот кусочек кода из loop(), который генерит FLProg:
Мы видим, что в каждом цикле аналоговый вход читается дважды:
- один раз чтобы определить длину строки и принять
решение о зачистке места;
- второй раз, чтобы её вывести.
И если между этими двумя чтениями длина строки изменится в большую сторону, то и случается сдвиг.
Ещё раз, проигрываем программу:
Потенциометр крутим вверх.
Цикл 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. Это же виртуальная машина
на работе. А на память я не помню.
Предположительно 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. Это же виртуальная машина
С уважением,
Евгений Бобков
Евгений Бобков
Ошибка вывода на LCD
Один компилирован вFlprog 2.1, а второй в 1.14. К чему подстава DEC? У меня такая-же проблема с блоком CHAR, при переносе проекта из версии 1.14 в последующие.
Добавлено (05.03.2017, 17:38)
---------------------------------------------
eugeneb, http://forum.flprogwiki.ru/viewtopic.php?f=5&t=1856 Посмотри если ещё актуально.
Добавлено (05.03.2017, 17:38)
---------------------------------------------
eugeneb, http://forum.flprogwiki.ru/viewtopic.php?f=5&t=1856 Посмотри если ещё актуально.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- support
- Супермодератор
- Сообщения: 1917
- Зарегистрирован: 03 янв 2018, 11:45
- Откуда: Астрахань
- Имя: Сергей
- Поблагодарили: 23 раза
- Контактная информация:
Ошибка вывода на LCD
При создании кода я пытался максимально уменьшить занимаемую память. Создавать временную переменную для входного значения посчитал неразумным. Ведь в большинстве случаев на вход блока дисплея УЖЕ подаются значения переменных. К тому же так же в большинстве случаев значения на аналоговых входах не изменяются так быстро и на большую величину.
В тех же случаях когда это происходит могу посоветовать сначала значение с аналогового входа положить в переменную, а её уже подавать на вход блока дисплея.
В тех же случаях когда это происходит могу посоветовать сначала значение с аналогового входа положить в переменную, а её уже подавать на вход блока дисплея.
Автор программы FLProg.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя