NicBenkly Опубликовано 28 июля, 2014 Поделиться Опубликовано 28 июля, 2014 Здравствуйте, столкнулся с такой проблемой: При использовании внешнего прерывания от кнопки INT0 выбирается один из режимов работы контроллера. Каждый режим состоит из длительного цикла (самый короткий 8 мин.). При обработке прерывания изменяется значение глобальной переменной. Состояние переменной проверяется лишь после окончания одного из циклов, что вызывает большую задержку времени до конца исполнения текущего цикла. Проверку переменной в цикл вставить не возможно из-за его и без того высокой нагрузки на систему. Как выход вижу переход при выполнении прерывания к началу программы. Подскажите как можно реализовать такой периход, либо иначе решить задачу. Код в упрощенном виде прилагаю. volatile int reg=0x00; interrupt [EXT_INT0] void ext_int0_isr(void) { reg=reg+1; delay_ms(50); if (reg>0x11) { reg=0x00; } } void regim0 (unsigned int x, y, z) { for (a=0; a<d; a++) { //…………… } } void regim2 (unsigned int x, y, z) { for (a=0; a<d; a++) { //………….. } } //………….. void regim11 (unsigned int x, y, z) { for (a=0; a<d; a++) { //………….. } } void main(void) { while (1) { switch (reg) case 0: regim0(x,y,z); break; case 1: regim1(x,y,z); break; //………….. case 11: regim11(x,y,z); break; } } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Rhime Опубликовано 28 июля, 2014 Поделиться Опубликовано 28 июля, 2014 (изменено) В режимах проверить значение переменной и если не равна текущему значению, то стелать break или goto по другому никак. И вообще как некуда вставить if. Два лишних такта не найдеся чтоли - бред? if(a!=b)break; if(a!=b)goto label; Изменено 28 июля, 2014 пользователем Rhime 0 - А совесть в курсе? - А совесть в доле! :-D Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле. Все грамматические ошибки являются авторским стилем изложения материала. Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
COKPOWEHEU Опубликовано 28 июля, 2014 Поделиться Опубликовано 28 июля, 2014 (изменено) Как выход вижу переход при выполнении прерывания к началу программы.Как вариант сделать переменную не инициализируемой при старте (__attribute__((__noinit__)) вроде), а по прерыванию делать программный сброс в начало (asm("rjmp 0"); ) Изменено 28 июля, 2014 пользователем COKPOWEHEU 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.