Перейти к содержанию

Логика Работы Прерываний? Или Ошибка В Коде?


falcol

Рекомендуемые сообщения

Делаю я контроллер для управления компом в машине... Столкнулся с такой проблемой .. выделенный кусок кода работает нормально, если выключены прерывания. т.е. при выполнении условий отрабатывает инструкция PORTB |= _BV(4); и у порта В на 4 пине логическая 1 остается до тех пор пока я ее не выключу (т.е. не выполнится условие

if (bit_is_clear(PINC,3))

{
PORTB &= ~_BV(4);
}

Но вот стоит включить прерывания, т.е. закомментировать cli(); в начале выделенного куска, порт переходит в лог.1 только тогда когда выполняется условие в выделенном куске кода, если условие не выполняется сразу становится лог.0. Вопрос - Почему? уже все векторы прерываний закомментировал. оставил только главную функцию(int main).

int main(void)
{
// int count=1;
// int time1;
PORTB = 0b00000000; //настраиваем
DDRB = 0b11111111; //порты
PORTC = 0b00000000;//
DDRC = 0b00000000;//
PORTD = 0b00001100;//
DDRD = 0b11110001;//
MCUCR=0x01;// прерывание по любому изменению логического уровня INT0 и низкому уровню на INT1
GICR=0xC0;// разрешаем прерывания на INT0 и INT1
GIFR=0x40;// сбрасывается флаг INT0 (в данный момент не требуется)
TCCR1B=0x03;// предделитель таймера 1 на 64
OCR1A=65534;// максимальное число счетчика таймера 1
TCCR2=0x05; // предделитель таймера 2 на 1024
TIMSK |= _BV(7); // разрешается прерывание по совпадению таймера 2
TIMSK |= _BV(4); // тоже,таймера1
TIMSK |= _BV(2); // прерывание по переполнению таймера 1
//OCR2=700;
PORTB |= _BV(5); // выставляется высокий уровень 5го бита порта B
sei();
while (1)
{

//если нет 12в с компа, то выключить усилитель.
// if (bit_is_clear(PINC,4)) PORTB &= ~_BV(3);

if (bit_is_clear(PINC,3))
{
PORTB &= ~_BV(4);
}
//Если пропало питание на USB то выключаем дежурку
if (bit_is_set(PINC,5)) //Если ключ в положении ON...
{
################################################################
cli();

if (bit_is_clear(PINC,4)) //...и нет питания 12v...
{
if (bit_is_clear(PINC,3))//И нет питанич на USB,то включаем дежурку
{
if (status==0)
{
PORTB |= _BV(4);
_delay_ms(1500);
click(0);//включаем комп
}
}
else
//if (status==0) click(0);//выводим из дежурки
_delay_ms(500);
status=1;
}
##################################################################3
// sei();
}
else
status=0;
}
return 0;
}

Изменено пользователем falcol
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Приведите, пожалуйста, код в читаемый вид. Отчасти этому, конечно, мешает движок форума (некоторые отступы, кодировка), но все на него не спишешь: отсутствие осмысленных комментариев где надо, "компьютерные" настройки

MCUCR=0x01;
GICR=0xC0;
GIFR=0x40;
TCCR1B=0x03;
OCR1A=65534;
TCCR2=0x05;
TIMSK |= _BV(7);
TIMSK |= _BV(4);
TIMSK |= _BV(2);

Вот лично я не помню наизусть что в каких контроллерах может делать эта последовательность команд. Нет ни комментариев, ни нормальной записи вида

TCCR1B = (0b11 << CS10);//тактовая частота F_CPU/64 = 15625 Hz

.

Ну и вопрос на засыпку, он же тонкий намек - если обработчик прерывания не написан, а само прерывание разрешено, что контроллер будет делать при его возникновении?

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

поправил, подписал, если честно сам сидел вспоминал, этот код писал пол года назад, потом времени не было заниматься, сейчас вот вспоминаю)) ну как бы посмотрел что эти регистры имеют отношения к прерываниям и не стал заострять на них внимания.

Честно говоря не знаю что он будет делать.. видимо сделает reset.. но я временно закомментировал их, произвожу отладку работы. т.к. изначально полностью написанный код не заработал как надо!)

я так понимаю из того самого тонкого намека, для начала запретить не используемые прерывания и проверить работу?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Комментарии это конечно хорошо, но еще бы не помешало нормальное форматирование кода отступами и использование именованых констант вместо магических чисел (пример с TCCR1B я приводил).

Что сделает контроллер в такой нештатной ситуации завиит от программиста. Как пишущего саму прошивку, так и написавшего компилятор. Обычно применяется просто ресет, но может быть и зацикливание кода.

Неиспользуемые прерывания можно запретить (глобально в SREG'е либо локально в соответствующих регистрах), а можно поставить заглушки вместо обработчиков (пустуя функция, без кода, может даже со специальными атрибутами вроде отсутствия дефолтного кода сохранения SREG и пр., но в данном случае достаточно просто пустого, но существующего, обработчика).

Кстати, в симуляторах оно работает нормально? Ну и что за контроллер и схема?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое! Разобрался. Действительно, мешали прерывания таймера. причем без обработчика. было прерывание по переполнению, по совпадению. А т.к. некуда было уходить и нечего обрабатывать видимо контроллер уходил в ресет, отсюда и ситуация со сбросом портов!)

В качестве эксперимента разрешил прерывание по переполнению, без обработчика - не работало. прописал обработчик, все стало нормально работать! причем все это одинаково было что на контроллере что в протеусе.

Думаю темку можно прикрыть! :dance2:

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...