Секундомер + U8glib
- Войдите на сайт для отправки комментариев
Сб, 02/12/2017 - 21:40
Привет форум.
Как обычно вопрос из рубрики "я в трёх соснах .. "
Есть програмный секундомер (взятый из примера) и библиотека для отрисовки графики U8glib. В моём случае это ОЛЕД дисплей 128х64 I2C.
В чем собственно проблема. Когда запускаю секундомер на монитор порта , без графики, всё нормально. Секундомер не врёт и идёт ровно. Но как только подключаю библиотеку и пытаюсь отрисовать это на дисплее появляется отставание и существенное.
Я так понимаю пока draw() отрисует графику это тормозит loop() (ну или непонимаю). Хотелось бы оставить эту графику, красиво рисует. Но секундомер нужен.
Скажите реально ли вообще подружить эту графическую библиотеку с секундомером?
собственно сам код. там реализовано старт/пауза и сброс после ужержания более 2 сек.(1 кнопка) и активация/деактивация (вторая кнопка)
понимаю что там никоторые вещи можно было так не раздувать и сделать поменьше, но чайники пишут так, только так =)
код совершенно бредовый. Начнем с того, что таймер на прерывании, тикающий раз в миллисекунду, в контроллере уже есть, называется миллис - совершенно непонятно, зачем изобретать велосипед заново.
Во-вторых - и это главное - зачем вы ПРИ КАЖДОМ цикле loop() заново отрисовываете всю картинку - рамку. ЧАСЫ!!!! МИНУТЫ! СЕКУНДЫ! - это же бред. Поэтому все безбожно тормозит. Обновляйте на экране только то, что изменилось - раз в секунду всего один символ - последний знак секунд.
Есть и прямые ошибки. Секундомер считает только до 1:59:59, так как при достижении 60 минут часы не увеличиваются на единицу, а всегда выставляются в "1"
реально ли вообще подружить эту графическую библиотеку с секундомером?
С этим секундомером - нет.
С этим секундомером - нет.
ну почему? - если обновлять экран не чаще раза в секунду - наверно будет работать...
Другой вопрос, что я бы вообще весь код секундомера выкинул, эти десятки строк можно заменить одной-двумя на основе миллис :)
Что-то мне вдруг подумалось - как все-таки полезно, что атмел относительно медленный контроллер :) На каком-нить пентиуме этот код, наверно, успевал был исполнятся и автор бы думал, что написал отличную программу. А на атмеле все подобные писатели получают от жизни мощнейшую плюху в строгом соответсвии со своими навыками оптимизации кода :)
ну почему? - если обновлять экран не чаще раза в секунду - наверно будет работать...
Ну, во-первых, не будет - Вы сами на ошибку указали и она там не одна такая.
А во-вторых - служба времени, зависящая от скорости выполнения loop - это уже само по себе ошибка. Сейчас Вы ему рисование сократите, он опрос датчиков вставит или ещё чего-нибудь - так просто не делается.
очень смешной код. вообще не рабочий, но смешной.
Типа "что-то где-то слышал" про микроконтроллеры.
========================
Я, ну чтобы не голословно хаять, скажу, что миллис() работаетот Таймера0, раз его перенастроили, то миллис() уже не работает.
Этого уже достаточно.
Не очень внимательно смотрел, но, вроде, должно работать. Делитель там 64 (такой же) и прервание не запретили, а просто своё добавили. Так что, вроде, молли не обидели, разве что я чего-то не заметил.
У него в таймере сброс по совпадению. Переполнение не наступит, миллис не обновица
Тоже верно.
Кстати, посмотрел повнимательнее и сделал вывод, что заявление ТС о том, что без графики секундомер работает правильно - есть "типичный случай так-называемого вранья".
код совершенно бредовый...
Согласен, но по другому пока неумею. Мы чайники такие. Пишем бредятину, а потом бегаем плакаться к вам на форум "мол, помогите ... не работает..." Тем самым поднимаем свой уровень и вашу самооценку =) . И слава богу, что вы есть. И до тех пор пока этот симбиоз существует, нас таких будет еще ооочень много. =)
Во-вторых - и это главное - зачем вы ПРИ КАЖДОМ цикле loop() заново отрисовываете всю картинку - рамку. ЧАСЫ!!!! МИНУТЫ! СЕКУНДЫ! - это же бред. Поэтому все безбожно тормозит. Обновляйте на экране только то, что изменилось - раз в секунду всего один символ - последний знак секунд.
Насколько я понял как раболтает эта библиотека, то .. Она отрисовывает всё в контроллере а потом выкидавает это на дисплей двумя половинками экрана. Как отрисовать отдельно я незнаю. Знаете поскажите.
Есть и прямые ошибки. Секундомер считает только до 1:59:59, так как при достижении 60 минут часы не увеличиваются на единицу, а всегда выставляются в "1"
Спасибо. Увидел. исправил.
А во-вторых - служба времени, зависящая от скорости выполнения loop - это уже само по себе ошибка.
Вот тут полностью согласен. Я это понял до того как сюда писать стал, но как сделать то, без loop() ?
Сейчас Вы ему рисование сократите, он опрос датчиков вставит или ещё чего-нибудь - так просто не делается.
ЕССТЕСТВЕННО , это еще не вся программа. И при каждой добавленной строкой loop() растягивается.
А можно имея модуль часов реального времени (например на DS1307) реализовать секундомер ?
А можно имея модуль часов реального времени (например на DS1307) реализовать секундомер ?
легко, в сети примеров тыщи))))
тыщу не надо.. хоть бы один. а то гугл непоказывает
вы барин или ленитесь или гуглить не умеете.
вот за вас сделал
https://www.google.com.ua/search?q=+DS1307+%D1%87%D0%B0%D1%81%D1%8B+%D0%...
Ну спасибо конечно. Просто у меня секундомер должен не просто идти, а останавливаться и потом опять идти. И потом его надо обнулять. Вопрос, я смогу такое реализовать используя библиотеку ....RTC.h ? ( пойду покопаю в эту сторону)
Насколько я понял как раболтает эта библиотека, то .. Она отрисовывает всё в контроллере а потом выкидавает это на дисплей двумя половинками экрана. Как отрисовать отдельно я незнаю. Знаете поскажите.
Ну, то есть это библиотека заставляет Вас вызывать свои методы на каждом проходе loop().
Какая настойчивая библиотека, однако.
Ну спасибо конечно. Просто у меня секундомер должен не просто идти, а останавливаться и потом опять идти. И потом его надо обнулять. Вопрос, я смогу такое реализовать используя библиотеку ....RTC.h ? ( пойду покопаю в эту сторону)
я вам больше скажу - это можно реализовать и без RTC.h :)
я вам больше скажу - это можно реализовать и без RTC.h :)
а поподробнее ?
Ну, то есть это библиотека заставляет Вас вызывать свои методы на каждом проходе loop()....
Т.е. вызывать процедуру отрисовки только при смене значений секунд?
Т.е. вызывать процедуру отрисовки только при смене значений секунд?
по-моему, вам уже несколько человек посоветовали это очевидное решение
а поподробнее ?
а что "подробнее"? - вот, к примеру. в вашем собственном коде секундомер реализован без библиотеки. Не так важно, что написано громоздко и с ошибками - их можно поправить, важнее то, что практически любую задачу в программировании можно решить 1001 способом