реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Непонятное поведение UART.
Oleg_IT
сообщение Jul 31 2007, 07:17
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



С UART работаю в импульсном режиме, инициализирую UART, работаю с ним и выключаю обнулением его регистров и инициализирую пины работающие с UART на выход DDR = 1, PORT = 0. Если я не включаю режим Power Save после того как отработал UART, то, между импульсами на пине TXD ноль, если режим сна включаю, то единица. Очень редко однократно бывает ноль.
Режим сна включаю так (IAR)
……………………
MCUCR |= (1 << SE);
__sleep();
MCUCR &=~ (1 << SE);

Почему так происходит и как сделать на этом пине гарантированный ноль?
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 31 2007, 07:48
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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

Что за контроллер у вас и какой режим сна используется?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
IEC
сообщение Jul 31 2007, 09:12
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



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

Вероятно в режиме сна контроллер отключает периферию и переходит в режим малого энергопотребления. В режиме удержания 0 на пине энергии затрачивается больше (протекание тока через резистор подтяжки) чем при удержании 1.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jul 31 2007, 09:30
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



МК у меня ATMega32. Поработав с UART я его отключаю и пины работают как общего назначения. Удаленное устройство отключал, физически, картина не изменилась.
Режим сна у меня Power Save (работает асинхронный таймер).
MCUCR |= (1 << SM1) | (1 << SM0);
Другие пины управляются так как я пожелаю. Предполагаю «виноват» UART, но в чем дело не пойму.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jul 31 2007, 09:40
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 31 2007, 10:16
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
Удаленное устройство отключал, физически, картина не изменилась.

А к удаленному устройству ТТЛ уровни идут? МАХ232 не стоит?
ИМХО надо ногу TXD поднять и посмотреть.
И может стоит режим Idle применить для проверки?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jul 31 2007, 10:30
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Удаленное устройство это ATR2406, я его полностью отключил. UART работал в молоко, только осциллограф на TXD был подключён.
Idle проверю, но мне по энергетики интересен Power Save.

Сейчас меня интересует TXD пин. Перед переходом Power Save в DDR (соответствующий бит) ставлю 1 (выход), а PORT (тот же бит) 0 (pull-up вроде как ни причём). Именно так рекомендуется для снижения потребления если подключенное устройство не требует чего-то своего.
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 31 2007, 12:00
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



А остальные пины этого порта как себя ведут?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jul 31 2007, 12:03
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(GDI @ Jul 31 2007, 16:00) *
А остальные пины этого порта как себя ведут?

Остальное работает так, как пожелаю.
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 31 2007, 12:21
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Может TXD на вход настроить и к земле резюком притянуть? с точки зрения потребления вход меньше должен влиять, т.к. оба транзистора выключены.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Aug 1 2007, 07:15
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



В режиме Idle на пине TXD ноль, так же как и без режима сна. Во всех остальных доступных режимах единица.
Может я UART не правильно отключаю??? Я делаю так:
UCSRA = 0x00;
UCSRB = 0x00;
UCSRC = 0x80;
UCSRC = 0x00;
Go to the top of the page
 
+Quote Post
GDI
сообщение Aug 1 2007, 08:02
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
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 тактовая портов сохраняется, но это как версия.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 17:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016