Фиксируемых генератор импульсов

Nikita 88
Offline
Зарегистрирован: 08.11.2016

Доброе время суток,проект простейшей программы поставил меня в ступор,надеусь на вашу отзывчивость !

И так имеем кнопку и один выход с подвязоным светодиодом для визуализации , Задача при нажатии на кнопку получаем импульс Hi 1C low 3C в количестве 50 раз и ждем нажатии нажатия кнопки если нажатия раньше окончания цикла то пауза и сброс счетчика. Зарания благодарен.

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

А за что именно Вы благодарны?

За то, что мы приняли Ваше сообщение к сведению?

Я понимаю еще, если бы в сообщении был вопрос, можно было бы быть юблагодарным за ответ на него...

А! Понял! Вы будете благоданы за дельный совет. Тогда даю такой: Если Вы хотите, чтобы кто-то решил поставленную задачу за Вас, подобные темы нужно размещать в разделе "Ищу исполнителя".

bwn
Offline
Зарегистрирован: 25.08.2014

andriano пишет:

А! Понял! Вы будете благоданы за дельный совет. Тогда даю такой: Если Вы хотите, чтобы кто-то решил поставленную задачу за Вас, подобные темы нужно размещать в разделе "Ищу исполнителя".

Недобрый ты, хоть раздел "Программирование" сперва бы предложил.))))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

написал я ему прграмку в "ищу..." пусть радуется. Не стоит это нравоучений.

Это просто по утрам я трезвый, потому и добрый. Было бы дело вечером - долго бы матерился на ленивого неуча.

Nikita 88
Offline
Зарегистрирован: 08.11.2016

Не судите так строго я просто еще учусь,а за скейч еще раз спасибо,пытаясь что-то написать не получалось реализовать счетчик,теперь есть пища для новых проэктов :-):-):-):-)

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

bwn пишет:

Недобрый ты, хоть раздел "Программирование" сперва бы предложил.))))

Не подходит по формальным признакам: для "Программирования" в исходном сообщении должен быть скетч.

bwn
Offline
Зарегистрирован: 25.08.2014

andriano пишет:

bwn пишет:

Недобрый ты, хоть раздел "Программирование" сперва бы предложил.))))

Не подходит по формальным признакам: для "Программирования" в исходном сообщении должен быть скетч.

А как же "Азбука"? А позже глядишь и нетленка появится.))))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Nikita 88 пишет:

Не судите так строго я просто еще учусь,а за скейч еще раз спасибо,пытаясь что-то написать не получалось реализовать счетчик,теперь есть пища для новых проэктов :-):-):-):-)

Рецепт: Как быстро написать скетч новичку.

1 Найти живой форум. А лучше не один. 

2. Открыть там тему и написать что скетч сделает.

3. Добрые(а может и не добрые ) дяди напишут рано или поздно скетч.

4. Придумать новые проэкты.

alex1608
Offline
Зарегистрирован: 01.09.2015

здравсттвуйте  подскажите что изменить в коде что бы генератор выдавал определеное количество импульсов например 3 импульса

alex1608
Offline
Зарегистрирован: 01.09.2015

здравсттвуйте  подскажите что изменить в коде что бы генератор выдавал определеное количество импульсов например 3 импульса

 

const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
 
long impuls = 1000;           // интервал между включение/выключением светодиода (1 секунда)
 
void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);     
}
 
void loop()
{for(int i = 0; i < 3; i = i+1){
  //  например повтор 3 раз
  
  unsigned long currentMillis = millis();
  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > impuls) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis; 
 
    // если светодиод не горит, то зажигаем, и наоборот
   
   if (ledState == LOW)
     ledState =HIGH ;
     else
      ledState = LOW;

 //   }
 
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  
}
}
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

вместо строк 26-29

ledState = !ledState;

Не проще будет?

 

 

alex1608
Offline
Зарегистрирован: 01.09.2015

проще но все равно при эмуляции  в протеусе  количество циклов не  равно трем оно бесконечно

 

bwn
Offline
Зарегистрирован: 25.08.2014

