как избавиться от 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 никогда не меняется. Вот пример, оне не оптимален и не идеален, должен работать, проверить не на чем.
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