dormouse 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Начал разработку несложного софта для системы из нескольких at90can128. Фактически, надо сделать несложный исходник на IAR EC++ 4.1 Посмотрел, что есть из готового, но ничего не нашёл. Единственное - колоссального размера исходник от Atmel'a (вроде адаптированный от прошлой архитектуры). Для начала очень желаемо суметь написать софт, который сможет принять-послать-обработать ошибку. Насчёт более высокого уровня (DeviceNET, CANOpen e.t.c) пока не сумел разобраться - складывается ощущение, что ничего готового (ни одного готового каркаса) невозможно найти... Есть желающие включиться в разработку из идейных или материальных побуждений? Жду ответа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
psion 0 16 февраля, 2006 Опубликовано 16 февраля, 2006 · Жалоба Типа совет. Когда работал с CAN-ом слепил приблуду - управляемый через ByteBlaster контроллер CAN на MCP2510 с опторазвязкой и драйвером линии. Можно посылать-принимать сообщения или подслушивать шину. Для отладки весьма полезно. Возможно, можно найти что-нибудь не кустарное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleks17 0 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба По-моему проще разобраться и своё сгородить. На С это несколько строчек текста, не более того. Протоколы высокого уровня конечно - более серьёзная тема, тоже ничего не попадалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spf 0 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба Для начала очень желаемо суметь написать софт, который сможет принять-послать-обработать ошибку. Не поверю что для Atmel'a такого нет. ;-) Это же пара строк кода, после прочтения доки на can-контроллер и CAN спецификации. - Инициализация (скорость и т.п) - Настройка приемных фильтров (далее по прерыванию или контролю флага приема) - Поместить в буфер сообщение и стартовать передачу - Анализ регистров ошибок Можно поискать/посмотреть примеры для других CAN-контроллеров, например SJA1000. Насчёт более высокого уровня (DeviceNET, CANOpen e.t.c) пока не сумел разобраться - складывается ощущение, что ничего готового (ни одного готового каркаса) невозможно найти... Есть такие , один из них - http://www.vscp.org/ PS: Рекомендую приобрести готовое can устройство, для контроля и отладки сети между МК. Подойдут недорогие USB-CAN, цена около 100$, к ним прилагаются библиотеки и примеры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dormouse 0 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба Найденные в продаже устройства: 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 0 17 февраля, 2006 Опубликовано 17 февраля, 2006 · Жалоба При начале работы я использовал 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 0 22 февраля, 2006 Опубликовано 22 февраля, 2006 · Жалоба Пока изучаю, ещё не компилировал. После обдумывания ситуации и изучения просторов интернета я понял, что ясного представления о "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 не получил пока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 24 февраля, 2006 Опубликовано 24 февраля, 2006 (изменено) · Жалоба Уважаемый dormouse, Вы пишите: PS Ответа от slavna.ru с предложением о покупке их адаптера USB-CAN не получил пока. Отвечаю: запроса на покупку от Вас мы не получали. На складе есть все http://www.slavna.ru/stran/devices.htm. Шлите заявку на [email protected] или непосредственно мне [email protected] PS. Заканчиваем тестирование преобразователя USB-rs485 c аппаратными реализациями некоторых протоколов, в том числи и MODBUS (RTU и ASCII) Изменено 24 февраля, 2006 пользователем Седой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dormouse 0 24 февраля, 2006 Опубликовано 24 февраля, 2006 · Жалоба Письмо я направил на [email protected], 17 Фев 2006 16:39:00. Тогда связываемся через форум. Мне надо получить внешний CAN (1шт, к нему очень желательно исходник на С - мне надо понять способ реальной работы с CAN, поскольку я никак не могу пробиться на начальную стадию ("когда кто-то кому-то как-то что-то передал")). Иными словами я обещаю, что исходник "дальше меня" не пойдёт, не будет использоваться как часть или целое в коммерческих проектах, не будет опубликован в любом виде и что единственный способ использования - самообразование ;-) В итоге я хочу купить в Москве 1 шт. USB-CAN-ext-06 с исходником (или частью исходника, отвечающей за CAN). Владимир. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spf 0 26 февраля, 2006 Опубликовано 26 февраля, 2006 · Жалоба Пока изучаю, ещё не компилировал. После обдумывания ситуации и изучения просторов интернета я понял, что ясного представления о "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 0 26 февраля, 2006 Опубликовано 26 февраля, 2006 · Жалоба Отлично. Почти собрал этот исходник. Осталось только немного разобраться с CANIDT? . Надеюсь, что скоро заработает. Критической ситуацией с подтверждениями я хотел обозначить следующее: Предположим, надо добиться синхронного начала работы N слейвов. Мастер последовательно настроил их, после этого должен дать инструкцию "старт". Если пользоваться modbus, то вариантов два (с дополнительной линией и без). 1. С дополнительной линией: выставляем на ней сильный ноль - все клиенты стартовали. Так же в неожиданный момент времени любой клиент самостоятельно выставляет ноль на линии => все замирают и мастер начинает последовательно перебирать слейвов, чтобы разобраться, что случилось. 2. Мастер всем синхронирнизовал часы, после чего шлёт первому инструкцию стартовать через deltaTn. Получает подтверждение, шлёт второму deltaT(n-1) и т.д. В итоге, если на каком -то слейве произошёл сбой, то мастер шлёт броадкаст, что надо отложить старт на 1 попытку связи. Проблема в том, что для паранои это сообщение само может быть не получено одним из слейвов и он начнёт работать не в нужное время. До сих пор не смог внятно понять, как реализуется подверждения приёма всеми узлами броадкаста в CAN шине. Жду ответа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 26 февраля, 2006 Опубликовано 26 февраля, 2006 · Жалоба До сих пор не смог внятно понять, как реализуется подверждения приёма всеми узлами броадкаста в CAN шине. Жду ответа. Совет один, прочитать спецификацию CAN, она открытая и в общем то понятная. В сети встречаются даже переведенные на русский язык спецификации, если не ошибаюсь, есть на www.datamicro.ru (эту ссылку уже давали выше). Уточняющие вопросы задать здесь. Желание заниматься преподавательской деятельностью есть далеко не у всех. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
John 0 1 марта, 2006 Опубликовано 1 марта, 2006 · Жалоба Посмотрите еще здесь - Описание CAN на русском языке; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ruslannd 0 4 апреля, 2006 Опубликовано 4 апреля, 2006 · Жалоба При начале работы я использовал CAN примерно так: ............... CANPAGE=0x60; if (!(CANSTMOB & (1<<TXOK))) return; TxHandler(); ............... А TxHandler() что делает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ipc 0 4 апреля, 2006 Опубликовано 4 апреля, 2006 · Жалоба Проблема в том, что для паранои это сообщение само может быть не получено одним из слейвов и он начнёт работать не в нужное время. Такой ситуации просто неможет быть если все устройства сети настроены соответствующим образом(т.е работают на одной скорости и неотпинают пакет своим фильтром).Когда на линии выставляется любое состояние его принимают абсолютно все узлы. Если существует проблема синхронизации действий разных узлов она предусмотрена в высокоуровневых протоколах(например в CANOpen есть пакет под названием SYNC имеющий высокий приоритет). Вобще воспринимать интерфейс CAN в отрыве от конкретного протокола очень странно.А придумывать свой долго и нецелесообразно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться