проблема с внешними прерываниями

iopq
Offline
Зарегистрирован: 05.07.2016

подскажите пожалуйста а то уже вторую ночь сижу не пойму

вот настроил прерывание -

volatile bool inter = false;

void func(){
 inter = true;
}
 

void setup() {
Serial.begin(115200);
attachInterrupt(0, func, RISING);
interrupts();
}

вот отслеживаю событие -

void loop() {
if(inter == true){
inter = false;
 noInterrupts();

//тут что то делаем

 interrupts();
}

}

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

 

 

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

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

По вашему коду не понятно, зачем вы включаете-выключаете прерывания в ЛУПе.

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

Откуда берётся Ваше прерывание? Физически?

Кстати, код написан неправильно, но к описанному Вами эффекту это приводить не должно.

iopq
Offline
Зарегистрирован: 05.07.2016

физически подключенное устройство его инициализирует. а что не правильного в коде?

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

iopq пишет:

физически подключенное устройство его инициализирует

Секрет какое? Тогда сами разбирайтесь со своей проблемой. Откуда мне знать, что там за устройство? Например, у него дребезг бывает? И много таких вопросов.

iopq пишет:

а что не правильного в коде?

Между строками №№ 2 и 3 может произойти ещё одно прерывание, которое Вы пропустите.

iopq
Offline
Зарегистрирован: 05.07.2016

дребезга нет. устройство специфичное так что никакого представления оно не даст

если сделать так -

void setup() {
 Serial.begin(115200);
 attachInterrupt(0, func, RISING);
 interrupts();
}


void func(){


Serial.println("interrupt");

}

все работает идеально

 

если сделать так -

void setup() {
 Serial.begin(115200);
 attachInterrupt(0, func, RISING);
 interrupts();
}


void func(){

DDRD  |=   _BV(2);
PORTD |=   _BV(2);
_delay_us(20);
PORTD &= ~ _BV(2);
_delay_us(10);
PORTD |=   _BV(2);
_delay_us(2000);

Serial.println("interrupt");

}

то все. цикл. такое ощущение что прерывание не отключаются и реагирует на на мои посылки

 

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

iopq пишет:

если сделать так -

void setup() {
 Serial.begin(115200);
 attachInterrupt(0, func, RISING);
 interrupts();
}


void func(){

DDRD  |=   _BV(2);
PORTD |=   _BV(2);
_delay_us(20);
PORTD &= ~ _BV(2);
_delay_us(10);
PORTD |=   _BV(2);
_delay_us(2000);

Serial.println("interrupt");

}

то все. цикл. такое ощущение что прерывание не отключаются и реагирует на на мои посылки

Что-то ничего похожего на это в первом посте не было. Здесь-то понятно в строке 15 Вы поднимаете новое прерывание. Зачем - это Вам виднее, но Вы его поднимаете, как раз по RISING. Если Вам и впрямь нужно это делать, то Вы должны почистить флаг прерывания после строки 15. Тогда никакого цикла не будет.

А то, что "не отключаются", так с чего им отключаться, если Вы их не отключаете?

iopq
Offline
Зарегистрирован: 05.07.2016

огромное спасибо