как избавиться от delay ?
- Войдите на сайт для отправки комментариев
Пнд, 08/06/2015 - 19:35
Нашел в одной из тем форума пример со светодиодами. Теперь пытаюсь его сделать без 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;
}
}
}
http://arduino.ru/forum/programmirovanie/tlc5940-plavnoe-zatukhanie-svet... вот сам пример
а что не получается то? или Вы жалуетесь что задержку в 10 милисекунд глазом уловить не можете? Или то что у Вас переменная j всегда 0? дык так прописано.
Да вот не получается переделать по примеру "мигаем без delay". Хочу от оператора for еще отойти попробовать. В моем варианте вообще правда ничего не загорается))
Открываете пример BlinkWithoutDelay и смотрите как там реализовано. Не знаете где примеры?
Файл, Примеры. Там и можно найти немало примеров.
1. delPWM - у вас типа int, а с левой части стоит unsigned long. Такое сравнение может не так работать. Там использован эффект вычитания беззнаковых чисел. Приведите к тому же типу что и у millis() это правильнее;
2. ВСЕ константы в коде правильнее задавать через директиву препроцессора #define или приписывать им размещение в памяти программ. Так будет заниматься меньше оперативной памяти. Но это так, "мелочи";
3. Чему равно stepPWM? оно в этом коде не задано от слова "вовсе". То есть, если оно не задано нигде, с большой долей вероятности (пока ещё просто не смотрел) компилятор присвоит такой переменной 0. А прибавляя к числу 0 его и получите. Аналогично и с остальными "неинициализированными" переменными. "хорошая" практика - присваивать переменным значения ДО их использования.
Собственно, этого вполне уже достаточно чтобы "ничего не происходило". По сути "ничего и не требовалось". :)
Не проинициализированы переменные, самое главное - 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, чтобы счет с нуля начинался.
i - меняется, j не меняется, о чем я в первом сообщении и написал %)
Дохтур, безусловно ты прав, j тоже не меняется и как следствие не меняется i. Твой ответ более правилен, потому что заставляет подумать, это да, согласен, я же разжевал и покормил.
Да, всё уже правильно написали до меня, я констатировал факт еще раз, ну тормоз я.
Старый анекдот: нет я пгинципиально буду пиз@eть!
i++; там стоит. не может она не меняться..
Ну скучно мне....
Да , спасибо за намек JollyBiber. После исправления появился свет)) kisoft и Вам спасибо . Вечером опробую ваш пример.
Старый анекдот: нет я пгинципиально буду пиз@eть!
i++; там стоит. не может она не меняться..
Ну скучно мне....
Если j всегда 0, то i никогда не изменится. А мне не скушно, я работаю :)
Ненене! Оно просто условие не проходит, а факт корректного изменения имеется! Если 35-ю строчку убрать, то тады да. Джи - при любых условиях полный ноль :)
Вот было бы время, я бы этот код скомпилял и посмотрел, скорее всего компилятор эту хню всё должен выкинуть, если оптимизатор включен. И переменную i тоже!
UPD: Фига с два, ничего не оптимизирует, по-умолчанию, i++ там остается в коде
kisoft,Ваш код работает, спасибо. Попытался потушить также последовательно - не получилось. Меняем мы только 31, 32 строки вашего кода или я ошибаюсь? Что скорее всего)) Поправьте ,пожалуйста.
13, 32, 45 строки.
Изменить шаг на отрицательный и установить начальное значение в двух местах на максимальное.
И конечно поменять граничное условие на >= 0