Работа генератора к коде на С++

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
Nikito$
Рядовой
Сообщения: 74
Зарегистрирован: 15.12.2016{, 22:04}
Репутация: 0
Откуда: Екатеринбург

Работа генератора к коде на С++

#1

Сообщение Nikito$ » 12.04.2017{, 01:09}

Всем доброго времени суток! Параллельно с работой в FLProg я занимаюсь изучением языка Си. Первые программы я начал писать года 3-4 назад, но тогда дальше бегущих огней с использованием цикла for и подобных простых вещей дело не пошло. Почему не знаю, может времени толком не было,может желания, а может и ещё чего-нибудь… Но последние полгода свободного стало чуть больше и желание что-нибудь собрать,естественно на ардуино, снова дало о себе знать. Так я познакомился с чудесной программой – FLProg. Уже реализовал не одну свою идею и это не может не радовать. Это была небольшая
ремарка, теперь ближе к делу!

Для очередного своего проекта, которой я пишу на Си, потребовалось подробнее разобраться с функций millis(). Решил посмотреть, как работает генератор, в коде, который генерирует FLProg. В результате остался ряд вопросов. Итак, есть простой генератор...

bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
void setup()
{
pinMode(8, OUTPUT);
}

void loop()
{
if (!_gen1I)
{
_gen1I = 1;
_gen1O = 1;
_gen1P = millis();
}

if (_gen1I)
{
if (_isTimer(_gen1P, 500))
{
_gen1P = millis();
_gen1O = !_gen1O;
}
}

digitalWrite(8, _gen1O);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{

unsigned long currentTime;
currentTime = millis();
if (currentTime >= startTime)
{
return (currentTime >= (startTime + period));
}
else
{
return (currentTime >= (4294967295 - startTime + period));
}
}

Если я всё правильно понимаю в данном отрезке кода

if (_gen1I)
{
if (_isTimer(_gen1P, 500))
{
_gen1P = millis();
_gen1O = !_gen1O;
}
}

В функцию bool _isTimer передаются значения количества миллисекунд в виде переменной _gen1P и требуемая задержка. И тут же функция, возвращает заданный
промежуток времени, переворачивая переменную _gen10. Вот как это происходит мне и не понятно(( Можно пожалуйста разъяснить этот вопрос как можно подробнее.
Последний раз редактировалось Nikito$ 12.04.2017{, 10:38}, всего редактировалось 1 раз.

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Работа генератора к коде на С++

#2

Сообщение support » 12.04.2017{, 05:01}

Ну во первых Вы зря порезали код. Правильнее так

 

Код: Выделить всё

//Board:1
  if ( (digitalRead (1))) {           // Если на входе En лог 1
    if (! _gen1I) {                     // если флаг о работе генератора ==0
      _gen1I = 1;                      // ставим флаг что генератор в работе
      _gen1O = 1;                     //выход блока в 1
      _gen1P = millis();             //запоминаем время
    }
  } else {                // Если на входе En лог 0
    _gen1I = 0 ;           //сбрасываем флаг работы генератора
    _gen1O = 0;               // выход генератора в 0
  }

  if (_gen1I) {       // если генератора в работе
    if ( _isTimer ( _gen1P , 500 )) {        // если с  момента последнего запоминания времени прошло 500 мс.
      _gen1P = millis();            //запоминаем новое время
      _gen1O = ! _gen1O;        //инвертируем выход генератора
    }
  }
  digitalWrite(2, _gen1O);         //выход генератора записываем на цифровой выход контроллера
Автор программы FLProg.

Nikito$
Рядовой
Сообщения: 74
Зарегистрирован: 15.12.2016{, 22:04}
Репутация: 0
Откуда: Екатеринбург

Работа генератора к коде на С++

#3

Сообщение Nikito$ » 12.04.2017{, 10:34}

support писал(а):Ну во первых Вы зря порезали код. Правильнее так
Сергей, спасибо за подробное разъяснение! Просто редактированием кода я изучал функционал генератора. И всё же, если не требуется проверять включен ли генератор, зачем выполнять первое условие if ( (digitalRead (1))) ???
Последний раз редактировалось Nikito$ 12.04.2017{, 10:36}, всего редактировалось 1 раз.

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Работа генератора к коде на С++

#4

Сообщение support » 12.04.2017{, 10:55}

Если не требуется управление генератором (включение - выключение) то код можно свести к этому

 

Код: Выделить всё

if ( _isTimer ( _gen1P , 500 )) {        // если с  момента последнего запоминания времени прошло 500 мс.
      _gen1P = millis();            //запоминаем новое время
      _gen1O = ! _gen1O;        //инвертируем выход генератора
    }
 а в секции setup прописываем

 

Код: Выделить всё

_gen1P = millis();             //запоминаем время
Автор программы FLProg.

Nikito$
Рядовой
Сообщения: 74
Зарегистрирован: 15.12.2016{, 22:04}
Репутация: 0
Откуда: Екатеринбург

Работа генератора к коде на С++

#5

Сообщение Nikito$ » 12.04.2017{, 12:46}

support писал(а):Если не требуется управление генератором (включение - выключение) то код можно свести к этому
f ( _isTimer ( _gen1P , 500 )) {        // если с  момента последнего запоминания времени прошло 500 мс.
      _gen1P = millis();            //запоминаем новое время
      _gen1O = ! _gen1O;        //инвертируем выход генератора
    } а в секции setup прописываем

_gen1P = millis();             //запоминаем время
 
 Ещё раз спасибо, буду разбираться!

Ответить

Вернуться в «Спросить у знатоков»