Уточните плиз по прерыванию

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Уточните плиз по прерыванию

#1

Сообщение Ingwar » 17.10.2020{, 21:32}

Делаю ПБ скоростных счетчиков с разными функциями для 4808 (там прерывание на любом пине) на основе штатного.
И вот в одной из настроек штатного есть такие строки при компиляции
void _SCT_1coutFunction()
{ _SCT_1IC++;
attachInterrupt(digitalPinToInterrupt (2), _SCT_1positiveCoutFunction, RISING );
}

Правильно ли я понимаю, что зайдя в функцию _SCT_1coutFunction, мы не выйдем из нее пока не случится другое прерывание и не отработает уже другая функция _SCT_1positiveCoutFunction?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Уточните плиз по прерыванию

#2

Сообщение Sancho » 17.10.2020{, 21:48}

Ingwar писал(а):
17.10.2020{, 21:32}
Правильно ли я понимаю, что зайдя в функцию _SCT_1coutFunction, мы не выйдем из нее пока не случится другое прерывание и не отработает уже другая функция _SCT_1positiveCoutFunction?
Нет.
Ingwar писал(а):
17.10.2020{, 21:32}
attachInterrupt(digitalPinToInterrupt (2), _SCT_1positiveCoutFunction, RISING );
настроит прерывание на пине 2 по положительному перепаду, фронту, по которому будет выполнен обработчик _SCT_1positiveCoutFunction
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Уточните плиз по прерыванию

#3

Сообщение Ingwar » 17.10.2020{, 22:28}

Все, врубился :smile250: :smile44:

Отправлено спустя 7 минут 21 секунду:
Все возможные варианты прерывания декларируем в setup, а потом, после срабатывания первого из них, в его функции задаем другое, которого будем ждать и т. д.?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Уточните плиз по прерыванию

#4

Сообщение Sancho » 17.10.2020{, 22:42}

Ingwar писал(а):
17.10.2020{, 22:36}
Все возможные варианты прерывания декларируем в setup, а потом, после срабатывания первого из них, в его функции задаем другое, которого будем ждать и т. д.?
Прерывание можно объявить в любой момент. Так-же его можно всегда перенастроить - изменить обработчик или событие его вызывающее.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Уточните плиз по прерыванию

#5

Сообщение Ingwar » 17.10.2020{, 23:08}

Sancho писал(а):
17.10.2020{, 22:42}
Прерывание можно объявить в любой момент.
Только не в составе функции? Задекларировал в сетапе - компилится, но не работает)
Sancho писал(а):
17.10.2020{, 22:42}
Так-же его можно всегда перенастроить - изменить обработчик или событие его вызывающее.
Да, наверное, но мне пока рано... пока копипаст... вдумчивый копипаст :smile171:

Отправлено спустя 49 минут 32 секунды:
Еще не могу понять почему выход на 7 пине не работает в такой конструкции
СпойлерПоказать
bool re=0;
void setup()
{


attachInterrupt (0, _SCT_1coutFunction, FALLING );
attachInterrupt(0, _SCT_1positiveCoutFunction, RISING );
pinMode(7, OUTPUT);

}
void loop()
{
digitalWriteFast(7, re);
}

void _SCT_1coutFunction()
{
re=0;
attachInterrupt( 0 , _SCT_1positiveCoutFunction, RISING );

}
void _SCT_1positiveCoutFunction()
{
re=1;
attachInterrupt( 0 , _SCT_1coutFunction, FALLING );
}
Но работает в такой
СпойлерПоказать
void setup()
{


attachInterrupt (0, _SCT_1coutFunction, FALLING );
attachInterrupt(0, _SCT_1positiveCoutFunction, RISING );
pinMode(7, OUTPUT);

}
void loop()
{

}

void _SCT_1coutFunction()
{
digitalWriteFast(7, 0);
attachInterrupt( 0 , _SCT_1positiveCoutFunction, RISING );

}
void _SCT_1positiveCoutFunction()
{
digitalWriteFast(7, 1);
attachInterrupt( 0 , _SCT_1coutFunction, FALLING );
}
Не работает в этой
СпойлерПоказать
bool Dubl_fr;

bool out7;

void setup()
{
attachInterrupt (0, _SCT_1coutFunction, FALLING );
attachInterrupt(0, _SCT_1positiveCoutFunction, RISING );
pinMode(7, OUTPUT);
}
void loop()

{
out7 = Dubl_fr;
digitalWriteFast(7, out7 );
}

void _SCT_1coutFunction()
{
Dubl_fr = 0;
attachInterrupt( 0 , _SCT_1positiveCoutFunction, RISING );
}
void _SCT_1positiveCoutFunction()
{
Dubl_fr = 1;
attachInterrupt( 0 , _SCT_1coutFunction, FALLING );
}
Но работает в этой
СпойлерПоказать
unsigned long CP;
bool Dubl_fr;
unsigned long _SCT_1P= 0UL;
unsigned long _SCT_1IC= 0UL;
bool out7;

void setup()
{

_SCT_1P=micros();
attachInterrupt (0, _SCT_1coutFunction, FALLING );
attachInterrupt(0, _SCT_1positiveCoutFunction, RISING );
pinMode(7, OUTPUT);

}
void loop()
{
if((( micros()-_SCT_1P) > 1000000 )||(( micros()-_SCT_1P) <0))
{
CP = _SCT_1IC;
_SCT_1IC=0;
_SCT_1P = micros();
}
out7 = Dubl_fr;
digitalWriteFast(7, out7 );
}

void _SCT_1coutFunction()
{
_SCT_1IC++;
Dubl_fr = 0;
attachInterrupt( 0 , _SCT_1positiveCoutFunction, RISING );

}
void _SCT_1positiveCoutFunction()
{
Dubl_fr = 1;
attachInterrupt( 0 , _SCT_1coutFunction, FALLING );
}
Это возможна фишка ядра?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

dsfbuy
Сержант
Сообщения: 171
Зарегистрирован: 03.11.2018{, 12:40}
Репутация: 21
Откуда: Братск
Имя: Виктор

Уточните плиз по прерыванию

#6

Сообщение dsfbuy » 18.10.2020{, 00:33}

Переменные которые изменяются в обработчике прерываний надо объявлять так:

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

volatile bool re=0;

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Уточните плиз по прерыванию

#7

Сообщение Ingwar » 18.10.2020{, 00:47}

dsfbuy писал(а):
18.10.2020{, 00:33}
Переменные которые изменяются в обработчике прерываний надо объявлять так:
А чем объяснить нижние 2 примера? Они отличаются только "вырезанным" замером за период.

Отправлено спустя 3 минуты 11 секунд:
dsfbuy писал(а):
18.10.2020{, 00:33}
volatile bool re=0;
Это помогло, спасибо.

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

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Уточните плиз по прерыванию

#8

Сообщение Sancho » 18.10.2020{, 11:56}

Ingwar,
Нет необходимости в сетапе объявлять оба типа прерывания на одном пине, если по ходу исполнения они меняются, всё равно последнее "затрёт" предыдущее.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Ответить

Вернуться в «Спросить у знатоков»