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

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

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

Правильно ли я понимаю, что зайдя в функцию _SCT_1coutFunction, мы не выйдем из нее пока не случится другое прерывание и не отработает уже другая функция _SCT_1positiveCoutFunction?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

Ingwar писал(а): 17 окт 2020, 21:32 Правильно ли я понимаю, что зайдя в функцию _SCT_1coutFunction, мы не выйдем из нее пока не случится другое прерывание и не отработает уже другая функция _SCT_1positiveCoutFunction?
Нет.
Ingwar писал(а): 17 окт 2020, 21:32 attachInterrupt(digitalPinToInterrupt (2), _SCT_1positiveCoutFunction, RISING );
настроит прерывание на пине 2 по положительному перепаду, фронту, по которому будет выполнен обработчик _SCT_1positiveCoutFunction
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

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

Отправлено спустя 7 минут 21 секунду:
Все возможные варианты прерывания декларируем в setup, а потом, после срабатывания первого из них, в его функции задаем другое, которого будем ждать и т. д.?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

Ingwar писал(а): 17 окт 2020, 22:36 Все возможные варианты прерывания декларируем в setup, а потом, после срабатывания первого из них, в его функции задаем другое, которого будем ждать и т. д.?
Прерывание можно объявить в любой момент. Так-же его можно всегда перенастроить - изменить обработчик или событие его вызывающее.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

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

Отправлено спустя 49 минут 32 секунды:
Еще не могу понять почему выход на 7 пине не работает в такой конструкции
[spoiler]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 );
}[/spoiler]
Но работает в такой
[spoiler]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 );
}[/spoiler]
Не работает в этой

[spoiler]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 );
}[/spoiler]
Но работает в этой
[spoiler]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 );
}
[/spoiler]

Это возможна фишка ядра?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
dsfbuy
Сержант
Сообщения: 172
Зарегистрирован: 03 ноя 2018, 12:40
Откуда: Братск
Имя: Виктор

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

Сообщение dsfbuy »

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

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

volatile bool re=0;
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

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

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

Отправлено спустя 4 минуты 56 секунд:
Подозреваю козни компилятора...
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

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

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость