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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Соединить 2 atmega168 по USART, тактуются от одного источника
Filov
сообщение Mar 3 2008, 08:40
Сообщение #1


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

Группа: Участник
Сообщений: 113
Регистрация: 8-10-07
Пользователь №: 31 170



Здравствуйте!

Пытаюсь обеспечить передачу данными по USART между двумя мегами 168. Обе тактются от одного внешнего источника частотой 12.5МHz. BAUD=500 на обоих мегах.

Использую polled версия работы s USART из App.Note от производителя.

Соединяю так:
Код
Rx    --  Tx
Tx    --  Rx
XCK  --  XCK



Передаю число первой мегой - вторая Atmega должна принять и соответсвующее количество раз мигнуть светодиодом.

Передаю 1 - мигает 2 раза
Передаю 2 - мигант 12 раз
Передаю 3 - мигает 14 раз sad.gif

После того как 2 мега мигнула светодиодами она должна вернуть первой константу.
Но такое ощущение что в буфере приема первой меги находится больше чем одно число. Т.к. она принимает контсанту еще до того как вторая закончила мигать светодиодами. Причем число не совпадает с той константой, что должна передать 2 мега.

Подскажите, пожалуйста, что делать, чтобы заработало?
Go to the top of the page
 
+Quote Post
GDI
сообщение Mar 3 2008, 10:17
Сообщение #2


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

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



А зачем сигнал XCK - вы в синхронном режиме чтоли работаете? И вообще, код бы не помешало привести.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
blackbit
сообщение Mar 3 2008, 10:32
Сообщение #3


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

Группа: Новичок
Сообщений: 100
Регистрация: 5-03-07
Пользователь №: 25 892



оп-с.. а земли (GND) вы им действительно не соединили или только на рисунке не удосужились?
Go to the top of the page
 
+Quote Post
Filov
сообщение Mar 3 2008, 10:57
Сообщение #4


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

Группа: Участник
Сообщений: 113
Регистрация: 8-10-07
Пользователь №: 31 170



Цитата(GDI @ Mar 3 2008, 13:17) *
А зачем сигнал XCK - вы в синхронном режиме чтоли работаете?


Я так понял после прочтения документации, что по XCK происходит тактование. А разве допустим для асинхронной передачи достаточно соледенить допустим Rx одного с Tx другого? А для синхронной соответсвенно Rx1----Tx2 и Tx1----Rx2?


Цитата(GDI @ Mar 3 2008, 13:17) *
И вообще, код бы не помешало привести.


Код взят из appnote 306. Действителен для обоих МК:

Код
/* Initialize UART */
void USART0_Init( unsigned int baudrate )
{
        /* Set the baud rate */
        UBRR0H = (unsigned char) (baudrate>>8);
        UBRR0L = (unsigned char) baudrate;

        /* Enable UART receiver and transmitter */
        UCSR0B = ( ( 1 << RXEN0 ) | ( 1 << TXEN0 ) );

        /* Set frame format: 8 data 2stop */
        UCSR0C = (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);              //For devices with Extended IO
        //UCSR0C = (1<<URSEL)|(1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);   //For devices without Extended IO
}

/* Read and write functions */
unsigned char USART0_Receive( void )
{
        /* Wait for incomming data */
        while ( !(UCSR0A & (1<<RXC0)) )
              ;
        /* Return the data */
        return UDR0;
}

void USART0_Transmit( unsigned char data )
{
        /* Wait for empty transmit buffer */
        while ( !(UCSR0A & (1<<UDRE0)) )
              ;
        /* Start transmittion */
        UDR0 = data;
}

В main:

USART0_Init( 500 );

передаю число так :

USART0_Transmit(0xAA);

принимаю так:

char data=USART0_Receive();



Вечером приведу полный листинг.

Цитата(blackbit @ Mar 3 2008, 13:32) *
оп-с.. а земли (GND) вы им действительно не соединили или только на рисунке не удосужились?



Земли и питание у обоих МК общие.

Сообщение отредактировал Filov - Mar 3 2008, 10:59
Go to the top of the page
 
+Quote Post
GDI
сообщение Mar 3 2008, 12:40
Сообщение #5


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

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



Цитата
Я так понял после прочтения документации, что по XCK происходит тактование. А разве допустим для асинхронной передачи достаточно соледенить допустим Rx одного с Tx другого? А для синхронной соответсвенно Rx1----Tx2 и Tx1----Rx2?

Тактирование нужно только в синхронном режиме, в асинхронном же нужно всего лишь соединить Rx1----Tx2 и Tx1----Rx2, ну и землю, естественно.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Mar 3 2008, 13:03
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



2Filov
Скажите, а чем вызвано желание использовать именно USART, к тому же, в синхронном режиме?
Go to the top of the page
 
+Quote Post
Filov
сообщение Mar 3 2008, 13:17
Сообщение #7


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

Группа: Участник
Сообщений: 113
Регистрация: 8-10-07
Пользователь №: 31 170



Цитата(GDI @ Mar 3 2008, 15:40) *
Тактирование нужно только в синхронном режиме, в асинхронном же нужно всего лишь соединить Rx1----Tx2 и Tx1----Rx2, ну и землю, естественно.


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

Цитата(Aesthete Animus @ Mar 3 2008, 16:03) *
2Filov
Скажите, а чем вызвано желание использовать именно USART, к тому же, в синхронном режиме?


Я как начинающий понял, что это самый стандартный и безболезненный способ передавать данные от одного МК к другому. Или я ошибаюсь? И USART в асинхронном режиме реализовать проще?
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Mar 3 2008, 13:29
Сообщение #8


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(Filov @ Mar 3 2008, 18:17) *
Я как начинающий понял, что это самый стандартный и безболезненный способ передавать данные от одного МК к другому. Или я ошибаюсь? И USART в асинхронном режиме реализовать проще?

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


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Filov
сообщение Mar 3 2008, 14:10
Сообщение #9


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

Группа: Участник
Сообщений: 113
Регистрация: 8-10-07
Пользователь №: 31 170



Цитата(Stanislav_S @ Mar 3 2008, 16:29) *
Скажем так, если меги стоят на одной плате, то еще их можно соединить через SPI. Мне лично так было проще. Кстати для приема лучше использовать прерывание.


Да надо бы попытаться добить USART, не дело начатое бросать. Вроде бы такая вещь простая... А просидел уже не один вечер.

Спасибо. Попробую использовать прерывание по приему. Плюс попробую асинхронный режим - может чего получится.
Go to the top of the page
 
+Quote Post
GDI
сообщение Mar 3 2008, 14:24
Сообщение #10


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

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



Цитата
Только инициалюзацию USART я так понимаю надо поменять немного.

Да, вроде не надо, хотя я с мега168 не работал, потому не могу точно сказать.
А примеры кода для УСАРТа можете поискать в примерах программ - это первая тема в этом форуме http://electronix.ru/forum/index.php?showtopic=10934
УСАРТ, мне кажется, для межпроцессорного обмена стоит применять когда надо чтобы любой из контроллеров мог инициировать передачу, а если этого не надо, то SPI будет проще и быстрее по скорости обмена.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 3 2008, 15:04
Сообщение #11


Ambidexter
*****

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



Цитата(Filov @ Mar 3 2008, 14:10) *
Да надо бы попытаться добить USART, не дело начатое бросать. Вроде бы такая вещь простая... А просидел уже не один вечер

1) Конечо, не дело. Разобраться стоит в любом случае. Но если вы хотите принимать данные от одного МК и затем принимать ответ от второго, то лучше использовать асинхронный режим, потому что в синхронном режиме возможна только полудуплексная работа, т.е. один МК передаёт данные, второй принимает, или наоборот, но неодновременно. Затем надо перенастраивать режим первого МК с синхронного мастера на синхронный слейв и наоборот для второго. Для переключения XCK используется бит DDR_XCK0. Ну и соответственно, нужно как-то синхронизировать процессы, чтобы не было ситуации, когда выходы XCK обоих МК начнут палить друг друга.

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

3) Не моё это дело, но вам, как начинающему, всё-таки скажу, что в сишных фрагментах ввода-вывода лучше ставить точку с запятой после оператора while не так как у вас или в авр306
Код
unsigned char USART0_Receive(void)
{
while(!(UCSR0A&(1<<RXC0)))  /* Wait for incomming data */
            ;
return UDR0;                /* Return the data */
}

а так
Код
unsigned char USART0_Receive(void)
{
while(!(UCSR0A&(1<<RXC0))); /* Wait for incomming data */
return UDR0;                /* Return the data */
}

Будет более читабельно и меньше вероятность совершить ошибку.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Mar 3 2008, 15:18
Сообщение #12


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(=GM= @ Mar 3 2008, 18:04) *
3) Не моё это дело, но вам, как начинающему, всё-таки скажу, что в сишных фрагментах ввода-вывода лучше ставить точку с запятой после оператора while не так как у вас или в авр306
Будет более читабельно и меньше вероятность совершить ошибку.


Это вопрос нотации записи, кто к чему привык.
По теме: можно взять библиотеку AvrLib. в ней есть примеры работы с USART. Я пользовался идеями, заложенными в код. ИМХО, библиотека универсальная, значит, избыточно-функциональная и объемная по затратам.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 3 2008, 15:26
Сообщение #13


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

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



Цитата(=GM= @ Mar 3 2008, 18:04) *
потому что в синхронном режиме возможна только полудуплексная работа, т.е. один МК передаёт данные, второй принимает, или наоборот, но неодновременно. Затем надо перенастраивать режим первого МК с синхронного мастера на синхронный слейв и наоборот для второго.

Это почему?
IMHO можно использовать дуплекс, просто один мастер, другой слейв или вообще оба слейва ( клоки от другого источника)

Другой вопрос, что при двух контроллерах на одной плате еще и с одним источником частоты - внешний клок для UART лишнее.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 3 2008, 16:27
Сообщение #14


Ambidexter
*****

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



Цитата(KRS @ Mar 3 2008, 15:26) *
Это почему?

Так атмелы захотели(:-).
Цитата(KRS @ Mar 3 2008, 15:26) *
IMHO можно использовать дуплекс, просто один мастер, другой слейв или вообще оба слейва ( клоки от другого источника)

1) У мастера ХСК является выходом, а у слейва входом. Как мастер примет данные от слейва, если ХСК уже занят на выдачу? Точно также для слейва, как слейв передаст данные, если ХСК уже занят на приём?

2) В усарте имеется только 4 режима для тактовой частоты, цитата из документа doc2545m, c.193
"The USART supports four modes of clock operation: Normal asynchronous, Double Speed asynchronous,
Master synchronous and Slave synchronous mode" Ну и какой из них дуплекс?

3) Оба слейва не помогут, кто тогда передавать будет? Да и проблема целая, как засинхронизировать смену битов данных с внешней тактовой частотой? Объясните, пожалуйста.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 3 2008, 16:42
Сообщение #15


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

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



Цитата(=GM= @ Mar 3 2008, 19:27) *
1) У мастера ХСК является выходом, а у слейва входом. Как мастер примет данные от слейва, если ХСК уже занят на выдачу? Точно также для слейва, как слейв передаст данные, если ХСК уже занят на приём?

Клоки нужны только для синхронизации. Вместо виртуальных внтуренних стробов данные захватываются по фронту клока. Мало того клоки должны идти постоянно и приемник ловит стартовый бит, потом n бит данных и стоповый бит (только ловит по фронту клока). Ничем от обычного асинхронного не отличатеся (кроме точки sampling)!

Цитата(=GM= @ Mar 3 2008, 19:27) *
2) В усарте имеется только 4 режима для тактовой частоты, цитата из документа doc2545m, c.193
"The USART supports four modes of clock operation: Normal asynchronous, Double Speed asynchronous,
Master synchronous and Slave synchronous mode" Ну и какой из них дуплекс?

Все дуплекс!


Цитата(=GM= @ Mar 3 2008, 19:27) *
3) Оба слейва не помогут, кто тогда передавать будет? Да и проблема целая, как засинхронизировать смену битов данных с внешней тактовой частотой? Объясните, пожалуйста.

Могут! они оба не являются источником клока! Передает какждый по своей линии TX, которая крест на крест связана с RX. Тут нужен только источник клоков внешний.
Go to the top of the page
 
+Quote Post

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

 


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


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