обратный отсчёт времени с выводом на дисплей ST7920

AngryMoonk
Offline
Зарегистрирован: 11.05.2016

Всем привет. Начнём с начала есть задача выводить на дисплей обратный отсчёт времени. Время задаётся вручную в формате: 00часы 00минуты 00 секунды. Работаю в протеусе так как дисплея на руках пока нет. Проблема в следующем сделал простенький алгоритм обратного отсчёта. Проверил его через порт работает отменно, но как только я начинаю его выводить на дисплей он зависает. Не могу понять в чём причина в протеусе или в коде.

Собственно код:

#include "U8glib.h"
U8GLIB_KS0108_128 u8g(22, 23, 24, 25, 26, 27, 28, 29, 37, 33, 34, 36, 35);
byte t1[6] {1, 0, 0, 1, 0, 1}; // заданное время
unsigned long i = 0;
byte m = 0;
byte h = 0;
unsigned long x = 0;
unsigned long s = 0;
void setup() {
  x = t1[0] * 10 + t1[1] + t1[2] * 10 * 60 + t1[3] * 60 + t1[4] * 10 * 60 * 60 + t1[5] * 60 * 60;// переводим время в секунды
  Serial.begin(9600);
}
void loop() {
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_6x13);
    u8g.setPrintPos(20, 40);
    u8g.print("hello");
    Serial.println ("hello");
    delay (100);
      while (x > 0) {
        s = x; //секунды
        h = 0;
        m = 0;
        Serial.println(x);
        while (s >= 3600) {//часы
          s -= 3600;
          h++;
        };
        while (s >= 60) {//минуты
          s -= 60;
          m++;
        };
        u8g.setPrintPos(20, 40);
        u8g.print(h);
        u8g.setPrintPos(52, 40);
        u8g.print(m);
        u8g.setPrintPos(84, 40);
        u8g.print(s);
        Serial.println (s);
        x--;
        delay (500);
      }
  } while ( u8g.nextPage() );
}

 

fogary
Offline
Зарегистрирован: 05.03.2016

Возможно, проблема в том, что метод u8g.print() принимает значение byte, а переменная s у Вас имеет тип unsigned long. Попробуйте закоментировать строки 38 и 39.

В чем причина разделения заданного времени на десятки и единицы?

AngryMoonk
Offline
Зарегистрирован: 11.05.2016

Спасибо за ответ, но не помогло. Просто это кусок другой программы, в которой ввод осуществляется двумя кнопками одна инкрементирует значение другая декрементирует. Поэтому сделал разделения что бы удобнее было вводить время. То есть отдельно вводим десятки потом единицы вместо того что бы держать кнопку.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А вас не смущает, что вы юзаете

U8GLIB_KS0108_128

тогда как дисплей у вас на контроллере ST7920? Надо бы юзать что-то типа U8GLIB_ST7920_128X64_1X

AngryMoonk
Offline
Зарегистрирован: 11.05.2016

Нет, не смущает. Если вы внимательно прочтете мой пост там написано, что я работаю пока в протеусе, так как нет экрана под рукой. А в протеусе экрана с контроллером ST7920 нет, есть только ks0108. Я полазил по сайтам почитал и увидел, что люди так и отлаживают программы. Потом просто выставляют другую инициализацию.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ок, фиг с ним с ks0108, пусть будет. delay внутри цикла отрисовки - ЗАЧЕМ? В документации к u8glib чётко сказано, что внутри цикла отрисовки не должно быть никаких ресурсоёмких функций,  делей там совсем не к месту (пусть не ресурсоёмкий - но он тормозит выполнение цикла отрисовки). Вас и это не смущает?

AngryMoonk
Offline
Зарегистрирован: 11.05.2016

Хорошо, спасибо за ответ. Раньше не смущал теперь смущает. Вроде много чего прочитал про эту библиотеку, но данного аспекта не знал. Видимо так читал. Завтра попробую убрать delay. Сделаю задержку по другому.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Если нужна задержка - её надо выносить из цикла отрисовки. Если при отрисовке надо сразу не всё выводить - конечные автоматы наше всё ;)

fogary
Offline
Зарегистрирован: 05.03.2016

Если по ссылке речь о Ваша библиотеке, то вывода текста, в приведенном примере, отличается от Вашего. Может дело в неправильном использовании библиотеки?

AngryMoonk
Offline
Зарегистрирован: 11.05.2016

В данной библиотеке текст можно выводить двумя способами. Мож так как в примере по ссылке, а можно и так как у меня. В основной программе я вывожу именно так как написано у меня в скетче, и нет не каких проблем.

AngryMoonk
Offline
Зарегистрирован: 11.05.2016

Кажется, я понял, в чём проблема. В данной библиотеке вывод на экран осуществляется по достижению строки

while (u8g.nextPage());. 

 А цикл while в моём скетче не даёт программе выйти туда. Если я циклы while меня на if программа начинает выводить данные, но с тормозами. С этим мне помо DIYMan. Подсказав про delay. Вопрос теперь такой можно ли как-нибудь все-таки использовать while? Это нужно, потому что в основной программе у меня очень большой код и если использовать if время будет отрабатываться не корректно. Или просто подогнать задержку?