Долгая работа с sin и cos

Tarik02
Offline
Зарегистрирован: 12.01.2015

Я пользуюсь экраном Nokia 5110. Я хочу создать программу-часы, чтобы на экран выводились аналоговые часы. Но при использовании sin и cos программа немного времени омень помалу поработает, и потом зависнет(всегда на том же месте). Как решить проблему?

axill
Offline
Зарегистрирован: 05.09.2011

float жутко тяжелая операуия для МК, а sin/cos это целая серия вычислений с float

зависает скорее всего потому, что памяти не хватает, но это пока только предположение ибо информации мало

ищите целочисленные алгоритмы рисования, их в свое время много было, когда компьютеры были маленькие и медленные даже на них синусы и косинусы пытались оптимизировать

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

Есть сторонние математические библиотеки где синус и косинус вычисляются таблично а на их основе уже другие тригонометрические ф-ии. Скорость вычислений увеличивается многократно, правда ценой расхода памяти.

Logik
Offline
Зарегистрирован: 05.08.2014

Именно таблично надо делать. И хранить в нем целые константы произведения радиуса, ну длину стрелки, на синус для первых 15 минут. Дальше вдохновится формулами приведения и пересчитать их в остальные 45 значений и заодно и косинусы получить. В итоге 15 констант, немного математического шаманства, максимум скорости при минимуме памяти и без левых либ.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

А зачем, позвольте спросить, вам тригонометрия, если можно хранить просто матрицы координат? Циферблат всегда из 60 делений состоит...

Tarik02
Offline
Зарегистрирован: 12.01.2015

Можете это по-подробнее обьяснить мне?

Maverik
Offline
Зарегистрирован: 12.09.2012

Tarik02 пишет:

Можете это по-подробнее обьяснить мне?

у вас матрица экрана всего-то 48x84 точек. допустим вы хотите нарисовать окружность циферблата. для отрисовки дуги 1/4 экрана нужны координаты с десяток точек, остальное отображается симметрично. 

прикол в том, что есть библиотеки, в которых уже есть функции, рисующие отрезки, окружности и многие другие примитивы на этом дисплее, причем достаточно экономично по расходу памяти-  например adafruit, u8glib - вы изобретаете лисапет.

Tarik02
Offline
Зарегистрирован: 12.01.2015

Я же и использую adafruit!

axill
Offline
Зарегистрирован: 05.09.2011

там есть рисование линий? Расчитайте на компьютере 15 точек на вашей окружность и сохраните их в памяти только храните во FLASH

на ходу можете легко пересчитать 15 точек (например левый верхний сегмент циферблата, первые 15 секунд) в 60 используя зеркалирование по X и Y

дальше имея 60 точек на окружности можете рисовать стрелку имея точку центра и нужную точку на окружности используя библиотечную функцию рисования линии по двум точкам

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вопрос на засыпку, что лучше, считать каждую секунду одно и то же, либо посчитать заранее и использовать таблицу заранее рассчитанных на большом компе данных? Ну да, конечно лучше заранее соломки подстелить.
С Новым старым годом :)

spa-sam
Offline
Зарегистрирован: 14.12.2012

Сейчас в одном из проектов использую дисплей nokia 5110 и тоже использую библиотеку от adafruit...и такая же фигня - после некоторого времени работы снижается скорость обработки и бывает выдаёт ошибку в com порт. Может конечно дело не в этом, но без этого дисплея раньше было всё хорошо. Сейчас переделал программу на u8glib... буду тестировать....отпишусь

spa-sam
Offline
Зарегистрирован: 14.12.2012

u8glib...вроде как,действительно с этой библой траблов нет)

axill
Offline
Зарегистрирован: 05.09.2011

u8glib качественная штука, вот только надо готовиться к тому, что она очень прожорлива к памяти флэш, особенно если увлечься разными фонтами