Не судите строго, я не волшебник, только учусь!
Вопрос по обработке внешних прерываний. Есть ATtiny2313, на вход INT0 подается сигнал прерывания, если в момент обработки данного прерывания приходит сигнал прерывания на вход INT1, что будет делать МК?
В моем случае прерывание INT1 почему-то игнорируется, даже после завершения обработки процедуры прерывания по INT0!
ATtiny2313 обработка внешних прерываний
Re: ATtiny2313 обработка внешних прерываний
Бдет продолжать обработку прерывания INT0. Когда обработчик прерывания отработает, и если условие прерывания INT0 больше не выполняется или INT0 запрещено, то начнётся выполнение обработчика прерывания INT1. А если условие прерывания INT0 выполняется и INT0 разрешено, то будет опять выполняться обработчик INT0, т.к. у него приоритет выше, чем у INT1.andrikan писал(а):вход INT0 подается сигнал прерывания, если в момент обработки данного прерывания приходит сигнал прерывания на вход INT1, что будет делать МК?
А может быть всё горадо проще. У меня как-то тоже игнорировалось прерывание. Не на ту ногу сигнал подавал...
- Dr. Alex
- Это не хвост, это антенна
- Сообщения: 1438
- Зарегистрирован: Вт окт 28, 2008 09:00:18
- Откуда: Украина, Харьков
- Контактная информация:
Re: ATtiny2313 обработка внешних прерываний
А приоритетность прерываний в таблице по убыванию?
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Re: ATtiny2313 обработка внешних прерываний
В даташите читаем: "The lower the address the higher is the priority level." Т.е. чем меньше адрес, тем выше приоритет.
- Dr. Alex
- Это не хвост, это антенна
- Сообщения: 1438
- Зарегистрирован: Вт окт 28, 2008 09:00:18
- Откуда: Украина, Харьков
- Контактная информация:
Re: ATtiny2313 обработка внешних прерываний
Ясненько. Хотя я приблизительно так и думал... Но всё-равно спасибо!
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Re: ATtiny2313 обработка внешних прерываний
Доброго времени суток, подскажите новичку. Увожу контроллер 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 попадает ноль, он сбрасывается, хотя в протеусе все работает так как надо. Подтянул шестую ножку резистором к плюсу - не помогло, подозреваю что эту проблему программно надо решать. Подскажите, что делать?
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 попадает ноль, он сбрасывается, хотя в протеусе все работает так как надо. Подтянул шестую ножку резистором к плюсу - не помогло, подозреваю что эту проблему программно надо решать. Подскажите, что делать?
Re: ATtiny2313 обработка внешних прерываний
Подскажите пожалуйста, у меня ATtiny2313A принимает и передает данные по SPI(реализован программным путем на основе USI), В главной функции вот такой код:
}
Работает все норм.
Но я хочу переделать чтоб прием/передача происходило по внешнему прерыванию, т.е. на INT0 приходит логический ноль и после этого МК идет на обработку прерывания(прием данных). Хочу сделать через INT0 потому что будут еще задействованы прерывания INT1 и прерывание таймера, но прием данных является самым важным звеном.
Ну короче говоря настраиваю INT0:
и обработчик прерывания:
А проблема в том что почему-то первый и второй байты меняются местами и вообще как-то непонятно работатет это прерывание. У меня возник вопрос: а как долго должен продержаться низкий уровень на INT0 чтоб сработало прерывание? или может в коде настройки прерывания какая-то ошибка? может чего то недопонимаю?
Код: Выделить всё
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 чтоб сработало прерывание? или может в коде настройки прерывания какая-то ошибка? может чего то недопонимаю?