Jump to content

    

spf

Свой
  • Content Count

    776
  • Joined

  • Last visited

Everything posted by spf


  1. ЦитатаУ меня есть задача, проверить работоспособность CAN на плате. Камень at91sam7x. Очено не хочется использовать для проверки какой-то сторонний девайс. Поэтому возник такой вопрос, а можно ли каким-нибудь образом отправить и принять пакет (любой) самому себе. Задача в чем? Проверить что в самом камне контроллер функционирует или работает все, до выходного разъёма? Если второе, то без внешнего устройства не обойтись. Для первого читай тему выше. ЦитатаПознания в CAN у меня пока нулевые. Для того, что бы пользовать матчасть, её надо бы знать. Стандарты открыты, переведены.
  2. Цитата(Dog Pawlowa @ Oct 3 2008, 12:29) У нас, наверное, разная терминология. Я использовал слово буфер как набор регистров, осуществяющих прием или передачу. Напрмер, в MCP2515 два буфера на прием и три на передачу. "The MCP2515 has three transmit and two receive buffers, two acceptance masks ( one for each receive buffer)..." Насколько я понял, автор использует один буфер на прием сообщений от двух источников. В таком контексте использования этого слова тоже возражения? Специально не изучал MCP2515, ну думаю все регистры буферов приема и отправления выполняют роль именно буферов. Т.к. MCP2515 еще более сложный случай - забрать из регистров можно по SPI, время общения по которому много больше, чем прямое обращение к регистрам встроенного интерфейса. Операция приема НЕ задействует регистры слотов, в приемный буфер(слот я бы его назвал) данные складываются после успешного завершения сеанс передачи сообщения по шине.
  3. Цитата(Dog Pawlowa @ Oct 2 2008, 18:40) Но нужно считать от конца приема первого до начала приема второго! То есть время не сотни мкс, а в лучшем случае одна-две! Не вводите людей в заблуждение. Буфер можно обрабатывать до завершения прихода следующего. Иначе бы ничего вообще не работало. Такой CAN ни кто бы не мог использовать. Даже в UARTе обработать надо не до начала поступления следующего, а до завершения передачи. Цитата(Dog Pawlowa @ Oct 2 2008, 18:40) Ну поймите же - речь идет о промежутке времени, когда первое сообщение ПРИНЯЛОСЬ и тут НАЧИНАЕТ передаваться второе. Ему некуда приниматься - буфер занят, прерывание не успевает обработаться за это время. Сообщение складывается в буфер только после того, как будет завершена операция передачи (причем без ошибок) и выполнена фильтрация по ID.
  4. Цитата(Fledgling @ Oct 2 2008, 17:17) Как такое возможно? Кадр передается по шине со скоростью 1МБит/сек порядка 100 мкс (примерно), а ассемблерная процедура приема успевает считать гораздо быстрее (просто посчитали количество инструкций, посмотрели сколько времени выолняется каждая, например MOV выполняется за 2 такта - 50 наносекунд). Значит до прихода следующего кадра уже точно слот №15 (приемник) освободится? или я ошибаюсь? Если вы не можете гарантировать правильность процедур, автора которых уже не отыскать, то надо исследовать процессы более наглядными вещами 1) снифер (USB-CAN) включенный на просмотр сообщений.(подключите уже шлейф от ПК на внутреннюю шину); 2) осциллограф; 3) светодиодик отображения времени выполнения процедуры. Иначе гадать будете очень долго. Тут народ простой, не экстрасенсы, сложно найти ошибку при куче неизвестных. (про это уже твержу не первый раз) Перепишите все на Си и голову не ломайте, должно успевать. А то может вы что-то просто путаете в асме. Когда заработает можно будет оптимизировать. ЦитатаИсходим из логического предположения, что кадр с одним и тем же ID приходит реже 800Гц Исходить можно, но лучше все таки все проверить Смысла не вижу в такой частоте опроса организованного "буфер". Еще предположение: Может у вас что-то не то с записью/вычитыванием из буфера при получении больше чем одного сообщения за 1/8.
  5. Цитата(Fledgling @ Oct 2 2008, 10:08) Чтение из него производится по прерыванию (у обоих контроллеров есть по прерыванию в таблице векторов). Вектора то может быть и есть, а обработчики прерываний есть? Раньше речь шла только о полинговом вычитывании с частотой в 8 раз больше, чем посылки. ЦитатаЕсть мнение что когда мы производим чтение из обьекта, приходит второй кадр - а обьект №15 в это время "заблокирован". Может ли увеличение числа обьектов-приемников помочь или не стоит даже пытаться? Или нужно менять весь алгоритм в целом и вводить синхронизацию? Станет лучше, но полностью ошибку не исправит. Синхронизацию вводить не обязательно (но с ней бы было проще), а вот с обработкой в прерывании надо видимо разобраться. ЦитатаКстати пакеты все равно будут висеть на шине последовательно, даже при максимальной скорости передача одного пакета (CAN кадра) будет около 100 мкс, процессор вроде бы должен успевать обработать и считать в свой буфер содержимое кан-обьекта до поступления следующего кадра. А это как вы программу напишите, должно конечно успеть ;-) PS:Я бы не использовал слово "объект", слот больше подходит.
  6. Еще раз перечитал первые ваши посты. Сообщалось что пользуете буфера приема (несколько слотов настроены на прием). Но работает ли этот буферизованный прием? Можно одним МК1 отправлять не одно, а несколько сообщений (последовательно и без паузы) в течении 100 мс и так же проверить на линейное изменение счетчика. Если будут ошибки, то буферизация не работает и в этом кроется ошибка. Даже если буферизация у вас и работает, восемь слотов вы опрашиваете восемь раз за период отправки сообщений от источников, то без потерь вы будете обрабатывать только в том случае, если отправки формируются в строгой синхронизации и в 1/8 периода формирования сообщений по шине проходит не более 8 сообщений. У вас синхронизации нет, поэтому без ошибок вы получать сообщения не сможете по определению (их количество будет увеличиваться с увеличением абонентов на шине). Так что CAN не виноват, ошибочны подходы построения взаимодействий в системе.
  7. Цитата(Fledgling @ Sep 30 2008, 23:50) Третий процессор проверяет так: if (cnt1 - cnt1_old > 1) {errorMK1++;} if (cnt2 - cnt2_old > 1) {errorMK2++;} cnt1_old = cnt1; cnt2_old = cnt2; cnt1 и cnt2 - счетчики, принимаемые от МК1 и МК2. Хм, это странно, что счетчики изменяются нелинейно. Надо проверять успешно ли завершается отправка из МК1 и МК2. Но скорее всего ошибка в другом: ЦитатаИ все это проверяется в 800 Гц (для верности воткнули на макс. частоту) цикле (в 8 раз чаще чем выдается). Если новое значение счетчика еще не пришло - errorMK не изменится. Если ваш контроллер не использует режим FIFO то следует работать по прерыванию. Все сообщения принимается в один приемный слот? Фильтры каким-то образом используются? Если вы работаете через один приемный слот, то данные у вас будут теряться. Теряться они будут когда два контроллера синхронно выдадут ответы друг за другом. Придет один пакет, придет второй, второй затрет первый, считать получиться только последний. Нельзя полингом работать при таких скоростях, даже если вы сделаете 1600 или 3200 Гц опроса.
  8. Цитата(fakel @ Oct 1 2008, 15:44) В нашем случае, если расстоние между узлами небольшое (50 см.) всё работает отлично! Как только оно увеличивается до 1 км связь пропадает и невостанавливается (независимо от того какая скорость выставлена)))) Какой драйвер линии? Какой кабель? (должна быть витая пара в экране) В каких условиях лежит этот кабель? Что говорят регистры ошибок?
  9. Цитата(Fledgling @ Sep 30 2008, 00:19) Процессоры могут стартовать асинхронно, выдачу кадров осуществляют (всех, которые предназначены к выдаче с этого МК) с частотой 100 Гц. Тесты показали, что контроллер успевает выставить все данные на шину до наступления следующего цикла. Цитата А частота у генераторов достаточно одинаковая ? Частота по идее абсолютно одинаковая Частота только по идее у них одинаковая . Плавали, знаю. Все процессоры будут плыть с разной скоростью в разные направления. Так что уповать на то, что все будут всегда попадать в нужные 100мс не стоит. На шине должен быть один синхронизатор, эталон общесистемных часов, который должен управлять временем в системе, на него должны все модули равняться. Цитата(Fledgling @ Sep 30 2008, 23:30) МК3 регистрирует пропуски по счетчикам. И снова не договариваете Сколько пропусков на каком количестве посылок, стабильно ли это возникает? Как регистрирует, N1 != N2 или анализируется линейность изменения каждого счётчика по-отдельности? Вам надо подключить снифер на внутреннюю шину, который бы на экран ПК выводил все что было на шине, тогда будет проще разбираться. Может оказаться что вся бяда именно в том, что все синхронно только "по идее", а на деле все плывет.
  10. Цитата(Dog Pawlowa @ Sep 30 2008, 22:48) Все можно проверить осциллографом Можно конечно и скопом битики сравнивать, но проще все на бумаге разложить по полочкам. ИМХО Или подключить на "внутреннюю" шину USB-CAN в качестве снифера и смотреть что-же там делается на самом деле. Цитата(Fledgling @ Sep 30 2008, 22:56) Задача устройства - регулирование исполнительного механизма в соответствии с показаниями датчиков. Например, обьясню на одном из регулируемых параметров: МК1 читает данные с датчика температуры, получает значение Т1 и выставляет его на шину CAN. МК2 читает данные со второго датчика температуры, получает значение Т2, выставляет на шину. Процессор МК3 получает по шине оба значения, расчитывает результирующее Трез = (Т1+Т2)/2 с частотой 100Гц. Каждый кадр имеет так называемый "счетчик обновляемости". в 100Гц-м цикле счетчик обновляемости каждого кадра уменьшается на 1, если кадр пришел - устанавливается в первоначальное значение. Для Т1 и Т2 счетчик равен 10. Если счетчик кадра = 0 (значит кадр "не приходил" 10 стогерцовых циклов подряд) - устройство генерирует отказ по контролю температуры. Так в принципе и отловили баг - периодически генерировался данный отказ (редко достаточно). Потом уже стали процерять по инкрементирующимся счетчикам. Вы меня не поняли, я прошу отделить "мух от котлет". Вы же продолжаете все сваливать в кучу. У меня подозрения что трудности не в CAN, а в общих алгоритмах. Отделите CAN, у него простая функция - передать то, что ему положили в регистры.(ему же все равно что в него положили, температуру или давление, не про это речь) Обязательно надо выполнять проверки всевозможных ошибок и регистров состояний. Диагностику CAN надо отделить от диагностики остальной программы. Иначе ошибку можно искать без конца, потому что сложно выяснить что же все таки работает так, как должно. Надо постепенно отсекать те вещи из рассмотрения, которые полностью проверены и в которых вы полностью уверены.
  11. Цитата(Fledgling @ Sep 30 2008, 22:39) У устройства есть внутренняя шина (для обмена данными между МК). Третий МК является своеобразным "шлюзом" - он транслирует все принятые внутренней шине кадры через контроллер CAN №2 на внешнюю шину - где приемник - ПК. Такие пояснения добавляют неопределенности Вы бы нарисовали что же у вас там и как, что и хотите, что получается... А так какие-то метания. 1) надо бы изучить матчасть поплотнее - протокол и используемый контроллер. 2) четко и ясно описать задачи каждого устройства и системы в целом. PS: В хорошем вопросе содержится большая доля ответа. Так уже начните задавать вопрос с чувством, с толком, с расстановкой. Когда будете все по местам расставлять, ответ должен сам и найтись.
  12. Цитата(Dog Pawlowa @ Sep 30 2008, 22:32) Ага, так похоже и происходит : "Для регистрации данных на ПК используется устройство IXXAT CAN II с драйвером третьей версии (с поддержкой .NET)." Типичная реакция у Windows - 10 мс. Один передатчик тянет, а два уже нет. "Приплыли"? Нет, тут должно быть все достаточно чисто. Работает же USB и т.п. ;-) В устройстве свои буфера должны быть достаточного размера. Мы пользовали древний USB-CAN, все пахало на 1Мбит под виндами без потерь и напрягов.
  13. Цитата(Fledgling @ Sep 30 2008, 22:09) Имеется в виду, выставлять один и тот же кадр на выдачу несколько раз за цикл? Но по какому алгоритму это делать? Не надо ничего выставлять несколько раз. Контроллер должен сам повторять сообщения, если на шине возникают ошибки. В некоторых контроллерах можно отключать автоматический повтор передачи сообщений (делать только одну попытку отправки). Видимо про это была речь. Цитата(Vokchap @ Sep 30 2008, 22:23) Учитывать это. Уже наступал на эти грабли. Это где такие грабли?
  14. Цитата(Andrew2000 @ Sep 30 2008, 22:04) !!!!!!!!!!!!!! Не _все_, а _хоть один_ кто-то !!!! Приплыли... Я поставил слово в кавычки именно потому, что хоть кто-то должен сказать "ок" в нужный момент, а все остальные с этим должны согласиться или сказать что в канале ошибка. Если ошибка, то все должны это сообщение выкинуть. Цитата(Fledgling @ Sep 30 2008, 22:09) Как это можно определить? Выставляется ли контроллером какой нибудь флаг в CSR или Message Control Register, сообщающий о том, что именно все адресаты получили сообщение? Почитайте стандарт, там все доходчиво сказано, даже с картинками и в переводе
  15. Цитата(Vokchap @ Sep 30 2008, 21:57) Если соотношение тактовой частоты контроллера и шины большое, возможна ситуация, когда при последовательной отправке двух и более сообщений один канал начнет передачу первого сообщения, а флаг занятости передатчика (либо канала) будет выставлен позднее, чем будет выполнена его проверка для возможности передачи второго сообщения. В итоге пойдет запись второго пакета в тот-же канал, он будет частично переписан, т.е. комбинация двух сообщений (CRC будет верна). Если контроллер так криво работает, то как вообще тогда можно работать с ним?
  16. Цитата(Fledgling @ Sep 30 2008, 20:51) Вот как раз вопрос в том, можно ли получить подтверждение принятия кадра несколькими приемниками и необходимо ли повторять передачу (по идее CAN считается защищенным от ошибок протоколом В CAN сообщение считается переданным только тогда, когда все "сказали" что все до них дошло без ошибок.
  17. Цитата(Fledgling @ Sep 30 2008, 00:19) Перегрузки на шине тоже не наблюдается, сокращали поток выдачи до 1 кадра с частотой 100Гц - количество пропусков снизилось, но осталось на высоком и неприемлимом уровне. Перегрузка легко считается. Какая скорость используется? Сколько байт данных в сообщении? Какие драйвера применены? Какие расстояния? Терминаторы на месте? Контролируете ошибки в контроллере CAN?
  18. Цитата(Fledgling @ Sep 29 2008, 22:47) UP! можно долго апать, но это дело не сдвинет с места. Ваш вариант описания ситуации мало что говорит. По всей видимости дело в программе или в протоколе, который вы пытаетесь огранизовать. Каким образом распределены ID CAN-сообщений по устройствам?
  19. Цитата(WiseAlex @ Sep 28 2008, 01:26) да 5.1. вроде в последнем особых отличий не было мы диск и не заказали, но если у них стало получше с компиляцией, надо взять. Кстати, может Вы в курсе, на КТЦ диски в наличии есть? Пятая версия - переходная, запускал ее пару раз, потом быстро вышла 6. Диски не нужны. Файлы с прошлогоднего диска заливал сюда, а сейчас можно все взять с сайта производителя -- http://electronix.ru/forum/index.php?showtopic=52837 ЦитатаВсе никак не спрыгнем с Softune. Уже раз 5 про eclipse думали но каждый раз все упирается в необходимость где-то найти время... Нехватка времени ощущается, вам даже не было времени обновить софт, к которому у вас имеются замечания
  20. Цитата(WiseAlex @ Sep 26 2008, 17:30) inline я так и не заставил разворачиваться в fr на с++ В проектике на scmRTOS все работает с инлайнами. Цитатаи еще если ставить оптимизацию на max speed для всей программы компиляция падает а если только отдельные файлы, то нормально, хотя и жрет при этом на моем проекте около 1 гига памяти при компиляции... Правда использует таки два ядра короче компилятор достаточно кривой вернее не достаточно ровный Случайно не пятую версию пользуете? В оболочке Softune FR ни разу не компилил, а мейком все работает при любой оптимизации.
  21. Привет! Ищется конвертер интерфейсов RS232С(sync)<>RS485. Необходимо устройство имеющее: - один (лучше два) интерфейс синхронного последовательного интерфейса RS-232C поддерживающих HDLC. - один (лучше два) интерфейс асинхронного последовательного интерфейса, физика RS-485. Предпочтительно иметь возможность программирования контроллера.
  22. Нашел нечто подходящее - COM86, только полноценной доки нет на сайте и где это взять непонятно.
  23. Скорости не высокие, всего 19200. Существуют карты для установки в ПК (MPAC-100, MPAP-100, ACB-104), но это громоздкий и дорогой вариант.
  24. Цитата(Androliz @ Sep 22 2008, 19:14) Далее из main вызывается другая функция pressPreprocess, объявленная в другом файле, подключенном к проекту. Эта функция ипользует структуру buttStates[20].Но компилятор выдаёт ошибку, что не может найти эту переменную: identifyer buttStates is undefined... И это правильно! ЦитатаПеременная объявленная в main является локальной. Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему вызова функции из другого файла, работающей с локальными переменными? Локальная переменная она на то и локальная, чтобы ее было видно только там, где она объявлена. Пытаться обходить стандарты Си не стоит, это грабли.
  25. Цитата(MrYuran @ Sep 22 2008, 17:50) Не совсем понятно, что имеется в виду (вернее, совсем не понятно) Из простых и дешёвых могу посоветовать moxa A52/53. Это не то, у этих девайсов только асинхронный последовательный порт, обычный RS232. Нужен конвертер из синхронного(дуплексный режим) в асинхронный. Синхронный режим очень похож на SPI. Подойдет плата/девайс на базе AM186CU/CC или других микроконтроллеров с аппаратным HDLC.