|
|
  |
Обработка прерывания, зависает в обработчике прерывания... |
|
|
|
Aug 18 2009, 11:17
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-11-07
Пользователь №: 32 751

|
Всем превед.. Вот столкнулся с проблемой....прерывание по 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;
}
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Aug 18 2009, 11:30
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Глобально запрещать и разрешать прерывания в обработчике не надо, они и так запрещаются автоматически при входе в обработчик. Ручками сбрасывать флаг прерывания тоже не надо, сбрасывается он автоматически. Проверте как у вас настроен INT0. На прерывание по уровню или по фронту. Если по уровню, то он и будет входить в прерывание пока будет держаться заданный уровень на входе INT0. А кто у вас воздействует на INT0, кнопка? И зачем у вас в функцию write_data_lcd(...) предаются GICR и GIFR ?
Причина редактирования: Ненужное цитирование.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Aug 18 2009, 15:19
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-11-07
Пользователь №: 32 751

|
Цитата(dimka76 @ Aug 18 2009, 17:30)  Проверте как у вас настроен 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); Поможите люди добрые....даже незнаю куда смотреть.....
|
|
|
|
|
Aug 19 2009, 03:05
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-11-07
Пользователь №: 32 751

|
Цитата(zltigo @ Aug 18 2009, 21:34)  При таком подходе к обработчикам с впихиванием в них задержек по полсекунды и прочих мутных вещей заниматься решением возникших "проблем" совершенно бессмысленно ввиду изначально заложенного уродства. Задержка на полсекунды - это для себя, дабы увидеть что функция обработчика запустилась и выд-ся информация на дисплей.....помоему это очевидно...индикация , и сразу за ней задержка чтоб рассмотреть, что вывел..... Ежели в программе по прерыванию требуется посмотреть информациюна экране.....как без задержки? Цитата(Goodefine @ Aug 18 2009, 21:24)  По каким признакам Вы определяете что программа вышла из обработчика? Main Вы не привели... MAIN не привел, в мэйне while(1) { //соответственно вывод другой индикации }
Сообщение отредактировал cuba74 - Aug 19 2009, 03:07
|
|
|
|
|
Aug 19 2009, 10:37
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(cuba74 @ Aug 19 2009, 07:05)  Задержка на полсекунды - это для себя, дабы увидеть что функция обработчика запустилась и выд-ся информация на дисплей Чтобы увидеть, что обработчик запустился достаточно ногой дрыгать. Уберите вы LCD из обработчика и посмотрите ушла ли проблема, если да, то копайте в реализации функций LCD.
|
|
|
|
|
Aug 19 2009, 23:09
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(cuba74 @ Aug 18 2009, 18:19)  Поможите люди добрые....даже незнаю куда смотреть..... Поскольку вы уже знаете что вход в функцию осуществляется, то для начала предлагаю сделать так: Код #pragma vector=INT0_vect __interrupt void IRQ(void) { } и убедиться что так ничего не подвисает.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|