roboforum.ru

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

Как вам такая унификация "строительных блоков"?

avr123.nm.ru » 29 сен 2006, 23:28

дак в вашем МК есть "железный" TWI ?

=DeaD= » 29 сен 2006, 23:35

avr123.nm.ru писал(а):дак в вашем МК есть "железный" TWI ?

Есть, есть, я же говорю - i2c.c это не обязательно софт-версия I2C, а вы не верили :)

avr123.nm.ru » 29 сен 2006, 23:44

конечно, ведь автор может как угодно назвать файлы.

Приципите пожалуйста ваши i2c.c   и   i2c.h

=DeaD= » 29 сен 2006, 23:56

Минимум функций - программируемые TTL выходы/выходы получилось сделать.

Полными функциям будут считаться АЦП входы на соотв. порту и Серво-ШИМ выходы.
Последний раз редактировалось =DeaD= 29 сен 2006, 23:58, всего редактировалось 1 раз.

=DeaD= » 29 сен 2006, 23:56

avr123.nm.ru писал(а):конечно, ведь автор может как угодно назвать файлы.
Приципите пожалуйста ваши i2c.c   и   i2c.h


таки не верите :)
Вложения
i2c.h
(7.17 КиБ) Скачиваний: 318
i2c.c
(18.46 КиБ) Скачиваний: 317

avr123.nm.ru » 30 сен 2006, 00:12

ну как я и говорил - это библиоьеки twi  - они не могут сделать интерфейс i2c на ножках  IO  кроме тех что закремплены за аппаратным TWI.

поэтому логично их назвать twi.

а библиотеки для i2с на МК без аппаратного TWI могут создавать интерфейс практически на любый ножках IO.

==========

я уж вам несколько раз это повторял, но вы толи не читаете то ли не хотите понять очевидной вещи.

=DeaD= » 30 сен 2006, 00:14

avr123.nm.ru писал(а):ну как я и говорил - это библиоьеки twi  - они не могут сделать интерфейс i2c на ножках  IO  кроме тех что закремплены за аппаратным TWI.

поэтому логично их назвать twi.

а библиотеки для i2с на МК без аппаратного TWI могут создавать интерфейс практически на любый ножках IO.


В курсе я, что вы считаете логичным называть twi, а что i2c, и знаю, что некоторые тоже так считают, но думается это отнюдь не "единственно правильное мнение", а всего лишь одно из :)

avr123.nm.ru » 30 сен 2006, 00:25

я не про название а про точ что библиотека дает программе !

=DeaD= » 30 сен 2006, 13:50

Принял еще одно важное, как я считаю, для успеха проекта решение - нужно выкинуть из проекта всю софтовую часть на ПК, иначе буду вынужден влезать во все подряд среды разработки и делать там библиотеки. А это пока "некогда" - иначе сдохнуть можно :)

Ограничусь поиском и выкладыванием ссылок на примеры как во разных средах разработки достучаться к COM-порту.

Виталий » 30 сен 2006, 15:57

=DeaD= писал(а):Принял еще одно важное, как я считаю, для успеха проекта решение - нужно выкинуть из проекта всю софтовую часть на ПК, иначе буду вынужден влезать во все подряд среды разработки и делать там библиотеки. А это пока "некогда" - иначе сдохнуть можно :)

Ограничусь поиском и выкладыванием ссылок на примеры как во разных средах разработки достучаться к COM-порту.


Я конечно не знаю, но мне кажется, что для проекта необходимы будут 2 вещи:
1. Четкое, ясное представление о протоколах взаимодействия, их спецификации.
2. Программная документация описывающая интерфейсы модулей и логику их работы.
3. Пример реализации под какой-либо средой.

=DeaD= » 30 сен 2006, 16:05

Виталий писал(а):Я конечно не знаю, но мне кажется, что для проекта необходимы будут 2 вещи:
1. Четкое, ясное представление о протоколах взаимодействия, их спецификации.
2. Программная документация описывающая интерфейсы модулей и логику их работы.
3. Пример реализации под какой-либо средой.


Так 2 или 3? :)
1. Есть, уже всё работает. Спецификация выше.
2. Это по каждому модулю. По первому в ограниченном виде сегодня будет.
3. В процессе.

Виталий » 30 сен 2006, 16:22

Программная документация на модуль описывающая логику его работы и внешние интерфейсы в корне отличается от примера реализации.
Первое может не содержать в себе ни строки кода...

=DeaD= » 30 сен 2006, 16:39

Виталий писал(а):Программная документация на модуль описывающая логику его работы и внешние интерфейсы в корне отличается от примера реализации.
Первое может не содержать в себе ни строки кода...


Это конечно понятно, но согласитесь, если программная документация и внешние интерфейсы ни разу на практике не использовались, - это очень сомнительного сорта интерфейсы и документация? :)

=DeaD= » 01 окт 2006, 13:35

Виталий писал(а):2. Программная документация описывающая интерфейсы модулей и логику их работы.

Вот:

Протокол работы с нулевой версией первого модуля:

Каждый порт может быть включен в один из режимов работы:
0. Цифровой вход (в этом режиме запись в порт означает включение/выключение встроенного подтягивающего резистора, а чтение - получение значения на входе порта);
1. Цифровой выход (в этом режиме запись в порт означает выставление выхода в соответствующее TTL-значение, а чтение - извлечение этого значения);

В примерах модуль имеет адрес FF, "Tx: " - передаваемые в RS-232 команды, адресованные модулю, "Rx: " - получаемые из RS-232 в ответ сообщения.

===============================================

Команда 1. Установить режим работы порта - отправить 2 байта и получить 0 байт:
- первый байт 0x20..0x38 для портов 0x00..0x18 соответственно;
- второй байт 0x00 или 0x01 - режим работы;

Пример (сделать порт 0х08 цифровым выходом):
Tx: QFF002801
Rx: R


===============================================

Команда 2. Записать значение в порт - отправить 2 байта и получить 0 байт:
- первый байт 0x00..0x18 для портов 0x00..0x18 соответственно;
- второй байт 0x00 / 0x01 - значение;

Пример (выставить порт 0х08 в единичку):
Tx: QFF000801
Rx: R


===============================================

Команда 3. Прочитать режим работы порта порта - отправить 1 байт и получить 1 байт:
- первый байт 0xA0..0xB8 для портов 0x00..0x18 соответственно;
- прочтенный байт - 0x00 / 0x01 - текущий режим работы порта;

Пример (прочитать режим работы порта 0х08 ):
Tx: QFF01A8
Rx: R01


===============================================

Команда 4. Прочитать значение порта - отправить 1 байт и получить 1 байт:
- первый байт 0x80..0x98 для портов 0x00..0x18 соответственно;
- прочтенный байт - 0x00 / 0x01 - значение порта;

Пример (прочитать состояние порта 0х0C - цифрового входа):
Tx: QFF018C
Rx: R00

=DeaD= » 01 окт 2006, 13:48

Виталий писал(а):3. Пример реализации под какой-либо средой.


Вот:

Пример использования модуля под C++ Builder 6.0 с компонентой SlyComm:

Здесь можно взять компоненту SlyComm: http://slydiman.narod.ru/eng/comm/comm.htm

Параметры COM-порта: 9600, 8/N/1, Control:Hard. Однако это для данной версии модуля-шлюза, для следующих скорость скорее всего будет меняться.

Компонента SlyComm имеет тип TCommPort, под которым и используется ниже в коде:

Процедура выполнения команды и получения ответа (поддерживает TimeOut, правда пока он предопределен в процедуре, но думаю не составит труда вынести :)):
Код: Выделить всёРазвернуть
AnsiString doRequest(AnsiString request, TCommPort* com){
 AnsiString r=request+"\n";
 char *cmd=r.c_str();
 com->PutString(cmd);
 char c;
 AnsiString res="";
 long int countdown=200000000;
 int finish=0;
 while(finish<2){
   while(--countdown && (com->InBuffUsed==0));
   if(countdown==0){
     return "XFFTimeout!";
   };
   c=com->GetChar();
   if(c=='R' || c=='X'){
     finish=1;
   };
   if(finish==1 && c>=' '){ res=res+c; };
   if(c=='\n' && finish==1){
     finish=2;
   };
 };
 return res;
};


Пример выставления портов 0x08..0x0B (на плате это B0..B3) в значение 0 и в режим цифрового выхода без обработки возможных ошибок:
Код: Выделить всёРазвернуть
    doRequest("QFF000801",CommPort1);
   doRequest("QFF002801",CommPort1);
   doRequest("QFF000900",CommPort1);
   doRequest("QFF002901",CommPort1);
   doRequest("QFF000A00",CommPort1);
   doRequest("QFF002A01",CommPort1);
   doRequest("QFF000B00",CommPort1);
   doRequest("QFF002B01",CommPort1);


Пример отправки в порт 0x08 значения, зависящего от CheckBox1->Checked, без обработки ошибок:
Код: Выделить всёРазвернуть
if(CheckBox2->Checked){
   doRequest("QFF000801",CommPort1);
 }else{
   doRequest("QFF000800",CommPort1);
 };


Пример запроса из порта 0x0C значения и в зависимости от него выставление CheckBox6->Checked, без обработки ошибок:
Код: Выделить всёРазвернуть
  AnsiString r=doRequest("QFF018C",CommPort1);
 if(r=="R01"){
   CheckBox6->Checked=TRUE;
 }else{
   CheckBox6->Checked=FALSE;
 };


Rambler\'s Top100 Mail.ru counter