Очередной "Умный дом", на этот раз модульная система...

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Andy пишет:

triac пишет:
Andy стал на лету подменять понятия
разницу между сетями, каналами и протоколами.

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

Andy пишет:

Напомни мне где я врал и на чем был ловлен с поличными

В #781 врал, в #797 был пойман на вранье.

Andy пишет:

Ты послан. Можешь не отвечать.

А, так ты слился, соплячок. Накозлил глупостей с три короба - и теперь в кусты.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Коллеги, предлагаю дискутировать , не переходя на личности. Уважайте друг друга. Читать такие вещи противно если честно. Взрослые ведь уже. Мы тут письками не мереемся, мы пытаемся сеть построить.

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

Коллеги, предлагаю дискутировать , не переходя на личности. Уважайте друг друга. Читать такие вещи противно если честно. Взрослые ведь уже. Мы тут письками не мереемся, мы пытаемся сеть построить.

Согласен полностью.

riv
Offline
Зарегистрирован: 20.07.2017

Т.к. согласно схемы http://electronicsworld.ru/wp-content/uploads/2017/11/niren_mcp2515-CAN-Bus-Module-Schematics.png

(Так тут я сбредил, здесь пишут про ресет на 17 ноге и выводе на INT) 

19 нога не задействована я уже почти пришел к тому чтобы через 10кОм на 19 ногу GPIO от ардуино подпаять и держать там HIGH для ресета дать LOW на 10-20 мс

http://microsin.net/images/stories/hard/MCP2515-RESET-pin-example-fig9-1.png

Думаю диод с конденсатором и R не нужны т.к автосброс мы не реализуем.

(Нужно схему смотреть с платы, вешером посмотрю)

MaksVV
Offline
Зарегистрирован: 06.08.2015

автосброс по этой схеме используется для того чтобы он происходил автомаически один раз при подаче питания (требование даташита MCP2515 делать сброс после подачи питания), но нам это не нужно, т.к. мы с ардуины делаем сброс при помощи SPI. 

Вообще сброс по SPI эквивалентен,  я так понял, сбросу по пину Reset. Вот выдержка из текста описания MCP2515

MCP2515 различает два способа сброса:

1. Hardware Reset (аппаратный сброс) - низким уровнем на выводе /RESET.
2. SPI Reset - подачей команды Reset через SPI.
Функционал обоих видов сброса эквивалентен. Важно осуществить один из этих способов сброса после включения питания, чтобы гарантировать переход логики и регистров в свое состояние по умолчанию.

Я научился делать фильтры правильно. Маске 0 соответсвуют фильтры 0 и 1. Маске 1 соответствуют фильтры 2,3,4,5. Так вот нужно задавать все маски и фильтры, иначе MCP воспринимает маску и фильтр как 0, что не правильно. 

Но, т.к. у нас один из фильтров на второй разряд ID равен 00 (шириоковещательные), то в целом будут пролетать ID вообще со всеми нулями, что нам не нужно. Тут два выхода:

- Сделать широковещательные 0xFF (будет проблем с enum, т.к. выходит за пределы)

- устанавливать брошенный нами бит direction  в 1 на ВСЕХ используемыми нами сообщениях, таким образом, наши сообщения никогда не будут с ID равном полностью 0  - считаю наилучший вариант. 

если мы так сделаем, то аппаратно не будут проходить большие ID 0х00000000 и маленькие 0х000. Думаю это даст шанс на исправление косяков. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

riv пишет:

(Так тут я сбредил, здесь пишут про ресет на 17 ноге и выводе на INT) 

19 нога не задействована я уже почти пришел к тому чтобы через 10кОм на 19 ногу GPIO от ардуино подпаять и держать там HIGH для ресета дать LOW на 10-20 мс

(Нужно схему смотреть с платы, вешером посмотрю)

бывают два корпуса MCP2515 - 20 ногий TSSOP  и 18 ногий PDIP/SOIC

У нас 18 ногий PDIP/SOIC. Поэтому пин reset  у нас 17 нога. У 20 ногого TSSOP reset, всё правильно, 19 нога. Надеюсь до этого гемора с хард ресетом не дойдет. 

ЗЫ есть ещё корпус 20 ногий 4x4 QFN* у него reset тоже 17 нога. 

riv
Offline
Зарегистрирован: 20.07.2017

Нв выходе пока бъемся с софтом?

riv
Offline
Зарегистрирован: 20.07.2017

И судя по схеме через R3 на 17 ногу всегда подается +5. Знаешь номинал R3?

MaksVV
Offline
Зарегистрирован: 06.08.2015

пока вот 11 версия. Теперь аппаратно не просачиваются 0х00000000 и 0х000. Поставил в нашем скетче в отправляемом фрейме в заголовке  бит direction везде "1" (надеюсь везде исправил). 

Исправил фильтры 

MaksVV
Offline
Зарегистрирован: 06.08.2015

riv пишет:

И судя по схеме через R3 на 17 ногу всегда подается +5. Знаешь номинал R3?

дак конечно, это потяжка к питанию, чтобы помехи не влияли, а то бы так постоянно спонтанно перезагружался MCP2515. Я думаю кОм 10 он. Да, всё верно,  щас проверил 10кОм.  (маркирвка резистора 103)

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот инфа из описания MCP2515 как детектируются ошибки в MCP2515

[Детектирование ошибок]

Протокол CAN предоставляет изощренные механизмы определения наличия ошибок. Можно детектировать следующие ошибки.

CRC Error. Проверка контрольной суммы (Cyclic Redundancy Check, CRC): передатчик вычисляет специальные проверочные биты для данных начиная от SOF и заканчивая полем данных. Последовательность бит CRC передается в поле CRC фрейма. Принимающий узел также вычисляет последовательность бит CRC по той же самой формуле, что и передатчик, и сравнивает вычисленную CRC с принятой. Если обнаружено несовпадение, то произошла ошибка CRC, и тогда генерируется фрейм ошибки. Передача сообщения повторяется.

Acknowledge Error. В поле подтверждения сообщения передатчик проверяет, находится ли там доминантный бит (доминантный бит должен быть установлен приемником сообщения, тогда как передатчик посылает этот бит как рецессивный). Если в поле подтверждения отсутствует доминантный бит, то значит противоположный узел не принял корректно фрейм. Как следствие возникает ошибка подтверждения (acknowledge error), генерируется фрейм ошибки и передача сообщения повторяется.

