cuba74 0 18 августа, 2009 Опубликовано 18 августа, 2009 · Жалоба Всем превед.. Вот столкнулся с проблемой....прерывание по 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 18 августа, 2009 Опубликовано 18 августа, 2009 · Жалоба Глобально запрещать и разрешать прерывания в обработчике не надо, они и так запрещаются автоматически при входе в обработчик. Ручками сбрасывать флаг прерывания тоже не надо, сбрасывается он автоматически. Проверте как у вас настроен INT0. На прерывание по уровню или по фронту. Если по уровню, то он и будет входить в прерывание пока будет держаться заданный уровень на входе INT0. А кто у вас воздействует на INT0, кнопка? И зачем у вас в функцию write_data_lcd(...) предаются GICR и GIFR ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cuba74 0 18 августа, 2009 Опубликовано 18 августа, 2009 · Жалоба Проверте как у вас настроен 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); Поможите люди добрые....даже незнаю куда смотреть..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Goodefine 0 18 августа, 2009 Опубликовано 18 августа, 2009 · Жалоба По каким признакам Вы определяете что программа вышла из обработчика? Main Вы не привели... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 18 августа, 2009 Опубликовано 18 августа, 2009 · Жалоба Вот столкнулся с проблемой....прерывание по INT0.... При таком подходе к обработчикам с впихиванием в них задержек по полсекунды и прочих мутных вещей заниматься решением возникших "проблем" совершенно бессмысленно ввиду изначально заложенного уродства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cuba74 0 19 августа, 2009 Опубликовано 19 августа, 2009 (изменено) · Жалоба При таком подходе к обработчикам с впихиванием в них задержек по полсекунды и прочих мутных вещей заниматься решением возникших "проблем" совершенно бессмысленно ввиду изначально заложенного уродства. Задержка на полсекунды - это для себя, дабы увидеть что функция обработчика запустилась и выд-ся информация на дисплей.....помоему это очевидно...индикация , и сразу за ней задержка чтоб рассмотреть, что вывел..... Ежели в программе по прерыванию требуется посмотреть информациюна экране.....как без задержки? По каким признакам Вы определяете что программа вышла из обработчика? Main Вы не привели... MAIN не привел, в мэйне while(1) { //соответственно вывод другой индикации } Изменено 19 августа, 2009 пользователем cuba74 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 19 августа, 2009 Опубликовано 19 августа, 2009 · Жалоба //соответственно вывод другой индикацииИ как этот вывод относится к тому, что посередине общения с дисплеем его прерывают, в дисплей впихивают что-то другое, а потом возвращают управление в ту же точку? Или вы обрамили вывод глобальным запретом/разрешением прерываний? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 19 августа, 2009 Опубликовано 19 августа, 2009 · Жалоба Задержка на полсекунды - это для себя, дабы увидеть что функция обработчика запустилась и выд-ся информация на дисплей Чтобы увидеть, что обработчик запустился достаточно ногой дрыгать. Уберите вы LCD из обработчика и посмотрите ушла ли проблема, если да, то копайте в реализации функций LCD. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 19 августа, 2009 Опубликовано 19 августа, 2009 · Жалоба или так: volatile uint8_t cnt; ISR { cnt++; } main { for (;;) { lcd_print_byte(cnt); ... } } В прерываниях работают обычно лишь с флагами, которые анализируются в main_task... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 19 августа, 2009 Опубликовано 19 августа, 2009 · Жалоба Поможите люди добрые....даже незнаю куда смотреть..... Поскольку вы уже знаете что вход в функцию осуществляется, то для начала предлагаю сделать так: #pragma vector=INT0_vect __interrupt void IRQ(void) { } и убедиться что так ничего не подвисает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cuba74 0 20 августа, 2009 Опубликовано 20 августа, 2009 · Жалоба Всё разрешилось....всем спасибо за помощь и рекомендации....... В Main после "соответственно вывод другой индикации" была написана собственная функция задержки - похоже криво.... т.е. во время прерывания из delay_1ms(1000) осущ-ся переход в обработчик прерыв. , а обратно войти не мог....я так думаю :-) .....поменял на стандартный __delay_cycles(10000000); и все разрешилось...хотя в других функциях delay_1ms(1) норм. робит.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 20 августа, 2009 Опубликовано 20 августа, 2009 · Жалоба и все разрешилось...хотя в других функциях delay_1ms(1) норм. робит....Значит дело не в ней, вы просто замаскировали ошибку. Покажите код, не стесняйтесь - замаскированная ошибка может вылезти в любом другом месте в любой (самый неподходящий) момент. Причем покажите и код вашей задержки, и код вывода на lcd. А еще лучше максимально обстриженный проект, в котором ошибка воспроизводится. Используйте тег [ codebox ] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться