Easyelectronics.ru

Электроника для всех
Текущее время: 26 ноя 2020, 20:45

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 20:51 
Только пришел

Зарегистрирован: 04 сен 2013, 16:58
Сообщения: 17
Откуда: Астана, Алматы, Тараз
Добрый день. Здесь продублирую. Atmega8a, частота 8MHz. Подключил линию onewire от считывателя к ножке int1. По прерыванию INT1 прерывание INT1 отключается, начинается обработка onewire на этом же пине, далее снова включается прерывание. Однако на практике начинается замкнутый цикл прерывани и обработки onewire. Если после обработки onewire не включать прерывание INT1, то цикла нет, и соответственно далее ничего не работает. Прерывание включается после строки onewire_reset(&sensorPin2), однако в дальнейшем прерывание сробатывает по (видимо фронту reset), и вновь происходит reset и потом прерывание и так безконечно.
Код:
ISR(INT1_vect)
{
        USART_Transmit('I');
        USART_Transmit('S');
        USART_Transmit('R');
        GICR &=~(1<<INT1);
        uint8_t num[30] = "";
        _delay_us(100);
        onewire_reset(&sensorPin2);
   GICR |=(1<<INT1);
        _delay_ms(1000);
}

[img]
https://ibb.co/X5hWF9p
[/img]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 21:40 
Только пришел

Зарегистрирован: 04 сен 2013, 16:58
Сообщения: 17
Откуда: Астана, Алматы, Тараз
Выставил внешнее прерывание по лог0, безконечный цикл исчез.
void INT1_Init(void)
{
GICR |=(1<<INT1);

//по уровню лог 0
MCUCR &=~(1<<ISC10);
MCUCR &=~(1<<ISC11);

//по ниспадающему фронту
//MCUCR &=~(1<<ISC10);
//MCUCR |=(1<<ISC11);

//по возрастающему фронту
//MCUCR |=(1<<ISC10);
//MCUCR |=(1<<ISC11);
}

Объясните пожалуйста знающие, как это сработало, не могу понять


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 22:05 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2944
Все эти ваши _delay в прерывании в принципе не стоит делать.
Перед включением прерывания попробуйте добавить GIFR = 1 << INTF1;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 22:10 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2944
Вообще не правильно делаете в корне. В прерывании никаких delay и usart transmit. Заведите глобальную переменную - флаг того, что прерывание было. В прерывании просто этот флаг поднимаете и выключаете прерывание. И дальше уже в основном цикле программы где-нибудь if (flag) делайте уже ваши usart_trasmit, delay и прочую обработку. А потом флаг назад в 0 и включаете прерывание, по необходимости предварительно очищая флаг прерывания ( как я выше написал), потому что он может взводиться независимо от включения самого прерывания (перехода на него).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 22:29 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 952
Потому, что, возможно, после сброса процессора ножка INT1, как и все, принимает единичное значение и, сразу входит в прерывание, как только Вы проинициализировали (разрешили) его. Что там происходит с внешним сигналом нужно смотреть осциллографом. Недаром предусмотрены прерывания INT1 по фронту, видимо, прерывания по уровню требуют более внимательного отношения. А, если Вы еще и проинициализаровали WatchDog, то все становиться очень понятным. Имейте всегда ввиду, что ошибаетесь Вы, иначе, эта ситуация была-бы описана в errata....

P.S. Вообще, вопрос Вы задали исключительно интересный и, хорошо было-бы сопроводить решение осциллограммой ;)...


Последний раз редактировалось AstraHard 27 май 2020, 22:44, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 22:34 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 952
NStorm писал(а):
Вообще не правильно делаете в корне. В прерывании никаких delay и usart transmit. Заведите глобальную переменную - флаг того, что прерывание было. В прерывании просто этот флаг поднимаете и выключаете прерывание. И дальше уже в основном цикле программы где-нибудь if (flag) делайте уже ваши usart_trasmit, delay и прочую обработку. А потом флаг назад в 0 и включаете прерывание, по необходимости предварительно очищая флаг прерывания ( как я выше написал), потому что он может взводиться независимо от включения самого прерывания (перехода на него).

Вопрос был не о правилах и личных пристрастиях чего можно и нельзя, а о том что происходит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 22:49 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2944
AstraHard писал(а):
Потому, что, возможно, после сброса процессора ножка INT1, как и все, принимает единичное значение и, сразу входит в прерывание, как только Вы проинициализировали (разрешили) его. Что там происходит с внешним сигналом нужно смотреть осциллографом. Недаром предусмотрены прерывания INT1 по фронту, видимо, прерывания по уровню требуют более внимательного отношения. А, если Вы еще и проинициализаровали WatchDog, то все становиться очень понятным. Имейте всегда ввиду, что ошибаетесь Вы, иначе, эта ситуация была-бы описана в errata....

P.S. Вообще, вопрос Вы задали исключительно интересный и, хорошо было-бы сопроводить решение осциллограммой ;)...

Вы невнимательно прочитали вопрос. И картинка с ЛА есть, и прерывание не по уровню было, да и по уровню работает не так.

AstraHard писал(а):
Вопрос был не о правилах и личных пристрастиях чего можно и нельзя, а о том что происходит.

И? Если я вижу, что делают что-то в корне неправильное, я об этом высказываюсь. Этот ваш комментарий тоже к вопросу отношения не имеет. При этом выше я уже написал написал нормально что может происходить и что попробовать ТС сделать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 22:51 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 952
Я не считаю, то что Вы считаете "в корне неправильным" таковым. Конечно, нехорошо в прерывании вставлять delay, нужно заниматься более полезными делами, но передачу по UART можно и нужно для диагностики. И вообще, программист волен делать что ему взбредет в голову, так легче пополнять Errata;)...

Кстати, хочу с Вами поделиться своими соображениями насчет ErattaSheet. По моему личному мнению, я встречал записи в ErattaSheet которые, на самом деле не являются логическими ошибками, а попали туда под давлением "общественности".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 23:01 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 952
А еще может быть, что Вы не заметили, что (схемотехнически) устроили обратную связь, между прохождением внешнего сигнала к выводу INT1 и состоянием процессора!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 23:12 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2944
Программист конечно может писать через жопу и делать секундные задержки в прерывании. И какое-то время оно может даже будет работать. Пока код не станет более менее сложным. А там когда наступит на грабли, будет сотая тема от "начинающего погроммиста" на одни и те же ошибки. Есть практика корректного (или хз как перевести best practice) программирования для МК и о ней я и рассказал. Такие вещи общепринятые и имеют под собой весомые основания. Можно пройти тернистый путь самому и самому набить себе шишек на ошибках, а можно сразу послушать как и почему делать стоит, а как нет.

По теме, вполне возможно что у ТС в onewire_reset() нога дергается с МК на нужный уровень. И тут в следующем цикле (из-за того, что оптимизатор решил заинлайнить эту функцию возможно в прерывание) уже включается прерывание. Оно вполне может сработать так снова. В любом случае инструкция GIFR = 1 << INTF1; после взвода прерывания должна его сбросить и решить этот вопрос. Если дело было в этом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 23:14 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 952
Ваша догматика, ну никак ни разу не поможет выяснить интересный факт. Процитирую себя " И вообще, программист волен делать что ему взбредет в голову, так легче пополнять Errata;)..." Конечно, я с Вами согласен, что delay(1000) в прерывании полный пи... как и вызов USART сделан не верно, но сама диагностика USRART в прерывании моя любимая фишка и, я считаю ее правильной и полезной. Но, вопрос-то все равно не об этом!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 27 май 2020, 23:37 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2944
Ответ-то на вопрос я уже давно написал. Ждем ТС, пусть попробует. Если не поможет - схему и полный код сразу лучше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 29 май 2020, 18:02 
Старожил

Зарегистрирован: 02 июл 2010, 23:41
Сообщения: 469
AstraHard писал(а):
И вообще, программист волен делать что ему взбредет в голову, так легче пополнять Errata;)...

Думаю, если человек пишет, «что ему взбредет в голову», то это не программист, а любитель, начинающий и т.д.
От ошибок начинающих надо избавляться, NStorm, конечно, правильно написал.
AstraHard писал(а):
… но сама диагностика USRART в прерывании моя любимая фишка и, я считаю ее правильной и полезной.

Что же тут правильного и полезного, если в простенькой программе получились проблемы.
Похоже, пора менять «любимую фишку».


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 29 май 2020, 19:59 
Старожил

Зарегистрирован: 12 июн 2010, 10:16
Сообщения: 248
В обработчике прерываний ничего не делаем. Кроме присвоения значения переменной хранящей событие возникновения прерывания для дальнейшей обработки. И, еще, сброс флага прерывания. Из-за несброса которого из обработчика уже не вылезем, если не сбрасывается аппаратно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 31 май 2020, 12:47 
Старожил

Зарегистрирован: 02 мар 2017, 20:10
Сообщения: 209
А мне кажется что всё это дело не работает только из за делея в прерывании.
Ему там точно не место, да и ни где не место по хорошему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 09 июн 2020, 14:52 
Только пришел

Зарегистрирован: 10 дек 2016, 12:28
Сообщения: 18
Ali777 писал(а):
Выставил внешнее прерывание по лог0, безконечный цикл исчез.
void INT1_Init(void)
{
GICR |=(1<<INT1);

//по уровню лог 0
MCUCR &=~(1<<ISC10);
MCUCR &=~(1<<ISC11);

//по ниспадающему фронту
//MCUCR &=~(1<<ISC10);
//MCUCR |=(1<<ISC11);

//по возрастающему фронту
//MCUCR |=(1<<ISC10);
//MCUCR |=(1<<ISC11);
}

Объясните пожалуйста знающие, как это сработало, не могу понять


Запрещение прерывания не означает, что процессор перестает следить за событиями на ноге.
Флаг прерывания устанавливается, но не вызывается процедура прерывания.
У вас помогло то, что на ноге наверно стоит лог. единица и во время нахождения в прерывании, флаг прерывания повторно не устанавливается.

В этом и полезность советов, как можно короче находиться в прерывании.
Или не успеет произойти новое событие на ноге, которое вызывает прерывание или просто повторится установка "вашего флага" и это не повлияет на ход выполнения вашего кода, просто немного его замедлит, на время выполнения прерывания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 13 июн 2020, 14:06 
Старожил

Зарегистрирован: 10 мар 2012, 11:11
Сообщения: 219
AstraHard писал(а):
И вообще, программист волен делать что ему взбредет в голову...

Абсолютно верно. Есть задача и есть несколько вариантов её решения. Программист из личных соображений выбирает удобный ему вариант и пофигу на то что в прерывании дикая задержка, например.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 13 июн 2020, 16:07 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2944
Snake писал(а):
AstraHard писал(а):
И вообще, программист волен делать что ему взбредет в голову...

Абсолютно верно. Есть задача и есть несколько вариантов её решения. Программист из личных соображений выбирает удобный ему вариант и пофигу на то что в прерывании дикая задержка, например.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 14 июн 2020, 09:27 
Старожил

Зарегистрирован: 10 мар 2012, 11:11
Сообщения: 219
NStorm писал(а):
Нет, есть правила и рекомендации и им надо следовать.

Да и вообще, удобно когда все строем ходят.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 14 июн 2020, 21:08 
Старожил

Зарегистрирован: 12 июн 2010, 10:16
Сообщения: 248
Зачем же все? Но, есть такие случаи, где без хождения строем никак... Если поезд пустить помимо рельсов, ничего хорошего не получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 15 июн 2020, 11:29 
Старожил

Зарегистрирован: 10 мар 2012, 11:11
Сообщения: 219
Естественно. Но это если ты уже в среде, со своими правилами и требованиями. А если нет, то вправе руководствоваться своими личными критериями, а не какими то стандартными правилами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 15 июн 2020, 11:44 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 952
Проблема не в плоскости ПО. Хотя, ее можно скорректировать программно, поставив задержку в другом месте в Main () до инициализации прерывания. Потому, что, возможно, после сброса процессора ножка INT1, как и все, принимает единичное значение и, сразу входит в прерывание, как только Вы проинициализировали (разрешили) его.А, если Вы еще и проинициализаровали WatchDog, то все становиться очень понятным. А еще может быть, что Вы не заметили, что (схемотехнически) устроили обратную связь, между прохождением внешнего сигнала к выводу INT1 и состоянием процессора. Недаром предусмотрены прерывания INT1 по фронту, видимо, прерывания по уровню требуют более внимательного отношения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 16 июн 2020, 11:14 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2944
Snake писал(а):
Естественно. Но это если ты уже в среде, со своими правилами и требованиями. А если нет, то вправе руководствоваться своими личными критериями, а не какими то стандартными правилами.

И набивать шишки самому, создавая давно известные проблемы, которые потом героически преодолевать.

Snake писал(а):
Да и вообще, удобно когда все строем ходят.

Причем здесь "строй"? Речь не о каких-то нюансах оформления кода, или стиле программирования. Речь о правильном коде, который не создает потенциальных и вполне реальных проблем из-за неправильного подхода. "Я художник - я так вижу" тут не подходит. Это программирование железки, а не рисование. Пространства для творчества полно, но не надо путать его с говнокодом, который возникает из-за непонимания и неопытности, а не от желания сделать по-своему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 16 июн 2020, 12:57 
Старожил

Зарегистрирован: 10 мар 2012, 11:11
Сообщения: 219
Из за непонимания это одно. Я же говорю о своём осознанном выборе исходя из каких то условий - быстро, просто, точно, лаконично и т.д. Ну а оформление это уже личная культура.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешнее прерывание уходит в безконечный цикл
СообщениеДобавлено: 16 июн 2020, 16:41 
Только пришел

Зарегистрирован: 10 дек 2016, 12:28
Сообщения: 18
Проблема не в оформлении, а в незнании как работает процессор.
Оформление влияет на расширяемость программы, когда добавление новой функции не требует переписывания всего кода.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB