Библиотека UG8LIB, особенности обращения к дисплею
- Войдите на сайт для отправки комментариев
Друзья, добрый день!
Возник вопрос с использованием библиотеки UG8LIB для графическго дисплея 128х64 с ардуино уно на 328 микросхеме.
Я только осваиваю параллельное выполнение ардуиной нескольких задач и решил организовать прорисовку дисплея 3 раза в секунду, чтобы больше ресурсов оставить на получение иобработку параметров, которые в дальнейшем собираюсь выводить на экран.
#include <U8glib.h> // Подключаем библиотеку U8glib U8GLIB_ST7920_128X64_1X u8g(10); // Создаём объект u8g для работы с дисплеем, указывая номер вывода CS для аппаратной шины SPI int FPS = 3; // частота обновления экрана void loop() { static uint32_t drawTimer = millis(); if(millis() - drawTimer >= (1000 / FPS)) { // все рисования разместим в этом Ифе u8g.firstPage(); do { u8g.setColorIndex(1); // делаем курсор белого цвета u8g.setFont(rus5x8); u8g.setPrintPos(3, 8); u8g.setPrintPos(99, 28); u8g.print(F("ВРЕМЯ")); }
На дисплее выводится слово "время" практически мгновенно, решил проверить, что будет если внутрь поместить считывание кнопки, по нажатию которой на экране должен загораться символ:
#include "GyverButton.h" #include <U8glib.h> // Подключаем библиотеку U8glib U8GLIB_ST7920_128X64_1X u8g(10); // Создаём объект u8g для работы с дисплеем, указывая номер вывода CS для аппаратной шины SPI int FPS = 3; // частота обновления экрана GButton myButt1; //у меня подключено на один аналоговый вывод A1 5 кнопок, через резисторы, в данном примере привожу только одну для упрощения восприятия кода void setup() { myButt1.setType(LOW_PULL); } void loop() { int analog = analogRead(1); myButt1.tick(analog < 200 && analog > 190); // диапазон значений для гарантированного срабатывания кнопки static uint32_t drawTimer = millis(); if(millis() - drawTimer >= (1000 / FPS)) { // все рисования разместим в этом Ифе u8g.firstPage(); do { u8g.setColorIndex(1); // делаем курсор белого цвета u8g.setFont(rus5x8); u8g.setPrintPos(90, 20); u8g.print(F("ВРЕМЯ")); if (myButt1.state()) {u8g.setPrintPos(90, 20); u8g.print(F("КНОПКА")); }
Я предполагал, что такая конструкция вызовет проблему с отлавливанием сигнала с кнопки, т.к. дисплей обновляется 3 раза в секунду, но отражение слова "КНОПКА" происходит мгновенно. Также попробовал уменьшить значение переменной FPS до 1, ничего не меняется.
Я понимаю, что принцип отрисовки этой библиотекой достаточно сложный, происходит построчная отрисовка в цикле DO...WHILE. Но почему при попытке уменьшить количество обращений к данному циклу, нет разницы в отображении информации на дисплее?
Вы бы сначала "особенности" своего кода изучили :-) или хотя бы выложили не эти обрубки ...
почему при попытке уменьшить количество обращений к данному циклу, нет разницы в отображении информации на дисплее?
потому что на самом деле вы не меняете число обращений к циклу - он у вас опрашивается не три или один раз в секунду, а непрерывно, насколько хватает скорсти контроллера.
Причина - вы неправильно работаете с миллис, таймер надо не только проверять, но и запоминать, а в коде этого нет.
а в коде этого нет.
а ТС уверен, что есть
Artist666, уж лучше бы вы не высовывались :)
Ваш код - пример того. КАК НЕ НАДО ДЕЛАТЬ. Попытайтесь представить, что произойдет с этим кодом. когда миллис приблизится к своему максимуму 0xFF FF FF FF
Через 50 суток со старта программы? DD
Да ничего, не будет.
Переменная drawTimer так же сбросится как и таймер.
Но выполнится код в последнюю секунду без учёта ограничения.
а, ну да, вы правы. Действительно, ничего не будет. В том смысле, что код вообще не рабочий :)
Ошибка та же, как и у предыдущего оратора - не запоминаете значение миллис. Более того, даже не читаете его...
А это что?
drawTimer = drawMillis + (1000 / FPS)
А это что?
drawTimer = drawMillis + (1000 / FPS)
К чему этот вопрос?
вы у меня спрашиваете, что значит эта строчка в ВАШЕМ коде?
дел
Хорошо, я вам скажу, эта строчка, где глобальная переменная drawTimer "запоминает" millis.
Кстати ради интереса загуглил, думал увижу "правильный" код.
Наткнулся на тутор алекса гайвера(блогер) не последний человек в программировании.
Минусы этого кода - в условии при каждой итерации loop происходит сложение.
1й вызов происходит не сразу же, а после задержки.
Теперь может покажите, правильный и рабочий код?
Типа не так:
static
uint32_t
drawMillis = millis();А так:
static
uint32_t drawMillis;
drawMillis = millis();?
Хорошо, я вам скажу, эта строчка, где глобальная переменная drawTimer "запоминает" millis.
давайте сначала закончим с вашим кодом, а потом перейдем к разбору "минусов" чужого...
Значит вы считаете. что эта строчка "запоминает" миллис? - ок, пусть так. Но откуда этот миллис берется - строчку можете показать?
Типа не так:
static
uint32_t
drawMillis = millis();А так:
static
uint32_t drawMillis;
drawMillis = millis();?
не плодите бред, отвечайте на вопросы.
Возможно я ошибся в синтаксисе, и нельзя сразу при объявлении статичной переменной забивать в неё данные.
Но это компилятор скорее всего заметил бы. и уведомил.
Это не суть. Такая ошибка мелочная, даже не стоит внимания.
отлично.
Даю сразу ответ - это неверно, миллис в этой строке не читается, точнее он читается, но только один единственный раз - при старте микроконтроллера.
Теперь возьмите учебник и прочитайте, как работают статик переменные.
И на будущее - пока вы не начнете четко понимать, что означают ключевые слова static volatile inline const - не используйте их.
Это не суть. Такая ошибка мелочная, даже не стоит внимания.
Слушайте, вы, мой недалекий друг! если вы не перестанете нести чушь - я перестану давать вам ответы. Не надо ничего выдумывать, берите учебник и читайте.
Эта "мелочная ошибка" делает ваш код ПОЛНОСТЬЮ НЕРАБОЧИМ.
Бугаг, вы мне только сделаете одолжение.
Перестаньте меня оскорблять, вы себя позорите. ))
Я прекрасно знаю что такое статичная переменная.
В отличии от обычной, которая создаётся и удаляется после выполнения кода, статичная создаётся 1 раз и удаляется после выполнения всей программы.
Я прекрасно знаю что такое статичная переменная.
по твоему коду этого не видно.
Спорить я с тобой не собираюсь, придешь домой - запусти что-то типа такого кода
понаблюдай за цифирьками в Сериал, подумай..
UPD И да - если ты ведешь себя как болван - я так тебя и стану называть, на вежливость не рассчитывай.
Так что, где код с таймерами?
Типа такого:
Хорошо, я вам скажу, эта строчка, где глобальная переменная drawTimer "запоминает" millis.
Кстати ради интереса загуглил, думал увижу "правильный" код.
Наткнулся на тутор алекса гайвера(блогер) не последний человек в программировании.
Минусы этого кода - в условии при каждой итерации loop происходит сложение.
1й вызов происходит не сразу же, а после задержки.
Теперь может покажите, правильный и рабочий код?
дополню, пожалуй. Фееричесский идиот.
Так что, где код с таймерами?
ты с темы не сваливай, иди учебник читай.
А таймера с тебя пока зватит и Гайверовского, из #11 - хоть тут гайвера и не любят, но в этом процитированном отрывке ошибок нет.
Тебе домашнее задание - разобрать по пунктам. почему все. что ты написал о "минусах" этого кода - невероятная чушь.
Филин, здаёцца мне, здесь видно уши Северноговетра.
дополню, пожалуй. Фееричесский идиот.
и я о том же :)
Забавно. что когда-то гайвер на этом же форуме сам выступал против этого же кода ровно с этими же бредовыми аргументами про лишнюю арифметическую операцию :) А увот глядишь-ко, поумнел.
Филин, здаёцца мне, здесь видно уши Северноговетра.
вполне возможно, хотя для северного ветра это комплимент, тот про статик вряд ли хоть что-то знает и вообще туп как полено
Дак и этот выточен из цельного куска стоеросового дерева. Зато апломбу-то скока.
Вот так тоже можно:
иоптваюмать.
Artist666
еще один глупый кривой код
Артист, пойди отдохни... пока учебник не прочитаешь - чтоб я тебя не видел.
ты уже свою норму глупости на сегодня перевыполнил.
Артист, я ж тебе говорил, админы потёрли, правда, ты пока хоть маленько знаний не наберешься, ну не лезь ты никому с программированием помогать, ну пожалуйста... Выглядит это жалко...
Извиняюсь, uint32_t без знака минус.
Но, 2 минуса остались, 2 из 3х - это не всё.
Конечно, отвечать бы не стоило, поэтому только на два КЛЮЧЕВЫХ вопроса
// Вопрос, 0 - 4294967295 больше или равно 500?
если считать в размерности uint32_t , то 0 - 4294967295 равно 1, значит меньше 500
// А 500 - 4294967295 больше или равно 500? - а это равно 501
По итогу это выражение одинаково правильно работает ДО, ВО ВРЕМЯ и ПОСЛЕ ПЕРЕПОЛНЕНИЯ.
Почитай что-нибудь про беззнаковую арифметику. тупень
от часа ночи, дебил, отними 2 часа. Будет не -1 час, а 23. Надеюсь, на этом у тебя межушный ганглий сломается.
Это просто пи...ц. Еще один "свидетель переполнения millis"
Артист, ты мой проверочный код для статик переменной из сообщения #19 запустил? Убедился. что ты болван и не знаешь, что такое статик?
Так чего ж ты споришь тогда? ты во всем остальном ровно так же плаваешь...
И чем он так глуп и крив?
Тело условия будет выполняться при каждом случае, когда миллис делится без остатка, т.е. каждые 333 миллисекунды.
2 минуса, деление в условии, и когда будет переполнение счётчика, возможен пропуск выполнения кода до 332 миллисекунд.
Это просто пи...ц. Еще один "свидетель переполнения millis"
диагноз уже поставлен - "феерический долбоеп".
Ща если будет еще выступать - добьем и забаним :)
Да пусть повеселит форумчан ... другим будет неповадно
И чем он так глуп и крив?
а ты уверен, что заслужил, чтоб тебе еще один код обьяснили? ты хоть раз сказал спасибо? Или извинился за тупые наезды?
И чем он так глуп и крив?
Тело условия будет выполняться при каждом случае, когда миллис делится без остатка, т.е. каждые 333 миллисекунды.
2 минуса, деление в условии, и когда будет переполнение счётчика, возможен пропуск выполнения кода до 332 миллисекунд.
он плох тем что вы неможете гарантировать что ваш код от проверки до порверки будет исполняться <= 1 миллисекуны
Во первых, я ни на кого не наезжал, во вторых, глазки подними выше своего поста, где я извинился за то, что uint32_t не имеет знака "-", тупанул, бывает.
Ну а на объяснение кода - тут дело не во мне, если ты хочешь меня убедить, что он тупой - пожалуйста.
Если ты писал, что код тупой не для меня, а для публики - пожалуйста, я не обижусь, можешь не объяснять.
Ааа, теперь понятно, спасибо. ))
А так гарантировано?
Единственно нужно посчитать частоту проца, подогнать модуль, и наверное при выполнении каких-то рассчётов, частота вызовов loop может проседать.
Во первых, я ни на кого не наезжал, во вторых, глазки подними выше своего поста, где я извинился за то, что uint32_t не имеет знака "-", тупанул, бывает.
а за то, что ты якобы знаешь, как устроен статик?
DetSimen А большая печать какой конторы ???
Отмечал, когда получил? DD
А так гарантировано?
не-а :)
Это уже просто смешно.
Ну не позорься, дурень. Ну не умеешь ты программировать - что с того? девки же любят не за это :))))
Во первых, я ни на кого не наезжал, во вторых, глазки подними выше своего поста, где я извинился за то, что uint32_t не имеет знака "-", тупанул, бывает.
а за то, что ты якобы знаешь, как устроен статик?
В смысле "якобы"?
Я вот думаю, что ты мелочный, и докопался до того, что я вместо:
Написал:
Я признаю, что я ошибся, но не признаю, что это такая важная ошибка, что стоило раздувать скандал.
Я уже писал, что я 4 года не занимался программированием, и многое забыл.
Я вот думаю, что ты мелочный, и докопался до того, что я вместо:
Написал:
Я признаю, что я ошибся, но не признаю, что это такая важная ошибка, что стоило раздувать скандал.
совсем мимо.
Давай так - ты пока код из сообщения #19 не запустишь - не пиши ничего больше.