реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
Minti
сообщение Nov 29 2011, 13:50
Сообщение #16





Группа: Участник
Сообщений: 13
Регистрация: 5-04-11
Пользователь №: 64 157



Залевши глубако в код CanFestival'я я понял, что функция canSend при "успехе" должна возвращять 0, а не 1. Хорошо это видно вот здесь:
CODE
//File: sdo.c
//function: _writeNetworkDict
//sendSDO -> return canSend
err = sendSDO(d, SDO_CLIENT, sdo);
if (err) {
MSG_ERR(0x1AD1, "SDO. Error while sending SDO to node : ", nodeId);
/* release the line */
resetSDOline(d, line);
return 0xFF;
}

Исправив это, функция ConfigureSlaveNode заработала на ура. зажимы «WAGO» включались/выключались, а вот колёса так и не крутились. Матерясь спаял "CAN-BUS" ввиде буквы Т, по концам D-Sub9(3шт.: для МК, для робота и 3й для CAN2USB-Interface, чтоб на компьютере мониторить).
Увидел следующие (ID: 1-WAGO; 3-Joystick; 4-MK (Master); A,B,C,D - 4 Мотора):
-Sync
-RPDOs от ID 1, 3, А-D (180h+NodeId)
-TPDOs от ID 1, 3 (200h+NodeId) <- ошибка А-D нету
-Heartbeat от ID 1, 3, 4, А-D

Отключил Joystick(3), запустил -> вместо него появился мотор А(см. скрин). Получается что МК только 2 TPDO обрабатывает(или успевает только 2).

Тут я вспомнил феномен с breakpont'ом. Дописал следующие чтоб отловить ТPDO с cobid 20Bh(2й мотор)
CODE
//File: pdo.c
//function: buildPDO
pdo->cob_id = (UNS16) UNS16_LE(*(UNS32*)TPDO_com->pSubindex[1].pObject & 0x7FF);
//TODO:DELETE AFTER TEST
if(pdo->cob_id == 523) //<-20Bh
prp_j = 0x00; //breakpoint line

И как следовало ожидать программа в этой строчке останавливается, а после в мониторинге появлается 20Bh один раз.
Вывод: МК обрабатывает только 2 TPDO, остальные теряются. При breakpoint'e Atollic TRUEStudio замечает что там что-то ещё есть.

Может мне кто-нибудь обяснить почему это так и как это исправить? может это "bug" в Atollic? или что-то интеррупты съедают?
Как вы вкрутили CanFestival в проэкт? как dll или просто .c/.h-фаилы импортировали? я импортировал, вот мои конфигурации:
CODE
//FILE: canfestival.h
#ifndef CANFESTIVAL_H_
#define CANFESTIVAL_H_

#include "applicfg.h"
#include "data.h"

// --------- to be called by user app ---------
void initTimer(void);
UNS8 canSend(CAN_PORT notused, Message *m);
UNS8 canChangeBaudRate(CAN_PORT port, char* baud);

#endif



//File: applicfg.h
#ifndef __APPLICFG_NONE__
#define __APPLICFG_NONE__

#include <string.h>
#include <stdio.h>

/* Integers */
#define INTEGER8 char
#define INTEGER16 short
#define INTEGER24 int
#define INTEGER32 int
#define INTEGER40 long long
#define INTEGER48 long long
#define INTEGER56 long long
#define INTEGER64 long long

/* Unsigned integers */
#define UNS8 unsigned char
#define UNS16 unsigned short
#define UNS32 unsigned int
#define UNS24 unsigned int
#define UNS40 unsigned long long
#define UNS48 unsigned long long
#define UNS56 unsigned long long
#define UNS64 unsigned long long

/* Reals */
#define REAL32 float
#define REAL64 double

#include "can.h"

/* Definition of error and warning macros */
/* -------------------------------------- */
#define MSG(...)

/* Definition of MSG_ERR */
/* --------------------- */
#define MSG_ERR(num, str, val)

/* Definition of MSG_WAR */
/* --------------------- */
#define MSG_WAR(num, str, val)

typedef void* CAN_HANDLE;
typedef void* CAN_PORT;

#endif



//File: config.h
#ifndef CONFIG_H_
#define CONFIG_H_

// Needed defines by Canfestival lib
#define MAX_CAN_BUS_ID 1
#define SDO_MAX_LENGTH_TRANSFERT 32
#define SDO_MAX_SIMULTANEOUS_TRANSFERTS 1
#define NMT_MAX_NODE_ID 128
#define SDO_TIMEOUT_MS 3000U
#define MAX_NB_TIMER 8

// CANOPEN_BIG_ENDIAN is not defined
#define CANOPEN_LITTLE_ENDIAN 1

//#define US_TO_TIMEVAL_FACTOR 8

#define REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES(repeat)\
repeat
#define REPEAT_NMT_MAX_NODE_ID_TIMES(repeat)\
repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat \
repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat \
repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat \
repeat repeat repeat repeat repeat repeat repeat repeat repeat

#define EMCY_MAX_ERRORS 8
#define REPEAT_EMCY_MAX_ERRORS_TIMES(repeat)\
repeat repeat repeat repeat repeat repeat repeat repeat

#endif



//File: timerscfg.h
#ifndef __TIMERSCFG_H__
#define __TIMERSCFG_H__

/* Time unit : us */
#define TIMEVAL UNS32
#define TIMEVAL_MAX 0xFFFF

#define MS_TO_TIMEVAL(ms) (ms * 125)
#define US_TO_TIMEVAL(us) (us>>3)
#endif



//File: can_STM32.h
#ifndef CAN_STM32_H_
#define CAN_STM32_H_

#include "config.h"
//#include "can_drv.h"

// Canfestivals includes
#include "can.h"

/************************* To be called by user app ***************************/
unsigned char canInit(unsigned int bitrate);
unsigned char canSend(CAN_PORT notused, Message *m);
unsigned char canReceive(Message *m);
unsigned char canChangeBaudRate_driver( CAN_HANDLE fd, char* baud);
#endif

Go to the top of the page
 
+Quote Post
Minti
сообщение Dec 8 2011, 23:34
Сообщение #17





Группа: Участник
Сообщений: 13
Регистрация: 5-04-11
Пользователь №: 64 157



Forger, syoma, как вы подсоединили CanFestival к проэкту? как CanFestival-3.dll или фаилы вставили?
Go to the top of the page
 
+Quote Post
Minti
сообщение Feb 12 2012, 16:01
Сообщение #18





Группа: Участник
Сообщений: 13
Регистрация: 5-04-11
Пользователь №: 64 157



Привет
Ошибку нашёл месяц назад, забыл запостить тут.

в методe canSend заменил строчку

if (CAN_Transmit(CAN1,&mess)!=CAN_NO_MB)

на

while (CAN_Transmit(CAN1,&mess) == CAN_NO_MB)

return 0 //всегда


Проблема была в том, что МК генерировал 5 messages(SYNC и 5 TPDOs) сразу, а CAN-модуль имеет только 3 transmission mailboxes. Поэтому SYNC и 2 TPDOs проходили, а остальные "шли лесом". Это и объясняет появление узла А когда узел 3 был отключен. Теперь всё работает на ура.
Go to the top of the page
 
+Quote Post
syoma
сообщение Feb 16 2012, 16:12
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Я так понял - это камень в мой огород? Ситуация с if сделана сознательно. Про грабли с 3-мя мейлбоксами я с самого начала знал. Прикол в том, что если будет while - и все боксы полны, прога будет ждать, пока бокс не освободится.
А при определенных условиях, например оборваной линии или отсутствии других CAN-узлов это может никогда не произойти. В итоге выша прога в этом месте мертво зависнет. Можете сами проверить выдернув CAN штекер.
Тут надо либо таймаут добавлять, либо еще что-то. Простым while не обойдетесь.
Go to the top of the page
 
+Quote Post
Minti
сообщение Feb 17 2012, 15:06
Сообщение #20





Группа: Участник
Сообщений: 13
Регистрация: 5-04-11
Пользователь №: 64 157



Цитата(syoma @ Feb 16 2012, 17:12) *
Я так понял - это камень в мой огород? Ситуация с if сделана сознательно. Про грабли с 3-мя мейлбоксами я с самого начала знал. Прикол в том, что если будет while - и все боксы полны, прога будет ждать, пока бокс не освободится.
А при определенных условиях, например оборваной линии или отсутствии других CAN-узлов это может никогда не произойти. В итоге выша прога в этом месте мертво зависнет. Можете сами проверить выдернув CAN штекер.
Тут надо либо таймаут добавлять, либо еще что-то. Простым while не обойдетесь.

Нет - это не камень в ваш огород. Просто про грабли с 3-мя мейлбоксами я не знал. И долго не мог понять откуда ноги ростатут: проходят только 2 TPDOs , а остальные теряются. Вот и пришла идея заменить if на while и у меня всё заработало. Кстате CAN штекер выдёргивал, робот сразу останавливался, а вот состояния микроконтроллера я не проверял. Пока даже и не знаю как проверить это.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 19:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01314 секунд с 7
ELECTRONIX ©2004-2016