Перейти к содержанию
    

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

Всем превед..

 

Вот столкнулся с проблемой....прерывание по INT0....

 

на прерывание откликается ...переходит в обработчик прерывания...выполняет все указанные действия....

 

пример - очистка lcd и выдача на него информации, поле этого стоит return... однако выходить из данной

 

функции нежелает....спустя 10 секунд, все-таки ввозвращается в исходное меню..

 

контроллер ATmega16.... среда IAR

 

 

#pragma vector=INT0_vect
__interrupt void IRQ(void)
{   
    IRQ_DIS; 
    GICR |= (1<<6);

    clear_lcd();
    write_data_lcd(GICR, 0xa0);
    write_data_lcd(GIFR, 0xe0);
    delay_1ms(500);

    IRQ_EN;
    return;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ручками сбрасывать флаг прерывания тоже не надо, сбрасывается он автоматически.

 

Проверте как у вас настроен INT0. На прерывание по уровню или по фронту. Если по уровню, то он и будет входить в прерывание пока будет держаться заданный уровень на входе INT0.

 

А кто у вас воздействует на INT0, кнопка?

И зачем у вас в функцию write_data_lcd(...) предаются GICR и GIFR ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверте как у вас настроен INT0. На прерывание по уровню или по фронту. Если по уровню, то он и будет входить в прерывание пока будет держаться заданный уровень на входе INT0.

 

А кто у вас воздействует на INT0, кнопка?

И зачем у вас в функцию write_data_lcd(...) предаются GICR и GIFR ?

 

 

INT0 настроен на спадающий фронт сигнала, данный уровень не держится так как по кнопке управление,

 

функция write_data_lcd(...) предаёт GICR и GIFR для себя....

 

вообщем в конце функции стопорится и всё.....причем секунд 15 постоит и выходит из обработчика прерываний.....

 

если нажать в ходе зависания опять кнопку, т.е. опять ниспадающий фронт,видно как переход осуществляется в начало функции обработчика....

 

т.е.

 

clear_lcd();

write_data_lcd(GICR, 0xa0);

write_data_lcd(GIFR, 0xe0);

 

 

Поможите люди добрые....даже незнаю куда смотреть.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По каким признакам Вы определяете что программа вышла из обработчика? Main Вы не привели...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот столкнулся с проблемой....прерывание по INT0....

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Задержка на полсекунды - это для себя, дабы увидеть что функция обработчика запустилась и выд-ся информация на дисплей.....помоему это очевидно...индикация , и сразу за ней задержка чтоб рассмотреть, что вывел.....

 

Ежели в программе по прерыванию требуется посмотреть информациюна экране.....как без задержки?

 

По каким признакам Вы определяете что программа вышла из обработчика? Main Вы не привели...

 

 

MAIN не привел, в мэйне

 

while(1)

{

 

//соответственно вывод другой индикации

 

}

Изменено пользователем cuba74

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задержка на полсекунды - это для себя, дабы увидеть что функция обработчика запустилась и выд-ся информация на дисплей

Чтобы увидеть, что обработчик запустился достаточно ногой дрыгать. Уберите вы LCD из обработчика и посмотрите ушла ли проблема, если да, то копайте в реализации функций LCD.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или так:

volatile uint8_t cnt;

ISR
{
    cnt++;
}

main
{
    for (;;)
    {
        lcd_print_byte(cnt);
       ...
    }
}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поможите люди добрые....даже незнаю куда смотреть.....

Поскольку вы уже знаете что вход в функцию осуществляется, то для начала предлагаю сделать так:

 

#pragma vector=INT0_vect
__interrupt void IRQ(void)
{   
}

и убедиться что так ничего не подвисает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё разрешилось....всем спасибо за помощь и рекомендации.......

 

В Main после "соответственно вывод другой индикации" была написана собственная функция задержки - похоже криво....

 

т.е. во время прерывания из delay_1ms(1000) осущ-ся переход в обработчик прерыв. , а обратно войти не мог....я так думаю :-) .....поменял на стандартный __delay_cycles(10000000);

 

и все разрешилось...хотя в других функциях delay_1ms(1) норм. робит....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и все разрешилось...хотя в других функциях delay_1ms(1) норм. робит....
Значит дело не в ней, вы просто замаскировали ошибку. Покажите код, не стесняйтесь - замаскированная ошибка может вылезти в любом другом месте в любой (самый неподходящий) момент. Причем покажите и код вашей задержки, и код вывода на lcd. А еще лучше максимально обстриженный проект, в котором ошибка воспроизводится. Используйте тег [ codebox ]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...