Например TDA7294

Форум РадиоКот :: Просмотр темы - Помогите разобраться с прерываниями
Форум РадиоКот
https://radiokot.ru/forum/

Помогите разобраться с прерываниями
https://radiokot.ru/forum/viewtopic.php?f=57&t=146841
Страница 1 из 2

Автор:  narius985 [ Вс июл 16, 2017 19:03:16 ]
Заголовок сообщения:  Помогите разобраться с прерываниями

Хочу щажечь свтоедиод, типо когда идёт нуль,( ну кнопку нажимаю), то вызывается прерывания , где должен гореть светик, и конечно когда я отпускаю кнопку, прога выходит из прерывания и светик не горит. но когда всё проверил в протеусе, почему то программа в прерывания заходит, но не выходит. почему так
#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");

}
}

Автор:  Ivanoff-iv [ Вс июл 16, 2017 19:55:21 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

он из прерывания выходит но ты об этом не знаешь — кто тебе светодиод выключит? (где соответствующая команда?)
ещё: настройку прерываний достаточно делать 1 раз (не в цикле)

Автор:  narius985 [ Вс июл 16, 2017 19:58:03 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

он из прерывания выходит но ты об этом не знаешь — кто тебе светодиод выключит? (где соответствующая команда?)
ещё: настройку прерываний достаточно делать 1 раз (не в цикле)

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

Автор:  Demiurg [ Пн июл 17, 2017 05:50:12 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

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

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



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

Автор:  narius985 [ Пн июл 17, 2017 06:29:57 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

Код:
   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); ВСЁ равно светодиод не выключается

Автор:  ARV [ Пн июл 17, 2017 08:37:36 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

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

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

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

Автор:  Ivanoff-iv [ Пн июл 17, 2017 08:54:54 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

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

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

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

Автор:  ARV [ Пн июл 17, 2017 09:31:24 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

Ivanoff-iv писал(а):
прерывание на зуб попробовать - как оно работает, а светик просто индикатор...
всему своё время. объяснить, почему прерывание для мигания светиком будет со всякими "странными" участками кода будет на данном уровне освоения МК слишком сложно, как мне кажется. но если охота, то в прерывании ставить volatile-флаг, а в главном цикле его анализировать вышеприведенным методом, как я пример показал, только не забывать всякий раз этот флаг сбрасывать.

Автор:  narius985 [ Пн июл 17, 2017 18:34:35 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

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

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

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

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

Автор:  ARV [ Пн июл 17, 2017 18:37:52 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

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

Автор:  Jack_A [ Пн июл 17, 2017 19:47:00 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

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

Автор:  Demiurg [ Пн июл 17, 2017 19:52:08 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

Вопрос о том, как из прерывания попасть сразу ( мгновенная реакция ведь нужна! ) на нужную ветку, многократно обсуждался в форуме, но это вопрос не новичкового уровня. Я так думаю.

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

Автор:  Jack_A [ Пн июл 17, 2017 19:58:24 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

Я знаю, как оно решается. Допустим, < 1 mks. Можем подменить адрес возврата. Но могут быть неочевидные проблемы.
Я говорю о том, что это не уровень, заданный ТС в его вопросе.

Автор:  Ivanoff-iv [ Пн июл 17, 2017 20:08:20 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

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

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

Автор:  Demiurg [ Пн июл 17, 2017 20:10:05 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

Я знаю, как оно решается. Допустим, < 1 mks. Можем подменить адрес возврата. Но могут быть неочевидные проблемы.
Я говорю о том, что это не уровень, заданный ТС в его вопросе.

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

Автор:  Jack_A [ Пн июл 17, 2017 20:33:13 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

Demiurg писал(а):
Если же у вас долгие циклы в программе - это уже ваши проблемы. Учитесь дробить процессы.

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

Автор:  Demiurg [ Пн июл 17, 2017 20:40:09 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

Вы никогда не знаете, в какой момент времени сработало прерывание. Кроме одного единственного случая, в глухом цикле. Именно поэтому, подмена возврата - изврат.

Автор:  Jack_A [ Пн июл 17, 2017 20:50:09 ]
Заголовок сообщения:  Re: Помогите разобраться с прерываниями

Я не собираюсь схоластически спорить на пустом месте вне конкретной задачи - тем более в теме топикстартера, которому эти проблемы пока - за далеким горизонтом.

Автор:  narius985 [ Ср авг 09, 2017 09:37:28 ]
Заголовок сообщения:  Внешние прерывания

Хелп ми плиз. Когда я включаю в протеусе, то у меня светодиод не горит, пото нажима. кнопочку, у уменя он загаерается и продолжает почему то гореть не выключаясь, почему он не выходит из прерывания то? я вообще уже какой день мучаюсь понять не могу, вроде всё правильно выставил
/*
* 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]
Скачиваний: 430

Автор:  ARV [ Ср авг 09, 2017 11:05:50 ]
Заголовок сообщения:  Re: Внешние прерывания

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

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/