Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Пт июл 06, 2018 12:05:02

Приветствую, комрады!
Вопрос видимо банальный, но опыта (да и знаний) нет, а ответа в инете не нашел.
Проект на 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: ибо чего то я явно не понимаю и главное простого...

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

Сб июл 07, 2018 05:46:42

while - это ведь ожидание? (вижу условие, но не вижу действия) - вот в него и вставь свой код, пусть работает пока ждет.

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

Пн июл 09, 2018 11:39:21

while - это ведь ожидание? (вижу условие, но не вижу действия) - вот в него и вставь свой код, пусть работает пока ждет.


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

Короче, проблема была в использовании так называемого 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 и переназначение портов отжирает так много ресурсов и времени в этой библиотеке. :(
Ответить