U8glib SPI бесконечный цикл тормозит программу

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
dds7sdd
Прорезались зубы
Сообщения: 207
Зарегистрирован: Чт дек 07, 2017 13:48:44

U8glib SPI бесконечный цикл тормозит программу

Сообщение dds7sdd »

Приветствую, комрады!
Вопрос видимо банальный, но опыта (да и знаний) нет, а ответа в инете не нашел.
Проект на ATmega328 предусматривает подключение периферийных устройств как Bluetooth модуль (UART), ИК модуль (I2C), LCD SSD1306 (SPI). Плюс, таймер, обработчик кнопок и АЦП для контроля АКБ.
Для работы с LCD использую библиотеку U8glib v_1.18.
Для выводя на экран используется конструкция с бесконечным циклом типа "for":

Код: Выделить всё

for(;;) {u8g_FirstPage(&u8g);
do {page ();} 
while (u8g_NextPage(&u8g));}
Весь остальной код, который должен быть зациклен, приходится вставлять в этот "for".
А выполняется он около 2 секунд при частоте MK - 8MGz. Что сильно сказывается на скорости опроса состояния кнопок и работе всей программы. Увеличив частоту до 16М стало немного побыстрее, но все равно долго.
Не могу понять - это нормальная работа по SPI с такими тягомотными циклами? Что мне теперь частоту до 32M поднимать :shock:
В общем буду благодарен за подсказки :beer: ибо чего то я явно не понимаю и главное простого...
Реклама
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: U8glib SPI бесконечный цикл тормозит программу

Сообщение Ivanoff-iv »

while - это ведь ожидание? (вижу условие, но не вижу действия) - вот в него и вставь свой код, пусть работает пока ждет.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
dds7sdd
Прорезались зубы
Сообщения: 207
Зарегистрирован: Чт дек 07, 2017 13:48:44

Re: U8glib SPI бесконечный цикл тормозит программу

Сообщение dds7sdd »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3415480#p3415480"]while - это ведь ожидание? (вижу условие, но не вижу действия) - вот в него и вставь свой код, пусть работает пока ждет.[/uquote]

Так и делаю, но две секунды пауза в работе программы - это овермного. При нажатии на кнопки идут пропуски. Нужно по нескольку раз нажимать.

Короче, проблема была в использовании так называемого SoftWare SPI:

Код: Выделить всё

u8g_InitSPI(&u8g, &u8g_dev_ssd1306_128x64_sw_spi, PN(1, 5), PN(1, 3), PN(1, 2), PN(1, 1), U8G_PIN_NONE);
Применение HardWare SPI проблему решило в корне. Теперь весь цикл выполняется за миллисекунды.

Код: Выделить всё

u8g_InitSPI(&u8g, &u8g_dev_ssd1306_128x64_hw_spi, PN(1, 5), PN(1, 3), PN(1, 2), PN(1, 1), U8G_PIN_NONE);
Не знаю почему использование софтового SPI и переназначение портов отжирает так много ресурсов и времени в этой библиотеке. :(
Ответить

Вернуться в «Разные вопросы по МК»