Есть такой вот вопрос: как ведут себя порты общего назначения PIC-микроконтроллера PIC24FJ64GB004 в момент подачи питания?
Дело в том, что у меня контроллер выдаёт два коротких импульса с нулевым уровнем на одном своём выводе, спустя пару миллисекунд после установления питания на уровне 3,3 В:
¯¯¯¯¯¯|_|¯|_|¯¯¯¯¯¯¯
В программе этот вывод конфигурируется как выход с общим стоком и выставляется в "1" в первой же строке программы (после процесса конфигурации). Никаких дополнительных переходов 1->0->1->0->1 в коде нет! На выводе стоит внешняя подтяжка к 3,3 В.
Из документа №2 понял, что при подаче питания (после ресета) контроллер имеет фиксированную задержку, перед тем, как начинает выполняться программный код. Эта задержка зависит от нескольких параметров: источник питания проца, осциллятор... Всё это ясно, и для меня не критично.
В документе №1 сказано, что все порты контроллера конфигурируются после старта (ресета) по умолчанию как входы. Но не понятно, как ведут себя порты до полноценного старта (т.е. до того, как пройдут все стартовые задержки POR и начнёт выполняться код)?
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
После сброса, все порты настроены на вход до того, как Вы их сконфигурируете на выход. Возможно, Вы сначала настраиваете регистр направления (TRIS), а затем уже регистр защёлки (LAT), по этому, если в защёлке находится "0", может проскакивать кратковременный импульс. Настраивайте сначала защёлку а затем направление. Тяжело судить, не видя куска кода с инициализацией.
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
2. Инициализация портов
А зачем Вы сначала настраиваете на выход, затем на вход, потом снова на выход ? К чему такие манипуляции, причём побитные ? Скорее всего проблема именно в этом. И где настройка защёлок (т.е. то, что нужно вывести в порт изначально) ?
Пример:
Код:
LATAbits.LATA0=0; // Сначала в защёлку начальное значение TRISAbits.TRISA0=0; // Затем пин на вЫход
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Поменяли инициализацию портов - см. код. Теперь сначала записываются значения в защёлки LAT, потом настраиваются Open drain, а потом задаётся направление портов ввода-вывода посредством регистров TRIS. Между этими операциями введена задержка.
Теперь проблема с двумя короткими импульсами при старте МК пропала. Но иногда (очень редко - примерно 1 запуск из 20-ти) проскакивает короткий импульс с нулевым уровнем, схематично выглядит он вот так:
Ещё хочу добавить немного про саму схему. Вывод МК RC5 настраивается как вЫход с общим стоком, на котором есть внешний пуллап на 5 В. Этот вывод подключён к управляющему входу OE логического буфера SN74AHC125 с активным низким уровнем. Вот упрощённая схемка:
Не знаем, что делать. К тому же проблема приобрела ещё и несистематический характер!
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Проблема всяко не в инициализации, а в дальнейшем коде. Ищите по коду что может этот ПИН так дёргать. К сожалению, в слепую будет трудно Вам что-либо подсказать...
Проблема всяко не в инициализации, а в дальнейшем коде. Ищите по коду что может этот ПИН так дёргать. К сожалению, в слепую будет трудно Вам что-либо подсказать...
Я могу выложить и оставшийся код, конечно. Только там ничего больше нет относительно этого пина RC5. Он может стать равным нулю только при нажатии на кнопку, которая подключена к одному из портов через функцию Change Notification и внутреннюю подтяжку. При следующем нажатии на кнопку пин RC5 возвращается в единицу.
Аlex писал(а):
ПыСы: А эт что такое
Код:
for(i = 0; i > 3; i++);
?
Это цикл задержки. А что вам не понравилось тут?
Какие могут быть ещё причины для несистематичного сброса пина в ноль? Есть у кого-нибудь догадки?
Мне кажется, нужно написать примитивнейший код, и на нём изучить пуск пика, что как и в какой последовательности происходит. и исходя из полученных результатов писать программу которая вам нужна.
_________________ Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Нашли вроде бы, в чём дело было. По крайней мере после внесённых изменений пока больше ни разу ни одного импульса не проскачило... А реагировал МК на кнопку, подключённую на пин с Change Notification, про которую я ранее писал. Отключили прерывание модуля CN, и после этого трабл исчез. Теперь разрешаем это прерывание в другом месте, и всё пока ОК!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения