roboforum.ru

Технический форум по робототехнике.

передача переменных между контроллерами

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

передача переменных между контроллерами

Сообщение 40inD » 29 дек 2005, 12:50

Кто силен в программизме? Мне нужно из одного контроллера в другой передать значения около десятка переменных по i2c. Как это лучше организовать? Структурой?
Аватара пользователя
40inD
 
Сообщения: 265
Зарегистрирован: 17 июн 2005, 08:08
Откуда: Москва

Сообщение avr123.nm.ru » 29 дек 2005, 13:01

дак по-байтно и передать.  можно конечно сделать i2c слэйв, а можно просто по линии SDA передать с помощью програмного UART.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение 40inD » 29 дек 2005, 13:06

у меня и будет мастер и слейв, я хочу сообразить, в программе как это организовать. Слейв будет передавать. Как мастер будет запрашивать значение какой-л. переменной?
Например, мастер хочет узнать у слейва, какое значение у него имеет переменная А. Как это сделать? Я с i2c только с часами и памятью работал.
А так как переменных передавать много, чтобы не терять времени на запрос каждой переменной, нужно передать сразу пакет. И как это сделать я вообще не догоняю.
Аватара пользователя
40inD
 
Сообщения: 265
Зарегистрирован: 17 июн 2005, 08:08
Откуда: Москва

Сообщение wolf » 29 дек 2005, 13:29

40inD писал(а):у меня и будет мастер и слейв, я хочу сообразить, в программе как это организовать. Слейв будет передавать. Как мастер будет запрашивать значение какой-л. переменной?
Например, мастер хочет узнать у слейва, какое значение у него имеет переменная А. Как это сделать? Я с i2c только с часами и памятью работал.
А так как переменных передавать много, чтобы не терять времени на запрос каждой переменной, нужно передать сразу пакет. И как это сделать я вообще не догоняю.

Переменная характеризуется адресом и размером в байтах. Передать переменную - значит, передать N байт, располагающихся по её адресу. На приёмной стороне эти байты записываются по адресу какой-нибудь переменной такого же размера. Тип переменной не имеет значения.
Если нужно запрашивать переменную именно по идентификатору, можно прошивать во флэш-память опрашивающего м/к список переменных, который создаётся компилятором для прошивки опрашиваемого м/к (.map файл), и вести по нему поиск адреса для запрашиваемой переменной, который затем и передавать в запросе. Можно и наоборот - в запросе передавать идентификатор переменной, а поиск по .map вести на опрашиваемом м/к.
Последний раз редактировалось wolf 29 дек 2005, 13:45, всего редактировалось 1 раз.
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Сообщение -= Александр =- » 29 дек 2005, 13:42

Тут смотря как удобнее: сразу всю пачку передавать или по-одно? Если в разном порядке или не все нужны в данный момент - лучше на каждую свой запрос делать. А если надо все сразу - просто слать их друг за другом в установленном порядке.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение ASin » 29 дек 2005, 14:36

И смотря насколько универсально это должно быть.
Если планируется читать каждый раз один и тот же набор переменных, то пусть слейв на любой запрос на чтение просто последовательно высылает все значения, а мастер пусть их раскладывает куда надо. Можно для приёма такую структуру сделать
Код: Выделить всёРазвернуть
union  inbuf_
{
 unsigned char buffer[5];
 struct
 {
   unsigned char A;
   unsigned int  B;
   unsigned int  C;
 };
} inbuf;


А если планируются разные запросы к слейву, то есть стандартный подход -- передавать ему ID переменной, которую хочется прочитать. В принципе, можно сделать так, что 0x01 -- это переменная A, 0x02- B и т.д., а 0x10 -- это все переменные скопом.
Короче, можно сделать как угодно  ;)
ASin
 
Сообщения: 155
Зарегистрирован: 18 дек 2004, 03:14
Откуда: Москва

Сообщение 40inD » 29 дек 2005, 14:47

Да, планируется читать каждый раз один и тот же набор переменных.
Так что посылка фиксированной структуры на запрос мастера - идеальный вариант. Засада в том, как слейвом передавать несколько байт сразу.
Аватара пользователя
40inD
 
Сообщения: 265
Зарегистрирован: 17 июн 2005, 08:08
Откуда: Москва

Сообщение avr123.nm.ru » 29 дек 2005, 15:03

40inD писал(а):Засада в том, как слейвом передавать несколько байт сразу.


да в чем засадо то? как в память передаешь сразу страницу байт за байтом так и делай.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение wolf » 29 дек 2005, 15:06

40inD писал(а):Да, планируется читать каждый раз один и тот же набор переменных.
Так что посылка фиксированной структуры на запрос мастера - идеальный вариант. Засада в том, как слейвом передавать несколько байт сразу.

В даташите по шагам расписано, как это делать.
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Сообщение -= Александр =- » 29 дек 2005, 21:41

40inD писал(а):Засада в том, как слейвом передавать несколько байт сразу.


Ну, тут без вариантов, в очередь эыти байты выстроить и через интерфейс передать...  :roll:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1