Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CAN128. Попробуем разобраться.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
dormouse
Начал разработку несложного софта для системы из нескольких at90can128. Фактически, надо сделать несложный исходник на IAR EC++ 4.1 Посмотрел, что есть из готового, но ничего не нашёл.
Единственное - колоссального размера исходник от Atmel'a (вроде адаптированный от прошлой архитектуры).

Для начала очень желаемо суметь написать софт, который сможет принять-послать-обработать ошибку.

Насчёт более высокого уровня (DeviceNET, CANOpen e.t.c) пока не сумел разобраться - складывается ощущение, что ничего готового (ни одного готового каркаса) невозможно найти...

Есть желающие включиться в разработку из идейных или материальных побуждений?

Жду ответа.
era
Типа совет. Когда работал с CAN-ом слепил приблуду - управляемый через ByteBlaster контроллер CAN на MCP2510 с опторазвязкой и драйвером линии. Можно посылать-принимать сообщения или подслушивать шину. Для отладки весьма полезно.
Возможно, можно найти что-нибудь не кустарное.
Aleks17
По-моему проще разобраться и своё сгородить. На С это несколько строчек текста, не более того.

Протоколы высокого уровня конечно - более серьёзная тема, тоже ничего не попадалось.
spf
Цитата(dormouse @ Feb 17 2006, 01:04) *
Для начала очень желаемо суметь написать софт, который сможет принять-послать-обработать ошибку.

Не поверю что для Atmel'a такого нет. ;-)
Это же пара строк кода, после прочтения доки на can-контроллер и CAN спецификации.
- Инициализация (скорость и т.п)
- Настройка приемных фильтров (далее по прерыванию или контролю флага приема)
- Поместить в буфер сообщение и стартовать передачу
- Анализ регистров ошибок

Можно поискать/посмотреть примеры для других CAN-контроллеров, например SJA1000.

Цитата
Насчёт более высокого уровня (DeviceNET, CANOpen e.t.c) пока не сумел разобраться - складывается ощущение, что ничего готового (ни одного готового каркаса) невозможно найти...

Есть такие , один из них - http://www.vscp.org/

PS:
Рекомендую приобрести готовое can устройство, для контроля и отладки сети между МК. Подойдут недорогие USB-CAN, цена около 100$, к ним прилагаются библиотеки и примеры.
dormouse
Найденные в продаже устройства:
1. Славна $70 (г.Свердловск). http://www.slavna.ru/stran/devices.htm
2. Rainbow $? (г.Москва) http://www.rtcs.ru/prod_element2.asp?wh_ke...B-CAN&id=401846
3. Много всего http://www.datamicro.ru/can/interfaces/usb-can.shtml
4. Каскод $160 (г.Ленинград). http://www.kaskod.ru/templates/pdf.dop.php...USB-CAN-адаптер
5. Apox $157, $300 исходники http://www.apoxcontrols.com/usbcan.htm (возможно можно заказать через efo.ru http://www.efo.ru/doc/Ftdi/Ftdi.pl?642 - За $140 вероятно более дешёвая версия без опто, $125 на сайте производителя)

По производителям софта (наличию хоть чего-нибудь) пока плохо.

В качестве платы выбрал www.miklobit.com (MB128-USB-CAN) - Обещали дать в комплект немного рабочего софта.
KRS
При начале работы я использовал CAN примерно так:

Код
//инициализация кана
static void CanInit(void)
{
  //входим в ресет моду
  CANGCON=0;
  while(CANGSTA & (1<<ENFG));

  // задаем TIME сеги... примеры есть в даташите
  CANBT1=CANBT1_DEF;
  CANBT2=CANBT2_DEF;
  CANBT3=CANBT3_DEF;

  // инициализируем все майлбоксы
  {
    BYTE i;
    for(i=0x00; i<0xF0; i+=0x10) {
      CANPAGE  = i;
      CANSTMOB = 0;
      CANCDMOB = 0;
    }  
  }
  
  // разрешаем прерывание на прием от майл боксов
  //  но только для полинга что бы использовать CANHPMOB
  CANGIE = 0x20;
  CANIE1=0x7F;
  CANIE2=0xFF;
  
}


// инициализация майл боксов
static void CanInitMailBoxes(void)
{
// инициализируем 6 майл боксов на прием extended frame

  CANPAGE=0;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;
  
  CANPAGE=0x10;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;

  CANPAGE=0x20;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;

  CANPAGE=0x30;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;

  CANPAGE=0x40;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;

  CANPAGE=0x50;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;
}

// вход в рабочий режим
static void CanEnterOperatingMode(void)
{
  CANGCON=(1<<ENASTB);
  while(!(CANGSTA & (1<<ENFG)));
}




// обработчик CAN (полингом)

static void CanHandler(void)
{
  {
    BYTE Tmp;
    if (CANGSTA & (1<<BOFF)) {
      Reset(); // произошло BUS OFF
    }
    Tmp=CANHPMOB; // Проверка принятых пакетов
    if (Tmp<0xF0) {
      CANPAGE=Tmp;
      if (Tmp<0x20) RxHandler1(); // прием из майл бокса 0 или 1
      else if (Tmp<0x40) RxHandler2(); // прием из майл бокса 2 или 3
      else if (Tmp<0x60) RxHandler3(); // прием из майл бокса 4 или 5
      // удаляем пакет
      CANSTMOB=0;
      CANCDMOB=0x90;

    } else {
      // 7 ой майл бокс используем для отправки
      CANPAGE=0x60;
      if (!(CANSTMOB & (1<<TXOK))) return;
      TxHandler();
    }  
  }
}


void main(void)
{
    CanInit();
    CanInitMailBoxes();
    CanEnterOperatingMode();
      // посылаем стартовый пакет (устройство включилось)
      // примерно так (extended frame без данных)
      CANIDT1=??;
      CANIDT2=??;
      CANIDT3=??;
      CANIDT4=??;
      CANSTMOB=0;
      CANCDMOB=0x50;

    while(1) {
      CanHandler();
    }

}
dormouse
Пока изучаю, ещё не компилировал. После обдумывания ситуации и изучения просторов интернета я понял, что ясного представления о "CAN" в терминах модели OSI у меня нет. Точнее - то я вижу это как UART, то как RS-232, то как modbus over serial (надюсь, что аналогия понятна: mailbox - это уже больше UART, поскольку это обработка; арбитраж мастеров по приоритету - тоже часть функций более высокого уровня; перепосылка... А обработка количества ошибок и отключение от линии- вообще неясно кем выполняется.).

По сути, для моих приложений оказалось достаточно ("можно втиснуть") MODBUS/RS-485 @ 0.5MBit.
На такой скорости вполне можно обойтись мастером и дополнительной линией синхронизации начала выполнения инструкции, переданной через MODBUS (если стартовый пакет не дойдёт до одного из slave, будет катастрофа).

В данном исходнике я вижу нечто подобное уровню физической сети + часть гарантированной доставки сообщения. Более высокий уровень надо мастерить руками и продвинутая версия будет называться DeviceNET, CANOpen e.t.c? При этом я так и не нашёл ни одного исходника "бесплатного" типа. Если посмотреть в форум (недавно начатая ветка про программы/библиотеки IAR C), можно увидеть характерное количество скачиваний файлов типа twi.c, lcd.c, timer.c e.t.c. Можно ли попробовать совместно с Вами написать что-то подобное (или просить Вас выложить более прилизанный каркас?) - т.е. готовое приложение "скомпилировал-залил в две CAN128-на правом жмём кнопочку-левый отвечает помаргиванием".


PS Ответа от slavna.ru с предложением о покупке их адаптера USB-CAN не получил пока.
Седой
Уважаемый dormouse, Вы пишите:
Цитата
PS Ответа от slavna.ru с предложением о покупке их адаптера USB-CAN не получил пока.


Отвечаю: запроса на покупку от Вас мы не получали.

На складе есть все http://www.slavna.ru/stran/devices.htm. Шлите заявку на npp@slavna.ru или непосредственно мне stas@slavna.ru

PS. Заканчиваем тестирование преобразователя USB-rs485 c аппаратными реализациями некоторых протоколов, в том числи и MODBUS (RTU и ASCII)
dormouse
Письмо я направил на NPP@SLAVNA.RU, 17 Фев 2006 16:39:00. Тогда связываемся через форум.
Мне надо получить внешний CAN (1шт, к нему очень желательно исходник на С - мне надо понять способ реальной работы с CAN, поскольку я никак не могу пробиться на начальную стадию ("когда кто-то кому-то как-то что-то передал")).

Иными словами я обещаю, что исходник "дальше меня" не пойдёт, не будет использоваться как часть или целое в коммерческих проектах, не будет опубликован в любом виде и что единственный способ использования - самообразование ;-)

В итоге я хочу купить в Москве 1 шт. USB-CAN-ext-06 с исходником (или частью исходника, отвечающей за CAN).

Владимир.
spf
Цитата(dormouse @ Feb 22 2006, 17:54) *
Пока изучаю, ещё не компилировал. После обдумывания ситуации и изучения просторов интернета я понял, что ясного представления о "CAN" в терминах модели OSI у меня нет.

Два первых уровня реализованы аппаратно
http://www.can-cia.org/can/higher-layer/
На www.datamicro.ru был?
Цитата
Точнее - то я вижу это как UART, то как RS-232, то как modbus over serial (надюсь, что аналогия понятна: mailbox - это уже больше UART, поскольку это обработка; арбитраж мастеров по приоритету - тоже часть функций более высокого уровня; перепосылка... А обработка количества ошибок и отключение от линии- вообще неясно кем выполняется.).

Арбитраж выполняется аппаратно, перепосылка аппаратно, контроль допустимого количества ошибок приложением пользователя, отключение от шины аппаратно, при достижении порога ошибок. При нормальной работе "отключение от шины " не требуется.
Цитата
По сути, для моих приложений оказалось достаточно ("можно втиснуть") MODBUS/RS-485 @ 0.5MBit.
На такой скорости вполне можно обойтись мастером и дополнительной линией синхронизации начала выполнения инструкции, переданной через MODBUS (если стартовый пакет не дойдёт до одного из slave, будет катастрофа).

Какая катастрофа?
Каким образом собираетесь контролировать что слейв еще жив?
Цитата
В данном исходнике я вижу нечто подобное уровню физической сети + часть гарантированной доставки сообщения.

Доставка гарантируется аппаратно.
Цитата
Более высокий уровень надо мастерить руками и продвинутая версия будет называться DeviceNET, CANOpen e.t.c? При этом я так и не нашёл ни одного исходника "бесплатного" типа.

Ищи лучше, одну ссылку давал, вот вторая:
http://www.microcanopen.com/
Подобные ссылке копил раньше, сейчас они не работают, поэтому приходится "искать" их текущее местоположение...

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

В CAN самое важное понять принцип арбитража и фильтрации по ID, и как можно больше пользоваться этими возможностями при реализации обмена между абонентами. ID это не только номер абонента, в нем можно выделить поля параметров, приоритетов и т.п.
Цитата
Если посмотреть в форум (недавно начатая ветка про программы/библиотеки IAR C), можно увидеть характерное количество скачиваний файлов типа twi.c, lcd.c, timer.c e.t.c. Можно ли попробовать совместно с Вами написать что-то подобное (или просить Вас выложить более прилизанный каркас?) - т.е. готовое приложение "скомпилировал-залил в две CAN128-на правом жмём кнопочку-левый отвечает помаргиванием".

Пример уже привели, на его основе уже можно сделать такую поделку.
dormouse
Отлично. Почти собрал этот исходник. Осталось только немного разобраться с CANIDT? . Надеюсь, что скоро заработает. Критической ситуацией с подтверждениями я хотел обозначить следующее:
Предположим, надо добиться синхронного начала работы N слейвов. Мастер последовательно настроил их, после этого должен дать инструкцию "старт". Если пользоваться modbus, то вариантов два (с дополнительной линией и без).
1. С дополнительной линией: выставляем на ней сильный ноль - все клиенты стартовали. Так же в неожиданный момент времени любой клиент самостоятельно выставляет ноль на линии => все замирают и мастер начинает последовательно перебирать слейвов, чтобы разобраться, что случилось.

2. Мастер всем синхронирнизовал часы, после чего шлёт первому инструкцию стартовать через deltaTn. Получает подтверждение, шлёт второму deltaT(n-1) и т.д. В итоге, если на каком -то слейве произошёл сбой, то мастер шлёт броадкаст, что надо отложить старт на 1 попытку связи.

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

До сих пор не смог внятно понять, как реализуется подверждения приёма всеми узлами броадкаста в CAN шине.

Жду ответа.
Andy Mozzhevilov
Цитата(dormouse @ Feb 26 2006, 11:06) *
До сих пор не смог внятно понять, как реализуется подверждения приёма всеми узлами броадкаста в CAN шине.

Жду ответа.


Совет один, прочитать спецификацию CAN, она открытая и в общем то понятная. В сети встречаются даже переведенные на русский язык спецификации, если не ошибаюсь, есть на www.datamicro.ru (эту ссылку уже давали выше). Уточняющие вопросы задать здесь.
Желание заниматься преподавательской деятельностью есть далеко не у всех.
John
Посмотрите еще здесь - Описание CAN на русском языке;
ruslannd
Цитата(KRS @ Feb 17 2006, 18:42) *
При начале работы я использовал CAN примерно так:

Код
...............
      CANPAGE=0x60;
      if (!(CANSTMOB & (1<<TXOK))) return;
      TxHandler();

...............


А TxHandler() что делает?
ipc
Цитата(dormouse @ Feb 26 2006, 10:06) *
Проблема в том, что для паранои это сообщение само может быть не получено одним из слейвов и он начнёт работать не в нужное время.


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

Если существует проблема синхронизации действий разных узлов она предусмотрена в высокоуровневых протоколах(например в CANOpen есть пакет под названием SYNC имеющий высокий приоритет).

Вобще воспринимать интерфейс CAN в отрыве от конкретного протокола очень странно.А придумывать свой долго и нецелесообразно.
ruslannd
Цитата(KRS @ Feb 17 2006, 18:42) *
При начале работы я использовал CAN примерно так:

Код
  //входим в ресет моду
  CANGCON=0;
  while(CANGSTA & (1<<ENFG))  {} ;


Не понимаю смысл этого куска. ENFG никогда не будет 1, если в CANGCON записать 0. Или я ошибаюсь?
KRS
Цитата(ruslannd @ Apr 4 2006, 15:43) *
Цитата(KRS @ Feb 17 2006, 18:42) *

При начале работы я использовал CAN примерно так:

Код
  //входим в ресет моду
  CANGCON=0;
  while(CANGSTA & (1<<ENFG))  {};


Не понимаю смысл этого куска. ENFG никогда не будет 1, если в CANGCON записать 0. Или я ошибаюсь?


если кан находится в рабочем режиме ENFG=1
когда записываем 0 в CANGCON дается команда войти в ресет моде
пока кан входит в ресет моде ENFG будет 1 надо ждать пока не станет 0
dormouse
Позволю добавить от себя ;-) Я разобрался с работой CAN за неделю. Из своего непонимания почти всё было ликвидировано. Вопрос о негарантированности доставки одному из слейвов (получателей) приобрёл другой характер:
CAN шина ГАРАНТИРУЕТ, что все приёмники РАБОТАЮЩИЕ В ЭТОТ МОМЕНТ на шине успешно получили сообщение. Никакой информации о количестве узлов, получивших сообщение НЕТ! В контексте поего предыдущего вопроса из этого можно сделать вывод, что надо после этого уметь на мастер узле принять N подтверждений о доставке (узел мог просто потерять питание!). В противном случае надо принять решение о дальнейшей работе всех устройств.