digitalWrite(ledPin, !DigitalRead(ledPin)); Минус одна переменная и несколько строк.

Чтобы не было бесконечно, надо завести конечную переменную и не позволять ей изменяться.)))))

alex1608
Offline
Зарегистрирован: 01.09.2015

поподробнее

bwn
Offline
Зарегистрирован: 25.08.2014

byte a = 0;
Вместо for      if (a < 3) {ваш мигалка}
После 34стр. a = a + 1;

alex1608
Offline
Зарегистрирован: 01.09.2015

Подскажите как избавиться в коде от delay

[code]
int a=20;
#define vihod 9
int b;
void setup() {                
  
  pinMode(vihod, OUTPUT);
     
}

void loop() {{
  
  int i=0; 
do {
  
  digitalWrite(vihod, HIGH);   
  delay(a);             
  digitalWrite(vihod, LOW); 
  delay(a); 
  i++;
}
while (i<10);}
int b;
  b=a*2;
delay(b);
digitalWrite(vihod,LOW);


delay(a);
 }



[/code]

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну , если я избавлюсь, то я полностью изменю программу. Это вам надо? Может пусть так будет.

bwn
Offline
Зарегистрирован: 25.08.2014

Боюсь в циклах будет проблемно. Классика здесь. Алгоритм придется в корне поменять на IF-ы.

alex1608
Offline
Зарегистрирован: 01.09.2015

ИЗМЕНЯЙТЕ ГЛАВНОЕ ЧТОБ  СМЫСЛ ОСТАЛСЯ

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

bwn, для меня это не "классика", а "глубокая древность".

bwn
Offline
Зарегистрирован: 25.08.2014

qwone пишет:

bwn, для меня это не "классика", а "глубокая древность".

Так я вроде ТС отвечал.))))
Если кому иному, то процитирю али обращусь.)))

bwn
Offline
Зарегистрирован: 25.08.2014

alex1608 пишет:

ИЗМЕНЯЙТЕ ГЛАВНОЕ ЧТОБ  СМЫСЛ ОСТАЛСЯ

Неа, это вы изменяйте. Направление показали.

alex1608
Offline
Зарегистрирован: 01.09.2015

ВСЕ ВЕРНО НЕ ПОЛУЧИЛОСЬ ПАУЗУ ДЕЛАТЬ В ПОСТЕ №9 ПРИШЛОСЬ ЧЕРЕЗ   DELAУ ДЕЛАТЬ 

Я НОВИЧЕК В ЭТОМ ДЕЛЕ

bwn
Offline
Зарегистрирован: 25.08.2014

Вроде в 9посте вас не устраивала только бесконечность повторения?

alex1608
Offline
Зарегистрирован: 01.09.2015

да все верно после повтора № количества пауза нужна там я просто пытался что подобное сдеелать без delay  

bwn
Offline
Зарегистрирован: 25.08.2014

Путаетесь в показаниях, просто пауза или прекратить вовсе?

alex1608
Offline
Зарегистрирован: 01.09.2015

пауза и дальше по кругу  основа для эмулятор ДПКВ авто в общем

bwn
Offline
Зарегистрирован: 25.08.2014

Заводите две глобальных переменных флага, в начале loop проверяете одну на 0, если да - крутите свой for, в конце изменяете ее значение.
После окончания for, проверяете второй флаг на 0, если да - изменяем его, запоминаем значение миллис и начинаем отсчитывать требуемый интервал. По достижении - сбрасываем оба флага в 0. Второй флаг нужен, чтобы при каждом проходе loop не изменять уже сохраненное значение миллис.

alex1608
Offline
Зарегистрирован: 01.09.2015

по подробне можно я новичек в микроконролерах учусь на примерах

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну вот так 

/* lex1608.ino
  #1 генератор -> 9 (Out1_pin)
*/
//#1 генератор
const int Out1_pin = 9; //  вывод генератора
bool Out1, Out1_old; // состояние на выв Out1_pin новое и старое
bool generator_ON = 1; // 1 идут импульсы / 0 формиров паузы между импульсов
const int half_cycle = 20; // длительность импульсов
const int n_inpuls = 10;// количество выдаваемых импульсов
byte i_inpuls = 0;// кол-во прошедших импульсов

void setup() {
  //#1 генератор
  pinMode(Out1_pin, OUTPUT);
  digitalWrite(Out1_pin, Out1 = 0);
}

void loop() {
  //#1 генератор
  static uint32_t past1 = 0;
  if (! generator_ON && millis() - past1 >= half_cycle / 2 ) { // формирование паузы мажду серией импульсов
    past1 = millis();
    generator_ON = 1; // вкл генератор
    i_inpuls = 0; // обнулить подсчет импульсов
  }
  if (generator_ON && millis() - past1 >= half_cycle ) { // формирователь импульсов
    past1 = millis();
    Out1_old = Out1;
    Out1 = ! Out1;
    if (! Out1_old && Out1) { // если прошел перепад 0/1
      i_inpuls++; 
      if (i_inpuls > n_inpuls) // если нужное количество импульсов выдано
        generator_ON = 0; // вкл формирователь паузы между импульсами
      else
        digitalWrite(Out1_pin, Out1 );
    }
    else digitalWrite(Out1_pin, Out1 );
  }
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Давайте проще, берете код из 9 поста и после 37 строки ставите delay с требуемой вам задержкой.

alex1608
Offline
Зарегистрирован: 01.09.2015

не идет на осцилограме  не работает пост №29

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

bwn пишет:

Давайте проще, берете код из 9 поста и после 37 строки ставите delay с требуемой вам задержкой.

Не все простые "гениальные"решения  будут работать. Перед тем как советовать, лучше убедиться на практике. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А вот залей в Ардуину и по светодиоду пин 13 убедись в мигании 5 импульсов

/* lex1608.ino
  #1 генератор -> 13 (Out1_pin)
*/
//#1 генератор
const int Out1_pin = 13; //  вывод генератора
bool Out1, Out1_old; // состояние на выв Out1_pin новое и старое
bool generator_ON = 1; // 1 идут импульсы / 0 формиров паузы между импульсов
const int half_cycle = 300; // длительность импульсов 
const int n_inpuls = 5;// количество выдаваемых импульсов
byte i_inpuls = 0;// кол-во прошедших импульсов

void setup() {
  //#1 генератор
  pinMode(Out1_pin, OUTPUT);
  digitalWrite(Out1_pin, Out1 = 0);
}

void loop() {
  //#1 генератор
  static uint32_t past1 = 0;
  if (! generator_ON && millis() - past1 >= half_cycle / 2 ) { // формирование паузы мажду серией импульсов
    past1 = millis();
    generator_ON = 1; // вкл генератор
    i_inpuls = 0; // обнулить подсчет импульсов
  }
  if (generator_ON && millis() - past1 >= half_cycle ) { // формирователь импульсов
    past1 = millis();
    Out1_old = Out1;
    Out1 = ! Out1;
    if (! Out1_old && Out1) { // если прошел перепад 0/1
      i_inpuls++; 
      if (i_inpuls > n_inpuls) // если нужное количество импульсов выдано
        generator_ON = 0; // вкл формирователь паузы между импульсами
      else
        digitalWrite(Out1_pin, Out1 );
    }
    else digitalWrite(Out1_pin, Out1 );
  }
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

qwone пишет:

bwn пишет:

Давайте проще, берете код из 9 поста и после 37 строки ставите delay с требуемой вам задержкой.

Не все простые "гениальные"решения  будут работать. Перед тем как советовать, лучше убедиться на практике. 

Каюсь, не проверял. Поверил автору, что все устраивает кроме отсутствия паузы.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

В таком стиле никаких delay() или других циклов быть в loop() не должно, ну кроме ну очень коротких. Это источник косяков в будущем. Вот народ на циклы и delay() подсел, и у них этот стиль "пробуксовывает".

alex1608
Offline
Зарегистрирован: 01.09.2015

qwone пишет:

А вот залей в Ардуину и по светодиоду пин 13 убедись в мигании 5 импульсов

/* lex1608.ino
  #1 генератор -> 13 (Out1_pin)
*/
//#1 генератор
const int Out1_pin = 13; //  вывод генератора
bool Out1, Out1_old; // состояние на выв Out1_pin новое и старое
bool generator_ON = 1; // 1 идут импульсы / 0 формиров паузы между импульсов
const int half_cycle = 300; // длительность импульсов 
const int n_inpuls = 5;// количество выдаваемых импульсов
byte i_inpuls = 0;// кол-во прошедших импульсов

void setup() {
  //#1 генератор
  pinMode(Out1_pin, OUTPUT);
  digitalWrite(Out1_pin, Out1 = 0);
}

void loop() {
  //#1 генератор
  static uint32_t past1 = 0;
  if (! generator_ON && millis() - past1 >= half_cycle / 2 ) { // формирование паузы мажду серией импульсов
    past1 = millis();
    generator_ON = 1; // вкл генератор
    i_inpuls = 0; // обнулить подсчет импульсов
  }
  if (generator_ON && millis() - past1 >= half_cycle ) { // формирователь импульсов
    past1 = millis();
    Out1_old = Out1;
    Out1 = ! Out1;
    if (! Out1_old && Out1) { // если прошел перепад 0/1
      i_inpuls++; 
      if (i_inpuls > n_inpuls) // если нужное количество импульсов выдано
        generator_ON = 0; // вкл формирователь паузы между импульсами
      else
        digitalWrite(Out1_pin, Out1 );
    }
    else digitalWrite(Out1_pin, Out1 );
  }
}

 

все работае осцилограф видт при установе количества зубьев даже обороты видит

надо будет попробоват на авто 

alex1608
Offline
Зарегистрирован: 01.09.2015

при расмотрении осцилограмы обнаружил страный импульс  период меньше чем у других

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну у меня осциллографа нет, точнее есть но на транзисторах. Я так не ковырял эту тему. Попробуйте millis() заменить на micros() со всеми последствиями http://arduino.ru/Reference/Micros. Да и на форуме прикреплена тема на эту тему.

http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-blink-i-bez-delay-i-bez-millis

 

Ну и код 

/* alex1608_v2.ino
  #1 генератор -> 9 (Out1_pin)
*/
//#1 генератор
const int Out1_pin = 9; //  вывод генератора
bool Out1, Out1_old; // состояние на выв Out1_pin новое и старое
bool generator_ON = 1; // 1 идут импульсы / 0 формиров паузы между импульсов
const int half_cycle = 20000; // длительность импульсов в микросекундах
const int n_inpuls = 10;// количество выдаваемых импульсов
byte i_inpuls = 0;// кол-во прошедших импульсов

void setup() {
  //#1 генератор
  pinMode(Out1_pin, OUTPUT);
  digitalWrite(Out1_pin, Out1 = 0);
}

void loop() {
  //#1 генератор
  static uint32_t past1 = 0;
  if (! generator_ON && micros() - past1 >= half_cycle / 2 ) { // формирование паузы мажду серией импульсов
    past1 = micros();
    generator_ON = 1; // вкл генератор
    i_inpuls = 0; // обнулить подсчет импульсов
  }
  if (generator_ON && micros() - past1 >= half_cycle ) { // формирователь импульсов
    past1 = micros();
    Out1_old = Out1;
    Out1 = ! Out1;
    if (! Out1_old && Out1) { // если прошел перепад 0/1
      i_inpuls++;
      if (i_inpuls > n_inpuls) // если нужное количество импульсов выдано
        generator_ON = 0; // вкл формирователь паузы между импульсами
      else
        digitalWrite(Out1_pin, 1 );
    }
    else digitalWrite(Out1_pin, 0 );
  }
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

alex1608, а что вы хотите то? Выдать пачку импульсов может стандартная функция tone(), нужно только точно рассчитать тайминг. К примеру команда tone(8,100,50); даст на 8 ногу  5 импульсов с периодом 10мс.

alex1608
Offline
Зарегистрирован: 01.09.2015

просто пачка импульсов не устроит  задающий диск например ваз  ДПКВ ВАЗ представляеш 58зубьев и 2 пропушено?