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

Проблема С Прерываниями Atmega8


deni219634

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

Помогите решить проблему. Написал программу для МК, прием данных от ПК, передача данных (температур) в ПК, и реализация детектора нуля (подключен к INT0), в обработчике прерывания INT0 подпрограмма управления симисторами. Проблема в следующем, МК отказывается принимать данных от ПК, из за того, что прерывание INT0 не дает прерваться на прием данных через UART. Подскажите, что можно сделать?

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

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

Что значит "прерывание INT0 не дает прерваться на прием данных через UART"? Все прерывания выполняются МК в соответствии с их приоритетом. У INT0 более высокий приоритет. Но после завершения выполнения прерывания INT0 все равно должно выполниться прерывание UART, если оно конечно разрешено. За единственным исключением: время выполнения прерывания INT0 превышает период его возникновения. В этом случае можно либо вообще отказаться от обработки прерывания INT0, а в основном цикле постоянно мониторить флаг INTF0, либо повысить тактовую частоту МК. А вообще, чтобы не было гадания на кофейной гуще, приведите весь ваш код.

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

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

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

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

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

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

Во-первых. Надо отказаться от выполнения алгоритма задержки внутри обработчика прерывания INT0. В нем достаточно поднять флаг и выйти. Саму обработку угла отпирания делайте в основном цикле.

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

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

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

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

Либо не заводить лишних переменных и проверять сам флаг прерывания (INTFx в GIFR / EIFR) в основном цикле.

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

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

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

Всем спасибо, проблему решил. Пошел другим путем, так как у меня нагрузка чисто резистивная, я отказался от использования детектора нуля, и просто сделал управление нагрузкой с помощью ШИМ. Прерывание по INT0 полностью убрал, в место него использую Fast PWM., и теперь все работает как нужно.

Тему можно закрывать.

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

  • 2 недели спустя...

Выше уже сказали, никаких задержек в прерываниях.

Я бы сделал фазовый регулятор так - детектор нуля (INT0) снимает управление симистором, сбрасывает в ноль таймер, устанавливает в регистре сравнения число, соответствующее нужному фазовому углу, разрешает прерывание по сравнению и запускает таймер. Обработчик прерывания таймера запускает симистор.

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

Но еще лучше и проще, поскольку нагрузка очень инерционна, мощность в ней регулировать не углом открывания, а целыми полупериодами сети. Тогда можно обойтись вовсе без детектора нуля, управляя симистором через MOС3063 или ему подобный с детектором нуля.

А ШИМ, как и фазовые регуляторы слишком много помех выдают в сеть.

P.S. Разумеется, таймер не должен успевать переполняться в течении 10 мс.

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

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

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

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

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

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

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

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

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

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

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