Всем доброго времени суток! Параллельно с работой в 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 апр 2017, 10:38, всего редактировалось 1 раз.
- support
- Супермодератор
- Сообщения: 1902
- Зарегистрирован: 03 янв 2018, 11:45
- Откуда: Астрахань
- Имя: Сергей
- Контактная информация:
Работа генератора к коде на С++
Ну во первых Вы зря порезали код. Правильнее так
Код: Выделить всё
//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.
Работа генератора к коде на С++
Сергей, спасибо за подробное разъяснение! Просто редактированием кода я изучал функционал генератора. И всё же, если не требуется проверять включен ли генератор, зачем выполнять первое условие if ( (digitalRead (1))) ???support писал(а):Ну во первых Вы зря порезали код. Правильнее так
Последний раз редактировалось Nikito$ 12 апр 2017, 10:36, всего редактировалось 1 раз.
- support
- Супермодератор
- Сообщения: 1902
- Зарегистрирован: 03 янв 2018, 11:45
- Откуда: Астрахань
- Имя: Сергей
- Контактная информация:
Работа генератора к коде на С++
Если не требуется управление генератором (включение - выключение) то код можно свести к этому
а в секции setup прописываем
Код: Выделить всё
if ( _isTimer ( _gen1P , 500 )) { // если с момента последнего запоминания времени прошло 500 мс.
_gen1P = millis(); //запоминаем новое время
_gen1O = ! _gen1O; //инвертируем выход генератора
}
Код: Выделить всё
_gen1P = millis(); //запоминаем время
Автор программы FLProg.
Работа генератора к коде на С++
support писал(а):Если не требуется управление генератором (включение - выключение) то код можно свести к этому
f ( _isTimer ( _gen1P , 500 )) { // если с момента последнего запоминания времени прошло 500 мс.
_gen1P = millis(); //запоминаем новое время
_gen1O = ! _gen1O; //инвертируем выход генератора
} а в секции setup прописываем
_gen1P = millis(); //запоминаем время
Ещё раз спасибо, буду разбираться!
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость