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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Полудуплексный обмен по USART, туплю ?!?
Hellper
сообщение Jan 19 2009, 20:57
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



Полудуплексный обмен. Два МК. Приемники/передатчики обоих МК соединены в одну линию.
Туплю. Как отключить приемник во время передачи байта информации?

Код
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))

void tx_disable( void )
{
    CLEARBIT(UCSR0B, TXEN);
}
void tx_enable( void )
{
    SETBIT(UCSR0B, TXEN);
}

void rx_disable( void )
{
    CLEARBIT(UCSR0B, RXEN);
//    UCSR0B &= ~(1 << RXEN0);
}

void rx_enable( void )
{
    SETBIT(UCSR0B, RXEN);
//    UCSR0B |= (1 << RXEN0);
}

void byte_to(uint8_t byte)
{
    rx_disable();
    tx_enable();

    UDR0 = byte;
//    while (!(UCSR0A&(1 << UDRE0)))
//;
    while (!(UCSR0A&(1 << TXC0)))
;

    tx_disable();
    rx_enable();          
}


Этот код не работает !
Прошу вправить мне мозг!
smile3009.gif

Сообщение отредактировал Hellper - Jan 19 2009, 20:59


--------------------
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jan 19 2009, 23:52
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Hellper @ Jan 19 2009, 20:57) *
Как отключить приемник во время передачи байта информации?

Надо бы передатчик отключать, причём на другой стороне, а не приёмник. Приёмник пусть себе принимает.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jan 20 2009, 00:27
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата
Как отключить приемник во время передачи байта информации?

Достаточно очистить бит RXEN:
Цитата
Disabling the Receiver In contrast to the Transmitter, disabling of the Receiver will be immediate. Data from ongoing
receptions will therefore be lost. When disabled (i.e., the RXEN is set to zero) the Receiver will
no longer override the normal function of the RxD port pin. The receiver buffer FIFO will be
flushed when the receiver is disabled. Remaining data in the buffer will be lost

Может, вместо TXEN, RXEN нужно писать TXEN0, RXEN0?

Цитата
Этот код не работает !

А вместо этого следовало бы описать, что для Вас означает "не работает". Т.е. что Вы хотели получить в результате выполнения кода и что получили.
Go to the top of the page
 
+Quote Post
Hellper
сообщение Jan 20 2009, 06:55
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



Цитата(=GM= @ Jan 20 2009, 02:52) *
Надо бы передатчик отключать, причём на другой стороне, а не приёмник. Приёмник пусть себе принимает.

отключать нужно именно приемник, тк ему не следует считывать то, что сам отправил.
Цитата(Александр Куличок @ Jan 20 2009, 03:27) *
Достаточно очистить бит RXEN:
Может, вместо TXEN, RXEN нужно писать TXEN0, RXEN0?

не работает. не играет никакой роли.
Код
/* USART Control Register B (generic) */
#define    RXCIE        7
#define    TXCIE        6
#define    UDRIE        5
#define    RXEN         4
#define    TXEN         3
#define    UCSZ         2
#define    UCSZ2        2       /* new name in datasheet (2467E-AVR-05/02) */
#define    RXB8         1
#define    TXB8         0

/* USART1 Control Register B - UCSR1B */
#define    RXCIE1       7
#define    TXCIE1       6
#define    UDRIE1       5
#define    RXEN1        4
#define    TXEN1        3
#define    UCSZ12       2
#define    RXB81        1
#define    TXB81        0

/* USART0 Control Register B - UCSR0B */
#define    RXCIE0       7
#define    TXCIE0       6
#define    UDRIE0       5
#define    RXEN0        4
#define    TXEN0        3
#define    UCSZ02       2
#define    RXB80        1
#define    TXB80        0


Цитата
А вместо этого следовало бы описать, что для Вас означает "не работает". Т.е. что Вы хотели получить в результате выполнения кода и что получили.

Не работает, означает, что во время передачи приемник не выключается и начинает считывать данные с линии.

Цитата
Надо бы передатчик отключать, причём на другой стороне, а не приёмник. Приёмник пусть себе принимает.


Нужно отключать именно приемник на передающей стороне.



PS Использую WinAVR-20081205


--------------------
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jan 20 2009, 07:49
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Hellper @ Jan 19 2009, 23:57) *
Полудуплексный обмен. Два МК. Приемники/передатчики обоих МК соединены в одну линию.
Туплю. Как отключить приемник во время передачи байта информации?

Код
...
void rx_disable( void )
{
    CLEARBIT(UCSR0B, RXEN);
//    UCSR0B &= ~(1 << RXEN0);
}

void rx_enable( void )
{
    SETBIT(UCSR0B, RXEN);
//    UCSR0B |= (1 << RXEN0);
}
...


Этот код не работает !


Закомментировано, вот и не работает. blink.gif
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 20 2009, 09:42
Сообщение #6


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

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



А это дублирующие строки закоментированы.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 20 2009, 09:51
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Hellper @ Jan 19 2009, 23:57) *
Этот код не работает ! Прошу вправить мне мозг!
Банально забыли очистить бит TXC0 в UCSR0A
P.S. Не дожидаясь окончания передачи Вы запретили передатчик (но, передача не закончилась и запрет отложен), и разрешили приёмник...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 20 2009, 10:02
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Hellper @ Jan 20 2009, 09:55) *
Не работает, означает, что во время передачи приемник не выключается и начинает считывать данные с линии.


На основании чего Вы делаете такой вывод? У Вас прием в прерывании? Приведите листинг, мож там бага smile.gif
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 20 2009, 10:09
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(_Pasha @ Jan 20 2009, 13:02) *
У Вас прием в прерывании? Приведите листинг, мож там бага smile.gif
Да, нет... У него - передача по готовности. Но, с ошибкой!
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 20 2009, 10:25
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Палыч @ Jan 20 2009, 12:51) *
Не дожидаясь окончания передачи Вы запретили передатчик

+многа

Тогда первый байт пройдет, а остальные  cranky.gif Так оно еще и ничего не передает?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 20 2009, 10:33
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(_Pasha @ Jan 20 2009, 13:25) *
Так оно еще и ничего не передает?
Передаёт. Запрет передатчика срабатывает по окончанию передачи (если сдвиговый регистр не пуст).
Go to the top of the page
 
+Quote Post
Hellper
сообщение Jan 20 2009, 13:02
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



Цитата(_Pasha @ Jan 20 2009, 13:02) *
На основании чего Вы делаете такой вывод? У Вас прием в прерывании? Приведите листинг, мож там бага smile.gif

То что на железке при отправке данных они возвращаются отправителю.
Да, прием в прерывании.
Код
ISR(USART0_RX_vect)
{
    uint8_t status;
    uint8_t data;
    status = UCSR0A;
    data = UDR0;
    if ( ( status & ( FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN ) ) == 0 )
    {
    UDR1 = data;
    };
}

тут все просто -- принять и переслать.
Цитата
P.S. Не дожидаясь окончания передачи Вы запретили передатчик (но, передача не закончилась и запрет отложен), и разрешили приёмник...


Код
void byte_to(uint8_t byte)
{
    rx_disable();

Приемник отключается. Правильно ?
Код
    tx_enable();

Передатчик включается. Да ?
Код
    UDR0 = byte;

Данные уходят в регистр передатчика. ?
Код
    while (!(UCSR0A&(1 << TXC0)))
   ;

Ожидаем полного выплевывания данных из сдвигового регистра. Верно ?
Код
    tx_disable();

Отключаем передатчик. Наверно отключаем.
Код
    rx_enable();          
}

Включаем приемник.

НО. Переданные данные возвращаются пользователю.

Добейте меня !


--------------------
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 20 2009, 14:51
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Hellper @ Jan 20 2009, 16:02) *
Добейте меня !

Вы, видно, невнимательно читаете ответы... Добиваю biggrin.gif
while (!(UCSR0A&(1 << TXC0))) ;
В этой строчке Вы ожидаете пока бит TXC не станет единицей. Ну, хорошо, он стал единицей. А, кто его будет сбрасывать в ноль? Вы - это не делаете. При выводе всех последующих байт - этот оператор просвистит пулей (TXC в единице), и никакого окончания передачи Вы не ожидаете. После while Вы включаете приёмник. Приёмник ловит передаваемый байт...
Что-то осталось непонятным?
Кстати: бит TXC сбрасывается записью в него единицы. Это - так, напоминаю на всякий случай...
Go to the top of the page
 
+Quote Post
Hellper
сообщение Jan 20 2009, 18:35
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



Код
void Byte_to(uint8_t byte)
{
    rx_disable();
    tx_enable();

       UDR0 = byte;
       while (!(UCSR0A&(1 << TXC0)))
;
    SETBIT(UCSR0A, TXC0);
    tx_disable();
    rx_enable();          
}


В первом приближении такая конструкция не заработала.
Завтра перепроверю.

на грани истерики. "мыши" закачиваются...


--------------------
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jan 21 2009, 18:57
Сообщение #15


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



А вы вот это вот
Код
if ( ( status & ( FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN ) ) == 0 )
уберите. Полагаю, будет нечто более интересное, чем те данные что отсылали :)

PS: при отключении RX\TX USART'а соотв. нога МК становится обычным I\O портом. Как порт сконфигурирован проверьте.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 07:25
Рейтинг@Mail.ru


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