Form Error. Если узел детектирует доминантный бит в одном из 4 сегментов, где его не должно быть - включая конец фрейма end-of-frame (EOF), промежуток между фреймами interframe space (IFS), разделитель подтверждения (acknowledge delimiter) или разделитель CRC, то тогда возникает ошибка формы, и генерируется ошибка фрейма. Передача сообщения повторяется.

Bit Error. Ошибка бита возникает, если передатчик детектирует противоположный уровень бита, не соответствующий тому, который был послан (например, передавался доминантный бит, но был детектирован рецессивный, или был передан рецессивный бит, но на шине вместо него был обнаружен доминантный бит).

Исключение имеется только для поля арбитража и слота подтверждения: если передатчик посылает рецессивный бит, и детектирует доминантный, то не генерируется ошибка бита, потому что это нормальные ситуации арбитража и получения подтверждения в протоколе CAN.

Stuff Error. Если в промежутке между началом фрейма (start-of-frame, SOF) и разделителем CRC, обнаружено 6 следующих друг за другом бит одинаковой полярности, то нарушено правило бит-стаффинга. Тогда происходит ошибка бит-стаффинга и генерируется ошибка фрейма. Передача сообщения повторяется.

Состояния ошибки. Про обнаруженные ошибки все другие узлы сети CAN узнают через генерацию и получение фреймов ошибки (error frame, см. рис. 2-4). Передача фрейма ошибочного сообщения прерывается, и этот фрейм повторяется, как только это становится возможным. Кроме того, каждый узел CAN находится в одном из 3 состояний ошибки, каждое из которых соответствует значению внутренних счетчиков ошибок:

1. Error-active (состояние активной ошибки).
2. Error-passive (состояние пассивной ошибки).
3. Bus-off (шина выключена, это относится только к передатчику).

Состояние error-active это обычное состояние, когда узел может передавать сообщения и фреймы активной ошибки (построенного из доминантных бит, см. рис. 2-4) без каких-либо ограничений.

В состоянии error-passive могут передаваться сообщения и фреймы пассивной ошибки (состоящие из рецессивных бит).

Состояние bus-off временно делает невозможным для узла участвовать в обмене по шине. Во время этого состояния сообщения не могут ни приниматься, ни передаваться. Только передатчики могут перейти в состояние bus-off.

Режимы ошибки и счетчики ошибок. Контроллер MCP2515 содержит 2 счетчика ошибок: счетчик ошибок приема Receive Error Counter, REC (см. регистр 6-2) и счетчик ошибок передачи Transmit Error Counter, TEC (см. регистр 6-1). Значения этих обоих счетчиков может прочитать управляющий микроконтроллер. Эти счетчики инкрементируются / декрементируются в соответствии со спецификацией шины CAN.

MCP2515 находится в состоянии error-active, если значение обоих счетчиков меньше 128, предела error-passive. В состояние error-passive MCP2515 переходит, если как минимум один из счетчиков ошибок равен или больше 128.

В состояние bus-off контроллер переходит, если TEC превышает 255, предел bus-off. Контроллер остается в этом состоянии, пока не будет принята последовательность восстановления шины (bus-off recovery sequence). Bus-off recovery sequence состоит из 128 передач следующих друг за другом 11 последовательных рецессивных бит (см. рис. 6-1).

Примечание: после того, как MCP2515, перейдет в bus-off, он восстановится обратно в состояние error-active без какого-либо вмешательства со стороны управляющего микроконтроллера, если шина остается в состоянии ожидания (idle) на время 128 * 11 бит. Если это нежелательно, то такая ситуация должна быть адресована обработчику прерывания.
Текущий режим работы MCP2515 может быть прочитан управляющим микроконтроллером через регистр EFLG (см. регистр 6-3).

Дополнительно есть бит флага предупреждения о состоянии ошибки (error state warning flag, EFLG:EWARN), который установится, если как минимум один из счетчиков ошибок превысит лимит 96. Бит EWARN сбрасывается, если оба счетчика ошибок станут меньше 96.

 

По идее в момент глюка можно вывести инфу в каком режиме по ошибкам находится MCP2515. Переполнены ли буферы. 

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

riv пишет:

И судя по схеме через R3 на 17 ногу всегда подается +5. Знаешь номинал R3?

дак конечно, это потяжка к питанию, чтобы помехи не влияли, а то бы так постоянно спонтанно перезагружался MCP2515. Я думаю кОм 10 он. Да, всё верно,  щас проверил 10кОм.  (маркирвка резистора 103)

Я тут посоветовался со своими разработчиками, они насоветовали от GPIO DUE через диод и резистор 500 ом + стабилитрон на ногу 17 подать 0. Ну это на бегу.

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

По идее в момент глюка можно вывести инфу в каком режиме по ошибкам находится MCP2515. Переполнены ли буферы. 

Сможешь это сделать? Я с регистрами вообще на Вы.

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот фукция, а вот когда её вызывать вопрос. Если мастер , то можно при каждом получении статуса от узла 

Если узел, то при каждом получении статуса мастера. 

void readErrorFlags_MCP2515 () {
  
SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0));  // начало связи по SPI ( скорость , очередность, режим SPI)
digitalWrite(csPIN, LOW);                // выбираем устройство на шине SPI (пин CS нужного устройства в лоу)
SPI.transfer(0x03);                   // команда прочитать регистры MCP2515 в BIN это 00000011
SPI.transfer(0x2D);                   // адрес регистра 6-3 EFGL - Error Flag
byte inByteSPI = SPI.transfer(0x00);  // получение данных из шины SPI
digitalWrite(csPIN, HIGH);               // отпускаем пин CS 
SPI.endTransaction();                 // конец связи по SPI

// ниже разборка полученного байта на биты
    if (inByteSPI != 0) {for (int i=0; i<8; i++) {
           if (i==0) { if (bitRead (inByteSPI, i)) Serial.print (F(" RX or TX errors >= 96   "));}
      else if (i==1) { if (bitRead (inByteSPI, i)) Serial.print (F(" RX errors >= 96   "));}
      else if (i==2) { if (bitRead (inByteSPI, i)) Serial.print (F(" TX errors >= 96   "));}
      else if (i==3) { if (bitRead (inByteSPI, i)) Serial.print (F(" RX errors >= 128. Mode ErrorPassive   "));}
      else if (i==4) { if (bitRead (inByteSPI, i)) Serial.print (F(" TX errors >= 128. Mode ErrorPassive   "));           }
      else if (i==5) { if (bitRead (inByteSPI, i)) Serial.print (F(" TX errors == 255. Mode BusOff   "));           }
      else if (i==6) { if (bitRead (inByteSPI, i)) Serial.print (F(" Переполнен буфер приёма RX0   "));           }
      else if (i==7) { if (bitRead (inByteSPI, i)) Serial.print (F(" Переполнен буфер приёма RX1   ")); Serial.println();     }
       }
    
  }
   else Serial.println (F("NO Errors"));

}

 

riv
Offline
Зарегистрирован: 20.07.2017

Воткнул твою функцию readErrorFlags_MCP2515 (); в 5 мест

1. в RX() в начале где return по 0 ID

2. в RX() в конце где default case

3. в test() под 9

4. В printStatus() в начале.

5 В конце MCP2515_Init

В итоге при кадом выводе статуса имеем список ошибок, при сбое имеем список ошибок, после инит имеем список ошибок, ну и ручками всегда можем посмотреть.

Поставил ждем.

Кстати к размышлению. У меня громе DUE которые включены в комп, все осталные платы (узлы 6-21) на автономном питании от единого БП, я из как включил 2 дня назад так и не выключал. Так вот там ошибок нет. 

Но они интенсивно в отличии от мастера с передачей 1 раз в секунду не обмениваются.

Т.е получается валимся при интенсивном обмене и не в терминаторах дело. В общем буду смотреть накопление ошибок.

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот немного подкорректированная функция чтения ошибок. Показывает кроме флагов также количество ошибок. Я в два места запихал. CTRL+F ом найдешь. 12 версия. 

riv
Offline
Зарегистрирован: 20.07.2017

Вот вылезло

00:00:03:00       
 RX or TX errors >= 96    RX errors >= 96 
 
00:00:05:00       
 RX or TX errors >= 96    TX errors >= 96    TX errors >= 128. Mode ErrorPassive 
 
00:00:05:30       
 RX or TX errors >= 96    TX errors >= 96   
 
00:00:06:00       
NO Errors
 
MaksVV
Offline
Зарегистрирован: 06.08.2015

поставь 12 версию, посмотрим как количество ошибок меняется. В описании написано что счётчики увеличиваются и уменьшаются в соответствии со спецификацией CAN - уж не знаю по какому алгоритму. 

riv
Offline
Зарегистрирован: 20.07.2017

Ты в ней только

void readErrorFlags_MCP2515 () поменял и readErrors_MCP2515 добавил?
 
  
MaksVV
Offline
Зарегистрирован: 06.08.2015

да

riv
Offline
Зарегистрирован: 20.07.2017

Вот смотри что происходит

  NODES CAN COMMUNICATION:
node_5_Net_center_Due2       OK
node_6_Hallway_net_center    OK
node_7_Hallway_main          OK
node_8_Hallway_light         OK
node_9_Kitchen_net_center    OK
node_10_Kitchen_main         OK
node_11_Kitchen_light        OK
node_12_WC_main              OK
node_13_WC_waterleak         OK
node_14_Bathroom_main        OK
node_15_Boxroom_main         OK
node_18_Loggia_recuperator   OK
node_19_Livingroom_main      OK
node_20_Bedroom_main         OK
node_21_Cabinet_main         OK

-------CAN MESSAGE RX ADRRESSED TO ME-------
 ID  CE0D0401
 type_msg  - Неизвестное сообщение  
 node_addr - node_13_WC_waterleak       
 Rem_addr  - node_4_Net_center_Due1     
 Dev_type  - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
DATA FRAME      NOT DATA, BECAUSE REMOTE FRAME

--------------------------------------------

NO ErrorFlags

 TX Errors = 0
 RX Errors = 12
Error Initializing MCP2515...

Мой адрес в сети CAN:  node_4_Net_center_Due1       MASTER!

NO ErrorFlags

 TX Errors = 7
 RX Errors = 0
Init1
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

-------CAN MESSAGE RX ADRRESSED TO ME-------
 ID  CE0D0401
 type_msg  - Неизвестное сообщение  
 node_addr - node_13_WC_waterleak       
 Rem_addr  - node_4_Net_center_Due1     
 Dev_type  - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
DATA FRAME      NOT DATA, BECAUSE REMOTE FRAME

--------------------------------------------

NO ErrorFlags

 TX Errors = 0
 RX Errors = 0
Error Initializing MCP2515...

Мой адрес в сети CAN:  node_4_Net_center_Due1       MASTER!

NO ErrorFlags

 TX Errors = 0
 RX Errors = 0
Init1
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

-------CAN MESSAGE RX ADRRESSED TO ME-------
 ID  CE0D0401
 type_msg  - Неизвестное сообщение  
 node_addr - node_13_WC_waterleak       
 Rem_addr  - node_4_Net_center_Due1     
 Dev_type  - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
DATA FRAME      NOT DATA, BECAUSE REMOTE FRAME

--------------------------------------------

NO ErrorFlags

 TX Errors = 0
 RX Errors = 12
Error Initializing MCP2515...

Мой адрес в сети CAN:  node_4_Net_center_Due1       MASTER!

NO ErrorFlags

 TX Errors = 7
 RX Errors = 0
Init1
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

-------CAN MESSAGE RX ADRRESSED TO ME-------
 ID  CE0D0401
 type_msg  - Неизвестное сообщение  
 node_addr - node_13_WC_waterleak       
 Rem_addr  - node_4_Net_center_Due1     
 Dev_type  - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
DATA FRAME      NOT DATA, BECAUSE REMOTE FRAME

--------------------------------------------

NO ErrorFlags

 TX Errors = 0
 RX Errors = 0
Error Initializing MCP2515...

Мой адрес в сети CAN:  node_4_Net_center_Due1       MASTER!

NO ErrorFlags

 TX Errors = 0
 RX Errors = 0
Init1
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

-------CAN MESSAGE RX ADRRESSED TO ME-------
 ID  CE0D0401
 type_msg  - Неизвестное сообщение  
 node_addr - node_13_WC_waterleak       
 Rem_addr  - node_4_Net_center_Due1     
 Dev_type  - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
DATA FRAME      NOT DATA, BECAUSE REMOTE FRAME

--------------------------------------------

NO ErrorFlags

 TX Errors = 0
 RX Errors = 12
Error Initializing MCP2515...

Мой адрес в сети CAN:  node_4_Net_center_Due1       MASTER!

NO ErrorFlags

 TX Errors = 7
 RX Errors = 0
Init1
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

-------CAN MESSAGE RX ADRRESSED TO ME-------
 ID  CE0D0401
 type_msg  - Неизвестное сообщение  
 node_addr - node_13_WC_waterleak       
 Rem_addr  - node_4_Net_center_Due1     
 Dev_type  - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
DATA FRAME      NOT DATA, BECAUSE REMOTE FRAME

--------------------------------------------

 

riv
Offline
Зарегистрирован: 20.07.2017

Вот глянь весь лог

https://yadi.sk/d/ozOcbX7B3V5hYy

log_18.05.18.txt

MaksVV
Offline
Зарегистрирован: 06.08.2015

лог не скачивается. почему опять всё время инит происходит? Сделай отладку для мастера таким образом 

#define debug                     //отладка в сериал_монитор. Закоментировать строку после отладки

#ifdef debug
#define debugStatus               //отладка в сериал_монитор - таблица статусов узлов CAN сети (для МАСТЕРА) Закоментировать строку после отладки
bool ID_Print = 0 ;               //флаг распечатки CAN FRAMES в монитор. 0 - будут, только адресованные на данный узел. 1 - все CANFRAMES  
bool statusprint = 0 ;            //флаг распечатки статусов в монитор.  
#include "debug.h"
#endif 

 

riv
Offline
Зарегистрирован: 20.07.2017

Смотри полный лог, файл просто долго синхронизировался.

Инит происходит т.к постоянно получаем то что попадает в default

riv
Offline
Зарегистрирован: 20.07.2017

А вот сейчас ресетнулось

  NODES CAN COMMUNICATION:
node_5_Net_center_Due2       OK
node_6_Hallway_net_center    OK
node_7_Hallway_main          OK
node_8_Hallway_light         OK
node_9_Kitchen_net_center    OK
node_10_Kitchen_main         OK
node_11_Kitchen_light        OK
node_12_WC_main              OK
node_13_WC_waterleak         OK
node_14_Bathroom_main        OK
node_15_Boxroom_main         OK
node_18_Loggia_recuperator   OK
node_19_Livingroom_main      OK
node_20_Bedroom_main         OK
node_21_Cabinet_main         OK

00:00:38:30       
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

  NODES CAN COMMUNICATION:
node_5_Net_center_Due2       OK
node_6_Hallway_net_center    OK
node_7_Hallway_main          OK
node_8_Hallway_light         OK
node_9_Kitchen_net_center    OK
node_10_Kitchen_main         OK
node_11_Kitchen_light        OK
node_12_WC_main              OK
node_13_WC_waterleak         OK
node_14_Bathroom_main        OK
node_15_Boxroom_main         OK
node_18_Loggia_recuperator   OK
node_19_Livingroom_main      OK
node_20_Bedroom_main         OK
node_21_Cabinet_main         OK
Default msg_id !=0 && >12
-------CAN MESSAGE RX ADRRESSED TO ME-------
 ID  8E090400
 type_msg  - Неизвестное сообщение  
 node_addr - node_9_Kitchen_net_center  
 Rem_addr  - node_4_Net_center_Due1     
 Dev_type  - NULL DEVICE
DATA FRAME      00 00 00 00 00 00 00 00 
--------------------------------------------

 RX or TX errors >= 96   
 RX errors >= 96   
 TX errors >= 96   
 RX errors >= 128. Mode ErrorPassive is ON  
 TX errors >= 128. Mode ErrorPassive is ON  
 TX errors == 255. Mode BusOff is ON  
 Переполнен буфер приёма RX0   
 Переполнен буфер приёма RX1   


 TX Errors = 255
 RX Errors = 255


MCP2515 Initialized Successfully! after REINIT

Мой адрес в сети CAN:  node_4_Net_center_Due1       MASTER!

NO ErrorFlags

 TX Errors = 0
 RX Errors = 255

Init!

 RX or TX errors >= 96   
 RX errors >= 96   
 TX errors >= 96   
 RX errors >= 128. Mode ErrorPassive is ON  
 TX errors >= 128. Mode ErrorPassive is ON  
 TX errors == 255. Mode BusOff is ON  
 Переполнен буфер приёма RX0   
 Переполнен буфер приёма RX1   


 TX Errors = 255
 RX Errors = 255


00:00:39:00       
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

  NODES CAN COMMUNICATION:
node_5_Net_center_Due2       OK
node_6_Hallway_net_center    OK
node_7_Hallway_main          OK
node_8_Hallway_light         OK
node_9_Kitchen_net_center    OK
node_10_Kitchen_main         OK
node_11_Kitchen_light        OK
node_12_WC_main              OK
node_13_WC_waterleak         OK
node_14_Bathroom_main        OK
node_15_Boxroom_main         OK
node_18_Loggia_recuperator   OK
node_19_Livingroom_main      OK
node_20_Bedroom_main         OK
node_21_Cabinet_main         OK

00:00:39:30       
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

  NODES CAN COMMUNICATION:
node_5_Net_center_Due2       OK
node_6_Hallway_net_center    OK
node_7_Hallway_main          OK
node_8_Hallway_light         OK
node_9_Kitchen_net_center    OK
node_10_Kitchen_main         OK
node_11_Kitchen_light        OK
node_12_WC_main              OK
node_13_WC_waterleak         OK
node_14_Bathroom_main        OK
node_15_Boxroom_main         OK
node_18_Loggia_recuperator   OK
node_19_Livingroom_main      OK
node_20_Bedroom_main         OK
node_21_Cabinet_main         OK

Ну вот откуда эти левые ID 8E090400

MaksVV
Offline
Зарегистрирован: 06.08.2015

ага неизвестный тип сообщения , да ещё фрейм ремоут докучи О_О.  Эта шина над нами издевается, ноль убрали  - дак это стало просачиваться. При том что MCP2515 виснет к тому же при получении такого сообщения. И видимо на пине INT висит сигнал что сообщение принято, и он одно и тоже глюкавое б/у шное сообщение показывает. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

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

Ну а сейчас от 9 было

041 -------CAN MESSAGE RX ADRRESSED TO ME-------
042  ID  8E090400
043  type_msg  - Неизвестное сообщение 
044  node_addr - node_9_Kitchen_net_center 
045  Rem_addr  - node_4_Net_center_Due1    
046  Dev_type  - NULL DEVICE
047 DATA FRAME      00 00 00 00 00 00 00 00
048 --------------------------------------------

Важно же не только из-за чего но и что делать если. Мало того CAN сам должкн отрабатывать 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

riv пишет:
Так что же нам поможет ;-)
ООП более структурировано, привыкнете писать красиво и правильно. По своему опыту знаю проекты, начавшиеся на чистом С, обычно переписываются на С++, обратно никогда.
riv пишет:
вопрос про легкость согласования длинноволновых линий связи. Утверждение основано на опыте или теории?
Опыт в соответствии с теорией. Произвольную топологию в принципе нельзя согласовать. Задержка распространения сигнала в медном кабеле 4.8 мкс/км, 19200 это предел для несогласованной линии 1 км.

riv
Offline
Зарегистрирован: 20.07.2017

Andy пишет:

riv пишет:
Так что же нам поможет ;-)
ООП более структурировано, привыкнете писать красиво и правильно. По своему опыту знаю проекты, начавшиеся на чистом С, обычно переписываются на С++, обратно никогда.
riv пишет:
вопрос про легкость согласования длинноволновых линий связи. Утверждение основано на опыте или теории?
Опыт в соответствии с теорией. Произвольную топологию в принципе нельзя согласовать. Задержка распространения сигнала в медном кабеле 4.8 мкс/км, 19200 это предел для несогласованной линии 1 км.

Я то насчет КСВ с КБВ и четверть волонового трансформатора имел в виду. Ну и чем длиннее волна тем сложнее согласовывать линии. Снижение скорости снижаетчастоту но и увеличивает длинну волны.

Я конечно понимаю что тут манипуляция а не модуляция, так как физ линия, но все же.

Ну и проблемы то у нас другого характера, ошибки на CAN есть но они очень эпизодические. Явно если бы линиям было недостаточно согласования она бы часами не стояла нормально. 

riv
Offline
Зарегистрирован: 20.07.2017

Вот новый сбой но ресетнулось нормально

00:01:31:30       
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

  NODES CAN COMMUNICATION:
node_5_Net_center_Due2       OK
node_6_Hallway_net_center    OK
node_7_Hallway_main          OK
node_8_Hallway_light         OK
node_9_Kitchen_net_center    OK
node_10_Kitchen_main         OK
node_11_Kitchen_light        OK
node_12_WC_main              OK
node_13_WC_waterleak         OK
node_14_Bathroom_main        OK
node_15_Boxroom_main         OK
node_18_Loggia_recuperator   OK
node_19_Livingroom_main      OK
node_20_Bedroom_main         OK
node_21_Cabinet_main         OK
Default msg_id !=0 && >12
-------CAN MESSAGE RX ADRRESSED TO ME-------
 ID  8E0D0400
 type_msg  - Неизвестное сообщение  
 node_addr - node_13_WC_waterleak       
 Rem_addr  - node_4_Net_center_Due1     
 Dev_type  - NULL DEVICE
DATA FRAME      61 80 00 00 00 00 00 00 
--------------------------------------------

 RX or TX errors >= 96   
 RX errors >= 96   
 TX errors >= 96   
 RX errors >= 128. Mode ErrorPassive is ON  
 TX errors >= 128. Mode ErrorPassive is ON  
 TX errors == 255. Mode BusOff is ON  
 Переполнен буфер приёма RX0   
 Переполнен буфер приёма RX1   


 TX Errors = 255
 RX Errors = 255


MCP2515 Initialized Successfully! after REINIT

Мой адрес в сети CAN:  node_4_Net_center_Due1       MASTER!

NO ErrorFlags

 TX Errors = 0
 RX Errors = 255

Init!

 RX or TX errors >= 96   
 RX errors >= 96   
 TX errors >= 96   
 RX errors >= 128. Mode ErrorPassive is ON  
 TX errors >= 128. Mode ErrorPassive is ON  
 TX errors == 255. Mode BusOff is ON  
 Переполнен буфер приёма RX0   
 Переполнен буфер приёма RX1   


 TX Errors = 255
 RX Errors = 255


00:01:32:00       
NO ErrorFlags

 TX Errors = 0
 RX Errors = 0

  NODES CAN COMMUNICATION:
node_5_Net_center_Due2       OK
node_6_Hallway_net_center    OK
node_7_Hallway_main          OK
node_8_Hallway_light         OK
node_9_Kitchen_net_center    OK
node_10_Kitchen_main         OK
node_11_Kitchen_light        OK
node_12_WC_main              OK
node_13_WC_waterleak         OK
node_14_Bathroom_main        OK
node_15_Boxroom_main         OK
node_18_Loggia_recuperator   OK
node_19_Livingroom_main      OK
node_20_Bedroom_main         OK
node_21_Cabinet_main         OK

Причем заметь опять ID  8E0D0400

Это не глюк это системная ошибка, причем приглядись к датафрейму 61 80 00 00 00 00 00 00. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

говорю отключай этот 13 узел, он несчастливый) 

А вообще регистры  неадекватно показывает. То все биты сразу 1. То все 0. Ошибки то 255, то 0 - бред. Хотя проверял на регистре режима работы (нормал, лупбэк, листен онли, слип) - нормально показывает, значит правильно запрашиваю. и раз ID начинается с 8 значит direction равно 0. А я везде сделал его 1. То бишь бабайка этот фрейм отправил.  Домовёнок у тебя к кану подключился. 21 век как никак. 

И самое главное как оно просочилось через фильтр? О_О

Фильтр стоит что direction только с 1 должен проходить. можешь проверить на простом скетче. Это не поддается объяснению. 

riv
Offline
Зарегистрирован: 20.07.2017

Вот уже 3 часа работает с 2мя сбоями и самовосстановлением.

Просбочка есть встрой код часов, стобы выдавалось не только милс время но и от часов.  Или я свой набросаю, встрой потом в скетч.

У меня трое часов загашнике нашлось

DS1302

DS1307

DS3231

Если у тебя нет каких то из них я тогда свой код под DS3231 напишу.

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

А вообще регистры  неадекватно показывает. То все биты сразу 1. То все 0. Ошибки то 255, то 0 - бред. Хотя проверял на регистре режима работы (нормал, лупбэк, листен онли, слип) - нормально показывает, значит правильно запрашиваю. и раз ID начинается с 8 значит direction равно 0. А я везде сделал его 1. То бишь бабайка этот фрейм отправил.  Домовёнок у тебя к кану подключился. 21 век как никак. 

Это из твоего кода ф-я RX case REQUEST_SEND

TX(0,REQUEST_ANSWER, dev_addr, dev_TYPE, EXTENDED, DATA_CANFRAME, DlC, DataP);

Первый 0 это dir 0

Ну и вообще может уйти от 11bit ID  и произвольных DLC

Везде 29 и 8?

MaksVV
Offline
Зарегистрирован: 06.08.2015

dlc 8 не везде. В REQUEST_SEND я вообщето direction исправил в 11 версии ещё вроде как . Ты хоть мои скетчи то заливаешь или гибриды опять делаешь? А то наворотим щас тут. Я буду думать что исправил, а у тебя в итоге не исправлено. А потом думай, почему не работает. Часы 3231 есть. код выложу

MaksVV
Offline
Зарегистрирован: 06.08.2015

короче если опять шина закозлит заливай опять упрощённый скетч - я его немного поправил. Он на коротких ID. мастер шлёт статус ID 666. Узлы отвечают 0XX, где ХХ - адрес узла. Посмотрим как себя поведёт. Заметь скорость поставил 125 кбит. 500 больше не ставь нигде, нафиг такая большая не нужна. Тем более расстояния довольно большие. 125 в самый раз. 

#include <mcp_can.h>
#include <SPI.h>

// Выбираем аппаратную часть узла

#define ARD_UNO
//#define ARD_MEGA
//#define ARD_DUE


#ifdef ARD_UNO 
#define can CAN0
MCP_CAN can(10); 
#endif
#ifdef ARD_MEGA
#define can CAN0
MCP_CAN can(53); 
#endif
#ifdef ARD_DUE
#define can CAN3                             
MCP_CAN can(52);  
#endif

typedef enum Node_addr_enum
{
    broadcast,                            //0
    node_1_Net_center_PC,                 //1
    node_2_Net_center_oraPi1,             //2
    node_3_Net_center_oraPi2,             //3 
    node_4_Net_center_Due1,               //4
    node_5_Net_center_Due2,               //5
    node_6_Hallway_net_center,            //6
    node_7_Hallway_main,                  //7
    node_8_Hallway_light,                 //8
    node_9_Kitchen_net_center,            //9
    node_10_Kitchen_main,                  //10
    node_11_Kitchen_light,                 //11
    node_12_WC_main,                       //12
    node_13_WC_waterleak,                  //13
    node_14_Bathroom_main,                 //14
    node_15_Boxroom_main,                  //15
    node_16_Balcony_meteo,                 //16                          
    node_17_Loggia_main,                   //17                             
    node_18_Loggia_recuperator,            //18                             
    node_19_Livingroom_main,               //19                             
    node_20_Bedroom_main,                  //20                             
    node_21_Cabinet_main,                  //21                             
    SIZE_Node_addr_ENUM                    //22 size    
}Node_addr_enum;               

const byte NODS_NUMBER = SIZE_Node_addr_ENUM;



// Назначаем адрес данного узла

//const byte node_address = node_1_Net_center_PC;                 //1
//const byte node_address = node_2_Net_center_oraPi1;             //2
//const byte node_address = node_3_Net_center_oraPi2;             //3 
//const byte node_address = node_4_Net_center_Due1;               //4
//const byte node_address = node_5_Net_center_Due2;               //5
//const byte node_address = node_6_Hallway_net_center;            //6
const byte node_address = node_7_Hallway_main;                  //7
//const byte node_address = node_8_Hallway_light;                 //8
//const byte node_address = node_9_Kitchen_net_center             //9
//const byte node_address = node_10_Kitchen_main;                  //10
//const byte node_address = node_11_Kitchen_light;                 //11
//const byte node_address = node_12_WC_main;                       //12
//const byte node_address = node_13_WC_waterleak;                  //13
//const byte node_address = node_14_Bathroom_main;                 //14
//const byte node_address = node_15_Boxroom_main;                  //15
//const byte node_address = node_16_Balcony_meteo;                 //16                          
//const byte node_address = node_17_Loggia_main;                   //17                             
//const byte node_address = node_18_Loggia_recuperator;            //18                             
//const byte node_address = node_19_Livingroom_main;               //19                             
//const byte node_address = node_20_Bedroom_main;                  //20                             
//const byte node_address = node_21_Cabinet_main;                  //21       



// Выбираем узлы подключенные к CAN шине 

const bool NodeCANpresence[22] = 
{
  0, //  broadcast,                            //0
  0, //  node_1_Net_center_PC,                 //1
  0, //  node_2_Net_center_oraPi1,             //2
  0, //  node_3_Net_center_oraPi2,             //3 
  1, //  node_4_Net_center_Due1,               //4
  0, //  node_5_Net_center_Due2,               //5
  0, //  node_6_Hallway_net_center,            //6
  1, //  node_7_Hallway_main,                  //7
  1, //  node_8_Hallway_light,                 //8
  0, //  node_9_Kitchen_net_center,            //9
  1, //  node_10_Kitchen_main,                  //10
  0, //  node_11_Kitchen_light,                 //11
  0, //  node_12_WC_main,                       //12
  0, //  node_13_WC_waterleak,                  //13
  0, //  node_14_Bathroom_main,                 //14
  0, //  node_15_Boxroom_main,                  //15
  0, //  node_16_Balcony_meteo,                 //16                          
  0, //  node_17_Loggia_main,                   //17                             
  0, //  node_18_Loggia_recuperator,            //18                             
  0, //  node_19_Livingroom_main,               //19                             
  0, //  node_20_Bedroom_main,                  //20                             
  0, //  node_21_Cabinet_main,                  //21                             
    };  


// Выбираем смысловую нагрузку узла 


