Помогите разобраться с циклом

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

Делаю контроллер управления подсветкой на чипе TLC5940. Последний ньюанс остался, не могу разобраться.

Вопрос возник в цикле for в 19 строке этой функции, дело в том что при прохождении этого цикла for, все светодиоды просто гаснут, хотя программа должна перейти к функции stepsOffFromUp(), но этого не происходит. Еще один момент заключается в том, что если изменить s>=0 на s>=1, то все работает как положено, но не доходя до самого первого светодиода. Канал 0 подключен, в остальном коде программы работает без нареканий. Помогите пожалуйста разобраться

void stepsOffFromDown()
{
  delay(pauseSteps + secondTime);
  for (int i = 0; i < steps; i++)
  {
    for (int j = brightness; j>=0; j-=speedSteps * 2)
    {
      Tlc.set(i, j);
      Tlc.update();
      delay(1/correctionTime);
    }
    Tlc.set(i, 0);
//check sensors
    currentUpSensor = sensorUp.Ranging(CM);
    currentDownSensor = sensorDown.Ranging(CM);
//up sensor
    if(currentUpSensor < lastUpSensor-5.00) 
    {
      for(byte s = i; s >= 0; s--)
      {
        for(int b = 0; b <= brightness; b+=speedSteps)
        {
          Tlc.set(s, b);
          Tlc.update();
          delay(1/correctionTime);
        }
      }
      secondTime = 4000;
      stepsOffFromUp();
      secondTime = 0;
      goto quit;
    }
//down sensor
      if(currentDownSensor < lastDownSensor-5.00) 
    {
      for(int b = brightness; b >= 0; b-=speedSteps * 4)
      {
        for(byte k = i; k<=steps; k++)
        {
          Tlc.set(k, b);
          Tlc.update();
          delay(1);
        }
      }
      Tlc.clear();
      stepsOnFromDown();
      goto quit;
    }
  }
    for(int k = 0; k<=brightnessLastSteps; k += brightnessLastSteps/25)
    {
     Tlc.set(0, k);
     Tlc.set(steps-1, k);
     Tlc.update();
     delay(10);
    }
    
 quit:;
 
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну, во первых - раз не получается разобраться в "большой функции" - нужно ее упрощать. Разбивать на мелкие, выкидывать какие-то кусочки... скажем выкинуть работу с Tlc и натыкать кучу Serial.println что-бы в логе было видно "что происходит". И другим рассказать, и самому посмотреть "что же там происходит с переменными" можно.
Тогда, кстати, взять и запустить ваш код смогут не только те у кого случайно тоже есть Tlc шка, но любой у кого есть ардуина.
Подумайте во сколько раз сразу повыситься шанс на получение помощи?

Второе: есть нюанс: Tlc.update() - не означает что "данные отправились микрухе". Это только команда НАЧАТЬ передачу данных. А закончится передача "чуток попозже", хотя ваш код уже пошел дальше. Закончится передача когда Tlc.update() начнет возвращать false.
Поэтому, если хотите иметь уверенность (если она ваша логика того требует), что "текущие состояние каналов отправленно на микруху", то использовать нужно:

while(Tlc.update());

Тогда следующая строка выполниться только после того как все данные "отправлены" в Tlc-шку.

Третье: Tlc.update()... делать после каждого Tlc.set - не имеет смысла. Большой расход времени. Вы можете вначале, своим циклом пройти и сделать Tlc.set каждому каналу, а уж потом.... Tlc.update() который отправит значения всех каналов на микруху. Тем более что он в любом случае "отправляет все каналы", даже если вы изменили только один.

Четвертное: Goto - "фу, фу....". Забудте про сущесвование  этого слова. Перечитывайте справочник, про циклы и функции. ВСЕГДА есть способ обойтись без GOTO. В вашем случае поможет оператор return;

Пятое: смотрим на строчку

for(byte s = i; s >= 0; s--)

Как вы думаете, при каких условиях, при каком значении s, этот цикл завершит свою работу. Чему должна стать равна переменна s, что-бы цикл больше не выполнялся?

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

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

Первое: проверял цикл Println-oм, выполняется цикл for до конца, до 0-го канала, а потом не понятно куда уходит программа, она не продолжается дальше, но весь вопрос в том что не работает только при for(byte s = i; s >= 0; s--), если поставить for(byte s = i; s >= 1; s--), все работает как положено! Но мне обязательно нужно чтобы этот нулевой канал учавствовал тоже.

Второе: думаю это не очень критично в данном случае

Третье: у меня во внутреннем цикле for меняется яркость, так что скорее всего смысл каждый раз отправлять Tlc.update() все же есть.

Четвертое: Почему нет?) Как по мне, так очень удобная штука. У меня там и так цикл на цикле, аж страшно становится. Это мой первый опыт работы с ардуино да и с программированием в целом, может я чего-то не понимаю?

Пятое: в данном случае s должно стать равно 0. Но у меня весь вопрос состоит в том что если вместо этого 0 поставить 1, данный код работает как нужно! За исключением того что не включается 0-ой канал, а он мне позарез нужен

leshak
Offline
Зарегистрирован: 29.09.2011

DieseL.cfg пишет:

Первое: проверял цикл Println-oм, выполняется цикл for до конца, до 0-го канала, а потом не понятно куда уходит программа, она не продолжается дальше, но весь вопрос в том что не работает только при for(byte s = i; s >= 0; s--), если поставить for(byte s = i; s >= 1; s--), все работает как положено! Но мне обязательно нужно чтобы этот нулевой канал учавствовал тоже.

А каков был мой вопрос "хотите ли вы участие нулевого канала" или "при каком значении s цикл перестаент выполнятся?".
Попробуйте еще раз. Назовите цифру, при котором цикл прекратит свое выполнение. Приведите пример когда s>=0 - вернет значение false?  

leshak
Offline
Зарегистрирован: 29.09.2011

DieseL.cfg пишет:

Второе: думаю это не очень критично в данном случае

Третье: у меня во внутреннем цикле for меняется яркость, так что скорее всего смысл каждый раз отправлять Tlc.update() все же есть.

Ваши возражения - взаимосключают друг друга. Если вы хотите "поменять один канал", и следующий менять только после того как это изменение отобразилось, то... вам нужно ждать, пока "отправка данных завершится".
Если не хотите.... то имеет смысл вначале выставить в нужную яркость все каналы . а потом отправлять.
А сейчас у вас:
1. Вы поменяли один канал
2. Начали отправку данных (процесс идет..)
3. Меняете следующий... а отправка-то идет....какой канал в данный момент отправляется в микруху - вы не знаете. в результате никто не знает отправилось новое значение для следующего канала в микруху или нет. Может успело, а может не успело.
Возникает неопределенное поведение.  Можете получить ситуацию, когда set каналу вы сделали, а в микруху он так и не отправился.

 

leshak
Offline
Зарегистрирован: 29.09.2011

DieseL.cfg пишет:

Четвертое: Почему нет?) Как по мне, так очень удобная штука. У меня там и так цикл на цикле, аж страшно становится. Это мой первый опыт работы с ардуино да и с программированием в целом, может я чего-то не понимаю?

Просто поверте на слово. Если не хотите что-бы вас пинали по этому поводу на каждом углу. 
Это не "удобно", а способ сильно повысить вероятность "выстрелить себе в ногу".
Существование GOTO восходит древним временам, когда языки были не столь развиты и оставленно только из "соображение совместимости".
Если вы пишите не на ассемблере, то просто представте что такого слова нет. И ищите решение другими средствами. Наличие этого слова в коде означает только одно: человек плохо знаком с управляющими структурами (if, циклы, функции)
Вообщем для любого программиста это будет "красная тряпка для быка".

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014
При таком коде

if(currentUpSensor < lastUpSensor-5.00) 
    {
      byte channel = 10;
      Serial.println("Start if");
      for(byte s = i; s >= 0; s--)
      {
        Serial.print("Step ");
        Serial.println(channel);
        for(int b = 0; b <= brightness; b+=speedSteps)
        {
          Tlc.set(s, b);
          while(Tlc.update());
          delay(1/correctionTime);
        }
        channel--;
      }
      Serial.println("End if");
      secondTime = 4000;
      stepsOffFromUp();
      secondTime = 0;
      goto quit;
    }

Println выдает

Start if
Step 10
Step 9
Step 8
Step 7
Step 6
Step 5
Step 4
Step 3
Step 2
Step 1
Step

Если же подставить 1-цу

if(currentUpSensor < lastUpSensor-5.00) 
    {
      byte channel = 10;
      Serial.println("Start if");
      for(byte s = i; s >= 1; s--)
      {
        Serial.print("Step ");
        Serial.println(channel);
        for(int b = 0; b <= brightness; b+=speedSteps)
        {
          Tlc.set(s, b);
          while(Tlc.update());
          delay(1/correctionTime);
        }
        channel--;
      }
      Serial.println("End if");
      secondTime = 4000;
      stepsOffFromUp();
      secondTime = 0;
      goto quit;
    }

результат Println

Start if
Step 10
Step 9
Step 8
Step 7
Step 6
Step 5
Step 4
Step 3
Step 2
Step 1
End if

 

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

leshak пишет:

DieseL.cfg пишет:

Второе: думаю это не очень критично в данном случае

Третье: у меня во внутреннем цикле for меняется яркость, так что скорее всего смысл каждый раз отправлять Tlc.update() все же есть.

Ваши возражения - взаимосключают друг друга. Если вы хотите "поменять один канал", и следующий менять только после того как это изменение отобразилось, то... вам нужно ждать, пока "отправка данных завершится".
Если не хотите.... то имеет смысл вначале выставить в нужную яркость все каналы . а потом отправлять.
А сейчас у вас:
1. Вы поменяли один канал
2. Начали отправку данных (процесс идет..)
3. Меняете следующий... а отправка-то идет....какой канал в данный момент отправляется в микруху - вы не знаете. в результате никто не знает отправилось новое значение для следующего канала в микруху или нет. Может успело, а может не успело.
Возникает неопределенное поведение.  Можете получить ситуацию, когда set каналу вы сделали, а в микруху он так и не отправился.

 

абсолютно верное замечание, с этим я столкнулся с самого начала, решается простым delay, но ваш способ логичнее, приму на вооружение, спасибо

leshak
Offline
Зарегистрирован: 29.09.2011

print-ны... это хорошо. уметь искать ими узкое место - это нужно.
но вот нашли его...
а теперь нужно думать  "а почему так получается?".

вот что-бы это понять нужно, все-таки ответить на МОЙ вопрос. я же не просто так его задал. Два раза уже.
Забудте про ардуину, забудте про код, забудте про TLC-шку.
Представте что мы в школе.
На доске написанно неравенство:

S>=0;

Вас вызвают к доске и говорят: приведите два примера значение S. Один при котором неравество выполяется, а другой при которым неравество  не выполняется.
Ваш ответ звучит так "при S равным .... неравенство будет выполнятся, при S равным .... неравенство не будет выполнятся".
Вот там где "многоточие", вам нужно подставить какую-то цифру.
Естественно, раз у нас знак нестрогий, то у нас есть бесконечное количество чисел при которых неравество выполняется, и бесконечное при которых - не выполняется. Но дайте хотя-бы по одному примеру. Одну цифру как "пример выполнения" и одну цифру как "пример не выполнения".
Ну скажем при "при S равно неравенство S>=0, будет выполнятся, а при S равно ???? неравенство не выполнится"?
Ну? Назовите цифру... не код, не "что вы хотите получить", не каковы ваши планы на лето, а одну цифру.
 

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

leshak пишет:

print-ны... это хорошо. уметь искать ими узкое место - это нужно.
но вот нашли его...
а теперь нужно думать  "а почему так получается?".

вот что-бы это понять нужно, все-таки ответить на МОЙ вопрос. я же не просто так его задал. Два раза уже.
Забудте про ардуину, забудте про код, забудте про TLC-шку.
Представте что мы в школе.
На доске написанно неравенство:

S>=0;

Вас вызвают к доске и говорят: приведите два примера значение S. Один при котором неравество выполяется, а другой при которым неравество  не выполняется.
Ваш ответ звучит так "при S равным .... неравенство будет выполнятся, при S равным .... неравенство не будет выполнятся".
Вот там где "многоточие", вам нужно подставить какую-то цифру.
Естественно, раз у нас знак нестрогий, то у нас есть бесконечное количество чисел при которых неравество выполняется, и бесконечное при которых - не выполняется. Но дайте хотя-бы по одному примеру. Одну цифру как "пример выполнения" и одну цифру как "пример не выполнения".
Ну скажем при "при S равно неравенство S>=0, будет выполнятся, а при S равно ???? неравенство не выполнится"?
Ну? Назовите цифру... не код, не "что вы хотите получить", не каковы ваши планы на лето, а одну цифру.
 

Вы меня натолкнули на верный ход, все заработало!!! И сейчас я понимаю что вы это делали в каждом своем посте) Я столько тупил, т.к. думал что если s уже равно 0, это будет концом цикла, и дальше вычитания происходить не будет. Огромное вам спасибо что уделили время, что не поленились и вникли в мою проблему, бескрайне хочется уважать таких людей. У вас интересный подход, вы заставляете задуматься, и целите туда куда нужно. Мне даже кажется вы преподаете программирование.

Еще раз спасибо за все)

leshak
Offline
Зарегистрирован: 29.09.2011

DieseL.cfg пишет:

Вы меня натолкнули на верный ход, все заработало!!!

Но, обратите внимание, как долго вы этому сопротивлялись. Читали мой вопрос, а отвечали на собственные мысли.
И, кстати.... вы так и не ответили на вопрос. Цифру при которой неравенство не выполнится - я не так и не услышал от вас :)

Так в чем же была причина? То что "заработало" еще не является 100% гарантией что "причину поняли правильно".
Как решили проблему?
Опишите, может и другим пригодится. Не вы же первый с циклами разбираетесь.

DieseL.cfg пишет:

 бескрайне хочется уважать таких людей.

Ну так а что вам мешает?  Не сдерживайте себя ;) Хочется уважать - уважайте, не хочется - не уважайте :) Свобода воли ;)

DieseL.cfg пишет:

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

Не... у меня не хватило бы нервов. Тут хоть "хочу участвую, хочу не участвую". Особо упертых или "халявщиков" - можно и послать. А если видишь что "человек старается сам...", то почему бы и подтолкнуть в нужную сторону?

 

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

Ответ на ваш вопрос конечно же -1, о которм тип byte ничего не слышал). Проблема решилась объявлением временной переменной s как int.

Значит цикл for все таки делает последнюю проверку в виде s=(0-1)=-1, чтобы убедиться что дальше идти некуда...

leshak
Offline
Зарегистрирован: 29.09.2011

DieseL.cfg пишет:

Ответ на ваш вопрос конечно же -1, о которм тип byte ничего не слышал). Проблема решилась объявлением временной переменной s как int.

Верно :)  А сообразите, как, сделать если использовать int нельзя?  Ну вот запретили нам пользоваться int-том.
Как быть?
 

DieseL.cfg пишет:
Значит цикл for все таки делает последнюю проверку в виде s=(0-1)=-1, чтобы убедиться что дальше идти некуда...

А вот тут вы ошиблись. Дальше есть "куда". Serial.println(s) сделайте в первой же строчке цикла. И delay() после него воткните, что-бы оно успело отправить его до того как зависнет (или, все-таки выкинте, как я вам изначально говорил работу с Tlc-шкой, только Serial.println-ны оставте, посмотрете как НА САМОМ ДЕЛЕ меняется ваша s.
Иногда этот "эффект" - зло, а иногда наоборот используют его специально.

 

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

leshak пишет:

DieseL.cfg пишет:

Ответ на ваш вопрос конечно же -1, о которм тип byte ничего не слышал). Проблема решилась объявлением временной переменной s как int.

Верно :)  А сообразите, как, сделать если использовать int нельзя?  Ну вот запретили нам пользоваться int-том.
Как быть?
 

DieseL.cfg пишет:
Значит цикл for все таки делает последнюю проверку в виде s=(0-1)=-1, чтобы убедиться что дальше идти некуда...

А вот тут вы ошиблись. Дальше есть "куда". Serial.println(s) сделайте в первой же строчке цикла. И delay() после него воткните, что-бы оно успело отправить его до того как зависнет (или, все-таки выкинте, как я вам изначально говорил работу с Tlc-шкой, только Serial.println-ны оставте, посмотрете как НА САМОМ ДЕЛЕ меняется ваша s.
Иногда этот "эффект" - зло, а иногда наоборот используют его специально.

 

Возможно дополнительным if(s = 0){отсюда выход из цикла for} ?

А в простом скетче с циклом, в Println и правда видно как это все работает, доходит до 0, и начинает отсчет с 255.

leshak
Offline
Зарегистрирован: 29.09.2011

DieseL.cfg пишет:

Возможно дополнительным if(s = 0){отсюда выход из цикла for} ?

А вы напишите в виде кода. Отложите, пока в сторону свой скетч с tlc-шкой, создайте новый...
loop() - пустой.
А в setup-пе, циклик. Внутри которого serial.println()
Просто вывидете подряд цифры 15,14,13.....,3,2,1,0  разными способами.
Через изменение типа счетчика - вы уже нашли  (кстати можно было char использовать, вместо int. один байт съкономили бы).
Найдите еще. оставив тип byte.

И "играйся сколько хочу" (тему-то вы назвали "разобратся с for" - ну вот и "разбирайтесь", разберетесь, потом уже лестницы/чудестницы клепать будете.

Чем вам if(s==0) поможет?  (дядя, прекращайте путать  = и ==, это хуже чем бросать сцепление на авто, одна такая перепутка и причину проблемм можно искать неделю, компилятор вам ошибку не выбросит... мучатся сами будете).

Где вы его воткнуть собрались? В теле цикла? А чем это поможет что-бы цикл выполнился нужное количество раз? byte же от этого все равно отрицательным стать не может.
Значит нужно что? Вы, в принципе уже находили ответ раньше "остановится на один шаг раньше". s>=1  (кстати s>0 - это "тоже самое"). Но.... нам же нужно что-бы "последней цифрой вывелся ноль, а не единица", так вот: как при значении счетчика 1 вывести ноль? (и выполнить все остальные условия задачи...)?

Вообщем показывайте цикл который у вас получился :)

DieseL.cfg пишет:

А в простом скетче с циклом, в Println и правда видно как это все работает, доходит до 0, и начинает отсчет с 255.

Вот. Теперь понимаете что у вас произошло?  Вы попытались установить значение 255-каналу. А каналы, внутри библиотеки, естественно хранятся в виде массива. И естествено масив имеет свой размер (16-ть по умолчанию). А вы попытались записать в "255" ячейку. Вышли за границы массива, сделали изменение памяти которая "принадлежит каким-то другим данным или коду". И естественно "повредили их". Отсюда - зависание  (но, в принципе может быть "что угодно". другие переменные неожиданно меняются, мусор в сериал, перезагрузки и т.п. и т.д.)

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014
вот)
 
void setup() {
  Serial.begin(9600);
  byte i = 15;
    while(i >= 0 && i < 16)
    {
      Serial.println(i);
      i--;
    }
  Serial.println("It's work :)");
}

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Хитрец... да. можно и while :) и do while - в принципе они все "взаимозаменяемы", но...
У нас-то тема про for :)

for(byte s=???;s>0;s--){
  Serial.println(?????);
}

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

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014
  for(byte s=16; s>0; s--)
  {
    Serial.println(s-1); 
  }

Просто и хитро одновременно)

 

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

Попкорн кончился, leshak - монстр просто :)

leshak
Offline
Зарегистрирован: 29.09.2011

Ну что же вы так не расчитали с попкорном, сезон сериала-то не закончился... :)
А что если нам запретили "--" использовать? И нам можно только увеличивать счетчик?

 

for(byte s=0;i<???;s++){
   serial.println(?????);
}

А вывести нужно, все теже 15,14,13....3,2,1,0  ?

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

leshak пишет:

Ну что же вы так не расчитали с попкорном, сезон сериала-то не закончился... :)
А что если нам запретили "--" использовать? И нам можно только увеличивать счетчик?

 

for(byte s=0;i<???;s++){
   serial.println(?????);
}

А вывести нужно, все теже 15,14,13....3,2,1,0  ?

  for(byte s=0; 16 > s; s++)
  {
    Serial.println(15 - s);
  }

столько способов однако

 

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

Ещё вместо byte - есть аналог только со знаком

leshak
Offline
Зарегистрирован: 29.09.2011

DieseL.cfg пишет:

  for(byte s=0; 16 > s; s++)
  {
    Serial.println(15 - s);
  }

столько способов однако

 

[/quote]

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

Волько вот это "16 > s"... оно конечно "абсолютно правильно", только "глаз цепляется". Трудно такое читать, обычно все-таки пишут s<16. Когда оно все время пишется (и везде в примерах так будет, и в учебниках), то глаз уже "читает это" не задумываясь: "цикл выполнится 16-ть раз". Не включая мозг. Он нам еще пригодится :)

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

Вот на базе идей последнего примера, как-бы вы сделали, если вывести нужно было такой ряд цифр:
15,0,14,1,13,2,12,3,11,4,10,5,9,6 ,8,7

Смогете?

leshak
Offline
Зарегистрирован: 29.09.2011

kisoft пишет:

Ещё вместо byte - есть аналог только со знаком

Уже было:

leshak пишет:

(кстати можно было char использовать, вместо int. один байт съкономили бы).

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

leshak пишет:

DieseL.cfg пишет:

  for(byte s=0; 16 > s; s++)
  {
    Serial.println(15 - s);
  }

столько способов однако

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

Волько вот это "16 > s"... оно конечно "абсолютно правильно", только "глаз цепляется". Трудно такое читать, обычно все-таки пишут s<16. Когда оно все время пишется (и везде в примерах так будет, и в учебниках), то глаз уже "читает это" не задумываясь: "цикл выполнится 16-ть раз". Не включая мозг. Он нам еще пригодится :)

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

Вот на базе идей последнего примера, как-бы вы сделали, если вывести нужно было такой ряд цифр:
15,0,14,1,13,2,12,3,11,4,10,5,9,6 ,8,7

Смогете?

  for(byte s=0; s<8; s++)
  {
    byte i = 0;
    Serial.println(15-i);
    Serial.println(i);
    i++;
  }

начинаю подозревать что нужно было идти учиться на программиста)

leshak
Offline
Зарегистрирован: 29.09.2011

DieseL.cfg пишет:

  for(byte s=0; s<8; s++)

  {
    byte i = 0;
    Serial.println(15-i);
    Serial.println(i);
    i++;
  }

начинаю подозревать что нужно было идти учиться на программиста)

А сейчас вы, по вашему, чем занимаетесь? ;)

Одно я только не понял, а зачем вы сюда i прикрутили? Чем вас s не устраивал, он же пробегает ровно по тем же значениям что и ваше "i". Почему s не использовали в println-нах? Зачем еще одну переменную заводили?

А теперь подумаем "а нафига мы этим занимались", какое применение может быть?

А если  теперь мы сделаем "обратную трансформацию"? Раньше мы Tlc.set-ты заменяли на println-ны
А теперь наоборот, print-ln-ны этого цикла заменим на Tlc.set-ты?
Какой "физический смысл" имеет этот ряд "15,0,14,1,13,2,12,3,11,4,10,5,9,6 ,8,7"?
А это позволяет "пустить волну" по лестнице не "снизу-вверх", а "от краев к центру".

По аналогии, можно сделать и "от центра к краям". "7,8,6,9,5,10...."

 

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

leshak пишет:

DieseL.cfg пишет:

  for(byte s=0; s<8; s++)

  {
    byte i = 0;
    Serial.println(15-i);
    Serial.println(i);
    i++;
  }

начинаю подозревать что нужно было идти учиться на программиста)

А сейчас вы, по вашему, чем занимаетесь? ;)

Одно я только не понял, а зачем вы сюда i прикрутили? Чем вас s не устраивал, он же пробегает ровно по тем же значениям что и ваше "i". Почему s не использовали в println-нах? Зачем еще одну переменную заводили?

А теперь подумаем "а нафига мы этим занимались", какое применение может быть?

А если  теперь мы сделаем "обратную трансформацию"? Раньше мы Tlc.set-ты заменяли на println-ны
А теперь наоборот, print-ln-ны этого цикла заменим на Tlc.set-ты?
Какой "физический смысл" имеет этот ряд "15,0,14,1,13,2,12,3,11,4,10,5,9,6 ,8,7"?
А это позволяет "пустить волну" по лестнице не "снизу-вверх", а "от краев к центру".

По аналогии, можно сделать и "от центра к краям". "7,8,6,9,5,10...."

 

с i до этого опыты делал, а насчет волны - хорошая идея, пригодится

leshak
Offline
Зарегистрирован: 29.09.2011

leshak пишет:

Одно я только не понял, а зачем вы сюда i прикрутили? Чем вас s не устраивал, он же пробегает ровно по тем же значениям что и ваше "i". Почему s не использовали в println-нах? Зачем еще одну переменную заводили?


Кстати "схалтурили". Дали ответ - но поленились проверить его сами.

Вот что выводит ваш пример:

15
0
15
0
15
0
15
0
15
0
15
0
15
0
15
0

Лажа. Если уж хотели заводить "i", то нужно было объявлять ее вне цикла. Что-бы она при каждом проходе цикла - не обнулалась.

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

leshak пишет:

leshak пишет:

Одно я только не понял, а зачем вы сюда i прикрутили? Чем вас s не устраивал, он же пробегает ровно по тем же значениям что и ваше "i". Почему s не использовали в println-нах? Зачем еще одну переменную заводили?


Кстати "схалтурили". Дали ответ - но поленились проверить его сами.

Вот что выводит ваш пример:

15
0
15
0
15
0
15
0
15
0
15
0
15
0
15
0

Лажа. Если уж хотели заводить "i", то нужно было объявлять ее вне цикла. Что-бы она при каждом проходе цикла - не обнулалась.

не, не халтурил, я i в цикл внес когда на сайт уже код постил, ошибся, не подумал, если вынести его, все работает)

leshak
Offline
Зарегистрирован: 29.09.2011

А можно еще, это сделать через "два счетчика". for - на самом деле не ограничивает нас сколько у нас счетчиков. и в разделе "инициализаци" и в разделе "выполнить после цикла" мы можем впихнуть что мы захотим.
 

 for(byte u=0,d=15;u<8;u++,d--)  { // u- идет вверх, d - идет вниз
    Serial.println(d);
    Serial.println(u);
  }

Но в "боевых проектах", лично я сам не люблю подобные "выкрутасы". Все-таки "один цикл, один счетчик" - как-то легче читается.

DieseL.cfg
Offline
Зарегистрирован: 03.07.2014

leshak пишет:

А можно еще, это сделать через "два счетчика". for - на самом деле не ограничивает нас сколько у нас счетчиков. и в разделе "инициализаци" и в разделе "выполнить после цикла" мы можем впихнуть что мы захотим.
 

 for(byte u=0,d=15;u<8;u++,d--)  { // u- идет вверх, d - идет вниз
    Serial.println(d);
    Serial.println(u);
  }

Но в "боевых проектах", лично я сам не люблю подобные "выкрутасы". Все-таки "один цикл, один счетчик" - как-то легче читается.

Не знал о таком. Сложнее, но где-то может быть и полезно.