реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Обработка прерывания, зависает в обработчике прерывания...
cuba74
сообщение Aug 18 2009, 11:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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;

}
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Aug 18 2009, 11:30
Сообщение #2


developer
****

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



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

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

А кто у вас воздействует на INT0, кнопка?
И зачем у вас в функцию write_data_lcd(...) предаются GICR и GIFR ?
Причина редактирования: Ненужное цитирование.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
cuba74
сообщение Aug 18 2009, 15:19
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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);


Поможите люди добрые....даже незнаю куда смотреть.....
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Aug 18 2009, 15:24
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



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


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 18 2009, 15:34
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(cuba74 @ Aug 18 2009, 13:17) *
Вот столкнулся с проблемой....прерывание по INT0....

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
cuba74
сообщение Aug 19 2009, 03:05
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 19 2009, 09:11
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(cuba74 @ Aug 19 2009, 06:05) *
//соответственно вывод другой индикации
И как этот вывод относится к тому, что посередине общения с дисплеем его прерывают, в дисплей впихивают что-то другое, а потом возвращают управление в ту же точку? Или вы обрамили вывод глобальным запретом/разрешением прерываний?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Aug 19 2009, 10:37
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



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

Чтобы увидеть, что обработчик запустился достаточно ногой дрыгать. Уберите вы LCD из обработчика и посмотрите ушла ли проблема, если да, то копайте в реализации функций LCD.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 19 2009, 12:46
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



или так:
Код
volatile uint8_t cnt;

ISR
{
    cnt++;
}

main
{
    for (;;)
    {
        lcd_print_byte(cnt);
       ...
    }
}
В прерываниях работают обычно лишь с флагами, которые анализируются в main_task...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 19 2009, 23:09
Сообщение #10


кекс
******

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



Цитата(cuba74 @ Aug 18 2009, 18:19) *
Поможите люди добрые....даже незнаю куда смотреть.....

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

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

и убедиться что так ничего не подвисает.
Go to the top of the page
 
+Quote Post
cuba74
сообщение Aug 20 2009, 03:07
Сообщение #11


Участник
*

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



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

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

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

и все разрешилось...хотя в других функциях delay_1ms(1) норм. робит....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 20 2009, 18:58
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 02:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016