Проблемы с millis HELP

nafanja
nafanja аватар
Offline
Зарегистрирован: 20.06.2018

К Ардуине не протеусе к пин 3 подходит тактовый сигнал. На кнопку СТАРТ пин 5 подходит генератор  и кнопку щелевого датчика (кнопка СТОП) пин 4 подходи генератор , два генератора выдают сигналы примерно в 1 секунду разницы чередуясь друг с другом, заставляя таким образом получать по факту пачки импульсы в 1 секунду и паузу в 1 секунду.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nafanja пишет:
нам нужно отключить генерацию или усыпить прерывание. В скетче я попробjвал сделать noInterrups

И заморозили свой контроллер!

Вы как "просыпляли" свое прерывание? "attachInterrupt"??? Так и "усыпляйте" его "detachInterrupt", чего выпендриваться-то?

b707
Offline
Зарегистрирован: 26.05.2017

nafanja пишет:

Сейчас вопрос такой, можно ли снять аппаратное прерывание через noInterrupts одним нажатием и навсегда.

 

вот именно что "навсегда". И не только нужное вам прерывание, но и все остальные.

nafanja
nafanja аватар
Offline
Зарегистрирован: 20.06.2018

Тогда вы можете пояснить хоть чуть чуть. перерыл весь интернет. Никаких примеров не нашел. Стандартные описания и все. привести какой-то пример, от чего можно было бы плясать...

Вы пишите что навсегда аппаратное прерывание снимаю функцией noInterrupts()...Это как сработал щелевой датчик.

Но потом же я включаю и выдаю interrupts()

Вот стандартное описание...Это цитата с сайта Гувера

ПЯ выключил прерывание датчиком. Ардуино ждет...я включаю кнопку СТАРТ и при этом там interrupts

Если можете пояснить - поясните плиз. Если есть куда читать - буду прищнателен...

nafanja
nafanja аватар
Offline
Зарегистрирован: 20.06.2018

Нашел вот это, но что делать с этим дальше - непонятно

void detachInterrupt(uint8_t);



Описание:

Отключает указанное прерывание.



Вызов:

detachInterrupt(interrupt);
b707
Offline
Зарегистрирован: 26.05.2017

командой noInterrupts() вы выключаете ВСЕ прерывания микроконтроллера. ВСЕ, понимаете?

Вы, может быть, не в курсе, но то прерывание, которое вы используете для датчика - в МК далеко не единственное. В микроконтроллере много других разных функций, работающих на прерываниях - причем многие из них необходимы для нормальной жизни МК. А вы их взяли и выключили.

Функцией noInterrupts() прерывания можно выключать только на очень короткое время. буквально на микросекунду. И если вы не понимаете, как это работает - лучше вообще эту функцию не трогайте. Если же вам надо выключить только свое прерывание - вам noInterrupts() не нужен, используйте детач.

 

А вообще, Нафаня, вы рано схватились за прерывания. Это совсем не для новичков тема. Вы вообще пока слепой котенок и мало что соображаете, вам лучше бы сначала сделать пяток проектов попроще

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно и головную боль топором полечить.

Когда Вы требует МК запретить обработку прерываний, то это означает, что далее ни одно (почти) системное прерывание не будет выполнено. Т.е. вы должны забыть о millis(), delay(), выводе в Serial и иных приятных безделушках.

Если Вы используете attachInterrupt() , detachInterrupt(), то просто разрешаете или не разрешаете вызывать Вашу персональную функцию из штатного обработчика, не затрагивая все остальное.

Это все, что нужно знать, чтобы сделать правильный выбор между двумя вышеупомянутыми способами.

b707
Offline
Зарегистрирован: 26.05.2017

nafanja пишет:

Нашел вот это, но что делать с этим дальше - непонятно

void detachInterrupt(uint8_t);



Описание:

Отключает указанное прерывание.



Вызов:

detachInterrupt(interrupt);

и что тут может быть непонятно? - если непонятно, значит вам еще рано... Хотя посмотрел на вашу регистрацию - если вы на четвертом году занятий ардуино все еще этого не поняли - может это просто не ваше?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nafanja пишет:

Нашел вот это, но что делать с этим дальше - непонятно

void detachInterrupt(uint8_t);

Примерно за 10 часов до Вашего поста, я Вам про неё писал в посте #52. Теперь Вы её нашли? Вы посты читаете? Или только пишете?

А что с этим делать? Что Вы делаете с attachInterrupt? Подключаете? Ну, а этим отключайте.

nafanja
nafanja аватар
Offline
Зарегистрирован: 20.06.2018

Я стараюсь в силу своих возможностей и я тут слепой котенок - это верно. 

Можно ли так делать?

 attachInterrupt(1, blink1, RISING); //значения для прерывания

}

void loop() {

  pinstartState = digitalRead(pinStart);
  // считываем значения с кнопки старта

  pinsensorState = digitalRead(pinSensor);
  // считываем значения с входа щелевого датчика

  if (pinstartState == HIGH) {    //если на кнопке СТАРТ высокое значение
    interrupts();
  }             // Изменяем режим кнопки

  if (pinsensorState == HIGH) {   //если щелевой датчик включен
    detachInterrupt(1);
  } // обнуляем значение

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Оно ж не компилируется! Впрочем, делайте, мы свободные люди, кто же Вам запретит-то?

nafanja
nafanja аватар
Offline
Зарегистрирован: 20.06.2018
Попробовал так  - убрал из void setup
attachInterrupt(1, blink1, RISING);

 и прикрутил к кнопке СТАРТ . Является ли это корректно?

void loop() {

  pinstartState = digitalRead(pinStart);
  // считываем значения с кнопки старта

  pinsensorState = digitalRead(pinSensor);
  // считываем значения с входа щелевого датчика

  if (pinstartState == HIGH) {    //если на кнопке СТАРТ высокое значение
    attachInterrupt(1, blink1, RISING); //значения для прерывания
  }             // Изменяем режим кнопки

  if (pinsensorState == HIGH) {   //если щелевой датчик включен
    detachInterrupt(1);
  } // обнуляем значение


Протеус показал работоспособность...