Например TDA7294

 Форум РадиоКот • Просмотр темы - Помогите разобраться с прерываниями
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Ср ноя 22, 2017 15:54:48



Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
Не в сети
 Заголовок сообщения: Помогите разобраться с прерываниями
СообщениеДобавлено: Вс июл 16, 2017 20:03:16 
Открыл глаза

Карма: -1
Зарегистрирован: Сб ноя 12, 2016 10:41:00
Сообщений: 57
Рейтинг сообщения: 0
Хочу щажечь свтоедиод, типо когда идёт нуль,( ну кнопку нажимаю), то вызывается прерывания , где должен гореть светик, и конечно когда я отпускаю кнопку, прога выходит из прерывания и светик не горит. но когда всё проверил в протеусе, почему то программа в прерывания заходит, но не выходит. почему так
#include <avr/io.h>
#include <avr/interrupt.h>
ISR (INT0_vect)
{
PORTA |=(1«0);
}

int main(void)
{
DDRA =0xFF;
PORTA = 0x00;
DDRD = 0x08;
PORTD = 0xFF;

/* Replace with your application code */
while (1)
{
MCUCR &=~(1«0); // делаю так чтобы прерывания работало по низкому уровню. типо когда на инте0 будет 0, только тогда перейдё на прерывания
GICR |=(1«6); //включаю инт0 .
asm("sei");

}
}


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Вс июл 16, 2017 20:55:21 
Опытный кот
Аватар пользователя

Карма: 12
Зарегистрирован: Пт ноя 11, 2016 06:48:09
Сообщений: 892
Откуда: край интернета... самый край :(
Рейтинг сообщения: 0
он из прерывания выходит но ты об этом не знаешь — кто тебе светодиод выключит? (где соответствующая команда?)
ещё: настройку прерываний достаточно делать 1 раз (не в цикле)

_________________
Во многой мудрости много печали; и кто умножает познания, умножает скорбь (Екклезиаст)


Вернуться наверх
 Профиль  
 
JLCPCB Prototype, $2 за 10 печатных плат (2 слоя, 100×100мм).

Крупнейший производитель печатных плат в Китае, 290,000+ заказчиков, 8,000+ он-лайн заказов в день.

Узнать цену прямо сейчас!

LCSC Parts: Экономия до 50%, большой выбор компонентов в наличии, отправка заказа в день оплаты.

Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Вс июл 16, 2017 20:58:03 
Открыл глаза

Карма: -1
Зарегистрирован: Сб ноя 12, 2016 10:41:00
Сообщений: 57
Рейтинг сообщения: 0
он из прерывания выходит но ты об этом не знаешь — кто тебе светодиод выключит? (где соответствующая команда?)
ещё: настройку прерываний достаточно делать 1 раз (не в цикле)

ааа, точно, окей, завтра утром посмотрю, спасибо


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 06:50:12 
Потрогал лапой паяльник

Карма: 3
Зарегистрирован: Ср июн 25, 2008 16:19:44
Сообщений: 395
Рейтинг сообщения: 1
Код:
   int main(void)
   {
      DDRA =0xFF;
      PORTA = 0x00;
      DDRD = 0x08;
      PORTD = 0xFF;

      MCUCR &=~(1«0);
      GICR |=(1«6);
      asm("sei");



      while (1)
      {
         // глухой цикл должен быть здесь. При вашем варианте по кругу постоянно идет инициализация внешнего прерывания.
      }
   }


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 07:29:57 
Открыл глаза

Карма: -1
Зарегистрирован: Сб ноя 12, 2016 10:41:00
Сообщений: 57
Рейтинг сообщения: 0
Код:
   int main(void)
   {
      DDRA =0xFF;
      PORTA = 0x00;
      DDRD = 0x08;
      PORTD = 0xFF;

      MCUCR &=~(1«0);
      GICR |=(1«6);
      asm("sei");



      while (1)
      {
         // глухой цикл должен быть здесь. При вашем варианте по кругу постоянно идет инициализация внешнего прерывания.
      }
   }

переделал, в валй(1) написал так PORTA &=~(1<<0); ВСЁ равно светодиод не выключается


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 09:37:36 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 91
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 10951
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
почти все проблемы кроются в алгоритме.
вот у вас: нажали кнопку - возникло прерывание - зажгли светодиод - вышли из прерывания. что происходит, когда кнопку не нажали? в главном цикле все время светодиод гасится - так? т.е. если кнопку нажали, то сначала в прерывании его включили, а когда вышли из обработчика - тут же выключили...
зачем вообще прерывания?

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

самое простое и, для начала, самое правильное - не применять прерывания.
Код:
 while(1){
   if(PIND & _BV(PD3)){ // проверяем кнопку на PD3 - разберитесь, где у вас она на самом деле
      // кнопка не нажата - гасим
   } else {
      // кнопка нажата - зажигаем
   }
}

_________________
я свою работу за вас делать не буду!


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 09:54:54 
Опытный кот
Аватар пользователя

Карма: 12
Зарегистрирован: Пт ноя 11, 2016 06:48:09
Сообщений: 892
Откуда: край интернета... самый край :(
Рейтинг сообщения: 0
я то думал основная цель не светодиодом мигать а прерывание на зуб попробовать - как оно работает, а светик просто индикатор...

Добавлено after 3 minutes 46 seconds:
если от кнопки светик зажигать то и контроллер не нужен... :)

Добавлено after 8 minutes 47 seconds:
я бы и рад копнуть глубже, но урок по телепатическому определению микроконтроллера в своё время прогулял...

_________________
Во многой мудрости много печали; и кто умножает познания, умножает скорбь (Екклезиаст)


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 10:31:24 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 91
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 10951
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Ivanoff-iv писал(а):
прерывание на зуб попробовать - как оно работает, а светик просто индикатор...
всему своё время. объяснить, почему прерывание для мигания светиком будет со всякими "странными" участками кода будет на данном уровне освоения МК слишком сложно, как мне кажется. но если охота, то в прерывании ставить volatile-флаг, а в главном цикле его анализировать вышеприведенным методом, как я пример показал, только не забывать всякий раз этот флаг сбрасывать.

_________________
я свою работу за вас делать не буду!


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 19:34:35 
Открыл глаза

Карма: -1
Зарегистрирован: Сб ноя 12, 2016 10:41:00
Сообщений: 57
Рейтинг сообщения: 0
я то думал основная цель не светодиодом мигать а прерывание на зуб попробовать - как оно работает, а светик просто индикатор...

Добавлено after 3 minutes 46 seconds:
если от кнопки светик зажигать то и контроллер не нужен... :)

Добавлено after 8 minutes 47 seconds:
я бы и рад копнуть глубже, но урок по телепатическому определению микроконтроллера в своё время прогулял...

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


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 19:37:52 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 91
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 10951
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
narius985 писал(а):
после того как я отжал кнопку он же должен выйти из прерывания
из прерывания он выходит сразу после того, как выполнит обработчик, в вашем коде нет ничего, что заставило бы "его" ждать отжатия кнопки. а далее - см. мои сообщения выше - в зависимости от настройки процесс либо будет непрерывно повторяться, либо нет.

_________________
я свою работу за вас делать не буду!


Вернуться наверх
 Профиль WWW  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 20:47:00 
Друг Кота
Аватар пользователя

Карма: 42
Зарегистрирован: Вт апр 24, 2007 08:45:40
Сообщений: 3961
Откуда: Minsk
Рейтинг сообщения: 0
Сама идея - пока нажата кнопка, МК вертится в прерывании по уровню , как собака за собственным хвостом - ущербна. Никакой полезной работы при этом не выполняется. Опрос кнопок проводят обычные люди по таймеру, попутно решая вопрос с дребезгом. Если уж - кровь из носу - реакция нужна молниеносная, наносекунды - организовываем прерывание по перепаду, но тогда уж отслеживать отпускание кнопки нужно в ветке, на которую попадаем из прерывания . Вопрос о том, как из прерывания попасть сразу ( мгновенная реакция ведь нужна! ) на нужную ветку, многократно обсуждался в форуме, но это вопрос не новичкового уровня. Я так думаю.
Кстати, интересный вопрос: если попав в прерывание по falling edge мы внутри его меняем условие на rising edge - вроде можем поймать и отпускание кнопки, но я думаю, это трюкачество не достойно серьезного проекта.

_________________
Изображение


Последний раз редактировалось Jack_A Пн июл 17, 2017 20:54:18, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 20:52:08 
Потрогал лапой паяльник

Карма: 3
Зарегистрирован: Ср июн 25, 2008 16:19:44
Сообщений: 395
Рейтинг сообщения: 0
Вопрос о том, как из прерывания попасть сразу ( мгновенная реакция ведь нужна! ) на нужную ветку, многократно обсуждался в форуме, но это вопрос не новичкового уровня. Я так думаю.

Эта проблема решается просто. Допустимое время реакции системы?


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 20:58:24 
Друг Кота
Аватар пользователя

Карма: 42
Зарегистрирован: Вт апр 24, 2007 08:45:40
Сообщений: 3961
Откуда: Minsk
Рейтинг сообщения: 0
Я знаю, как оно решается. Допустим, < 1 mks. Можем подменить адрес возврата. Но могут быть неочевидные проблемы.
Я говорю о том, что это не уровень, заданный ТС в его вопросе.

_________________
Изображение


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 21:08:20 
Опытный кот
Аватар пользователя

