Página 1 de 1

Ajuda no protocolo CAN

MensagemEnviado: 20 Ago 2008 20:13
por ivansousa
Olá outra vez :)

Eu estou a desenvolver um projecto de um robot. Agora estou na parte do controlo dos 2 motores DC. Tenho 3 placas, a placa mestre, motor direito e motor esquerdo. A placa mestre só envia mensagens e recebe das outras placas....faz o controlo das outras. (envia velocidade,aceleração e etc...)
Cada motor tem um encoder que esta ligado à respectiva placa do motor.
O meu problema é o seguinte... tou a programar no CSS já consigo meter a placa mestre a enviar pelo protocolo can e a receber.... mas as vezes tenho alguns erros... penso que é na configuração dos filtros e das mascaras da CAN... alguem me pode explicar como isto funciona? de preferencia codigo no CSS.
Comprei o livro do Fabio Pereira a pensar que explicava a can, mas infelizmente não explica :(

Obrigado pela vossa atenção.

MensagemEnviado: 21 Ago 2008 07:44
por RobL
Vamos tentar:
Não está claro, "As vezes alguns erros".
Seja num protocolo qualquer, ao solicitar a mesma função, hora funciona, hora dá erro, o problema não está no protocolo e sim, mais possivelmente em ruído, ou problemas de baud.
Você se refere a filtros digitais ou analógicos?

MensagemEnviado: 21 Ago 2008 09:28
por ivansousa
Boas!
O meu problema é que algumas vezes as placas não recebem.... o filtro e as mascaras a que referia são os da configuração da can, com os quais não sei trabalhar.

MensagemEnviado: 21 Ago 2008 09:32
por ivansousa
vou escrever o meu codigo pode ser que ajude:
Placa mestre a enviar:
tx_id[0]=0x00000250;
if(can_tbe())
{
out_data[0]=(dutyD & 0xff);
out_data[1]=(dutyD>>8) & 0xff;
printf("\n\r%d-outdata[0] \n\r %d-outofdata[1] \n\r",out_data[0],out_data[1]);
tx_len=4;
i=can_putd(tx_id[0],out_data, tx_len,tx_pri,tx_ext,tx_rtr);

if (i != 0xFF)
{
printf("\n\r\r Mensagem enviada para o motor direito \r\n"); // OK Mensagem enviada
}

Agora o motor direito a receber


if (can_kbhit() ) {
if(can_getd(rx_id, &in_data[0], rx_len, rxstat)) {
rx_id=rx_id & 0x7ff;
if (rx_len>=2) {

if (rx_id==0x00000250){ //
duty=in_data[1];
duty= duty << 8;
duty= duty+((signed long)in_data[0]);
flag=2;
ciclo=1;
}