Сложность реализации оказалась незначительной, но до конца я пока не разобрался ( скажем, как надо распределить MOB'ы если посылающий RDF должен принять ответ на него и прочие мелочи), поскольку в данный момент после успешного испытания простейшего решения на базе "один сообщил => другой принял" работы ведутся над другими частями.

PS Отдельное спасибо НПП Славна (http://www.slavna.ru). Успешно получено купленное у них USB->CAN устройство. Пока не испытано.
ipc
Цитата(dormouse @ Apr 5 2006, 01:00) *
Позволю добавить от себя ;-) Я разобрался с работой CAN за неделю. Из своего непонимания почти всё было ликвидировано. Вопрос о негарантированности доставки одному из слейвов (получателей) приобрёл другой характер:
CAN шина ГАРАНТИРУЕТ, что все приёмники РАБОТАЮЩИЕ В ЭТОТ МОМЕНТ на шине успешно получили сообщение. Никакой информации о количестве узлов, получивших сообщение НЕТ! В контексте поего предыдущего вопроса из этого можно сделать вывод, что надо после этого уметь на мастер узле принять N подтверждений о доставке (узел мог просто потерять питание!). В противном случае надо принять решение о дальнейшей работе всех устройств.

Сложность реализации оказалась незначительной, но до конца я пока не разобрался ( скажем, как надо распределить MOB'ы если посылающий RDF должен принять ответ на него и прочие мелочи), поскольку в данный момент после успешного испытания простейшего решения на базе "один сообщил => другой принял" работы ведутся над другими частями.

PS Отдельное спасибо НПП Славна (http://www.slavna.ru). Успешно получено купленное у них USB->CAN устройство. Пока не испытано.


Мне кажется что в данном случае имеет место попытка использовать CAN как обычный RS-485 с технологией запрос-ответ.Прелесть CANа как раз в том что проблемы целостности сети и работоспособности узлов решаются на более высоком уровне(на уровне протокола).Физическая линия гарантирует и так все на свете.Допустим в протоколе CANOpen существует по крайне мере 2 способа слежения за работой узлов это Nodeguarding и Heartbert.Первый заключается в периодичном опросе всех узлов мастером и получении их текущего статуса(режима работы) а второй заставляет slave-ы постоянно отправлять свой статус самостоятельно(из названия понятно что это как серцибиение).Кроме того в случае перезагрузки прибора он обязан отослать пакет BootUp который можно отлавливать.
В крайнем случае можно использовать RTR но это уже в чистом виде RS-485.

Кароче все возникающие вопросы относятся исключительно к отсутствию протокола(каждый из которых уже все эти грабли для себя определил)
kanzler
Привет всем! Идейные соображения по поводу CAN меня не интересуют, такой я вот Пацак :-)
Авот в материальном плане чем смогу тем и помогу. Работал когда то я в команде которая разрабатывала Банковскую Автоматизированную Распознающую Систему. Так вот в ней все устройсва были подключены к хосту через CAN. Я уже давно там не работаю но исходники как ниского так и высого уровня есть. Может поработаем вместе. Прошу не судить строго но у меня есть свои интерсы в этом вопросе.
ipc
Цитата(kanzler @ Apr 5 2006, 09:28) *
Привет всем! Идейные соображения по поводу CAN меня не интересуют, такой я вот Пацак :-)
Авот в материальном плане чем смогу тем и помогу. Работал когда то я в команде которая разрабатывала Банковскую Автоматизированную Распознающую Систему. Так вот в ней все устройсва были подключены к хосту через CAN. Я уже давно там не работаю но исходники как ниского так и высого уровня есть. Может поработаем вместе. Прошу не судить строго но у меня есть свои интерсы в этом вопросе.

Несовсем в тему но всетаки вопрос.А незавалялось ли с тех времен какого нибудь фирменного софта например IXXAT CANAnalizer или Vector CANErator а может быть CANOpen Conformance Test.
dormouse
Совершенно верное суждение насчёт протоколов высокого уровня. В CANOpen, DEVICENET это всё есть. Единственная сложность в том, что нет готового OpenSource верианта, если я правильно понимаю суть проблемы. Иными словами если надо использовать MODBUS/485 - пожалуйста. За час работы в сети я нашей 4 независимые реализации. Полностью все спецификации выложены на сайте и т.д. С CAN ситуация иная. Пути:
1. Иметь МНОГО времени и реализовать либо свой CANOpen
2. Иметь МНОГО денег и купить уже реализованный (как я понял, минимум $850 за библиотеку без исходников)
3. Иметь большой умный мозг и МНОГО времени - придумать некое "подмножество" протокола CANOpen и реализовать его.
4. Ограничиться самым примитивным решением - взять только DataFrame от физической части CAN и сделать только HeartBeat для гарантированности работы всего "в целом".

Можно даже BootUP не использовать - в некотором смысле при фиксированном наборе устройств, при отсутствии одного по HeartBeat, работа всей остальной совокупности уже невозможна. В этом смысле BootUP заменяется просто "push'ингом" HeartBeat'ов от слейвов к мастеру. Даже не требуется RDF использовать для этого, шина и так рассчитана на большую пропускную способность.
ipc
Цитата(dormouse @ Apr 5 2006, 11:00) *
Совершенно верное суждение насчёт протоколов высокого уровня. В CANOpen, DEVICENET это всё есть. Единственная сложность в том, что нет готового OpenSource верианта, если я правильно понимаю суть проблемы. Иными словами если надо использовать MODBUS/485 - пожалуйста. За час работы в сети я нашей 4 независимые реализации. Полностью все спецификации выложены на сайте и т.д. С CAN ситуация иная. Пути:
1. Иметь МНОГО времени и реализовать либо свой CANOpen
2. Иметь МНОГО денег и купить уже реализованный (как я понял, минимум $850 за библиотеку без исходников)
3. Иметь большой умный мозг и МНОГО времени - придумать некое "подмножество" протокола CANOpen и реализовать его.
4. Ограничиться самым примитивным решением - взять только DataFrame от физической части CAN и сделать только HeartBeat для гарантированности работы всего "в целом".

Можно даже BootUP не использовать - в некотором смысле при фиксированном наборе устройств, при отсутствии одного по HeartBeat, работа всей остальной совокупности уже невозможна. В этом смысле BootUP заменяется просто "push'ингом" HeartBeat'ов от слейвов к мастеру. Даже не требуется RDF использовать для этого, шина и так рассчитана на большую пропускную способность.


Ну для реализации своего CANOpen варианта нужно не так уж и много времени благо часть функциональности можно неделать что допускается спецификациями.Но в любом случае вопрос звучит по другому а именно для чего все это,какую задачу вы пытаетесь решить.Пару лет назад когда в моей лавке встала задача собрать измерительную систему тоже были варианты.
1.Купить готовую или собрать из покупных модулей
2.Купить исходники или библиотеки для убыстрения разработки
3.Создать свою с нуля определившись с технологией,интерфейсами и протоколами

В результате
1.Был произведен маркетинг и сравнение существующих систем и решений
В силу ряда причин готовое решение найти неудалось и было принято решение создавать свое
2.Была выбрана распределенная технология измерения(в силу конструктивных особеностей контролируемого обьекта)
3.Было проведено сравнение полевых шин и сделан выбор(CAN по соотношению цена качество оказался на коне)
4.Было проведено сравнение протоколов и по характеристикам и количеству/качеству существующего готового(само собой платного софта) а также ареалу рапространения был выбран CANOpen
5.Был проведен анализ функциональности(по пригодности для наших задач) готовых библиотек и их стоимость а также сроков выделенных на реализацию проекта после чего было принято решение писать протокол самостоятельно.
6.Была закуплена документация(спецификации CIA),интерфейсные платы для верхнего уровня и фирменная прога(Ixxat CANOpen Studio) для первоначально проверки реализации своего протокола.

Для чего все это и столько заморочек.А для того чтобы система была модульной и позволяла использовать приборы нашего изготовления совместно с покупными потомучто был выбран стандартный и очень рапространенный протокол.
Решение оказалось правильным и в данное время система находится в серийном производстве.
dormouse
Тогда можно попросить указать цены на вами закупленное решение:
1. Цена на плату, на библиотеку, на документацию (примерно до +- 50$). Сайт datamicro оказался очень сложен в использовании :-)

В нашем случае вроде нет необходимости делать стыковку с приборами не своего изготовления, поскольку они "по сути" не применимы в данном случае. Скорее всего это будет сделано при переходе на "следующий" виток развития, если вообще будет сделано. На данном этапе скорее всего будет доделана работа с CAN на основе At90CAN128 (примерно шесть экземпляров на одну систему), сбор данных температуры и прочего осуществляется по Dallas 1-wire, а самый дешёвый датчик с CANOpen стоил почти 800euro, что пока излишне ;-)
В качестве USB-PC будет устройство от slavna.ru - они предоставляют "каркас" программы на VC, так что можно очень быстро начать его использовать, поскольку код на C портируется с MCU без изменений, только интерфейсная часть будет другой.
ipc
Плата IXXAT USBtoCAN(2 канала с опторазвязкой) ~250 евро
Плата IXXAT USBtoCAN compact (1 канал с опторазвязкой) ~200 евро
Плата Adlink 7841 (два канал с опторазвякой) ~150 евро
CANOpen Configuration Studio ~1000 баксов(точно непомню)
СANOpen CIA Standart 200 евро + годовая подписка

Столько плат было нужно для разных целей,USB для использования с командировочными ноутбуками(и фирменным софтом) а PCI для рабочих станций на которых ведется калибровка и настройка приборов.

Средняя стоимость прибора(1-2ух канальных) получилась 200 баксов.
При выпуске около 2000 штук.
dormouse
Цена действительно оказалась более чем приемлемой. Я полагал примерно 2x-4x диапазон. При этом раскладе это <$1500 для начала работы, что приемлимо даже для личной разработки.

Осталось разобраться в следующем: физически CANOpen - это только data frame, которые ходят по шине. Никакая конкретика непосредственной физической реализации аппаратного уровня его не интересуют. Из этого можно сделать вывод, что и код на C должен быть одинаковым как для PC карты, так и для MCU. У них же (если я правильно понимаю) предлагается отдельно "стандарт" и отдельно "он же реализованный под Win32 с закрытым кодом", отдельно "софт мониторирования пакетов и проверки соответствия работы устройства стандарту", ну и платы, разумееется.

Если внимательно посмотреть на это, то вместо их библиотеки можно было бы использовать C версию кода, но они его не предоставляю. Я правильно понимаю ситуацию, что фактически надо реализовать 80% их библиотеки, являющейся кросс-платформенной, в каждом проекте?

Нешёл очень интересный сайт с большим чилом БЕСПЛАТНОГО софта (ограниченного на 125к/бит и временем работы), называется port.de. http://www.port.de/engl/canprod/content/software.html
Пока не ясно, но возможно, что предлагают недорогую кросс-платформенную реализацию на С.
ipc
Цитата(dormouse @ Apr 5 2006, 12:16) *
Цена действительно оказалась более чем приемлемой. Я полагал примерно 2x-4x диапазон. При этом раскладе это <$1500 для начала работы, что приемлимо даже для личной разработки.

Осталось разобраться в следующем: физически CANOpen - это только data frame, которые ходят по шине. Никакая конкретика непосредственной физической реализации аппаратного уровня его не интересуют. Из этого можно сделать вывод, что и код на C должен быть одинаковым как для PC карты, так и для MCU. У них же (если я правильно понимаю) предлагается отдельно "стандарт" и отдельно "он же реализованный под Win32 с закрытым кодом", отдельно "софт мониторирования пакетов и проверки соответствия работы устройства стандарту", ну и платы, разумееется.

Если внимательно посмотреть на это, то вместо их библиотеки можно было бы использовать C версию кода, но они его не предоставляю. Я правильно понимаю ситуацию, что фактически надо реализовать 80% их библиотеки, являющейся кросс-платформенной, в каждом проекте?


Да для CANOpen вобщем по барабану на физическую линию это всего лишь формат пакетов,структура и диапазон идентификаторов и временные параметры(таймауты) передачи.
Но есть небольшой нюанс.Обычно в приборах реализуют CANOpen Slave а на PC CANOpenSlave+CANOpenMaster.Мастер как таковой очень громоздок и реализовать его в полном обьеме внутри микроконтроллера из среднего ценового дивапазона проблематично.То же касается готовых библиотек и патентованых кроссплатформенных исходников.Сами продавцы пишут что только CANOpen практически на любой платформе займет не менее 64K(это плата за универсальность).В моем случае узкоспециализированный и конкретно заточеный CANOpen(с приличной функциональностью) около 10Кслов(вместе со словарем).
Вобще CANOpen неоднородная вещь.Это набор подпротоколов(те вариантов обмена) которые используются для разных целей.Например.
SDO-протокол для конфигурационного обмена
PDO-протокол для обмена данными
NMT-протокол для управлению сетью и состоянием узлов
LSS и LMT -протоколы для раздачи идентификаторов(NID Node ID) и смены скорости сети.
Необязательно реализовывать все,но часть полюбому нужно будет сделать.Фирменные библиотеки содержат все и потому такие громоздкие.

Что действительно ненравица так это алчность рапростаранителей стандартов,библиотек и ПО для настройки и проверки,они все как сговорились,цена на исходники доходит до 10 килотугриков.
Кстати я где то видел аппаратное(кстати недорогое) решение CANOpen в микросхеме(можно порыть в интеренте).

Вот кароче бесплатная дока по CANOpen кому интересно можете почитать

Что касается ресурсов.
Фирма Port предлагает много но вот купить это у нас проблематично.
Лучше смотреть на http://www.vector-cantech.com/ и www.ixxat.com
ruslannd
Цитата(KRS @ Apr 4 2006, 18:28) *
Цитата(ruslannd @ Apr 4 2006, 15:43) *

Цитата(KRS @ Feb 17 2006, 18:42) *

При начале работы я использовал CAN примерно так:

Код
  //входим в ресет моду
  CANGCON=0;
  while(CANGSTA & (1<<ENFG))  {};


Не понимаю смысл этого куска. ENFG никогда не будет 1, если в CANGCON записать 0. Или я ошибаюсь?


если кан находится в рабочем режиме ENFG=1
когда записываем 0 в CANGCON дается команда войти в ресет моде
пока кан входит в ресет моде ENFG будет 1 надо ждать пока не станет 0


Сорри. Облажался. С CAN контроллером разобрался. Все работает, только у Atmel'a даташит не достаточно детальный.
dormouse
Atmel сделала шаг вперёд к gcc и CAN. Конкретно: только что выложили новую версию библиотеки для At90CANxxx для gcc! Качаем, разбираемся.
Похоже, что внутри уже имеются примеры работчего "скелета" программ hello world для работы с шиной.


http://www.atmel.com/dyn/products/product_...sp?part_id=3780
zltigo
Цитата(dormouse @ Apr 5 2006, 00:00) *
PS Отдельное спасибо НПП Славна (http://www.slavna.ru). Успешно получено купленное у них USB->CAN устройство. Пока не испытано.

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


Спасибо за замечание, в текущей партии уже исправили.
zuuuuk
Меня очень интерисует эта тема. т. к. я сейчас только разбираючь с CAN ом. У меня вопрос.
может ли в арбитраже учавствать не только индентификатор но и остальная часть какдра.
spf
Цитата(zuuuuk @ Jun 8 2007, 22:24) *
Меня очень интерисует эта тема. т. к. я сейчас только разбираючь с CAN ом. У меня вопрос.
может ли в арбитраже учавствать не только индентификатор но и остальная часть какдра.

Это вопрос для другого форума -- http://electronix.ru/forum/index.php?showforum=158

Нет, не может. Это четко описано в спецификации.
J0hnNick
Цитата(KRS @ Feb 17 2006, 18:42) *
При начале работы я использовал CAN примерно так:

Код
// обработчик CAN (полингом)

static void CanHandler(void)
{
  {
    BYTE Tmp;
    if (CANGSTA & (1<<BOFF)) {
      Reset(); // произошло BUS OFF
    }
    Tmp=CANHPMOB; // Проверка принятых пакетов
    if (Tmp<0xF0) {
      CANPAGE=Tmp;
      if (Tmp<0x20) RxHandler1(); // прием из майл бокса 0 или 1
      else if (Tmp<0x40) RxHandler2(); // прием из майл бокса 2 или 3
      else if (Tmp<0x60) RxHandler3(); // прием из майл бокса 4 или 5
      // удаляем пакет
      CANSTMOB=0;
      CANCDMOB=0x90;

    } else {
      // 7 ой майл бокс используем для отправки
      CANPAGE=0x60;
      if (!(CANSTMOB & (1<<TXOK))) return;
      TxHandler();
    }  
  }
}


на эту функчию получаю в компиляторе winavr ошибки
C:\WinAVR\projects\Can_Int/main.c:143: undefined reference to `TxHandler'
C:\WinAVR\projects\Can_Int/main.c:127: undefined reference to `Reset'
C:\WinAVR\projects\Can_Int/main.c:132: undefined reference to `RxHandler1'
C:\WinAVR\projects\Can_Int/main.c:133: undefined reference to `RxHandler2'
C:\WinAVR\projects\Can_Int/main.c:134: undefined reference to `RxHandler3'

как их исправить?
d'Bill
Дык их то и надо написАть ручками
Dimorus
я не могу понять как этот Can ваще работает млиин помогите....
Надо чтобы одна микросхемка At90cAn128 отправляла какие-нибудь данные а другая At90cAn128 их принимала и в случае обнарожения нуля в байте данных зажигала светодиод .....очень нужно помогите smile.gif))
_________________________________________________
я не волщебник я только учусь .....
Dimorus
А кто-нибудь автора dormouse видел или может знает? 1111493779.gif
сорри за офтопик bb-offtopic.gif
Alexeus
Цитата(Dimorus @ Jun 20 2007, 18:42) *
А кто-нибудь автора dormouse видел или может знает? 1111493779.gif
сорри за офтопик bb-offtopic.gif


Такая же проблема- нужен скелет на асемблере, что бы пакет хоть просто в сеть кинуть...
Кто может помочь, скиньте код. (at90can128)
SasaVitebsk
По моему на асме ничего не было. Если только билиотеку взять и Сишный модуль на асм переложить.
ARV
я же выкладывал нормальную библиотеку для работы с этим контроллером - чем не подходит? Единственный недостаток - работа поллингом, т.е. без прерываний по приему/передаче сообщения, но для множества применений вполне достаточно и этого.
galjoen
Цитата(Alexeus @ Jan 22 2009, 16:52) *
Такая же проблема- нужен скелет на асемблере, что бы пакет хоть просто в сеть кинуть...
Кто может помочь, скиньте код. (at90can128)

Из моего проекта без к.л. обработки.
RG00 - регистр равный 0x00. RBXn - регистры из R16...R24.
Выключил автоматическую перепередачу при ошибках. При неподтверждении ACK передаю 3 раза (4 попытки).
Вопросы конечно будут ещё..
CODE

ICAN_L: ; Инициализация CAN.
; Тактовая частота 14745600. Связь 125000 (реально 126031)
.SET CBT1=0x10 ; писаемое в CANBT1 (делитель=9, частота 1.6384 МГц)
.SET CBT2=0x0A ; писаемое в CANBT2 (Tsjw=1, Tprs=6)
.SET CBT3=0x25 ; писаемое в CANBT3 (Tphs2=3, Tphs1=3, SMP=1)
; TQ=(SYN=1)+(Tprs=6)+(Tphs1=3)+(Tphs2=3)=13
; Sampling Point=((SYN=1)+(Tprs=6)+(Tphs1=3))/(TQ=13)=76.92%

;.SET CBT1=0x12 ; писаемое в CANBT1 (16 МГц) (частота 1,6 МГц)
;.SET CBT2=0x0C ; писаемое в CANBT2 (16 МГц)
;.SET CBT3=0x37 ; писаемое в CANBT3 (16 МГц)
; BRP=9 (предделитель на 10), SJW=0 (1 квант), PRS=6 (7 квантов),
; PHS2=3 (4 кванта), PHS1=3 (4 кванта), SMP=1 (3 выборки). Итого 16.

;.SET CBT1=0x0A ; писаемое в CANBT1 (12 МГц) (частота 2 МГц)
;.SET CBT2=0x0E ; писаемое в CANBT2 (12 МГц)
;.SET CBT3=0x4B ; писаемое в CANBT3 (12 МГц)
; BRP=5 (предделитель на 6), SJW=0 (1 квант), PRS=7 (8 квантов),
; PHS2=4 (5 квантов), PHS1=5 (6 квантов), SMP=1 (3 выборки). Итого 20.
sts CANGCON,RG00 ; CAN запрещён
ldi RBX0,15 ; имеется 15 MOb
ldi RBX1,0x00 ; писаем в CANPAGE
ldi XL,0x00 ; писаем в CANSTMOB
ldi XH,0x00 ; писаем в CANCDMOB
IniCAN1: ; цикл сброса всех MOb
sts CANPAGE,RBX1 ; N MOb
sts CANCDMOB,XH ; регистр контроля MOb
sts CANSTMOB,XL ; регистр статуса MOb
subi RBX1,0xF0 ; увеличим N Page MOb на след. раз
dec RBX0 ; уменьшаем сч-к
brne IniCAN1 ; циклимся
ldi RBX0,CBT1 ; настройка
sts CANBT1,RBX0 ; частоты
ldi RBX0,CBT2 ; шоб получить
sts CANBT2,RBX0 ; скорость
ldi RBX0,CBT3 ; CAN
sts CANBT3,RBX0 ; 125 кБит
; инициализируем скорость счёта CANTIM (Time Stamp)
ldi RBX0,((Fclk>>3)/16000)-1 ; шоб считалось
sts CANTCON,RBX0 ; +16 единиц за 1 мС

; иниц-зируем MOb N10..14 на прослушку сообщений "я ещё живой"

ldi RBX1,14<<4 ; начнём с 14 MOb
IniCAN2: ; цикл иниц-ии MOb N14..10
sts CANPAGE,RBX1 ; и писать в AT45 и слать через InIn
ldi RBX0,1<<IDE ; 29 бит адреса (пока до кучи)
sts CANCDMOB,RBX0 ; остальное пока запрещено
; адрес CAN приёма "я ещё живой"
ldi RBX0,AdSiV>>21 ; 28..21 биты
sts CANIDT1,RBX0 ; адреса приёма
ldi RBX0,low(AdSiV>>13) ; 20..13 биты
sts CANIDT2,RBX0 ; адреса приёма
ldi RBX0,low(AdSiV>>5) ; 12..5 биты
sts CANIDT3,RBX0 ; адреса приёма
ldi RBX0,low(AdSiV<<3) ; 4..0 маска,
sts CANIDT4,RBX0 ; RTRTAG, RB1TAG и RB0TAG
; маска адреса CAN приёма "я ещё живой"
ldi RBX0,AmSiV>>21 ; 28..21 биты маски
sts CANIDM1,RBX0 ; адреса приёма
ldi RBX0,low(AmSiV>>13) ; 20..13 биты маски
sts CANIDM2,RBX0 ; адреса приёма
ldi RBX0,low(AmSiV>>5) ; 12..5 биты маски
sts CANIDM3,RBX0 ; адреса приёма
ldi RBX0,low(AmSiV<<3)|(1<<RTRMSK)|(1<<IDEMSK)
sts CANIDM4,RBX0 ; 4..0 маска, RTR и IDE (2.0B)
ldi RBX0,(1<<CONMOB1)|(1<<IDE) ; у MOb
sts CANCDMOB,RBX0 ; разрешим приём (+2.0 B до кучи)
subi RBX1,1<<4 ; уменьшаем N MOb
cpi RBX1,10<<4 ; проверим на < 10го MOb
brcc IniCAN2 ; C=0 - циклимся

sts CANIE2,RG00 ; разрешим прерывание токо от
ldi RBX0,1<<IEMOB14|1<<IEMOB13|1<<IEMOB12|1<<IEMOB11|1<<IEMOB10
sts CANIE1,RBX0 ; слушаюших MOb N10..14

ldi RBX0,0x7F ; сбросим все сбрасываемые
sts CANGIT,RBX0 ; флаги прерываний от CAN

; sts L_GER,RG00 ; очистим LISTEN-накопитель ошибок

ldi RBX0,(1<<ENIT)|(1<<ENRX)|(1<<ENTX)|(1<<ENERR)|(1<<ENERG)
; ldi RBX0,(1<<ENIT)|(1<<ENERG)
; ldi RBX0,0x00
sts CANGIE,RBX0 ; прер-я по приёму и ош-кам

; ldi RBX0,(1<<TTC)|(1<<SYNTTC)|(1<<LISTEN)|(1<<ENASTB)
ldi RBX0,(1<<TTC)|(1<<SYNTTC)|(1<<ENASTB)
sts CANGCON,RBX0 ;

sts FlOpO,RG00 ; шоб не зависнуть
sts FlCpO,RG00 ; после переиниц-ии
ret
;***
C6CRO: ; Пошлём сообщение, управляющее CAN РЕЛЕ (передача Выходов).
; Но в начале запретим низкоприоритетную передачу Выходов.
ldi RBX0,7<<4 ; выберем MOb
sts CANPAGE,RBX0 ; N7 (+ MSG с 0)
lds RBX0,CANCDMOB ; прочтём, шоб запретить токо передачу
andi RBX0,low(~((1<<CONMOB1)|(1<<CONMOB0))) ; (шоб если она
sts CANCDMOB,RBX0 ; уже пошла, то былаб такой-же)
ldi RBX0,6<<4 ; выберем MOb
sts CANPAGE,RBX0 ; N6 (+ MSG с 0)
ldi RBX0,1<<IDE ; 29 бит адреса (пока до кучи)
sts CANCDMOB,RBX0 ; остальное пока запрещено
; адрес CAN передачи срочного управления CAN РЕЛЕ (Выходов)
lds RBX1,N8OpO ; N8 передачи Выходов
lds XL,N16OpO ; м.б. N16
lds XH,N16OpO+1 ; с.б. N16
add XL,XL ; сдвинем
rol XH ; всё
rol RBX1 ; это
rol RBX0 ; на 3 бита
add XL,XL
rol XH
rol RBX1
rol RBX0
add XL,XL
rol XH
rol RBX1
rol RBX0
andi RBX0,0x07 ; тут 3 ст. бита N8
ori RBX0,(Ad6CAN>>21)&0xF8 ; 5 ст. бит адреса
sts CANIDT1,RBX0 ; 28..21 биты адреса передачи
sts CANIDT2,RBX1 ; 20..13 биты адреса передачи
sts CANIDT3,XH ; 12..5 биты адреса передачи
sts CANIDT4,XL ; 4..0 биты с RTR=RB1=RB0=0
; маска адреса CAN передачи CAN РЕЛЕ (Выходов)
ldi RBX0,Am6CAN>>21 ; 28..21 биты маски
sts CANIDM1,RBX0 ; адреса передачи
ldi RBX0,low(Am6CAN>>13) ; 20..13 биты маски
sts CANIDM2,RBX0 ; адреса передачи
ldi RBX0,low(Am6CAN>>5) ; 12..5 биты маски
sts CANIDM3,RBX0 ; адреса передачи
ldi RBX0,low(Am6CAN<<3)|(1<<RTRMSK)|(1<<IDEMSK)
sts CANIDM4,RBX0 ; 4..0 маска, RTR и IDE (2.0B)
ldi RBX0,(1<<IDE)|(LgMOb6&0x0F) ; у соотв-го MOb
sts CANCDMOB,RBX0 ; запретим всё (+2.0 B до кучи)
lds RBX0,DtOpO ; м.б. данных
sts CANMSG,RBX0 ; в передачу
lds RBX0,DtOpO+1 ; с.б. данных
sts CANMSG,RBX0 ; в передачу
ldi RBX0,0x03 ; разрешим 3 неполучения
sts MO6Cn,RBX0 ; ACK (min м.б. 4 попытки)
sts MO6St,RG00 ; статус передачи =0
sts CANSTMOB,RG00 ; очистим ош-ки и прерывания
ldi RBX0,(1<<CONMOB0)|(1<<IDE)|(LgMOb6&0x0F) ; у MOb N6
sts CANCDMOB,RBX0 ; разрешим передачу + 2.0B
lds RBX0,CANIE2 ; там разр-ние прерываний от MOb N0..7
andi RBX0,low(~(1<<IEMOB7)) ; запретим от MOb N7
ori RBX0,(1<<IEMOB6) ; разрешим от MOb N6
sts CANIE2,RBX0 ; назад изменённую маску
lds RBX0,CANGIE ; прочтём шоб доп-но
ori RBX0,(1<<ENIT)|(1<<ENTX); разрешить прер-е
sts CANGIE,RBX0 ; по передаче (до кучи)
ret ; возврат
;***

Кодировка не совпадает - пришлось перекодировать в DOS-866, а файл прикрепить что-то не удаётся. Какие-то проблемы с прикреплением файлов.
Alexeus
Цитата(ARV @ Jan 22 2009, 21:20) *
я же выкладывал нормальную библиотеку для работы с этим контроллером - чем не подходит? Единственный недостаток - работа поллингом, т.е. без прерываний по приему/передаче сообщения, но для множества применений вполне достаточно и этого.


Спасибо. Там вроде на Си все реализовано. Мне для понимания на асме полегче было бы... Но спасибо, будем разбираться...
(Ох уж этот CAN, никто не хочет написать обучалку на примерах попроще для реализации CAN??? Очень нужная вещь smile.gif )
SasaVitebsk
А там нечего писать. Инициализацию - заимствовать. А приём - передача - найприметивнейшая. Одни разговоры - CAN.
На PIC значительно сложнее всё получается.

Если же приём осущ. по прерыванию - вообще лафа. Можно даже таймаут настроить, без внешних измерений. Короче - несколько строк.

Главное - не ленитесь - разберитесь. Ну и общее представление по CAN надо иметь.
ARV
Цитата(Alexeus @ Jan 23 2009, 15:12) *
Спасибо. Там вроде на Си все реализовано. Мне для понимания на асме полегче было бы... Но спасибо, будем разбираться...
(Ох уж этот CAN, никто не хочет написать обучалку на примерах попроще для реализации CAN??? Очень нужная вещь smile.gif )

использование ассемблера для 128 килобайт флеша - это попахивает мазохизмом... а если абстрагироваться от удобольствий, то в вышеупомянутой библиотеке достаточно для понимания... ну и почитать даташит хоть поверхностно...
Alexeus
Это, конечно, похоже больше в тематику- обучалка, но подскажите как пакет составить и отправить, что то не соображу куда подставлять ID и собственно сами данные...

Я понимаю УСАПП там... или SPI- есть регистр в который кидай из переменной и все уйдет, по приходу реагируем на поднятый флаг, но в этом CANе я что то не въеду никак. Нужно вот пакет с полезной инфой в 8 байт отправить с идентификатором (ID), ну пусть число 395. Что для этого нужно?

(8 байт будем? например, считывать циклом из ОЗУ (ld temp,Y+))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.