Карма: 12
Зарегистрирован: Пт ноя 11, 2016 06:48:09
Сообщений: 892
Откуда: край интернета... самый край :(
Рейтинг сообщения: 0
по идее пока нажата кнопка светик будет быстро-быстро мигать - т.к. завершив прерывание, мк выйдет обратно в основной цикл и, если мне не изменяет выполнит там хотя бы одну команду (в этом на 100% не уверен) прежде чем опять уйдёт в прерывание, (по крайней мере разбирал один проект с прерыванием по низкому уровню и, как утверждает автор удержание 0 на прерывающей ноге не блокировало остальную программу полностью).
при отпущенной кнопке МК будет тушить и тушить светодиод.
но это по идее, а почему происходит не так, можно попытаться узнать разглядывая регистры, например проверить что GICR |=(1«6); //действительно включаю инт0 . , но ТС партизан не колется, какой мк пытает, а для разных мк такая запись может означать разное.

Добавлено after 2 minutes 45 seconds:
пытался на днях в обработчике захвата сменить условие захвата - с первого раза не взлетело, а второго раза и не понадобилось, нашел способ удобнее.

_________________
Во многой мудрости много печали; и кто умножает познания, умножает скорбь (Екклезиаст)


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 21:10:05 
Потрогал лапой паяльник

Карма: 3
Зарегистрирован: Ср июн 25, 2008 16:19:44
Сообщений: 395
Рейтинг сообщения: 0
Я знаю, как оно решается. Допустим, < 1 mks. Можем подменить адрес возврата. Но могут быть неочевидные проблемы.
Я говорю о том, что это не уровень, заданный ТС в его вопросе.

Подмена вектора - это уже работа на ассемблере. Но даже в этом случае подмена вектора - выстрелить себе в ногу. Не нужны такие извраты. Если реакция должна быть мгновенной, работаем в прерывании. Если нет, ставим признак обработки прерывания. Если же у вас долгие циклы в программе - это уже ваши проблемы. Учитесь дробить процессы.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 21:33:13 
Друг Кота
Аватар пользователя

Карма: 42
Зарегистрирован: Вт апр 24, 2007 08:45:40
Сообщений: 3961
Откуда: Minsk
Рейтинг сообщения: 0
Demiurg писал(а):
Если же у вас долгие циклы в программе - это уже ваши проблемы. Учитесь дробить процессы.

Спасибо за добрый совет. Если бы он лет хотя бы 20 назад - цены бы ему не было. :)) :) "Дающий вовремя - дает вдвойне " © Насчет подмены адреса выхода - это зависит исключительно от контекста задачи, и там сразу будет видно - в ногу или в другое место. :(

_________________
Изображение


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 21:40:09 
Потрогал лапой паяльник

Карма: 3
Зарегистрирован: Ср июн 25, 2008 16:19:44
Сообщений: 395
Рейтинг сообщения: 0
Вы никогда не знаете, в какой момент времени сработало прерывание. Кроме одного единственного случая, в глухом цикле. Именно поэтому, подмена возврата - изврат.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с прерываниями
СообщениеДобавлено: Пн июл 17, 2017 21:50:09 
Друг Кота
Аватар пользователя

Карма: 42
Зарегистрирован: Вт апр 24, 2007 08:45:40
Сообщений: 3961
Откуда: Minsk
Рейтинг сообщения: 0
Я не собираюсь схоластически спорить на пустом месте вне конкретной задачи - тем более в теме топикстартера, которому эти проблемы пока - за далеким горизонтом.

_________________
Изображение


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Внешние прерывания
СообщениеДобавлено: Ср авг 09, 2017 10:37:28 
Открыл глаза

Карма: -1
Зарегистрирован: Сб ноя 12, 2016 10:41:00
Сообщений: 57
Рейтинг сообщения: 0
Хелп ми плиз. Когда я включаю в протеусе, то у меня светодиод не горит, пото нажима. кнопочку, у уменя он загаерается и продолжает почему то гореть не выключаясь, почему он не выходит из прерывания то? я вообще уже какой день мучаюсь понять не могу, вроде всё правильно выставил
/*
* GccApplication5.c
*
* Created: 09.08.2017 10:10:45
* Author : HP
*/
#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

ISR (INT0_vect)
{
PORTC |=(1<<1);
}
int main(void)
{
DDRD = 0x00;
PORTD = 0xFF;
DDRC = 0xFF;
PORTC &=~(1<<1);
GICR |=(1<<6);
MCUCR &=~(1<<ISC01)|(1<<ISC00);
sei();
/* Replace with your application code */
while (1)
{
asm("nop");
}
}


Вложения:
Безымянный.png [183.71 KiB]
Скачиваний: 10
Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Внешние прерывания
СообщениеДобавлено: Ср авг 09, 2017 12:05:50 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 91
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 10951
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
при чем тут не выходит из прерывания? вы в прерывании включили, а выключать кто будет? вот он и горит вечно после первого включения.

_________________
я свою работу за вас делать не буду!


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



Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

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


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y