Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятное поведение UART.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Oleg_IT
С UART работаю в импульсном режиме, инициализирую UART, работаю с ним и выключаю обнулением его регистров и инициализирую пины работающие с UART на выход DDR = 1, PORT = 0. Если я не включаю режим Power Save после того как отработал UART, то, между импульсами на пине TXD ноль, если режим сна включаю, то единица. Очень редко однократно бывает ноль.
Режим сна включаю так (IAR)
……………………
MCUCR |= (1 << SE);
__sleep();
MCUCR &=~ (1 << SE);

Почему так происходит и как сделать на этом пине гарантированный ноль?
GDI
Вообщето у УСАРТа не активный уровень лог "1", а поступивший затем "0" считается стартовым битом, т.о. может это удаленное устройство дает там единичку, а не ваш контроллер? Например преобразователь МАХ232 и т.п.
Второе: режимов сна существует несколько и в разных режимах отключается различный состав перефирии, хотя по-умолчанию там стоит режим Idle. Но мне кажется, что это маловероятная причина.

Что за контроллер у вас и какой режим сна используется?
IEC
Цитата(Oleg_IT @ Jul 31 2007, 10:17) *
... если режим сна включаю, то единица. Очень редко однократно бывает ноль.

Вероятно в режиме сна контроллер отключает периферию и переходит в режим малого энергопотребления. В режиме удержания 0 на пине энергии затрачивается больше (протекание тока через резистор подтяжки) чем при удержании 1.
Oleg_IT
МК у меня ATMega32. Поработав с UART я его отключаю и пины работают как общего назначения. Удаленное устройство отключал, физически, картина не изменилась.
Режим сна у меня Power Save (работает асинхронный таймер).
MCUCR |= (1 << SM1) | (1 << SM0);
Другие пины управляются так как я пожелаю. Предполагаю «виноват» UART, но в чем дело не пойму.
KRS
Цитата(Oleg_IT @ Jul 31 2007, 11:17) *
С UART работаю в импульсном режиме, инициализирую UART, работаю с ним и выключаю обнулением его регистров и инициализирую пины работающие с UART на выход DDR = 1, PORT = 0.

Так когда UART не активен должна быть 1 на ноге. К тому же RX лучще настраивать на вход (чтобы конфликта не было) ну можно включить pull-up поэтому
DDR должен быть (1<<TXD), а PORT = (1<<TXD) или PORT = (1<<TXD) | (1<<RXD) для pull-up на RX
GDI
Цитата
Удаленное устройство отключал, физически, картина не изменилась.

А к удаленному устройству ТТЛ уровни идут? МАХ232 не стоит?
ИМХО надо ногу TXD поднять и посмотреть.
И может стоит режим Idle применить для проверки?
Oleg_IT
Удаленное устройство это ATR2406, я его полностью отключил. UART работал в молоко, только осциллограф на TXD был подключён.
Idle проверю, но мне по энергетики интересен Power Save.

Сейчас меня интересует TXD пин. Перед переходом Power Save в DDR (соответствующий бит) ставлю 1 (выход), а PORT (тот же бит) 0 (pull-up вроде как ни причём). Именно так рекомендуется для снижения потребления если подключенное устройство не требует чего-то своего.
GDI
А остальные пины этого порта как себя ведут?
Oleg_IT
Цитата(GDI @ Jul 31 2007, 16:00) *
А остальные пины этого порта как себя ведут?

Остальное работает так, как пожелаю.
GDI
Может TXD на вход настроить и к земле резюком притянуть? с точки зрения потребления вход меньше должен влиять, т.к. оба транзистора выключены.
Oleg_IT
В режиме Idle на пине TXD ноль, так же как и без режима сна. Во всех остальных доступных режимах единица.
Может я UART не правильно отключаю??? Я делаю так:
UCSRA = 0x00;
UCSRB = 0x00;
UCSRC = 0x80;
UCSRC = 0x00;
GDI
Цитата
UCSRA = 0x00;
UCSRB = 0x00;
UCSRC = 0x80;
UCSRC = 0x00;
Зачем такие сложности? Достаточно просто обнулить биты TXEN и RXEN в регистре UCSRB, т.е. просто записать так:
Код
UDSRB &= ~((1<<TXEN)|(1<<RXEN));
, а включать потом
Код
UDSRB |= ((1<<TXEN)|(1<<RXEN));
и не производить каждый раз настройку скорости, формата данных и прочего.

Кроме режима Idle есть еще другие режимы да PowerSave, например PowerDown, можно проверить еще и их.

И ещё, может стоит сделать какую то задержку между командами выключения УСАРТа и командами перехода в PowerSave, возможно что на выключение требуется какое то время, а в режиме PowerSave отключается тактовая портов, т.е. может проц, возможно, засыпает не успев сделать все процедуры останова УСАРТа, а в режиме Idle тактовая портов сохраняется, но это как версия.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.