Задержка без Delay.

maxibons
Offline
Зарегистрирован: 27.12.2015

Делаю первые шаги в освоении ардуино.

Помогите понять свою ошибку.

тестовые скетчи.

Первый код с delay работает.

int data_pin = 11;
int clock_pin = 12;
byte g_digits[10]={
 B00100001, B10110111, B00011001, B00010101, B10000111,   // 0 1 2 3 4
 B01000101, B01000001, B00110111, B00000001, B00000101};   // 5 6 7 8 9
byte disp;
int ledPin = 13;
int ledState = LOW;


void setup() {
pinMode(clock_pin, OUTPUT);
pinMode(data_pin, OUTPUT);
pinMode(ledPin, OUTPUT);}

void loop() {
  for (int j = 0; j < 10; j++) {
disp = g_digits[j];
    shiftOut(data_pin, clock_pin, LSBFIRST, disp);
    if (j > 5) ledState = HIGH;
      else ledState = LOW;
      digitalWrite(ledPin, ledState);
    delay(500);}
}

Второй с millis не работает.

//счетчик до 10 на 4094!!!!
int data_pin = 11;
int clock_pin = 12;
byte g_digits[10]={
 B00100001, B10110111, B00011001, B00010101, B10000111,   // 0 1 2 3 4
 B01000101, B01000001, B00110111, B00000001, B00000101};   // 5 6 7 8 9
byte disp;
int j_delay = 500;
unsigned long actual_j_delay = 0;
int ledPin = 13;
int ledState = LOW;

void setup() {
pinMode(clock_pin, OUTPUT);
pinMode(data_pin, OUTPUT);
pinMode(ledPin, OUTPUT);
}

void loop() 
{
  if(millis() - actual_j_delay > j_delay)
      {  
        actual_j_delay = millis();
         for (int j = 0; j < 10; j++)
            {
              disp = g_digits[j];
              shiftOut(data_pin, clock_pin, LSBFIRST, disp);
             
      if (j > 5) ledState = HIGH;
      else ledState = LOW;
      digitalWrite(ledPin, ledState);
            }  
      }    
              
            
      
 }

 

MacSim
Offline
Зарегистрирован: 28.11.2012

Не работает? бывает по разному...

При компелировании какие ошибки выдает?

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

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

В первом случае задержка внутри цикла, во втором - снаружи. Скетчи разные.
Плюс как именно и что не работает, откуда мы знаем?

maxibons
Offline
Зарегистрирован: 27.12.2015

MacSim пишет:

Не работает? бывает по разному...

При компелировании какие ошибки выдает?

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

]

Компилируется и заливается без ошибок.

Тоже думаю, что совмещаю несовместимое, а как сделать правильно, не соображу.

Мне, по сути, нужна задержка только для

j++

kisoft пишет:
В первом случае задержка внутри цикла, во втором - снаружи. Скетчи разные. Плюс как именно и что не работает, откуда мы знаем?

Не могу сообразить, как можно Millis() засунуть внутрь цикла, если Millis() - объемлющий цикл.

Задача теста - считать на семисегментнике от 0 до 9 и при условии, когда число больше пяти - зажигать светодиод (13).

Скетчи разные только реализацией задержки.

Первый вариант работает исправно, цифры считает, светик горит, когда надо, а именно 3 секунды не горит и 2 секунды горит.

Второй вариант выводит на индикатор мусор, который вздрагивает через 500мс, светик отрабатывает включение - выключение, но с другими интервалвми.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

maxibons пишет:

Первый код с delay работает.

....

Второй с millis не работает.

.....

Вы понимаете что это не логично и с таким подходом вы программировать не научитесь!

-Если работает с delay то нужно так и оставить.

-А если хотите неаучиться  delay не использовать, тогда зачем чужой помощи просите? Ищите ошибку сами тогда будет толк.

maxibons
Offline
Зарегистрирован: 27.12.2015

bodriy2014 пишет:

...тогда зачем чужой помощи просите? Ищите ошибку сами тогда будет толк.

Ну, можно учиться на своих ошибках, а можно на чужих...

Как я понимаю, функция приращения for и функция задержки Millis не совместимы.

Вот так все заработало, что еще раз доказывает, что утро вечера мудренее.

void loop() 
{
   if(millis() - actual_j_delay >= j_delay)
            {  
              actual_j_delay = millis();
              j++;
              if (j == 10) j = 0;
              disp = g_digits[j];
              shiftOut(data_pin, clock_pin, LSBFIRST, disp);
              if (j > 5) ledState = HIGH;
              else ledState = LOW;
              digitalWrite(ledPin, ledState);
            }  
}

Вот ответ http://arduino.ru/forum/programmirovanie/kak-podruzhit-tsikl-i-funktsiyu-millis

 

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

Ну вот, теперь и здесь задержка внутри цикла.

maxibons
Offline
Зарегистрирован: 27.12.2015

Уважаемый kisoft, я честно не понимаю...

Разве не наоборот? Я вижу в последнем коде функцию задержки Millis, внутри которой всё и происходит.

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

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

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

Там используется конструкция

if (millis......
     for (z....
          PORTD = .....

Я пытаюсь изменить её вот так

if (millis......
     for (z....
          shiftOut( .....
 
 
 

 

 

Пока безуспешно. И попытка избавиться от for пока не дала результат на этом конкретном случае.

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

Я вижу, что в сообщении #5 что все работает. А теперь оказывается, что не работает. Как понять то?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

maxibons пишет:

Ну, можно учиться на своих ошибках, а можно на чужих...

На чужих ошибках учатся только хирурги-травматологи.

Все остальные - на своих.

maxibons
Offline
Зарегистрирован: 27.12.2015

kisoft пишет:
Я вижу, что в сообщении #5 что все работает. А теперь оказывается, что не работает. Как понять то?

в сообщении #5 "учебный" код, из которого я выкинул for.

И выводы я там про несовместимость делаю неверные.

Потому что в чужом коде оно работает. Но там нет shiftOut.

В итоге, я избавился от for и там. Почти уверен, что если бы больше понимал - не пришлось бы избавляться.

Возможно, сумбурно получилось объяснить...

Мне бы хотелось понять Ваши замечания про вложенность функций. Могли бы направить?

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

Не понимаю о вложенности каких функций идёт речь?
Разбейте задачу на части. Научитесь работать с 595 регистром без циклов. Потом усложняйте задачу. Статьи по регистру есть на форуме, почитайте раздел Программирование в верхней части экрана есть такая ссылка. Там есть примеры работы с 595.
http://arduino.ru/Tutorial/registr_74HC595

MacSim
Offline
Зарегистрирован: 28.11.2012

maxibons пишет:

bodriy2014 пишет:

...тогда зачем чужой помощи просите? Ищите ошибку сами тогда будет толк.

Ну, можно учиться на своих ошибках, а можно на чужих...

Как я понимаю, функция приращения for и функция задержки Millis не совместимы.

Вот так все заработало, что еще раз доказывает, что утро вечера мудренее.

void loop() 
{
   if(millis() - actual_j_delay >= j_delay)
            {  
              actual_j_delay = millis();
              j++;
              if (j == 10) j = 0;
              disp = g_digits[j];
              shiftOut(data_pin, clock_pin, LSBFIRST, disp);
              if (j > 5) ledState = HIGH;
              else ledState = LOW;
              digitalWrite(ledPin, ledState);
            }  
}

Вот ответ http://arduino.ru/forum/programmirovanie/kak-podruzhit-tsikl-i-funktsiyu-millis

 

а что милис не работает в цикле?

милис завязана на таймер 0. функция делей вызывает милис. т.е по сути делей тот же N*милес.

maxibons
Offline
Зарегистрирован: 27.12.2015

kisoft пишет:
Не понимаю о вложенности каких функций идёт речь?

Я тоже не понимаю, и поэтому прошу Вас разъяснить, что Вы имелли ввиду здесь

kisoft пишет:
В первом случае задержка внутри цикла, во втором - снаружи. Скетчи разные. Плюс как именно и что не работает, откуда мы знаем?

и здесь

kisoft пишет:
Ну вот, теперь и здесь задержка внутри цикла.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

maxibons пишет:

kisoft пишет:
Не понимаю о вложенности каких функций идёт речь?

Я тоже не понимаю, и поэтому прошу Вас разъяснить, что Вы имелли ввиду здесь

[/quote]

Может я попробую объяснить : в тех двух скечах что вы привели в первый в лупе есть цыкл, который тормозится на пол секунды после каждого прибавления i, а во втором скече цыкл for вызывается раз в пол секунды и "прохерачивает сразу все i без задержек. 

Первый выполняется так i=0, пауза, i=1, пауза, i=3, пауза....

Второй так: пауза, i=0,1,2,3,4,5,6,7,8,9,10, пауза.

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

maxibons пишет:

Мне бы хотелось понять Ваши замечания про вложенность функций. Могли бы направить?

Про вложенность функций - вот это Ваша фраза. Понятия не имею, что имелось с виду, по контексту непонятно.

 

 

maxibons
Offline
Зарегистрирован: 27.12.2015

Mr.Privet, благодарю.

Не сочтите за наглость - а как нужно было сделать во втором случае, чтоб не выкидывать for и не использовать  delay?

Спасибо.