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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> USART, atmega
max_mart
сообщение Jun 20 2012, 06:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Здравствуйте.
Использую USART для общения 2 мег. Нужно объеденить RX и TX в одну линию.
Подскажите, ПОЖАЛУЙСТА, как это реализовать програмно?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2012, 07:15
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (max_mart @ Jun 20 2012, 09:48) *
как это реализовать програмно?
Настроить ногу TX регистром DDR на ввод. Линию подтянуть к питанию резистором. Перед передачей включать передатчик битом TXEN (при этом нога переключится на вывод автоматически), после передачи - выключать этим же битом. При желании на время передачи отключать приемник битом RXEN. На уровне протокола исключать возможность работы более одного передатчика одновременно. В протоколе же предусмотреть паузу на время передачи одного байта после включения передатчика и отсеивание принятого до включения передатчика мусора из линии.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
max_mart
сообщение Jun 20 2012, 08:22
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



"В протоколе же предусмотреть паузу на время передачи одного байта после включения передатчика и отсеивание принятого до включения передатчика мусора из линии." -
это значит, что еще после вкл. идет передача мусора?
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Jun 20 2012, 09:33
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



А че на прямую нельзя ? накрест соединить RX и TX?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2012, 09:34
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (max_mart @ Jun 20 2012, 11:22) *
это значит, что еще после вкл. идет передача мусора?
Нет, это значит, что приемник мог зацепиться в худшем случае за последний всплеск шума и в течении максимум одного байта продолжает принимать. Если начать передачу - приемник просто не зацепится за реальный стартовый бит.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AlexFTF
сообщение Jun 20 2012, 09:38
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 95
Регистрация: 11-11-10
Из: Новосибирск
Пользователь №: 60 808



Цитата(max_mart @ Jun 20 2012, 13:48) *
Здравствуйте.
Использую USART для общения 2 мег. Нужно объеденить RX и TX в одну линию.
Подскажите, ПОЖАЛУЙСТА, как это реализовать програмно?


Если не секрет, зачем такое усложнение? sm.gif
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jun 20 2012, 09:52
Сообщение #7


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

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Наверное хочет 2 провода вместо 3-х ...


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
max_mart
сообщение Jun 20 2012, 10:43
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Я уже так делал. При передаче запрещал прием, а при преме запрещал передачу.
Резистором 10 кОм подтянул к +.
При передаче после нужных мне 5 байт. Еще идет какая-то отправка(какие-то байты).
Потом я ее запрещаю. передаю с компьютеры другие 5 байт ответа - он вместо нужной команды выдает 0. А дальше вообще кашмар. Когда приходит командв на отправку, он начинает отправлять одни 0 и команды. Пока не будит истечено временем.

Реализую не по прерыванию.

3 провода: VCC, GND, DATA

3 провода: VCC, GND, DATA
Go to the top of the page
 
+Quote Post
AlexFTF
сообщение Jun 20 2012, 10:54
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 95
Регистрация: 11-11-10
Из: Новосибирск
Пользователь №: 60 808



Цитата(hd44780 @ Jun 20 2012, 16:52) *
Наверное хочет 2 провода вместо 3-х ...

Если работает в синхронном режиме согласен.
max_mart может было бы проще использовать USART в асинхронном режиме или I2C?
Go to the top of the page
 
+Quote Post
max_mart
сообщение Jun 20 2012, 11:15
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



А он и работает в асинхронном режиме.
А выше я написал почему 3 провода в общем
Go to the top of the page
 
+Quote Post
V_G
сообщение Jun 20 2012, 11:46
Сообщение #11


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(NSTU @ Jun 20 2012, 19:38) *
Если не секрет, зачем такое усложнение? sm.gif

В ряде случаев это упрощение. У меня на одном порту сидят 3 процессора, плюс компьютер может подключаться (через преобразователь уровней)
Go to the top of the page
 
+Quote Post
max_mart
сообщение Jun 20 2012, 12:51
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Ну и подскажите тогда, пожалуйста, как тогде реализовать такое упрощение?
Я думаю может быть дело в гипер терминале через, который я отлаживал(он не предусматривает одновременной работы с 2 ногами RX и TX) через max232.
просто надо связать 2 разных устройства по одному протоколу через USART.

Попробую испытать. Если не заработает, то напишу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2012, 13:15
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (max_mart @ Jun 20 2012, 15:51) *
Ну и подскажите тогда, пожалуйста, как тогде реализовать такое упрощение?
Нее... Это вы показывайте свой код, а мы постараемся помочь исправить его.
QUOTE (max_mart @ Jun 20 2012, 15:51) *
Я думаю может быть дело в гипер терминале через, который я отлаживал(он не предусматривает одновременной работы с 2 ногами RX и TX) через max232.
Описывайте задачу полностью. Никакого гипертерминала и max232 в вашем вопросе не было - там были 2 меги. Естественно, что поскольку max232 не умеет отключать свой выход - напрямую его подключать к такой системе нельзя. Как минимум надо развязать диодом, чтобы в паузах единица на выходе max232 не мешала работать шине.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
max_mart
сообщение Jun 20 2012, 14:11
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Также не работает(((
Спасибо огромное за отклики и помощь!!!
Задача следующая:
Передача данных по USART. RX и TX объединены в одну
Есть устройство(именуемое SLAVE), которое всегда находится в режиме приема, как только данные приходят оно отправляет ответ.
Есть второе устройство(именуемое MASTER), которое всегда находится в режиме передачи, как только данные отправлены оно ожидает ответ, в качестве подтверждения.
Есть специальный протокол обмена между ними:
Из MASTER в SLAVE:

Формат пакета:

[Const1] [Data] [-Data] [Const2] [CS]

где
Const1 = 0x0F
Const2 = 0x15

Data - один байт пересылаемых данных.
-Data - инвертированный предыдущий байт.
CS - контрольная сумма, вычисляемая как сумма четырех
предыдущих байт по "исключающему ИЛИ". При всех операциях
старшие биты 5,6,7 не учитываются (обнуляются).

Команда 00, 01, 02, 03 - номер включаемого режима.
(максимально до 07, но реально будет использоваться 3 или 4).

Команда 08 - запрос текущего режима.

Ответ SLAVE:
Формат пакета

[Const3] [Data] [-Data] [Const4] [CS]

где
Const3 = 0x06
Const4 = 0x12

Data = 00, 01, 02, 03 ... 07 - текущий режим.


Примеры обменов.

MAS -> SLA SLA -> MAS
-------------- --------------
0F 00 1F 15 05 - 06 00 1F 12 0B включить! режим 0 - включен режим 0
0F 01 1E 15 05 - 06 01 1E 12 0B ... 1
0F 02 1D 15 05 - 06 02 1D 12 0B ... 2
0F 03 1C 15 05 - 06 03 1C 12 0B ... 3

0F 08 17 15 05 - 06 01 1E 12 0B какой режим включен? - включен режим 1

MASTER работает 100%. Уже было проверено с другими.

Код реализацииSLAVE:
// Сначала инициализация

// USART initialization
UCSR0A=0x00;
UCSR0B=0b00001000; // transmitter enable
UCSR0C=0b00000000; // 5 bit data transmit, no parity, 1 stop
UBRR0H = (unsigned char)(MYUBRR>>8);
UBRR0L = (unsigned char)MYUBRR;

//Функции обработки данных

unsigned char receive_BYTE (void)
{
// Wait until a byte has been received
while (!(UCSR0A & (1 << RXC0)));

return UDR0;
}

unsigned char receive_USART (void)
{
unsigned char cs=0;
pos=1;
do
{
USART_RX_buf[pos] = receive_BYTE();
USART_RX_buf[pos]&=0x1F;
if (pos != 5)cs^=USART_RX_buf[pos];
pos++;
} while (pos<6);
if ((USART_RX_buf[1]==0x06)&&(USART_RX_buf[4]==0x12))
{
if (cs == USART_RX_buf[5])
{
if (USART_RX_buf[3] == ((~(USART_RX_buf[2]))&0x1F))
{
UCSR0B &= ~(1<<4); //RX
DDRD &=~(1<<0);
PORTD &=~(1<<0);
UCSR0B |= (1<<3); //TX
return USART_RX_buf[2];
}
}
}
UCSR0B &= ~(1<<4); //RX
DDRD &=~(1<<0);
PORTD &=~(1<<0);
UCSR0B |= (1<<3); //TX
return 0;
}

void send_USART (unsigned char data)
{
unsigned char cs=0;
pos=1;
if (data == economS) data=0x00;
do
{
while (!(UCSR0A & (1 << UDRE0)));
// Transmit data

if (pos == 1) {UDR0 = 0x0F;cs^=0x0F;}
if (pos == 2) {UDR0 = data&0x1F; cs^=(data&0x1F);}
if (pos == 3) {UDR0 = ((~data)&0x1F); cs^=((~data)&0x1F);}
if (pos == 4) {UDR0 = 0x15;cs^=0x15;}
if (pos == 5) UDR0=cs;
while (!(UCSR0A & (1 << TXC0)));
pos++;
}while (pos<6);
UCSR0B &= ~(1<<3); //TX
DDRD &=~(1<<1);
PORTD &=~(1<<1);
UCSR0B |= (1<<4); //RX
}

Далее просто:
send_USART(mode); // отправляет команду
u_dat=receive_USART(); // приходит подтверждение

Дальше идет событие.
Сейчас проверял. Получается так как будто он зависает в режиме приема. Потому что если приходит подтверждение, то должен гореть светодиод

Заранее благодарен.
Очень надеюсь на Вашу помощь.
Go to the top of the page
 
+Quote Post
V_G
сообщение Jun 20 2012, 14:16
Сообщение #15


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(max_mart @ Jun 20 2012, 22:51) *
просто надо связать 2 разных устройства по одному протоколу через USART.

В этом случае нет смысла объединять Rx и Tx. Вот если к этой связке для программирования и отладки требуется добавить компьютер (через max с диодом, совершенно верно) или еще одно устройство, то смысл появится
Go to the top of the page
 
+Quote Post

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

 


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


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