как избавиться от delay ?

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Нашел в одной из тем форума пример со светодиодами. Теперь пытаюсь его сделать без delay, но пока ничего не получается. Может кто поможет разобраться? Вот пример моего нерабочего кода.

 

#include "Tlc5940.h"
//количество
int Leds = 10;
//маскимальная яркость
const int maxLight = 4095;
//задержка ШИМ
int delPWM = 10;
//шаг наращивания яркости
int stepPWM, stepPWMP;
int i;
int j;
unsigned long lastAction = 0;


void setup() {
 Tlc.init(); 

}

void loop()
{
  
  if ( millis() - lastAction >= delPWM)  
  {
    lastAction = millis();
    
    if (j < maxLight)
    {
      j += stepPWM;
      Tlc.set(i, j);
      Tlc.update();
    }
    else
    {
      i++;
      if (i == Leds -1) i = 0;
      j = 0;
    }
  }
  
  
}

 

dimOnOff
Offline
Зарегистрирован: 21.04.2015
JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

а что не получается то? или Вы жалуетесь что задержку в 10 милисекунд глазом уловить не можете? Или то что у Вас переменная j всегда 0? дык так прописано.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Да вот не получается переделать по примеру "мигаем без delay".  Хочу от оператора for еще отойти попробовать. В моем варианте вообще правда ничего не загорается))

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

Открываете пример BlinkWithoutDelay и смотрите как там реализовано. Не знаете где примеры?
Файл, Примеры. Там и можно найти немало примеров.

Arhat109
Offline
Зарегистрирован: 26.05.2015

1. delPWM - у вас типа int, а с левой части стоит unsigned long. Такое сравнение может не так работать. Там использован эффект вычитания беззнаковых чисел. Приведите к тому же типу что и у millis() это правильнее;

2. ВСЕ константы в коде правильнее задавать через директиву препроцессора #define или приписывать им размещение в памяти программ. Так будет заниматься меньше оперативной памяти. Но это так, "мелочи";

3. Чему равно stepPWM? оно в этом коде не задано от слова "вовсе". То есть, если оно не задано нигде, с большой долей вероятности (пока ещё просто не смотрел) компилятор присвоит такой переменной 0. А прибавляя к числу 0 его и получите. Аналогично и с остальными "неинициализированными" переменными. "хорошая" практика - присваивать переменным значения ДО их использования.

Собственно, этого вполне уже достаточно чтобы "ничего не происходило". По сути "ничего и не требовалось". :)

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

Не проинициализированы переменные, самое главное - stepPWM - он равен 0 и потому i никогда не меняется. Вот пример, оне не оптимален и не идеален, должен работать, проверить не на чем.

// #define USE_WO_TLC

#if !defined(USE_WO_TLC)
#include "Tlc5940.h"
#endif
//количество
const int Leds = 10;
//маскимальная яркость
const int maxLight = 4095;
//задержка ШИМ
int delPWM = 10;
//шаг наращивания яркости
int stepPWM = 10;
int stepPWMP = 10;
int i = 0;
int j = -stepPWM;
unsigned long lastActionTime = 0;

void setup() {
#if !defined(USE_WO_TLC)
  Tlc.init();
#endif
}

void loop()
{
  if ( millis() - lastActionTime >= delPWM)
  {
    lastActionTime = millis();

    j += stepPWM;
    if (j < maxLight)
    {
      #if !defined(USE_WO_TLC)
      Tlc.set(i, j);
      Tlc.update();
      #endif
    }
    else
    {
      i++;
      if (i == Leds) {
        i = 0;
      }
      j = -stepPWM;
    }
  }
}

UPD: Ошибочка закралась, Leds-1 это было неправильно (теперь i меняется с 0 до 9). Плюс инициализировал j = -stepPWM, чтобы счет с нуля начинался.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

i - меняется, j не меняется, о чем я в первом сообщении и написал %)

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

Дохтур, безусловно ты прав, j тоже не меняется и как следствие не меняется i. Твой ответ более правилен, потому что заставляет подумать, это да, согласен, я же разжевал и покормил.

Да, всё уже правильно написали до меня, я констатировал факт еще раз, ну тормоз я.

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Старый анекдот: нет я пгинципиально буду пиз@eть!

i++; там стоит. не может она не меняться..

Ну скучно мне....

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Да , спасибо за намек JollyBiber. После исправления появился свет))  kisoft и Вам спасибо . Вечером опробую ваш пример. 

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

JollyBiber пишет:

Старый анекдот: нет я пгинципиально буду пиз@eть!

i++; там стоит. не может она не меняться..

Ну скучно мне....

Если j всегда 0, то i никогда не изменится. А мне не скушно, я работаю :)

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Ненене! Оно просто условие не проходит, а факт корректного изменения имеется! Если 35-ю строчку убрать, то тады да. Джи - при любых условиях полный ноль :)

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

Вот было бы время, я бы этот код скомпилял и посмотрел, скорее всего компилятор эту хню всё должен выкинуть, если оптимизатор включен. И переменную i тоже!

UPD: Фига с два, ничего не оптимизирует, по-умолчанию, i++ там остается в коде

 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

kisoft,Ваш код работает, спасибо.  Попытался потушить также последовательно - не получилось. Меняем мы только 31, 32 строки вашего кода или я ошибаюсь? Что скорее всего)) Поправьте ,пожалуйста.

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

13, 32, 45 строки.
Изменить шаг на отрицательный и установить начальное значение в двух местах на максимальное.
И конечно поменять граничное условие на >= 0