FLProg
Вход на сайт
Логин:
Пароль:
Поиск
...
Статистика
Пятница, 23.06.2017, 01:07
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » Работа генератора к коде на С++ (Прощу разъяснить подробнее.)
Работа генератора к коде на С++
Nikito$ Дата: Среда, 12.04.2017, 01:09 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 74
Награды: 2
Репутация: 1
Статус: Offline
Всем доброго времени суток! Параллельно с работой в 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
 
support Дата: Среда, 12.04.2017, 05:01 | Сообщение # 2
Автор программы
Группа: Администраторы
Сообщений: 858
Награды: 40
Репутация: 26
Статус: Offline
Ну во первых Вы зря порезали код. Правильнее так

 
Код
//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$ Дата: Среда, 12.04.2017, 10:34 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 74
Награды: 2
Репутация: 1
Статус: Offline
Цитата support ()
Ну во первых Вы зря порезали код. Правильнее так

Сергей, спасибо за подробное разъяснение! Просто редактированием кода я изучал функционал генератора. И всё же, если не требуется проверять включен ли генератор, зачем выполнять первое условие if ( (digitalRead (1))) ???


Сообщение отредактировал Nikito$ - Среда, 12.04.2017, 10:36
 
support Дата: Среда, 12.04.2017, 10:55 | Сообщение # 4
Автор программы
Группа: Администраторы
Сообщений: 858
Награды: 40
Репутация: 26
Статус: Offline
Если не требуется управление генератором (включение - выключение) то код можно свести к этому

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

 
Код
_gen1P = millis();             //запоминаем время


Разработчик программы FLProg
 
Nikito$ Дата: Среда, 12.04.2017, 12:46 | Сообщение # 5
Лейтенант
Группа: Проверенные
Сообщений: 74
Награды: 2
Репутация: 1
Статус: Offline
Цитата support ()
Если не требуется управление генератором (включение - выключение) то код можно свести к этому
f ( _isTimer ( _gen1P , 500 )) {        // если с  момента последнего запоминания времени прошло 500 мс.
      _gen1P = millis();            //запоминаем новое время
      _gen1O = ! _gen1O;        //инвертируем выход генератора
    } а в секции setup прописываем

_gen1P = millis();             //запоминаем время
 
 Ещё раз спасибо, буду разбираться!
 
Форум » Основной » Спросить у знатоков » Работа генератора к коде на С++ (Прощу разъяснить подробнее.)
Страница 1 из 11
Поиск:

FLProg © 2017
Яндекс.Метрика