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

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


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.. но я временно закомментировал их, произвожу отладку работы. т.к. изначально полностью написанный код не заработал как надо!)

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

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

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

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

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

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

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

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

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

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

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

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

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

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

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

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

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

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

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