Перейти к содержанию
С Днём Победы! ×

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


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

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

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • Спасибо за ссылку, Именно с этим Паком у меня впервые и возникли проблемы со встроенной внутри заразой. Тоже самое потом было и c DPS. Но это было давно, с тех пор я им больше не пользовался. Возможно что этот лучше, но пока не попробуешь, не будешь знать. Будет время и необходимость, попробую и проверю.  По поводу "бесплатных драйверов" - драйвера у DSP есть бесплатные онлайн, но с "довеском" ввиде всякого шита. Даже полный небесплатный пакет тоже с этим дерьмом идет. Ничего смешного тут нет. Один клиент купил это дерьмо, и что потом, в суд подавать на ту компанию? Он собирался им сделать гадость, хорошо что мне удалось все вычистить... KDE мне нравился старый, новый не очень... Чаще использую XFCE (насколько cтарое железо позволяет), или Cinnamon. Оболочка скорее нужна только для запуска программ, чем сама по себе. Ubuntu сам по себе достаточно "тяжелый", MX Linux, Manjaro или Mint для более старого железа. На одном ядре приходится жертвовать красотой ради  сравнительно  "нормального" управления. Слава богу, что под любой комп можно что-то подобрать.
    • Не совсем понятно чего ТСу надо?  Т.е. очень похоже, что ТС слабо представляет что оно такое и как с этим обращаться и в придачу или забанен во всех поисковиках, или не понимает что там написано.  Выше уже отметили, но и (специально для Гость Алексей) добавлю, что для использования "Z5R" в любых, необходимых в нём местах, никаких схем не надо.. Всё, что нужно для включения её куда-нибудь, все её настройки и режимы в досконально "разжёванном виде" есть в Инете в свободном доступе.
    • Литцендрат в обмотках из-за того , что рабочая частота трансформатора в 1000 раз выше , чем 50 герц в сети 230 вольт. На высоких частотах ток идёт по поверхности проводов - больше площадь поверхности.
    • Проверил на практике, сначала выпаял R123 и второй 10Ом резистор и заменил перемычками, флешка начала определяться на ГУ, но при попытке чтения происходило зависание приложений. Затем попробовал выпаять R101 и  R103 результат такой же. И только когда выпаял L106 и L105 флешка начала нормально читаться. Для теста проиграл одну мелодию. Как-то так, у меня есть вторая плата AUX+USB завтра попробую на ней отпаять дроссели и припаять перемычки.
    • У многих радиолюбителей есть компьютеры, которые их удовлетворяют по многим причинам. На новых нет "железных" LPT и COM портов. Сейчас восстанавливаю мать ASUS M2V. 10-ка LTSC легла, но убиты звуковуха и Eternet. Чипы заказал, приедут перепаяю. А по теме, может всё-таки BIOS обновить, загрузиться с внутренней видеокартой, потом с внешней.
    • Cortland rs400 не отключается mute. Изначально на дисплее светились все сегменты, был пробит транзистор, обрыв стабилитрона по -30в, после замены напряжение в норме но дисплей также весь светился. после замены драйвера все заработало. сейчас ресивер полностью работает но висит в MUTE. Усилитель работает нормально. R324 стоял МЛТ1 заменил на 0.25 47к , МЛТ стоял 47к а новый оказался 44к. все транзисторы, диоды по цепи защиты целые.  Подскажите в какую сторону копать?  Ресивер висит в MUTE из-за Protect. какое напряжение должно быть на  Protect. Именно TEAC часто на форумах с подобным, но решения нет. На клонах проблем нет, единственное отличие в клонах подтяжка Protect 10к а в TEAC 47к. ag15d.pdf
    • Скорее всего, трансформаторы в серийном производстве были выбраны производителем драйверов лед-ламп из того, что есть у производителя ТПИ, и был выбран на ступень более лучший вариант исполнения, в соответствии с необходимыми расчетными характеристиками
×
×
  • Создать...