Страница 1 из 1

Блокирующий таймер

Добавлено: 07.03.2016{, 14:13}
SirYorik
как правильно сделать блокирующий таймер (и вообще таймеры запускаемые по условию)
вот такая схема НЕ работает:
5852721.jpg
она генерит код:

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

bool _gtv1 = 0; //ВРЕМЯ_БЛОКИРОВКИ
int _gtv2 = 10; //НЕКОЕ_УСЛОВИЕ
long _gtv3 = 0; //ЛЮБАЯ_РАБОТА_НИЖЕ_ПО_СХЕМЕ
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
void setup()
{
}
void loop()
{

  if (( ((_gtv2) > (0)) && (!(_gtv1)) )) {
    if (! _gen1I) {
      _gen1I = 1;
      _gen1O = 1;
      _gen1P = millis();
    }
  } else {
    _gen1I = 0 ;
    _gen1O = 0;
  }
  if (_gen1I &&  _gen1O)   _gen1O = !( _isTimer( _gen1P , 100 ));
  if (( ((_gtv2) > (0)) && (!(_gtv1)) )) {
    _gtv3 = 100500;
  }
  _gtv1 = _gen1O;

}
из которого видно, что таймер никогда не достигнет нужной длительности, следющим циклом он  сбросится (входом EN), следующим снова запустится и произойдет присваивание 100500, следующим снова сброс и так по кругу.

меняем схему сдвигая присваивание вниз:
6743052.jpg
смотрим код:



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

bool _gtv1 = 0; //ВРЕМЯ_БЛОКИРОВКИ
int _gtv2 = 10; //НЕКОЕ_УСЛОВИЕ
long _gtv3 = 0; //ЛЮБАЯ_РАБОТА_НИЖЕ_ПО_СХЕМЕ
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
void setup()
{
}
void loop()
{

  if (( ((_gtv2) > (0)) && (!(_gtv1)) )) {
    if (! _gen1I) {
      _gen1I = 1;
      _gen1O = 1;
      _gen1P = millis();
    }
  } else {
    _gen1I = 0 ;
    _gen1O = 0;
  }
  if (_gen1I &&  _gen1O)   _gen1O = !( _isTimer( _gen1P , 100 ));
  _gtv1 = _gen1O;
  if (( ((_gtv2) > (0)) && (!(_gtv1)) )) {
    _gtv3 = 100500;
  }

}
сюрприз, таймер по прежнему рвётся, а присваивание полезной нагрузки произойдет только на СЛЕДУЮЩИЙ цикл, в результате нижележащие платы дают не те результаты (уловие случилось - а реакция будет в будущем)

Блокирующий таймер

Добавлено: 07.03.2016{, 16:46}
rw6cm
SirYorik писал(а):блокирующий таймер

Блокирующий таймер

Добавлено: 07.03.2016{, 19:12}
SirYorik
rw6cm писал(а):TimerStop.flp(65Kb)
принцип тотже - EN перекрывается сигналом таймера с инверсией.
только полезная нагрузка здесь сам сигнал таймера - а мне этот сигнал вообще не нужен.
мне нужно разовое присваивание, которое не должно повториться при любых условных данных пока таймер не истёк.

Добавлено (07.03.2016, 19:12)
---------------------------------------------
TOF и одновибратор.
в блокировке использовать только TOF.
тема закрыта

Блокирующий таймер

Добавлено: 07.03.2016{, 19:13}
Airis
Если использование одновиратора необязательно, то блокировку можно сделть элементом "задержка на отключение".

Блокирующий таймер

Добавлено: 07.03.2016{, 19:31}
rw6cm
SirYorik писал(а):мне нужно разовое присваивание, которое не должно повториться при любых условных данных пока таймер не истёк.
Или я что то не понимаю что вы хотите, но то что выложил, именно это и делает.
По условию стопорит данные пока не истечет таймер.
Сделал пример для проверки все так и работает.

Блокирующий таймер

Добавлено: 07.03.2016{, 21:09}
SirYorik
вместо одновибратора надо использовать TOF - тогда работает