Здравствуй millis Новый Год

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Здравствуйте !

Делаю автомат световых эффектов , где вместо delay использую millis. Почему millis - на будущее прикручу кнопку для переключения эффектов. Вроде все работает , но задержка к примеру в 20 миллисекунд получается почти секундной. Подскажите плиз где я накосячил.

Код


 int aa=0;
      
//****************Переменные пинов светодиодов
int l1 = 4; //1
int l2 = 5; //2
int l3 = 6; //4
int l4 = 7; //8
int l5 = 8; //16
int l6 = 9; //32
int l7 = 10; //64
int l8 = 11; //128
int l9 = 12; //256
int l10 = 13;//512
int l11 = 14;//1024 
int l12 = 15; //2048
int l13 = 16; //4096
int l14 = 17; //8192
int l15 = 18; //16384
int l16 = 19;//32768
int l17 = 1; //65536                  
int l18 = 3;//131072
//**************************
int lp[] = {l1, l2, l3, l4, l5, l6, l7, l8,l9, l10, l11, l12, l13, l14, l15, l16, l17, l18}; // массив пинов светодиодов 
#include <avr/pgmspace.h>
const PROGMEM  uint32_t  point[]  = { 
3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,
16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,16323,0,
32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,32707,0,
229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,229375,0,
262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,262143,0,
262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,
262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,262143,
};
const char inv_on = LOW ;   //LOW для макета, HIGH  с транзисторами
const char inv_off = HIGH ;  // HIGH для макета, LOW   с транзисторами
int Count = (sizeof(point)/4); //Подсчет количества элементов в массиве 
long duration=20; // интервал 
long previousMillis = 0; 
void setup() {
 for (int i = 0; i < 18; i++) {
        pinMode(lp[i], OUTPUT);
       digitalWrite(lp[i], inv_off);

 }
 Serial.begin(9600);
}
 
void loop()
{
 // Serial.println(aa);
/////////////////////////////////////////////////////////////
 

{
 for (int p0=0; p0<Count; p0++ ){
  for (int p1=0;p1<18;p1++){ 
long int p2 = pgm_read_dword   (&(point[p0]));
int ppp3;
if (bitRead(p2,p1)==1)
{
ppp3=inv_on;
}
if (bitRead(p2,p1)==0)
{
ppp3=inv_off; 
}


//****************** для задержки в millis
// Serial.println(aa);
  
  while (aa==0){
  
unsigned long currentMillis = millis();
      if(currentMillis - previousMillis > duration) {
       previousMillis = currentMillis; 
    aa=1;
      }
   digitalWrite(lp[p1], ppp3);
   }
 
aa=0;
//*****************************

}
}
}
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а чем твоя задержка отличается от делай? я не увидел отличия принципиального

а что массив такой большой? сколько светодиодов. какое железо

Araris
Offline
Зарегистрирован: 09.11.2012

Не знаю, связано ли это с описываемой проблемой, но бросилось в глаза, что в строках 37-38 переменные объявлены как long, лучше бы они были unsigned long.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

unsigned long 

вместо цикла - if

while (aa==0){

класс титановый велосипед для delay без delay().

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Железа пока нет - на выходах ардуины по одному светодиоду. Всего 18.

Клапауций 234 

По вашему совету нет задержки. Пробовал применить титановый велосипед , но ничего не вышло. 

jeka_tm

Массив сам собирал.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

понятно в массиве записано как тот или иной светодиод должен светится. но видно это чей то уже готовый массив, скорее всего

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

262143 это всего 15 бит, а значит 15 светодиодов. ну или дублируются

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

jeka_tm пишет:

а чем твоя задержка отличается от делай? я не увидел отличия принципиального

тем, что в неё можно вставить опрос кнопки, он же писал.

А вот зачем в этом цикле стоит "digitalWrite(lp[p1], ppp3);" я тоже не понимаю.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mobistrike пишет:

но задержка к примеру в 20 миллисекунд получается почти секундной.

А с чего Вы это взяли? Боюсь, что это Вам так кажется чисто внешне. Поставьте вывод в сериал значения millis перед строкой 72 и после строки 80. Думаю, что Вы уидите, что задержка у Вас нормальная. Если, вдруг, паче чаяния, нет, то выложите что там напечаталось, посмотрим.

А то, что у Вас эффекты не меняются, так разбирайтесь со своим массивом point. Например, для начала, удалите запятую в конце строки 32. И вообще, посмотрите на массив.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Мерцание при 20 ms и мигание раз в секунду уж очень отличимы.С чтением массива все нормально. Эффекты меняются правильно , только очень медленно. И где теряется время не могу отловить. В цикле между 72 и 80 строками все нормально.

stroka 72_______21
stroka 80________43
stroka 72_______43
stroka 80________64
stroka 72_______64
stroka 80________86
stroka 72_______103
stroka 80________124
stroka 72_______147
stroka 80________169
stroka 72_______192
stroka 80________214
stroka 72_______237
stroka 80________259
stroka 72_______281
stroka 80________304
stroka 72_______326
stroka 80________348
stroka 72_______371
stroka 80________393
stroka 72_______415
stroka 80________438
stroka 72_______460
stroka 80________482
stroka 72_______505
stroka 80________527
stroka 72_______550
stroka 80________572
stroka 72_______594
stroka 80________617
stroka 72_______640
stroka 80________661
stroka 72_______685

 

digitalWrite(lp[p1], ppp3); вынес из цикла while - результат прежний . Запятую убрал .Все очень медленно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mobistrike пишет:

Мерцание при 20 ms и мигание раз в секунду уж очень отличимы.

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

mobistrike пишет:

digitalWrite(lp[p1], ppp3); вынес из цикла while - результат прежний . Запятую убрал .Все очень медленно.

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

mobistrike пишет:
stroka 72_______21
...

Вот это уже интереснее, давайте смотреть.

Первое, что Вы должны отметить. Разница между "строка 80" и предшествующей ей "строка 72" всегда и везде почти правильная - 21 - 24 мс. Обратили на это внимание?

Вывод - задержка отрабатыват правильно - в районе 20-25 мс.

Значит проблема в другом. Не в в этом цикле. Вы с этим согласны?

Ищите в другом месте. Также печатайте время и анализируйте.

Если нужна моя помощь в поиске, выложите текущий скетч, я скажу где ещё печатей постаставить, чтобы что-то выловить.

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Спасибо огромное ! Помощь очень нужна. 

В массиве мерцание светодиодом на 13 ноге (20ms) . На самом деле мигает раз в секунду. Можно проверить на любой ардуине.

Вот что имеем сейчас


 int aa=0;
      
//****************Переменные пинов светодиодов
int l1 = 4; //1
int l2 = 5; //2
int l3 = 6; //4
int l4 = 7; //8
int l5 = 8; //16
int l6 = 9; //32
int l7 = 10; //64
int l8 = 11; //128
int l9 = 12; //256
int l10 = 13;//512
int l11 = 14;//1024 
int l12 = 15; //2048
int l13 = 16; //4096
int l14 = 17; //8192
int l15 = 18; //16384
int l16 = 19;//32768
int l17 = 1; //65536                  
int l18 = 3;//131072
//**************************
int lp[] = {l1, l2, l3, l4, l5, l6, l7, l8,l9, l10, l11, l12, l13, l14, l15, l16, l17, l18}; // массив пинов светодиодов 
#include <avr/pgmspace.h>
const PROGMEM  uint32_t  point[]  = { 
512,0,512,0,512,0
};
const char inv_on = LOW ;   //LOW для макета, HIGH  с транзисторами
const char inv_off = HIGH ;  // HIGH для макета, LOW   с транзисторами
int Count = (sizeof(point)/4); //Подсчет количества элементов в массиве 
unsigned long duration=20; // интервал 
unsigned long previousMillis = 0; 
void setup() {
 for (int i = 0; i < 18; i++) {
        pinMode(lp[i], OUTPUT);
       digitalWrite(lp[i], inv_off);

 }
 Serial.begin(9600);
}
 
void loop()
{
 // Serial.println(aa);
/////////////////////////////////////////////////////////////
 

{
 for (int p0=0; p0<Count; p0++ ){
  for (int p1=0;p1<18;p1++){ 
long int p2 = pgm_read_dword   (&(point[p0]));
int ppp3;
if (bitRead(p2,p1)==1)
{
ppp3=inv_on;
}
if (bitRead(p2,p1)==0)
{
ppp3=inv_off; 
}
digitalWrite(lp[p1], ppp3);

//****************** для задержки в millis
// Serial.println(aa);
unsigned long currentMilli = millis();
Serial.print("stroka 72_______");
Serial.println(currentMilli); 
  while (aa==0){
  
unsigned long currentMillis = millis();
      if(currentMillis - previousMillis > duration) {
       previousMillis = currentMillis; 
    aa=1;
      }
  // digitalWrite(lp[p1], ppp3);
   }
 unsigned long currentMill = millis();
Serial.print("stroka 80________");
Serial.println(currentMill);
aa=0;
//*****************************

}
}
}
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

Есть несколько советов. Во первых если вы любите называть переменные так: aa, p1, p2, ppp3 -вы конечно можете это делать, но если выкладываете свой код на осмотр ЛЮДЯМ то желательно давать более адекватные имена. Во вторых вы генерите очень много кода и кучу лишних переменных, например в последнем коде из #11 строки 53... 61 вполне заменяются одной командой

digitalWrite(lp[p1], !bitRead(p2,p1));

Ну и в третьих нет форматирования, -любые вложенные операции должны быть с отступлением строки от  той, где произошло вложение. По сути дать заключение очень трудно ввижу вышесказанного, но предварительно я вижу например по коду в #11 что вы в 50-51 строках перечитываете байт флеша из массива на каждой итерации светодиода. Т.е. как минимум вы делаете 19 раз операцию довольно ресурсожоркую операцию, которую нужно было сделать перед циклом  всего 1 раз.

 

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

 

dimax пишет:

 Вы так намудрили, что похоже и сами не понимаете как это работает.

Спасибо за критику . Намудрил - согласен. Но это от того что не программист. Учусь. Как работает представляю - писал все сам с нуля. Про эстетику и переменные приму к сведению.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, давайте сделаем так.

I. Сначала давайте обсудим логику

Мне кажется, у Вас логическая ощибка, но я не уверен.

Насколько я понимаю, Вы хотите делать так

1. Поменяли значение всех 18 светодиодов
2. Отработали задержку
3. Переход к п.1.

И так ДЛЯ ВСЕХ массив point

Это правильно Вы этого хотите?

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

Понимаете разницу?

В общем, если я прав, то просто вынесите задержку из цикла, который начинается в строке 50, но при этом она должна остаться в цикле, который начинается в строке 49 и тогда всё будет хорошо.

2. Если же с логикой у Вас всё в порядке,

то ниже я прикду скетч. который я чуть-чуть причесал (а то коллега прав - мозг взрывается). Запустите его и проанализируйте времена. Если не поймёте, то выложите сюда лог, будем вместе смотреть.

//****************Переменные пинов светодиодов
int l1 = 4; //1
int l2 = 5; //2
int l3 = 6; //4
int l4 = 7; //8
int l5 = 8; //16
int l6 = 9; //32
int l7 = 10; //64
int l8 = 11; //128
int l9 = 12; //256
int l10 = 13;//512
int l11 = 14;//1024
int l12 = 15; //2048
int l13 = 16; //4096
int l14 = 17; //8192
int l15 = 18; //16384
int l16 = 19;//32768
int l17 = 1; //65536
int l18 = 3;//131072
//**************************
int lp[] = {l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18}; // массив пинов светодиодов
#include <avr/pgmspace.h>
const PROGMEM  uint32_t  point[]  = {
  512, 0, 512, 0, 512, 0
};
const char inv_on = LOW ;   //LOW для макета, HIGH  с транзисторами
const char inv_off = HIGH ;  // HIGH для макета, LOW   с транзисторами
int Count = (sizeof(point) / sizeof(point[0])); //Подсчет количества элементов в массиве
unsigned long duration = 20; // интервал
unsigned long previousMillis = 0;


void setup() {
  for (int i = 0; i < 18; i++) {
    pinMode(lp[i], OUTPUT);
    digitalWrite(lp[i], inv_off);

  }
  Serial.begin(9600);
}

void checkPoint(const char * title) {
  static unsigned long previousOne = 0;
  unsigned long currentMillis = millis();
  Serial.print("Check point #");
  Serial.print(title);
  Serial.print(": ");
  Serial.print(currentMillis);
  Serial.print(" elapsed since previous checkpoint: ");
  Serial.print(currentMillis - previousOne);
  previousOne = currentMillis;
}

void loop() {
  checkPoint("Enter Loop");
  for (int p0 = 0; p0 < Count; p0++ ) {
    for (int p1 = 0; p1 < 18; p1++) {
      long int p2 = pgm_read_dword   (&(point[p0]));
      digitalWrite(lp[p1], bitRead(p2, p1) ? inv_on : inv_off);

      checkPoint("Before delay");

      for (bool aa = true; aa; ) {
        unsigned long currentMillis = millis();
        if (currentMillis - previousMillis > duration) {
          previousMillis = currentMillis;
          aa = false;
        }
      }
      checkPoint("After delay");
    }
  }
}

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Еще раз благодарю !

ЕвгенийП пишет:

I. Сначала давайте обсудим логику

1. Поменяли значение всех 18 светодиодов

2. Отработали задержку
3. Переход к п.1.

И так ДЛЯ ВСЕХ массив point

Это правильно Вы этого хотите?

 

Да именно так.

Залил . Вот лог .

eck poщCheck point #Enter Loop: 0 elapsed since previous checkpoint: 0Check point #Before delay: 0 elapsed since previous checkpoint: 0Check point #After delay: 65 elapsed since previous checkpoint: 65Check point #Before delay: 134 elapsed since previous checkpoint: 69Check point #After delay: 204 elapsed since previous checkpoint: 70Check point #Before delay: 274 elapsed since previous checkpoint: 70Check point #After delay: 345 elapsed since previous checkpoint: 71Check point #Before delay: 414 elapsed since previous checkpoint: 69Check point #After delay: 485 elapsed since previous checkpoint: 71Check point #Before delay: 555 elapsed since previous checkpoint: 70Check point #After delay: 625 elapsed since previous checkpoint: 70Check point #Before delay: 695 elapsed since previous checkpoint: 70Check point #After delay: 765 elapsed since previous checkpoint: 70Check point #Before delay: 835 elapsed since previous checkpoint: 70Check point #After delay: 906 elapsed since previous checkpoint: 71Check point #Before delay: 975 elapsed since previous checkpoint: 69Check point #After delay: 1046 elapsed since previous checkpoint: 71Check point #Before delay: 1117 elapsed since previous checkpoint: 71Check point #After delay: 1189 elapsed since previous checkpoint: 72Check point #Before delay: 1260 elapsed since previous checkpoint: 71Check point #After delay: 1332 elapsed since previous checkpoint: 72Check point #Before delay: 1402 elapsed since previous checkpoint: 70Check point #After delay: 1474 elapsed since previous checkpoint: 72Check point #Before delay: 1545 elapsed since previous checkpoint: 71Check point #After delay: 1616 elapsed since previous checkpoint: 71Check point #Before delay: 1687 elapsed since previous checkpoint: 71Check point #After delay: 1759 elapsed since previous checkpoint: 72Check point #Before delay: 1829 elapsed since previous checkpoint: 70Check point #After delay: 1901 elapsed since previous checkpoint: 72Check point #Before delay: 1972 elapsed since previous checkpoint: 71Check point #After delay: 2043 elapsed since previous checkpoint: 71Check point #Before delay: 2114 elapsed since previous checkpoint: 71Check point #After delay: 2187 elapsed since previous checkpoint: 73Check point #Before delay: 2257 elapsed since previous checkpoint: 70Check point #After delay: 2329 elapsed since previous checkpoint: 72Check point #Before delay: 2400 elapsed since previous checkpoint: 71Check point #After delay: 2471 elapsed since previous checkpoint: 71Check point #Before delay: 2542 elapsed since previous checkpoint: 71Check point #After delay: 2614 elapsed since previous checkpoint: 72Check point #Before delay: 2684 elapsed since previous checkpoint: 70Check point #After delay: 2756 elapsed since previous checkpoint: 72Check point #Before delay: 2827 elapsed since previous checkpoint: 71Check point #After delay: 2898 elapsed since previous checkpoint: 71Check point #Before delay: 2969 elapsed since previous checkpoint: 71Check point #After delay: 3041 elapsed since previous checkpoint: 72Check point #Before delay: 3111 elapsed since previous checkpoint: 70Check point #After delay: 3184 elapsed since previous checkpoint: 73Check point #Before delay: 3255 elapsed since previous checkpoint: 71Check point #After delay: 3326 elapsed since previous checkpoint: 71Check point #Before delay: 3397 elapsed since previous checkpoint: 71Check point #After delay: 3469 elapsed since previous checkpoint: 72Check point #Before delay: 3539 elapsed since previous checkpoint: 70Check point #After delay: 3611 elapsed since previous checkpoint: 72Check point #Before delay: 3682 elapsed since previous checkpoint: 71Check point #After delay: 3753 elapsed since previous checkpoint: 71Check point #Before delay: 3824 elapsed since previous checkpoint: 71Check point #After delay: 3896 elapsed since previous checkpoint: 72Check point #Before delay: 3966 elapsed since previous checkpoint: 70Check point #After delay: 4038 elapsed since previous checkpoint: 72Check point #Before delay: 4109 elapsed since previous checkpoint: 71Check point #After delay: 4182 elapsed since previous checkpoint: 73Check point #Before delay: 4252 elapsed since previous checkpoint: 70Check point #After delay: 4324 elapsed since previous checkpoint: 72Check point #Before delay: 4395 elapsed since previous checkpoint: 71Check point #After delay: 4466 elapsed since previous checkpoint: 71Check point #Before delay: 4537 elapsed since previous checkpoint: 71Check point #After delay: 4609 elapsed since previous checkpoint: 72Check point #Before delay: 4679 elapsed since previous checkpoint: 70Check point #After delay: 4751 elapsed since previous checkpoint: 72Check point #Before delay: 4822 elapsed since previous checkpoint: 71Check point #After delay: 4893 elapsed since previous checkpoint: 71Check point #Before delay: 4964 elapsed since previous checkpoint: 71Check point #After delay: 5036 elapsed since previous checkpoint: 72Check point #Before delay: 5106 elapsed since previous checkpoint: 70Check point #After delay: 5178 elapsed since previous checkpoint: 72Check point #Before delay: 5250 elapsed since previous checkpoint: 72Check point #After delay: 5321 elapsed since previous checkpoint: 71Check point #Before delay: 5392 elapsed since previous checkpoint: 71Check point #After delay: 5464 elapsed since previous checkpoint: 72Check point #Before delay: 5534 elapsed since previous checkpoint: 70Check point #After delay: 5606 elapsed since previous checkpoint: 72Check point #Before delay: 5677 elapsed since previous checkpoint: 71Check point #After delay: 5748 elapsed since previous checkpoint: 71Check point #Before delay: 5819 elapsed since previous checkpoint: 71Check point #After delay: 5891 elapsed since previous checkpoint: 72Check point #Before delay: 5961 elapsed since previous checkpoint: 70Check point #After delay: 6033 elapsed since previous checkpoint: 72Check point #Before delay: 6104 elapsed since previous checkpoint: 71Check point #After delay: 6175 elapsed since previous checkpoint: 71Check point #Before delay: 6247 elapsed since previous checkpoint: 72Check point #After delay: 6319 elapsed since previous checkpoint: 72Check point #Before delay: 6389 elapsed since previous checkpoint: 70Check point #After delay: 6461 elapsed since previous checkpoint: 72Check point #Before delay: 6532 elapsed since previous checkpoint: 71Check point #After delay: 6603 elapsed since previous checkpoint: 71Check point #Before delay: 6674 elapsed since previous checkpoint: 71Check point #After delay: 6746 elapsed since previous checkpoint: 72Check point #Before delay: 6816 elapsed since previous checkpoint: 70Check point #After delay: 6888 elapsed since previous checkpoint: 72Check point #Before delay: 6959 elapsed since previous checkpoint: 71Check point #After delay: 7030 elapsed since previous checkpoint: 71Check point #Before delay: 7101 elapsed since previous checkpoint: 71Check point #After delay: 7173 elapsed since previous checkpoint: 72Check point #Before delay: 7244 elapsed since previous checkpoint: 71Check point #After delay: 7316 elapsed since previous checkpoint: 72Check point #Before delay: 7387 elapsed since previous checkpoint: 71Check point #After delay: 7458 elapsed since previous checkpoint: 71Check point #Before delay: 7529 elapsed since previous checkpoint: 71Check point #After delay: 7601 elapsed since previous checkpoint: 72Check point #Before delay: 7671 elapsed since previous checkpoint: 70Check point #After delay: 7743 elapsed since previous checkpoint: 72Check point #Before delay: 7814 elapsed since previous checkpoint: 71Check point #After delay: 7885 elapsed since previous checkpoint: 71Check point #Before delay: 7956 elapsed since previous checkpoint: 71Check point #After delay: 8028 elapsed since previous checkpoint: 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ой, блин, ну в строке 50 вместо print надо println, Разумеется.

Если так (про логику), то Вы вынесли задержку из цикла? Вынесите и проблема решится.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

ЕвгенийП пишет:

Ой, блин, ну в строке 50 вместо print надо println, Разумеется.

Если так (про логику), то Вы вынесли задержку из цикла? Вынесите и проблема решится.

Вынес . Все так же медленно.  Вы так имели ввиду ?

void loop() {
  checkPoint("Enter Loop");
 
  
  for (bool aa = true; aa; ) {
        unsigned long currentMillis = millis();
        if (currentMillis - previousMillis > duration) {
          previousMillis = currentMillis;
          aa = false;
        }
      }
  
  for (int p0 = 0; p0 < Count; p0++ ) {
    for (int p1 = 0; p1 < 18; p1++) {
 
     long int p2 = pgm_read_dword   (&(point[p0]));
     digitalWrite(lp[p1], bitRead(p2, p1) ? inv_on : inv_off);

      checkPoint("Before delay");

      //for (bool aa = true; aa; ) {
        //unsigned long currentMillis = millis();
        //if (currentMillis - previousMillis > duration) {
          //previousMillis = currentMillis;
          //aa = false;
        //}
      //}
      checkPoint("After delay");
    }
  }
}

Вот лог сейчас

#AfterаCheck point #Enter Loop: 0 elapsed since previous checkpoint: 
0Check point #Before delay: 21 elapsed since previous checkpoint: 
21Check point #After delay: 71 elapsed since previous checkpoint: 
50Check point #Before delay: 142 elapsed since previous checkpoint: 
71Check point #After delay: 215 elapsed since previous checkpoint: 
73Check point #Before delay: 286 elapsed since previous checkpoint: 
71Check point #After delay: 359 elapsed since previous checkpoint: 
73Check point #Before delay: 431 elapsed since previous checkpoint: 
72Check point #After delay: 503 elapsed since previous checkpoint: 
72Check point #Before delay: 575 elapsed since previous checkpoint: 
72Check point #After delay: 648 elapsed since previous checkpoint: 
73Check point #Before delay: 720 elapsed since previous checkpoint: 
72Check point #After delay: 793 elapsed since previous checkpoint: 
73Check point #Before delay: 865 elapsed since previous checkpoint: 
72Check point #After delay: 937 elapsed since previous checkpoint: 
72Check point #Before delay: 1009 elapsed since previous checkpoint: 
72Check point #After delay: 1083 elapsed since previous checkpoint: 
74Check point #Before delay: 1156 elapsed since previous checkpoint: 
73Check point #After delay: 1229 elapsed since previous checkpoint: 
73Check point #Before delay: 1302 elapsed since previous checkpoint: 
73Check point #After delay: 1376 elapsed since previous checkpoint: 
74Check point #Before delay: 1448 elapsed since previous checkpoint: 
72Check point #After delay: 1523 elapsed since previous checkpoint: 
75Check point #Before delay: 1596 elapsed since previous checkpoint: 
73Check point #After delay: 1670 elapsed since previous checkpoint: 
74Check point #Before delay: 1742 elapsed since previous checkpoint: 
72Check point #After delay: 1816 elapsed since previous checkpoint: 
74Check point #Before delay: 1889 elapsed since previous checkpoint: 
73Check point #After delay: 1963 elapsed since previous checkpoint: 
74Check point #Before delay: 2035 elapsed since previous checkpoint: 
72Check point #After delay: 2109 elapsed since previous checkpoint: 
74Check point #Before delay: 2182 elapsed since previous checkpoint: 
73Check point #After delay: 2256 elapsed since previous checkpoint: 
74Check point #Before delay: 2329 elapsed since previous checkpoint: 
73Check point #After delay: 2403 elapsed since previous checkpoint: 
74Check point #Before delay: 2476 elapsed since previous checkpoint: 
73Check point #After delay: 2549 elapsed since previous checkpoint: 
73Check point #Before delay: 2622 elapsed since previous checkpoint: 
73Check point #After delay: 2696 elapsed since previous checkpoint: 
74Check point #Before delay: 2768 elapsed since previous checkpoint: 
72Check point #After delay: 2842 elapsed since previous checkpoint: 
74Check point #Before delay: 2915 elapsed since previous checkpoint: 
73Check point #After delay: 2990 elapsed since previous checkpoint: 
75Check point #Before delay: 3062 elapsed since previous checkpoint: 
72Check point #After delay: 3136 elapsed since previous checkpoint: 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mobistrike, а то что я писал -мимо ушей промчалось? 16 строчку перед 14 вставить

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

dimax пишет:

mobistrike, а то что я писал -мимо ушей промчалось? 16 строчку перед 14 вставить

Сделано . Без изменений.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mobistrike, будьте внимательнее

1. Я Вам говорил ln добавить в строке 50, а Вы добавили в 49. Вы же видите что в печати лажа, ну и поправьте.

2. Про перестановку задежрки. Конечно, я имел в виду не так. Но может быть Вам так и нужно - это только Вы знаете.

Давайте ещё раз договоримся о логике. В каком месте должна быть задержка? Так как я описывал, или как-то по-другому. Напишите точно и чётко, что Вы хотите сделать. Без этого мы никуда не продвинемся.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Алгоритм такой  

1 Берем первое число  массива

2 раскладываем на биты

3 Побитово выводим -в  зависимости от битов в числе - 1 вкл светодиод, 0 выкл светодиод 

4 Задержка

5 берем следующее число и так до конца массива

Как то так.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Я вот тоже не понял что собссно не так, 19 итераций по 20мс + накладные расходы -итого примерно 1 Гц  и получаем.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mobistrike пишет:

Алгоритм такой  

1 Берем первое число  массива

2 раскладываем на биты

3 Побитово выводим -в  зависимости от битов в числе - 1 вкл светодиод, 0 выкл светодиод 

4 Задержка

5 берем следующее число и так до конца массива

Как то так.

Надо не "как-то так", а точно.

Правильно ли я понимаю, что п.3. Выше включает в себя все 18 битов (т.е. весь цикл строки 14???).

Тогда задержка нужна после цикла строки 14. 

Попробуйте вот так:

//****************Переменные пинов светодиодов
int l1 = 4; //1
int l2 = 5; //2
int l3 = 6; //4
int l4 = 7; //8
int l5 = 8; //16
int l6 = 9; //32
int l7 = 10; //64
int l8 = 11; //128
int l9 = 12; //256
int l10 = 13;//512
int l11 = 14;//1024
int l12 = 15; //2048
int l13 = 16; //4096
int l14 = 17; //8192
int l15 = 18; //16384
int l16 = 19;//32768
int l17 = 1; //65536
int l18 = 3;//131072
//**************************
int lp[] = {l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18}; // массив пинов светодиодов
#include <avr/pgmspace.h>
const PROGMEM  uint32_t  point[]  = {
  512, 0, 512, 0, 512, 0
};
const char inv_on = LOW ;   //LOW для макета, HIGH  с транзисторами
const char inv_off = HIGH ;  // HIGH для макета, LOW   с транзисторами
int Count = (sizeof(point) / sizeof(point[0])); //Подсчет количества элементов в массиве
unsigned long duration = 20; // интервал
unsigned long previousMillis = 0;


void setup() {
  for (int i = 0; i < 18; i++) {
    pinMode(lp[i], OUTPUT);
    digitalWrite(lp[i], inv_off);

  }
  Serial.begin(9600);
}

void checkPoint(const char * title) {
  static unsigned long previousOne = 0;
  unsigned long currentMillis = millis();
  Serial.print("Check point #");
  Serial.print(title);
  Serial.print(": ");
  Serial.print(currentMillis);
  Serial.print(" elapsed since previous checkpoint: ");
  Serial.println(currentMillis - previousOne);
  previousOne = currentMillis;
}

void loop() {
  checkPoint("Enter Loop");
  for (int p0 = 0; p0 < Count; p0++ ) {
    long int p2 = pgm_read_dword   (&(point[p0]));
    for (int p1 = 0; p1 < 18; p1++) {
      digitalWrite(lp[p1], bitRead(p2, p1) ? inv_on : inv_off);
    }
    for (bool aa = true; aa; ) {
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis > duration) {
        previousMillis = currentMillis;
        aa = false;
      }
    }
  }
  checkPoint("Exit Loop");
}

Время между "Enter Loop" и "Exit loop" должно быть приблизительно 120-130 мс.

Дело в том, что задержка у Вас находится в цикле строки 56. Цикл выполняется в данном случае 6 раз. Вот 6*20 + время на всё остальное и даёт 120-130 мс.

Если получится так. то это нормально. Именно так, как написано. 

Покажите что получилось.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

ЕвгенийП пишет:

[

Покажите что получилось.

Не покажу !

Потому что теперь работает правильно ! Я в принципе не сомневался что специалисты справятся.Сам пытался. Два вечера просидел но так и не разобрался.

Спасибо всем откликнувшимся.

Отдельная благодарность ЕвгенийП за проявленное внимание и терпение.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С победой!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

ЕвгенийП пишет:

Вам бы код причесать. 

Так вы его уже причесали до неузнаваимости(в хорошем смысле) .Гляжу на свой код в первом сообщении и на ваш последний . Теперь я знаю откуда взялось выражение , как нельзя лучше подходящее к этому действию. "Причесать !" :-))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Этот код можно причёсывать и причёсывать, пока три строчки не останется :))

