Миландр

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

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




Начать новую тему  Ответить на тему  [ 9 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Соединение двух выходов, в OpenDrain
СообщениеДобавлено: 2019-ноя-29 14:44 
Не в сети

Зарегистрирован: 2019-ноя-26 08:33
Сообщения: 5
Организация: ООО НПО Горизонт
Здравствуйте! Микроконтроллер К1986ВЕ92У, Au ТСКЯ.431296.001СП.
Пины порта настроены на выход следующим образом:
PORT_InitStructure.PORT_Pin = (PORT_Pin_0 | PORT_Pin_1);
PORT_InitStructure.PORT_OE = PORT_OE_OUT;
PORT_InitStructure.PORT_PD = PORT_PD_OPEN;
PORT_InitStructure.PORT_PULL_UP = PORT_PULL_UP_ON;
PORT_InitStructure.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
PORT_InitStructure.PORT_FUNC = PORT_FUNC_PORT;
PORT_InitStructure.PORT_MODE = PORT_MODE_DIGITAL;
PORT_InitStructure.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init (MDR_PORTB, &PORT_InitStructure);
0-й и 1-й пины по отдельности выдают сигналы, которые в приложенной картинке (настроены бесконечным циклом), при физическом замыкании 0-го и 1-го пина появляется постоянная непрерывная логическая "0".
Пины настроены в режиме OpenDrain с подтяжкой к плюсу питания, как видно выше. Должно быть, чтобы в момент подачи логической "1" на обоих пинах и при замыкании была логическая "1".
Подскажите пожалуйста, откуда при замыкании двух пинов появляется лог. 0?


Вложения:
Комментарий к файлу: Осциллограмма 2 пинов.
[ attachment ]
20191129_115506.jpg [ 4.89 МБ | 225 просмотров ]
Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2019-дек-02 09:39 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 466
Вы 1 записываете для каждого пина или только для одного? Весь код записи неплохо бы взглянуть.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2019-дек-02 11:08 
Не в сети

Зарегистрирован: 2019-ноя-26 08:33
Сообщения: 5
Организация: ООО НПО Горизонт
Для каждого из двух пинов. При постоянных единицах на двух пинах одного порта, замкнутый пин выдает 1 (все норм), но при каком-либо 0 (программном или физическом) до 100мс два пина обнуляются, как будто какая-то "защита" срабатывает (уместная при использовании пинов в режиме драйвера (push-pull), чтобы не спалить порт, но в режиме OpenDrain эта "защита" не нужна). При использовании пинов из разных портов все нормально, как в приложенной картинке (как должно быть). На пинах одного порта возможно как-то настроить, чтобы получить осциллограмму как в приложенной картинке? (а не постоянный 0)


Вложения:
[ attachment ]
20191129_115506.jpg [ 118.1 КБ | 170 просмотров ]
Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2019-дек-02 11:31 
Не в сети

Зарегистрирован: 2019-ноя-26 08:33
Сообщения: 5
Организация: ООО НПО Горизонт
for(;;)
{if (PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == Bit_RESET) /
{ PORT_ResetBits(MDR_PORTA, PORT_Pin_4); // при замкнутых физически PA4 и PA5 и нажатии кнопки (на порту PC0) выполняется PORT_ResetBits пина 4, после чего замкнутые пины обнуляются в 0.
_delay_ms(5);
PORT_SetBits(MDR_PORTA, PORT_Pin_4);
_delay_ms(1);
PORT_ResetBits(MDR_PORTA, PORT_Pin_5);
_delay_ms(5);
PORT_SetBits(MDR_PORTA, PORT_Pin_5);
_delay_ms(10); // после PORT_SetBits на замкнутых пинах все время 0. Например в STM32F103 такого не встречал.
}
else
{ PORT_SetBits(MDR_PORTA, PORT_Pin_4|PORT_Pin_5); // при не нажатой кнопке замкнутые физически пины 4 и 5, выдают 1, все норм.
}}

При использовании пинов PA4 и PC1 все норм (при замыкании пинов и нажатии кнопки на PC0, на этих пинах нули только в момент PORT_ResetBits, в остальное время - 1):
for(;;)
{if (PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == Bit_RESET)
{ PORT_ResetBits(MDR_PORTA, PORT_Pin_4);
_delay_ms(5);
PORT_SetBits(MDR_PORTA, PORT_Pin_4);
_delay_ms(1);
PORT_ResetBits(MDR_PORTC, PORT_Pin_1);
_delay_ms(5);
PORT_SetBits(MDR_PORTC, PORT_Pin_1);
_delay_ms(10);
}
else
{ PORT_SetBits(MDR_PORTC, PORT_Pin_1);
PORT_SetBits(MDR_PORTA, PORT_Pin_4);
}}


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2019-дек-02 12:36 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 722
Откуда: г. Санкт-Петербург
Библиотечные функции PORT_ResetBits, PORT_SetBits для этого МК выполняют операции "чтение модификация запись" для всех разрядов порта. Поэтому при закороченных PA4,5 после выполнения
PORT_ResetBits(MDR_PORTA, PORT_Pin_5);
_delay_ms(5);
PORT_SetBits(MDR_PORTA, PORT_Pin_5);
в 4 бите регистра MDR_PORTA->RXTX будет записан "0" со всеми вытекающими.
Чтобы этого не происходило применяйте свои функции установки/сброса бита с использованием "регистра - образа"
состояния порта в памяти данных.
static uint16 porta_data = 0;
void porta_SEtbit(uint16 portapin)
{
porta_data |= portapin;
MDR_PORTA->RXTX = porta_data;
}
void porta_RESEtbit(uint16 portapin)
{
porta_data &= ~portapin;
MDR_PORTA->RXTX = porta_data;
}


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2019-дек-03 11:18 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 466
Цитата:
Например в STM32F103 такого не встречал
В STM32 есть специальные регистры, которые отвечают за установку (сброс) битов порта без изменения остальных разрядов.
Здесь такого нет. Особенности железа.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2019-дек-03 12:08 
Не в сети

Зарегистрирован: 2017-июн-05 14:53
Сообщения: 8
Организация: ОАП АПЗ
Для этой цели можно воспользоваться Bit Band Region
viewtopic.php?f=33&t=3730

Я делаю так:
В h файле:
#define BITBAND_PERI_REF 0x40000000
#define BITBAND_PERI_BASE 0x42000000
#define BIT_PER(a,b) *((volatile uint32_t *)(BITBAND_PERI_BASE+((uint32_t)&(a)-BITBAND_PERI_REF)*32+((b)*4)))
А применяю примерно так:
BIT_PER (MDR_PORTE->RXTX,1) = 1;
BIT_PER (MDR_PORTE->RXTX,1) = 0;


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2019-дек-03 12:38 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1390
Откуда: Тула
dOb писал(а):
Для этой цели можно воспользоваться Bit Band Region
Нельзя.

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


Вынести предупреждение
Вернуться к началу
СообщениеДобавлено: 2019-дек-03 17:19 
Не в сети

Зарегистрирован: 2019-ноя-26 08:33
Сообщения: 5
Организация: ООО НПО Горизонт
Решил эту проблему таким образом:
for(;;)
{if (PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == Bit_RESET) /
{ PORT_ResetBits(MDR_PORTA, PORT_Pin_4);
_delay_ms(5);
PORT_SetBits(MDR_PORTA, PORT_Pin_4);
_delay_ms(1);
PORT_ResetBits(MDR_PORTA, PORT_Pin_5);
_delay_ms(5);
PORT_SetBits(MDR_PORTA, PORT_Pin_4|PORT_Pin_5); // замкнутые пины принудительно в 1.
_delay_ms(10);
}
else
{ PORT_SetBits(MDR_PORTA, PORT_Pin_4|PORT_Pin_5);
}}
Возможно не самый оптимальный способ, но то что нужно работает.


Вынести предупреждение
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 9 сообщений ] 

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


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

Сейчас этот форум просматривают: Bing [Bot] и 1 гость


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

Перейти: 

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