Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/27: Рейтинг темы: голосов - 27, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219

Проблемы с прерываниями

03.12.2013, 03:30. Показов 5362. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Граждане, помогите с проблемой, несколько часов ломаю голову не могу осилить:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// B0 interrupt
#pragma vector = TIMERB0_VECTOR
__interrupt void B0_ISR(void)
{
if(!button) счетчик_отжатия++; //если не нажата
else //если нажата
{
счетчик_нажатия++;
счетчик_отжатия=0;
}
if(счетчик_отжатия>2 || счетчик_нажатия>200)
{
if(счетчик_нажатия > 200) irq=//длинное нажатие;
else if(счетчик_нажатия> 2) irq=//короткое нажатие;
else irq=0;
 
__low_power_mode_off_on_exit();
TBCCTL0 = 0;
TBCTL = 0;  // off
}
}
 
// PORT2 interrupt
#pragma vector = PORT2_VECTOR
__interrupt void P2_ISR(void)
{
delay_ms(10);
if(!button)
{
P2IE = 0; //отключаем, что б не мешало определять время нажатия
__bic_SR_rikystir_on_exit(__SR_OSC_OFF); //переход в  LPM3
TBCCTL0 = CCIE;           // настройка ТВ3
TBCCR0 = 120;             //10 ms
TBCTL = TBSSEL_1 + MC_1;  // ACLK, contmode
счетчик_нажатия = 0;
счетчик_отжатия = 0;
}
 
P2IFG = 0;
}
 
//------------------------------------------------------------------------------
int main( void )
{
//настройка тактирования
//настройка портов и прерываний
for(;;)
{
//включаем прерывания копки
P2IE = BIT0;
__low_power_mode_4();
 
//мигаем диодом
 
}
}
Суть такова.
Хочу обрабатывать нажатие кнопки с помощью таймера и прерываний. Более-менее получилось, но есть одна проблема - если кнопку нажимать быстро много раз подряд, программа зависает. Как выяснил - почемуто оказываются отключены прерывания от кнопки. Но я не вижу в каком месте они могут отключится и не в ключится...
При спокойном нажатии (пару раз в секунду) все работает четко.

Прогамма рабботает так:
после инициализации засыпаем, по прерыванию от кнопки запускаем таймер и прерывания от него, а от кнопки отключаем, что б не мешали счету. Переходим в LPM3. Как только счетчик времени нажатия или времени отжатия превысит порог, просыпаемя, мигаем соотв. светодиодом. Затем включаем прерывания кнопки и засыпаем.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.12.2013, 03:30
Ответы с готовыми решениями:

Проблемы с прерываниями
Странная проблема, помогите пожалуйста. Проект в IAR 6.50 (и в 6.21) для STM32F107, плата самодельная. Отладчик STM32VLDyscovery. ...

Проблемы с внешними прерываниями
Доброго всем времени суток. Продолжая изучение stm8s наткнулся на грабли. Пытаюсь настроить ножку на генерацию внешнего прерывания: ...

STMF3DISCOVERY+CooCox Проблемы с прерываниями
Добрый день. Я только начинаю программировать STM32. Но у меня никак не получается вызвать прерывание. При переходе в отладку программа...

8
1 / 1 / 0
Регистрация: 25.01.2012
Сообщений: 492
03.12.2013, 13:27
Code
1
2
3
__interrupt void P2_ISR(void)
{
delay_ms(10);
Это моветон
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
03.12.2013, 13:31
Есть подозрения, что со спящими режимами что-то не то. Попробуйте без них запустить прогу.
__low_power_mode_off_on_exit(); эта штука точно выводит из lpm3?
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
03.12.2013, 13:50
MrYurom, только из-за того, что прерывание в иделе должно работать быстро?

dr_wop, я тоже подозреваю, что проблема образуется во время входа-выхода из LPM, но в каком месте - не могу отловить.
Можно попробовать без них, но ведь финальная прога должна быть с ними :)

__low_power_mode_off_on_exit(); это выход из любого режима в полнофункциональный, т.е. когда работает все.
0
1 / 1 / 0
Регистрация: 25.01.2012
Сообщений: 492
03.12.2013, 13:55
Цитата Сообщение от ZoomyrJuk
MrYurom, только из-за того, что прерывание в иделе должно работать быстро?
Не в идеале, а всегда.
Тем более в MSP, где вложенные прерывания по умолчанию запрещены.
dr_wop, я тоже подозреваю, что проблема образуется во время входа-выхода из LPM, но в каком месте - не могу отловить.
Можно попробовать без них, но ведь финальная прога должна быть с ними :)
Советую посмотреть, что из себя реально представляют эти макросы.
Возможно, что они сбрасывают глобальный флаг IE
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
03.12.2013, 14:06
Нет, IE при выходе не затрагивается, только тактирование
Code
1
2
3
4
5
#define __low_power_mode_off_on_exit()
(__bic_SR_rikystir_on_exit(  __SR_CPU_OFF
| __SR_SCG0
| __SR_SCG1
| __SR_OSC_OFF))
Я ставил в программе метки и по ним определил, что проблема в том, что контроллер засыпает с отключенными P2IE, как только коммментирую строку отключения P2IE в обработчике прерывания от PORT2, все работает. Но я, наверное, сотню раз просмотрел программу и не пойму - как может получится так? Ведь если программа зашла в обработчике прерывания от PORT2 и отключила P2IE, значит она и таймер запустила. А раз таймер запущен, он полюбому выведет контроллер из спящего режима и в основном цикле включит прерывания от кнопки.

Хотя да, может получаться, что контроллер не переходит в LPM3, тогда таймер не будет работать и программа зависнет. Надо посмотреть. Правильно я перехожу из LPM4 в LPM3?
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
03.12.2013, 14:26
Попробовал без спящих режимом. Нифига - при быстром многократном нажатии программа виснет... При неторопливом нажатии все ок. Но почему? Ведь при обработке первого нажатия прерывания от кнопки отключаютя... как может сработать второе и при этом накосячить?
0
omx
03.12.2013, 15:04
А много вы выигрываете в LPM4 вместо LPM3? Старт часового кварца - дело не быстрое.
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
03.12.2013, 15:15
LPM3 у меня от VLO. Судя по ДШ разница в 2 раза, хоть речь о 1 мкА. Да и зачем держать постоянно включенным генератор.

Нашел проблему последнего сообщения - включение прерывания поставил после мигания диодом, так до этого во времы процедуры мигания происходило отключение прерываний, теперь все работает идеально. А вот как теперь спящие режимы применить? В варианте со спящим режимом подобное не поможет, т.к. включение стоит перед входом в спячку, т.е. получается уже после мигания...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2013, 15:15
Помогаю со студенческими работами здесь

Пробема с прерываниями
Добрый вечер! Прошу помощи в решении проблемы. Имеется контроллер ATmega169pa-au. PORTE настроен на вход и подтянут резисторами внутри...

Энкодеры с прерываниями
Привет всем! Пытаюсь решить задачу: нужно собрать коробку с восьмью энкодерами, которая управляла бы светодиодной лентой. Почему 8? Потому...

Работа с прерываниями
Здравствуйте. Нужно реализовать шифрование AES, используя новые команды aesenc и aesdec, причем работа с файлами осуществляется через...

Работа с прерываниями
Есть программа для работы с прерыванием по таймеру. Не могу до конца разобраться как и что работает. Прошу детально объяснить что тут и к...

Работа с прерываниями
Доброе время суток. Возник вопрос, недавно я начал учиться работать с прерываниями в DOS, но до конца еще не разобрался, а сейчас пишу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru