Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2020-сен-22 10:59

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 27 сообщений ]  На страницу 1 2 »
Автор Сообщение
СообщениеДобавлено: 2014-ноя-12 11:06 
Не в сети

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
Доброго дня!

Не выполняется установка бита 12 в порте А при работе микроконтроллера в обычном режиме. При этом если идет работа в отладке и на функцию записи в порт поставлена точка останова, установка бита производится правильно. Как только снимается точка останова, функция перестает выполняться.
Проблема проявляется только если вывод настроен как OpenDrain, если вывод настроен как PushPull, все работает нормально! На плате вывод подтянут к 5В через 20к.
Код записи в порт:
PORT_WriteBit( MDR_PORTA, PORT_Pin_12, (BitAction) 1 );
пробовал без вызова функции:
portdata = MDR_PORTA->RXTX ;
MDR_PORTA->RXTX = portdata | PORT_Pin_12;
результат тот же. Через BitBand еще хуже (см. ниже).
Данный кусок кода точно выполняется. Рядом поставил команду управления светодиодом и светодиод исправно моргает как в отладке, так и в рабочем режиме, но интересующий меня бит, по-прежнему не устанавливается.
Причина не может быть в том, что бит где-то еще в программе бит сбрасывается, т.к. при установке breakpoint-а бит устанавливается и держится в 1 до его выключения вручную по команде. Также исключено влияние прерываний, т.к. я пробовал их отключать (безрезультатно).
Частота ядра 72МГц, тактирование от 8МГц кварца. Flash работает с 2 тактами задержки (пробовал ставить 3, 7 тактов, не помогло). Среда разработки Keil uVision 5, оптимизация отключена (включение не помогает).
Вывод настроен следующим образом: GPIO, OUT, подтяжки выключены, Open Drain, фронты медленные, фильтр и триггер шмидта выключены, цифровой режим.
Из периферии используется: АЦП 14 каналов + DMA, UART1, все таймеры в режиме ШИМ, компаратор. Используется JTAGB.

Ранее была аналогичная проблема при обращении к портам через BitBand. Проблема проявлялась на очень многих выводах. После замены обращений через BitBand на работу через PORT->RXTX большая часть выводов заработали нормально, но, как оказалось, не все...

У меня идеи кончились. Очень надеюсь на Вашу помощь.


Вернуться к началу
СообщениеДобавлено: 2014-ноя-17 11:38 
Не в сети

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
УВАЖАЕМЫЕ СОТРУДНИКИ МИЛАНДРа! ПОЖАЛУЙСТА ОТКЛИКНИТЕСЬ!!!!
Пока вывод заменил на Push-Pull, но вопрос все равно остался, т.к. open-drain выводов полно!!!


Вернуться к началу
СообщениеДобавлено: 2014-ноя-17 13:13 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1311
Откуда: АО "ПКК Миландр"
RRoman писал(а):
УВАЖАЕМЫЕ СОТРУДНИКИ МИЛАНДРа! ПОЖАЛУЙСТА ОТКЛИКНИТЕСЬ!!!!
Пока вывод заменил на Push-Pull, но вопрос все равно остался, т.к. open-drain выводов полно!!!
Все должно работать.
Возможно этот вывод у вас нагружен к земле. И 20 КОм подтяжки не хватает (коротыш на плате, или еще что). Ну и как крайний случай - пробой в кристалле. Но это маловероятно.

Покажите схему включения, проверьте плату без кристалла.


Вернуться к началу
СообщениеДобавлено: 2014-ноя-18 10:41 
Не в сети

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
Высылаю схему включения.
Вложение:
[ attachment ]
схема open-drain.jpg [ 117.22 КБ | 12366 просмотров ]
Тестор КЗ не обнаруживает. Проверить без микросхемы нет возможности, т.к. плата в единственном экземпляре. Можно поднять ножку МК, но не вижу смысла, т.к. КЗ нет.

ОБРАТИТЕ ВНИМАНИЕ, что вывод работает при установке на него точки останова!!! Если ошибка в схемотехнике, то такого не должно быть (или я не прав?). Как я писал выше, аналогичная проблема наблюдалась при работе через BitBand и была устранена переходом к работе через PORT->RXTX. Такое ощущение, что что-то неправильно настроено в МК: шина, порты, тактирование, что-то еще? Возможно ли такое?


Вернуться к началу
СообщениеДобавлено: 2014-ноя-18 10:56 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1511
Откуда: Тула
Вы бы урезанный до максимума пример проекта выложили, что бы специалистам было более удобно разбираться в Вашей проблеме. (видимо, желательно кейл или фитон).
ЗЫ. а ещё Вас могут поругать специалисты по импульсной схемотехнике - нужен токоограничивающий резистор как минимум. лучше драйвер =)

_________________
сочувствующий…


Вернуться к началу
СообщениеДобавлено: 2014-ноя-18 15:02 
Не в сети

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
Спасибо!
Резистор действительно неплохо бы поставить. Расчет был на то, что транзистор не очень мощный, емкость затвора небольшая и заряжается(разряжается) быстро. Поэтому, если бросок тока и есть, то он очень короткий. В данном случае стоит irf3708. В режиме push-pull все прекрасно работает. Минимизация проекта это работа достаточно трудоемкая, но если без этого не удастся разобраться, сделаю.


Вернуться к началу
СообщениеДобавлено: 2014-ноя-18 15:51 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1311
Откуда: АО "ПКК Миландр"
RRoman писал(а):
Спасибо!
Резистор действительно неплохо бы поставить. Расчет был на то, что транзистор не очень мощный, емкость затвора небольшая и заряжается(разряжается) быстро. Поэтому, если бросок тока и есть, то он очень короткий. В данном случае стоит irf3708. В режиме push-pull все прекрасно работает. Минимизация проекта это работа достаточно трудоемкая, но если без этого не удастся разобраться, сделаю.
Работать должно, проверьте сопротивление резистора подтяжки тестером, проверьте транзистор не на КЗ в на сопротивление, Ну и осцилограмму бы посмотреть что на затворе транзистора.


Вернуться к началу
СообщениеДобавлено: 2014-ноя-18 16:07 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1511
Откуда: Тула
RRoman писал(а):
Спасибо!
Резистор действительно неплохо бы поставить. Расчет был на то, что транзистор не очень мощный, емкость затвора небольшая и заряжается(разряжается) быстро. Поэтому, если бросок тока и есть, то он очень короткий. В данном случае стоит irf3708. В режиме push-pull все прекрасно работает. Минимизация проекта это работа достаточно трудоемкая, но если без этого не удастся разобраться, сделаю.
Суть не минимизация, а повторение условий - тактирование и инициализация порта, использование.
Грубо, должен быть проект из одного файла исходного кода, где настраивается порт (методом копипаста из вашего проекта) и, например по программной задержке, переключается нужный пин (тоже копипастом). (рядом укажите ещё проблемные пины,с инициализацией так вообще отлично)
Не забудьте сами проверить в реально железе - вдруг заработает ;)

_________________
сочувствующий…


Вернуться к началу
СообщениеДобавлено: 2014-ноя-18 19:06 
Не в сети

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
-=Sergei=- писал(а):
проверьте сопротивление резистора подтяжки тестером,
проверьте транзистор не на КЗ в на сопротивление, Ну и осцилограмму бы посмотреть что на затворе транзистора.
Сопротивление правильное(20к), но почему-то с затвора транзистора на землю те же 20к. Действительно что-то в схеме. Не может ли выход МК давать такое сопротивление? Внутренние подтяжки выключены.
Сигнал на затворе постоянно ноль.


Вернуться к началу
СообщениеДобавлено: 2014-ноя-18 19:44 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1311
Откуда: АО "ПКК Миландр"
RRoman писал(а):
Сопротивление правильное(20к), но почему-то с затвора транзистора на землю те же 20к. Действительно что-то в схеме. Не может ли выход МК давать такое сопротивление? Внутренние подтяжки выключены.
Сигнал на затворе постоянно ноль.
поднимайте ногу микроконтроллера, и смотрите. Так уже сложно что либо подсказать.


Вернуться к началу
СообщениеДобавлено: 2014-ноя-18 20:07 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1511
Откуда: Тула
через источник питания может звониться примерно "те же 20к". лучше пилите демку.

_________________
сочувствующий…


Вернуться к началу
СообщениеДобавлено: 2015-фев-06 18:40 
Не в сети

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
Нужда заставила вернуться к данной проблеме. Напомню, что у меня не устанавливался в 1 вывод порта, настроенный как open-drain. При чем, при пошаговом исполнении бит устанавливается нормально, а при обычной работе программы - не устанавливается.
После небольших исследований пришел к простым, но интересным выводам. В порт, о котором идет речь, программа постоянно что-то выводит. При записи в порт всегда делаю READ-MODIFY-WRITE, либо вызываю функцию PORT_WriteBit, которая обеспечивает это сама? чтобы ничего не потерять. НО! Вывод о котором идет речь, нагружен на затвор транзистора, у которого все же оказалась довольно большая емкость. Из-за этого, так как вывод работает в режиме "открытый сток", с подтяжкой 20к напряжение на данном выводе нарастает достаточно медленно (20мкс при подтяжке 2.2к, соответственно при 20к должно быть 200мкс). При следующей записи в порт, которая может произойти буквально на следующей строке кода программа честно считывает регистр PORT->RXTX, но в нем нет бита, который только что записали, так как напряжение на выводе еще не наросло и во входном регистре данного бита нет!
ВОПРОС: что делать??? Я пока вижу только один выход - вводить на каждый порт переменную, которая будет помнить все, что выводили в порт и при записи в порт считывать не RXTX, а эту переменную. Может быть есть другие идеи? Идею "сменить транзистор" не предлагать :). Сильно уменьшать подтягивающий резистор тоже не могу, т.к. максимальный ток вывода МК - 6мА, а при 1к получу 5мА и время нарастания 10мкс.


Вернуться к началу
СообщениеДобавлено: 2015-фев-06 18:44 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1311
Откуда: АО "ПКК Миландр"
RRoman писал(а):
Нужда заставила вернуться к данной проблеме. Напомню, что у меня не устанавливался в 1 вывод порта, настроенный как open-drain. При чем, при пошаговом исполнении бит устанавливается нормально, а при обычной работе программы - не устанавливается.
После небольших исследований пришел к простым, но интересным выводам. В порт, о котором идет речь, программа постоянно что-то выводит. При записи в порт всегда делаю READ-MODIFY-WRITE, либо вызываю функцию PORT_WriteBit, которая обеспечивает это сама? чтобы ничего не потерять. НО! Вывод о котором идет речь, нагружен на затвор транзистора, у которого все же оказалась довольно большая емкость. Из-за этого, так как вывод работает в режиме "открытый сток", с подтяжкой 20к напряжение на данном выводе нарастает достаточно медленно (20мкс при подтяжке 2.2к, соответственно при 20к должно быть 200мкс). При следующей записи в порт, которая может произойти буквально на следующей строке кода программа честно считывает регистр PORT->RXTX, но в нем нет бита, который только что записали, так как напряжение на выводе еще не наросло и во входном регистре данного бита нет!
ВОПРОС: что делать??? Я пока вижу только один выход - вводить на каждый порт переменную, которая будет помнить все, что выводили в порт и при записи в порт считывать не RXTX, а эту переменную. Может быть есть другие идеи? Идею "сменить транзистор" не предлагать :). Сильно уменьшать подтягивающий резистор тоже не могу, т.к. максимальный ток вывода МК - 6мА, а при 1к получу 5мА и время нарастания 10мкс.
В ВЕ91 только через переменную которую подмешивать к порту при записи.


Вернуться к началу
СообщениеДобавлено: 2015-фев-06 21:54 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1511
Откуда: Тула
А лучше таки развязывать пин от такой ёмкости нагрузки, ведь если состояние вывода может меняться буквально каждую строчку туда-сюда, то вывод фактически видит КЗ.

_________________
сочувствующий…


Вернуться к началу
СообщениеДобавлено: 2015-фев-09 14:00 
Не в сети

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
Спасибо!


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 27 сообщений ]  На страницу 1 2 »

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB