|
Соединить 2 atmega168 по USART, тактуются от одного источника |
|
|
|
Mar 3 2008, 08:40
|
Частый гость
 
Группа: Участник
Сообщений: 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 раз  После того как 2 мега мигнула светодиодами она должна вернуть первой константу. Но такое ощущение что в буфере приема первой меги находится больше чем одно число. Т.к. она принимает контсанту еще до того как вторая закончила мигать светодиодами. Причем число не совпадает с той константой, что должна передать 2 мега. Подскажите, пожалуйста, что делать, чтобы заработало?
|
|
|
|
|
 |
Ответов
|
Mar 3 2008, 13:17
|
Частый гость
 
Группа: Участник
Сообщений: 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 в асинхронном режиме реализовать проще?
|
|
|
|
|
Mar 3 2008, 14:10
|
Частый гость
 
Группа: Участник
Сообщений: 113
Регистрация: 8-10-07
Пользователь №: 31 170

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

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 */ } Будет более читабельно и меньше вероятность совершить ошибку.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
Filov Соединить 2 atmega168 по USART Mar 3 2008, 08:40 GDI А зачем сигнал XCK - вы в синхронном режиме чтоли ... Mar 3 2008, 10:17 Filov Цитата(GDI @ Mar 3 2008, 13:17) А зачем с... Mar 3 2008, 10:57 blackbit оп-с.. а земли (GND) вы им действительно не соедин... Mar 3 2008, 10:32     mdmitry Цитата(=GM= @ Mar 3 2008, 18:04) 3) Не мо... Mar 3 2008, 15:18      =GM= Цитата(KRS @ Mar 3 2008, 15:26) Это почем... Mar 3 2008, 16:27       KRS Цитата(=GM= @ Mar 3 2008, 19:27) 1) У мас... Mar 3 2008, 16:42 Aesthete Animus 2Filov
Скажите, а чем вызвано желание использовать... Mar 3 2008, 13:03 GDI ЦитатаТолько инициалюзацию USART я так понимаю над... Mar 3 2008, 14:24 GDI Имхо, в синхронном режиме USART очень похож на SPI... Mar 4 2008, 07:22 KRS Цитата(GDI @ Mar 4 2008, 10:22) Имхо, в с... Mar 4 2008, 09:50 Filov Вообщем действительно USART работал у меня в асинх... Mar 4 2008, 09:27 GDI Ну, во первых, посмотрите осциллографом, что у вас... Mar 4 2008, 09:49 Filov Цитата(GDI @ Mar 4 2008, 12:49) Ну, во пе... Mar 4 2008, 09:53 GDI ЦитатаКстати не во всех чипах есть режим SPI, (нап... Mar 4 2008, 09:57 Filov Цитата(GDI @ Mar 4 2008, 12:57) Это я зна... Mar 4 2008, 10:04  defunct Цитата(Filov @ Mar 4 2008, 12:04) Констан... Mar 4 2008, 10:47   Filov Цитата(defunct @ Mar 4 2008, 13:47) А теп... Mar 5 2008, 09:39    mdmitry Цитата(Filov @ Mar 5 2008, 12:39) Это я в... Mar 5 2008, 15:55    defunct Цитата(Filov @ Mar 5 2008, 11:39) Т.е. мо... Mar 5 2008, 16:30  mdmitry Цитата(Filov @ Mar 4 2008, 13:04) Кстати ... Mar 4 2008, 10:48
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|