//#define type_node_master
//#define type_node_slave
#define type_node_mk



long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];


#define CAN0_INT 2                              // Set INT to pin 2

byte StatusMK[22] = {0};


unsigned long prevtimeStatus = 0;
bool TimerStatus = 0;
unsigned long prevPrintStatus = 0;

void setup()
{
  Serial.begin(115200);
  
  
   if(can.begin(MCP_STDEXT, CAN_125KBPS, MCP_8MHZ) == CAN_OK)
    Serial.println("MCP2515 Initialized Successfully!");
  else
    Serial.println("Error Initializing MCP2515...");
 #ifdef type_node_master
  can.init_Mask(0,0,0x07000000);     //маска на самый левый разряд ID - для мастера
  can.init_Filt(0,0,0x00000000);     // фильтр чтобы левый разряд ID был 0 - для мастера
  #else
  can.init_Mask(0,0,0x07FF0000);    // маска на весь ID - для узла
  can.init_Filt(0,0,0x06660000);   //  только ID 666 проходят - для узла
  #endif
  can.setMode(MCP_NORMAL);                     

  pinMode(CAN0_INT, INPUT);                          
  
  Serial.println("MCP2515 Library Receive Example...");
}

void loop()
{
  if(!digitalRead(CAN0_INT))                        
  {
    can.readMsgBuf(&rxId, &len, rxBuf);     
 #if defined (type_node_slave) or defined (type_node_mk)   
  if (rxId == 0x666) {prevtimeStatus = millis(); TimerStatus = 1; Serial.println(F("Receive StatusMaster"));}
 #endif

#ifdef type_node_master
if (rxId >0 && rxId<22) StatusMK[rxId] = 0;

#endif 
  }

 #if defined (type_node_slave) or defined (type_node_mk)   
if  (TimerStatus && millis() - prevtimeStatus > node_address*50) {
byte data[8]= {255,255,255,255,255,255,255,255};
byte sndStat = can.sendMsgBuf(node_address, 0, 8, data);
if(sndStat == CAN_OK){ Serial.println(F("Send my Status successfully!"));}
else { Serial.println(F("Error Send my Status!!! "));}
TimerStatus = 0;}
 #endif 






#ifdef type_node_master
if  (millis() -prevtimeStatus > 2000) {
for (int i = 0; i<22; i++) StatusMK[i]++;

byte data[8]= {0,0,0,0,0,0,0,0};
can.sendMsgBuf(0x666, 0, 8, data); 
prevtimeStatus = millis();}



if (millis() - prevPrintStatus > 15000) {
  
  Serial.println(); Serial.println(F("NODE STATUS")); 
  for (int i = 1; i<22; i++) {if (i!=4 && NodeCANpresence[i]) {Serial.print (i);  if (StatusMK[i]<=4) Serial.println (F("  OK")); else Serial.println (F("  FAIL"));  }}
  Serial.println();
    prevPrintStatus = millis();
  }

#endif
}

 

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

dlc 8 не везде. В REQUEST_SEND я вообщето direction исправил в 11 версии ещё вроде как . Ты хоть мои скетчи то заливаешь или гибриды опять делаешь? А то наворотим щас тут. Я буду думать что исправил, а у тебя в итоге не исправлено. А потом думай, почему не работает. Часы 3231 есть. код выложу

Заливаю твои, но подкручиваю дебаг, сам видишь как выводит, меня это отправлено в CAN достает в логе.

Вроде залита 11 с измененной ф-й вывода ошибок из 12. Я специально спросил, ты только ее изменил.

Я кстати про это и говорил что

1. Вставляй в основной файл что то вроде //ver 12 

2. По времени подготовить код и залить его во все контроллеры это 2-3 часа. Поэтому без серьезных изменения я только в DUE меняю код. И кстати МК не вснут

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

короче если опять шина закозлит заливай опять упрощённый скетч - я его немного поправил. Он на коротких ID. мастер шлёт статус ID 666. Узлы отвечают 0XX, где ХХ - адрес узла. Посмотрим как себя поведёт. Заметь скорость поставил 125 кбит. 500 больше не ставь нигде, нафиг такая большая не нужна. Тем более расстояния довольно большие. 125 в самый раз. 

Ок завтра поставлю. Пусть 12 простоит ночь. Уже 4 часа без малого стоит.

MaksVV
Offline
Зарегистрирован: 06.08.2015

код часов. Не проверял, нету под рукой DS3231. библиотека

#include <RTC.h>
#include <Wire.h> 

RTC  time;
byte ss; //секунда 
byte mm; //минута 
byte hh; //час
byte dd; //день месяца
byte wd; //день недели
byte mn; //месяц 

void setup() {
  time.begin(RTC_DS3231);  //  RST, CLK, DAT инициализация модуля часов    
}

void loop() {
DS_3231 (); 

}

void DS_3231 () {
time.gettime();
ss = time.seconds;
mm = time.minutes;
hh = time.Hours;
dd = time.day;
wd = time.weekday;
mn = time.month; 
}

в либе смотри пример, как часы настроить и вообще почитай коменты

riv
Offline
Зарегистрирован: 20.07.2017

Опять сбойнуло https://yadi.sk/d/ozOcbX7B3V5hYy

log_18.05.18-2.txt

riv
Offline
Зарегистрирован: 20.07.2017

Опять сбойнуло https://yadi.sk/d/ozOcbX7B3V5hYy

log_18.05.18-2.txt

Да и смотри какое кино реконект по com порту ресетит MCP нормально.

MaksVV
Offline
Зарегистрирован: 06.08.2015

riv пишет:

Заливаю твои, но подкручиваю дебаг, сам видишь как выводит, меня это отправлено в CAN достает в логе.

Я же тебе говорил как дебаг настроить 

riv пишет:
Вроде залита 11 с измененной ф-й вывода ошибок из 12. Я специально спросил, ты только ее изменил.

нужно наверное убрать в 5 местах обращения к регистрам - коряво всё это работает почему то

riv пишет:
1. Вставляй в основной файл что то вроде //ver 12
 

ладно, просто в шапке показывается же название файла. Но ок, мне не сложно это добавлять. 

riv пишет:
По времени подготовить код и залить его во все контроллеры это 2-3 часа. Поэтому без серьезных изменения я только в DUE меняю код.

но вот это конечно не гуд, из-за этого  и могут быть проблемы. Где то скетч старый остался, а мы тут гадаем, че за шляпа творится. И убери пока DUE - глючная она. Потом вернёшь когда всё наладится.  

 

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

Я же тебе говорил как дебаг настроить 

ладно, просто в шапке показывается же название файла. Но ок, мне не сложно это добавлять. 

но вот это конечно не гуд, из-за этого  и могут быть проблемы. Где то скетч старый остался, а мы тут гадаем, че за шляпа творится. И убери пока DUE - глючная она. Потом вернёшь когда всё наладится.  

Посмотри файл лога, как на DUE добиться такого вывода настройками?

Я беру твой пакет, создаю под каждый папку с именем узла, переименовываю основной файл, открываю, настраиваю. На выходе если нет указателя что за версия то хрен поймешь что стоит. Так что лучше даже в лог пусть выводит вместе с именем узла.

Ну я условно сказал. Везде стоит 11 версия, так как лог я снимаю только с DUE то протсо вставил ф-ю снятия ошибок из регистров.

DUE завтра поменяю. Но я думаю не в DUE дело. Каждая плата свои либы имеет и может конфликтовать.

MaksVV
Offline
Зарегистрирован: 06.08.2015

riv пишет:
Посмотри файл лога, как на DUE добиться такого вывода настройками?

ну вот что это в отладке ? 

Default msg_id !=0 && >12
----------CAN BROADCAST MESSAGE RX----------
 ID  20
 type_msg  - NULL_C
 node_addr - ШИРОКОВЕЩАТЕЛЬНО           
 Rem_addr  - ШИРОКОВЕЩАТЕЛЬНО           
 Dev_type  - Неизвестное устройство  
DATA FRAME      
--------------------------------------------

какое то Default msg_id !=0 && >12 вспыло. зачем ты ID_Print в труе ставишь. Нафиг эти рамки - по ID уже и так на глаз всё определяем, примелькаклось уже. 

У меня кстати при удачной перинициализации вообще не так в отадке всё было . см видос. Че то у тебя не так как у меня в скетче, похоже. 

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

riv пишет:
Посмотри файл лога, как на DUE добиться такого вывода настройками?

ну вот что это в отладке ? 

Default msg_id !=0 && >12
----------CAN BROADCAST MESSAGE RX----------
 ID  20
 type_msg  - NULL_C
 node_addr - ШИРОКОВЕЩАТЕЛЬНО           
 Rem_addr  - ШИРОКОВЕЩАТЕЛЬНО           
 Dev_type  - Неизвестное устройство  
DATA FRAME      
--------------------------------------------

какое то Default msg_id !=0 && >12 вспыло. зачем ты ID_Print в труе ставишь. Нафиг эти рамки - по ID уже и так на глаз всё определяем, примелькаклось уже. 

У меня кстати при удачной перинициализации вообще не так в отадке всё было . см видос. Че то у тебя не так как у меня в скетче, похоже. 

#define debug                     //отладка в сериал_монитор. Закоментировать строку после отладки

#ifdef debug
#define debugStatus               //отладка в сериал_монитор - таблица статусов узлов CAN сети (для МАСТЕРА) Закоментировать строку после отладки
bool ID_Print = 0 ;               //флаг распечатки CAN FRAMES в монитор. 0 - будут, только адресованные на данный узел. 1 - все CANFRAMES  
bool statusprint = 0 ;            //флаг распечатки статусов в монитор.  

Эээ я как бы твой код из другого места (чуть выше) взял и ткнул в нужное мне место ( RX default)

У меня отладка Ночью идет и места на твой развернутый как в видео дебаг в консоле нет, она начнет затираться. 

Я вывожу раз в 60 сек сост узлов и при аварии состояние авариии. Смотреть чем обмениваются в другое время узлы нет смысла.

MaksVV
Offline
Зарегистрирован: 06.08.2015

я не знаю в чём у тебя там проблема, но на узле аж на 4 часа хватает такой записи в мониторе порта. Этого хватит, чтобы косяки засечь. Не говоря уже про мастер, где данные два раза в минуту пишутся. Там весь лог записался от начала до конца.  Вот 5-часовой тест мастера и одного узла №10. Глюки отсутсвуют полностью. В конце, для прикола, сделал с монитора порта переинициализацию MCP2515. Если бы были косяки, по такой отладке у узла можно определить что  и когда он отсылал и получил. Время у него посмотреть, не простаивало ли. Сравнить что в это время на мастере творилось. 

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

я не знаю в чём у тебя там проблема, но на узле аж на 4 часа хватает такой записи в мониторе порта. Этого хватит, чтобы косяки засечь. Не говоря уже про мастер, где данные два раза в минуту пишутся. Там весь лог записался от начала до конца.  Вот 5-часовой тест мастера и одного узла №10. Глюки отсутсвуют полностью. В конце, для прикола, сделал с монитора порта переинициализацию MCP2515. Если бы были косяки, по такой отладке у узла можно определить что  и когда он отсылал и получил. Время у него посмотреть, не простаивало ли. Сравнить что в это время на мастере творилось. 

Поставил 12 версию на мастер без

   // SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0));
   // digitalWrite(csPIN, LOW);
   // SPI.transfer(0xC0);
  //  digitalWrite(csPIN, HIGH);
  //  SPI.endTransaction();
   // delay (100);

+

#define debug                     //отладка в сериал_монитор. Закоментировать строку после отладки

#ifdef debug
#define debugStatus               //отладка в сериал_монитор - таблица статусов узлов CAN сети (для МАСТЕРА) Закоментировать строку после отладки
bool ID_Print = 0 ;               //флаг распечатки CAN FRAMES в монитор. 0 - будут, только адресованные на данный узел. 1 - все CANFRAMES  
bool statusprint = 0 ;            //флаг распечатки статусов в монитор.  

Так нужно?

Инициализация у меня тоже работает.

Но вот когда глюк серьезный то сеть летит. Лог сам видел.

riv
Offline
Зарегистрирован: 20.07.2017

Так 12 версия не работает.

riv
Offline
Зарегистрирован: 20.07.2017

Постиавил 11 с теми же настройками и скопировал тольуо ф-ю с ошибками MCP

MaksVV
Offline
Зарегистрирован: 06.08.2015

что в 12 не работает?