Страница 1 из 1

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

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

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

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

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

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

Добавлено: 17 окт 2020, 22:36
Ingwar
Все, врубился :smile250: :smile44:

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

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

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

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

Добавлено: 17 окт 2020, 23:57
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]

Это возможна фишка ядра?

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

Добавлено: 18 окт 2020, 00:33
dsfbuy
Переменные которые изменяются в обработчике прерываний надо объявлять так:

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

volatile bool re=0;

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

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

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

Отправлено спустя 4 минуты 56 секунд:
Подозреваю козни компилятора...

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

Добавлено: 18 окт 2020, 11:56
Sancho
[ref]Ingwar[/ref],
Нет необходимости в сетапе объявлять оба типа прерывания на одном пине, если по ходу исполнения они меняются, всё равно последнее "затрёт" предыдущее.