roboforum.ru

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

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

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

40inD » 29 дек 2005, 12:50

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

avr123.nm.ru » 29 дек 2005, 13:01

дак по-байтно и передать.  можно конечно сделать i2c слэйв, а можно просто по линии SDA передать с помощью програмного UART.

40inD » 29 дек 2005, 13:06

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

wolf » 29 дек 2005, 13:29

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

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

-= Александр =- » 29 дек 2005, 13:42

Тут смотря как удобнее: сразу всю пачку передавать или по-одно? Если в разном порядке или не все нужны в данный момент - лучше на каждую свой запрос делать. А если надо все сразу - просто слать их друг за другом в установленном порядке.

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 -- это все переменные скопом.
Короче, можно сделать как угодно  ;)

40inD » 29 дек 2005, 14:47

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

avr123.nm.ru » 29 дек 2005, 15:03

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


да в чем засадо то? как в память передаешь сразу страницу байт за байтом так и делай.

wolf » 29 дек 2005, 15:06

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

В даташите по шагам расписано, как это делать.

-= Александр =- » 29 дек 2005, 21:41

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


Ну, тут без вариантов, в очередь эыти байты выстроить и через интерфейс передать...  :roll:


Rambler\'s Top100 Mail.ru counter