Если расположить светодиоды не абы как, а по строго по портам,то можно полностью убрать цикл перебирания светодиодов, а вместо него вставить всего три (!!!) команды на запись портов.  Типа PORTA=p2; PORTF=(p2>>8); PORTE=(p2>>16);

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

рыба гирлянды с использованием класс титановый велосипед для delay без delay().

у кого есть много фонтазии, что такого можно интересно намигать - приглашаю в garland();


#include <class_noDELAY.h>
noDELAY timer[7]; // генерится массив семи классов таймеров? - странно, но да...

unsigned int time[] = {100,200,300,400,500,600,700}; // время срабатывания таймеров

byte ledCount   = 7; // количество подключенных светодиодов
byte ledPins [] = { 0, 1,10,11,12,13,15}; // пины светодиодов

void setup() {

for (int i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT);
}

for (int i = 0; i < ledCount; i++) {
timer[i].start();
}

}

void loop() {

garland(); // код гирлянды

// считать состояние всех таймеров
for (int i = 0; i < ledCount; i++) {
timer[i].read(time[i]);
}

}

void garland() { // здесь рулим таймерами и пинами светодиодов в меру фантазии

// запустить все таймеры
// for (int i = 0; i < ledCount; i++) {
// timer[i].start(); // запустить таймер i
// }

// остановить все таймеры
// for (int i = 0; i < ledCount; i++) {
// timer[i].stop(); // остановить таймер i
// }

// time[i] = xxx; // изменить время таймера i

// зажечь/погасить светодиод i
// digitalWrite(ledPins[i], 0);
// digitalWrite(ledPins[i], 1);

// простая демка - логическое состояние пина светодиода изменяется на противоположное, согласно time[]
for (int i = 0; i < ledCount; i++) {
if (timer[i].tick) {digitalWrite(ledPins[i], !digitalRead (ledPins[i]));}
}

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, в общем, не особо напрягаясь и не пытаясь как-то и что-то поменять в логике (например, как советуют - переставить светодиоды, и т.п.). Просто Ваш код ну чуть-чуть прилизал то, что в глаза бросалось.

Вот Ваш код из поста 23. Я прокомментировал в нём то, мне резало глаза.

//****************Переменные пинов светодиодов
// Эти переменные дважды занимают память. Один раз сами, а второй раз в массиве lp. Зачем?
// Скорее всего оптимизатор их выбросит, но не будем на это надеяться, а выбросим их сами
int l1 = 4; //1
int l2 = 5; //2
int l3 = 6; //4
int l4 = 7; //8
int l5 = 8; //16
int l6 = 9; //32
int l7 = 10; //64
int l8 = 11; //128
int l9 = 12; //256
int l10 = 13;//512
int l11 = 14;//1024
int l12 = 15; //2048
int l13 = 16; //4096
int l14 = 17; //8192
int l15 = 18; //16384
int l16 = 19;//32768
int l17 = 1; //65536
int l18 = 3;//131072
//**************************

//	Этот массив 
//	a) никогда не меняется, значит надо сказать ему const
//	б) содержит данные, которые помещаются в 1 байт, значит незачем ему быть int
// в) используется только в данном файле, значит надо сказать ему static
int lp[] = {l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18}; // массив пинов светодиодов

#include <avr/pgmspace.h>

const PROGMEM  uint32_t  point[]  = {
  512, 0, 512, 0, 512, 0
};

//	Эти две переменные - суть константы. Таковыми их и надо сделать
//	Кроме того, если менять с макета на транзистор, их надо не забыть поменять ОБЕ - это
//	плохая идея. Сделаем так, чтобы менять надо было только что-то одно
const char inv_on = LOW ;   //LOW для макета, HIGH  с транзисторами
const char inv_off = HIGH ;  // HIGH для макета, LOW   с транзисторами

// Эти две переменные - суть константы. Так зачем им занимать память?
int Count = (sizeof(point) / sizeof(point[0])); //Подсчет количества элементов в массиве
unsigned long duration = 20; // интервал

// Эта переменная используется только в функции loop.
// Так нафига нам её объявлять глобальной?
//	Объявим по месту использования, нечего её тут торчать у всех на обозрении
unsigned long previousMillis = 0;


void setup() {
	// Зачем этому индексу быть int?
  for (int i = 0; i < 18; i++) {
  	 // Зачем два раза брать элемент массива? 
  	 // Это довольно дорогая операция.
  	 // Хотя в данном случае оптимизатор скорее всего
  	 // всё сделает за нас, но лучше иметь привычку самому
  	 // контролировать ситуацию, а не полагаться на оптимизатор
    pinMode(lp[i], OUTPUT);
    digitalWrite(lp[i], inv_off);

  }
  Serial.begin(9600);
}

void checkPoint(const char * title) {
  static unsigned long previousOne = 0;
  unsigned long currentMillis = millis();
  Serial.print("Check point #");
  Serial.print(title);
  Serial.print(": ");
  Serial.print(currentMillis);
  Serial.print(" elapsed since previous checkpoint: ");
  Serial.println(currentMillis - previousOne);
  previousOne = currentMillis;
}

void loop() {
  checkPoint("Enter Loop");
  // Если количество элементов массива point заведомо
  // меньше 256, то лучше p0 сделать uint8_t
  // На всякий случай я заменил, но если массив может иметь
  // более, чем 255 элементов, замените обратно
  for (int p0 = 0; p0 < Count; p0++ ) {
  	 // p2 никогда не меняется - делаем её const
    long int p2 = pgm_read_dword   (&(point[p0]));
    // p1 - заведомо меньше 128. Хватит с неё int8_t
    for (int p1 = 0; p1 < 18; p1++) {
      digitalWrite(lp[p1], bitRead(p2, p1) ? inv_on : inv_off);
    }
    for (bool aa = true; aa; ) {
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis > duration) {
        previousMillis = currentMillis;
        aa = false;
      }
    }
  }
  checkPoint("Exit Loop");
}

При компиляции у меня:
   Sketch uses 3 332
   Global variables use 360 bytesТепер

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

//**************** Константы пинов светодиодов
#define L1	4 //1
#define L2	5 //2
#define L3	6 //4
#define L4	7 //8
#define L5	8 //16
#define L6	9 //32
#define L7	10 //64
#define L8	11 //128
#define L9	12 //256
#define L10	13//512
#define L11	14//1024
#define L12	15 //2048
#define L13	16 //4096
#define L14	17 //8192
#define L15	18 //16384
#define L16	19//32768
#define L17	1 //65536
#define L18	3//131072

static const int8_t lp[] = {L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18}; // массив пинов светодиодов

#include <avr/pgmspace.h>

const PROGMEM  uint32_t  point[]  = {
  512, 0, 512, 0, 512, 0
};
#define	TotalPoints (sizeof(point) / sizeof(point[0]))

#define	MODE_TRANSISTOR	// Если режим "макет" - просто закомментируйте эту строку

#ifndef	MODE_TRANSISTOR // Если режим "макет"
	#define	INV_ON	LOW
#else	// Если режим "транзистор"
	#define	INV_ON	HIGH
#endif
#define	INV_OFF	(! INV_ON)


#define	DURATION	20ul

void setup() {
  for (register int8_t i = 0; i < 18; i++) {
    const int8_t pin = lp[i];
    pinMode(pin, OUTPUT);
    digitalWrite(pin, INV_OFF);
  }
  Serial.begin(9600);
}

void checkPoint(const char * title) {
  static unsigned long previousOne = 0;
  unsigned long currentMillis = millis();
  Serial.print("Check point #");
  Serial.print(title);
  Serial.print(": ");
  Serial.print(currentMillis);
  Serial.print(" elapsed since previous checkpoint: ");
  Serial.println(currentMillis - previousOne);
  previousOne = currentMillis;
}

void loop() {
  checkPoint("Enter Loop");
  for (register uint8_t p0 = 0; p0 < TotalPoints; p0++ ) {
    const long int p2 = pgm_read_dword   (&(point[p0]));
    for (int8_t p1 = 0; p1 < 18; p1++) {
      digitalWrite(lp[p1], bitRead(p2, p1) ? INV_ON : INV_OFF);
    }
    static unsigned long previousMillis = 0;
    unsigned long currentMillis;
    while (! ((currentMillis = millis()) - previousMillis >= DURATION));
    previousMillis = currentMillis;
  }
  checkPoint("Exit Loop");
}

При компиляции у меня:
   Sketch uses 2 954
   Global variables use 300 bytesТепер

 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

это #define DURATION    20ul какая-то фигня, а не гирлянда

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

И снова здравствуйте !

Прикрутил кнопку. Занимаюсь переключением режимов. Реализовал так : один массив, в котором последовательно записаны эффекты, к примеру по адресу от 0 до 10 один эффект,11-20 второй ,21-30 и т.д.  По нажатию кнопки выбираются адреса начала и конца   . Все работает но что то мне подсказывает что можно сделать проще. Что думаете ?

Видео покажу чуть позже.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

видео покажи. а то хз какие эффекты

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

jeka_tm пишет:

видео покажи. а то хз какие эффекты

Примерно так .... 

https://www.youtube.com/watch?v=1HtyRJ1WaWw&feature=youtu.be

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ничего сложного или случайного не увидел. все можно описать математически

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

как минимум здесь - previousMillis = currentMillis;