ATtiny2313 обработка внешних прерываний

Обсуждаем контроллеры компании Atmel.
Ответить
andrikan
Открыл глаза
Сообщения: 43
Зарегистрирован: Вс мар 03, 2013 11:42:19
Откуда: Краснодарский край

ATtiny2313 обработка внешних прерываний

Сообщение andrikan »

Не судите строго, я не волшебник, только учусь!
Вопрос по обработке внешних прерываний. Есть ATtiny2313, на вход INT0 подается сигнал прерывания, если в момент обработки данного прерывания приходит сигнал прерывания на вход INT1, что будет делать МК?
В моем случае прерывание INT1 почему-то игнорируется, даже после завершения обработки процедуры прерывания по INT0!
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: ATtiny2313 обработка внешних прерываний

Сообщение Барсик »

andrikan писал(а):вход INT0 подается сигнал прерывания, если в момент обработки данного прерывания приходит сигнал прерывания на вход INT1, что будет делать МК?
Бдет продолжать обработку прерывания INT0. Когда обработчик прерывания отработает, и если условие прерывания INT0 больше не выполняется или INT0 запрещено, то начнётся выполнение обработчика прерывания INT1. А если условие прерывания INT0 выполняется и INT0 разрешено, то будет опять выполняться обработчик INT0, т.к. у него приоритет выше, чем у INT1.

А может быть всё горадо проще. У меня как-то тоже игнорировалось прерывание. Не на ту ногу сигнал подавал... :)
Аватара пользователя
Dr. Alex
Это не хвост, это антенна
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков
Контактная информация:

Re: ATtiny2313 обработка внешних прерываний

Сообщение Dr. Alex »

А приоритетность прерываний в таблице по убыванию?
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: ATtiny2313 обработка внешних прерываний

Сообщение Барсик »

В даташите читаем: "The lower the address the higher is the priority level." Т.е. чем меньше адрес, тем выше приоритет.
Аватара пользователя
Dr. Alex
Это не хвост, это антенна
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков
Контактная информация:

Re: ATtiny2313 обработка внешних прерываний

Сообщение Dr. Alex »

Ясненько. Хотя я приблизительно так и думал... Но всё-равно спасибо!
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
To7oP
Родился
Сообщения: 7
Зарегистрирован: Вт янв 29, 2013 20:59:00

Re: ATtiny2313 обработка внешних прерываний

Сообщение To7oP »

Доброго времени суток, подскажите новичку. Увожу контроллер ATtiny2313 в глубокий сон (для экономии батареи) командами:
sleep_enable();
powerdown();

Бужу контроллер прерыванием на INT0. Прерывание настроил на INT0 таким образом:
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x40;
MCUCR=0x00;
EIFR=0x40;

У меня стоит задача при подаче нуля на INT0 запускать в работу контроллер. Проблема в том, что во время работы каждый раз, когда на INT0 попадает ноль, он сбрасывается, хотя в протеусе все работает так как надо. Подтянул шестую ножку резистором к плюсу - не помогло, подозреваю что эту проблему программно надо решать. Подскажите, что делать?
Alex2014
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Сб янв 11, 2014 17:13:19

Re: ATtiny2313 обработка внешних прерываний

Сообщение Alex2014 »

Подскажите пожалуйста, у меня ATtiny2313A принимает и передает данные по SPI(реализован программным путем на основе USI), В главной функции вот такой код:

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

for(;;)//бесконечный цикл
    {               
   if(bit_is_clear(PIN_SPI, SS))//если выбран наш кристалл
        {
      data_r[0] = SPI_WR_S(data_w[0]);   //принимаем по SPI байт данных, одновременно передавая
      data_w[0]=data_r[0];
      data_r[1] = SPI_WR_S(data_w[1]);   //принимаем по SPI байт данных, одновременно передавая
      data_w[1]=data_r[1];   
   }

}
Работает все норм.
Но я хочу переделать чтоб прием/передача происходило по внешнему прерыванию, т.е. на INT0 приходит логический ноль и после этого МК идет на обработку прерывания(прием данных). Хочу сделать через INT0 потому что будут еще задействованы прерывания INT1 и прерывание таймера, но прием данных является самым важным звеном.
Ну короче говоря настраиваю INT0:

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

GIMSK|=(1<<INT0);   //регистр маски прерываний
MCUCR&=~((1<<ISC01)|(1<<ISC00));   //по нижнему уровню

и обработчик прерывания:

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

ISR(INT0_vect)
{
data_r[0] = SPI_WR_S(data_w[0]);   //принимаем по SPI байт данных, одновременно передавая
data_w[0]=data_r[0];
data_r[1] = SPI_WR_S(data_w[1]);   //принимаем по SPI байт данных, одновременно передавая
data_w[1]=data_r[1];
EIFR|=(1<<INTF0);   //убираю флаг на всякий случай
}


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

Вернуться в «AVR»