TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: zer0 en 11 de Febrero de 2007, 17:52:35

Título: Ayuda BUS-CAN
Publicado por: zer0 en 11 de Febrero de 2007, 17:52:35
Hola estoy haciendo un proyecto en el que uso el BUS-CAN, necesitaría un poco de ayuda, uso un dspic30f6014 y el transceiver mcp2551.
Mi problema es que no se con usar la libreria de Microchip, programo el micro con el ejemplo que hay en el datasheet de las librerias de los periféricos pero no funciona. Alguien ha logrado hacerlo funcionar ?

Gracias y espero una respuesta si yo la encontrase antes la postearía.
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 12 de Febrero de 2007, 11:29:34
Hola zer0. Como haces la prueba del CAN? con el MCP o sin el? Te aconsejo que primero pruebes sin el MCP2551 porque es posible que dependiendo de la resistencia de referencia que le hallas puesto te de problemas de velocidades con el CAN. Yo te recomiendo que no uses el MCP2551 y que uses el 82C251 de Philips, que es el integrado de CAN más extendido.

De todos modos para hacer pruebas puedes quitarle el MCP y mirar con un osciloscopio la tension que tienes entre CANH y CANL. Puede que tu problema se encuentre básicamente en el transceiver.

A ver si conseguimos que funcione el bicho, ok?

Venga figura!!!!!!!! Suerte!!!!!!
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 12 de Febrero de 2007, 14:20:58
Ok, aqui en casa no tengo osciloscopio, pero he probado en la placa demo de Microchip y no funcionaba, seguire probando y os informare de mis progresos (que deden ser muy rapidos), aunque en el trabajo lo probe (mirar directamente los pins del can y no funcionaba) ¿?
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 13 de Febrero de 2007, 12:49:53
Oye zer0 porqué no pegas aquí el programa para que le podamos echar un ojo? Quizás no tengas bien configurada la máquina para el CAN. Por cierto es CAN, CANopen, Enhanced CAN,...? El CAN tiene un sinfín de variantes.

Supongo que le habrás metido la libreria can2510.h que viene dentro del compilador, pero yo te recomiendo que mires los fuentes en C que te vienen igualmente dentro del mplab. La ruta a estos fuentes, dentro de mi ordenador, es:

C:\Archivos de programa\MCC18\src\extended\pmc\CAN2510

verás que te salen un buen taco de archivos .c que necesitas para realizar el protocolo CAN. El hecho que sea para 2510 y tu uses el 2551 no importa, ya que la diferencia básica es que el 2551 es para alta velocidad, y el 2510 es para un protocolo de velocidad media.

Hoy puede ser un gran día........ duro con él!!!!!!!!! (Joan Manel Serrat)

Dews!!!!
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 13 de Febrero de 2007, 13:48:17
Te explico es mi proyecto de fin de carrera, el tgrabajo no me ha dejado tiempo y tengo que entregarlo el martes que viene, quiero usar el can pero no sabia si obligatoriamente debía orientarme hacia can o podia hacer un "micro" protocolo propio para aprobechar las ventajas hard del bus y luego una vez expuesto el proyecto mejorarlo, os paso el codigo y los esquemas (están basados en la placa demo de microchip) y uso el msp2551,  muchas gracias estoy muy muy necesitado de un cable (nunca mejor dicho).

Aqui van esquemas y código, como verás he hecho una libreria para el display que esta de coña (lastima mi ignorancia en el bus can).  Por cierto uso el C30 :( Gracias por tu ayuda a ver si puedo conseguirlo....

Primero los esquemas...
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 13 de Febrero de 2007, 13:49:22
Ahora el codigo de la consola
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 13 de Febrero de 2007, 13:50:28
Y ahora el codigo del nodo
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 13 de Febrero de 2007, 13:56:59
Muchas gracias Deimos, por cierto los tengo conectados por el sub d (2 y 7 vivo y 5 malla,¿ no hace falta cruzarlos verdad?), y una foto de la consola y otra del nodo (si tira mañana o pasado haré otro) espero que tire, por cierto el oscilador es de 8 megas y el PLL x8
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 14 de Febrero de 2007, 05:02:35
Hola zer0. A ver no he mirado todavía los archivos que adjuntas, pero...... 8MHz x 8 son 64MHz, velocidad que tu dsPIC no alcanza ni de broma. Mira en microchip la hoja técnica del dsPIC30F6014 y verás como no puede ir a la velocidad que le has puesto. Pienso que tu problema básicamente es un problema de velocidades. En cuanto tenga un minuto y mire los archivos que has subido te comento algo, pero por ahora, mira a que MIPS puede trabajar el micro, que no creo que sean 64.

En cableado del CAN hay que trenzarlo, verás que en todas las documentaciones dicen que hay que trenzar el bus de comunicaciones CAN.

Salu2!!!!!
Título: Re: Ayuda BUS-CAN
Publicado por: Nocturno en 14 de Febrero de 2007, 06:52:33
Ese micro no puede pasar de 30MIPS teóricos. En la práctica con un disipador se puede poner a 32MIPS.
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 14 de Febrero de 2007, 11:58:33
Gracias nocturno, me hacia falta la opinión de un experto. Ya ves zer0 como posiblemente tu problema venga de las velocidades a las que intentas hacer trabajar al micro. Trabajando con un PLL x8, tu cuarzo no lo puedes pasar de 4MHz, como bien dice el compañero, con disipador.

Prueba a bajar el valor del PLL, que te saldrá más barato que cambiar el cristal. Quizas a PLL x4 consigas que funcione, aunque 8MHz x 4 son 32MIPS. Mejor usa un cuarzo de 7.3728MHz y el PLL x 4, estarás casi en 30MIPS, casi al límite de la máquina.

Salu2
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 14 de Febrero de 2007, 12:20:24
Ok esta mañana el foro no tiraba luego lo pruebo y os comento muchas gracias.
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 14 de Febrero de 2007, 12:33:30
Si mirais en la pagina 146 del datasheet de la familia dspic30f6014a podréis ver que si se puede 70143c.pdf. Gracias y seguire posteandoos mis progresos. Que espero que hoy avancen he traido un osciloscopio del trabajo.
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 14 de Febrero de 2007, 14:30:14
zer0 no estás en lo cierto. Mírate la hoja de características técnicas que este micro, verás que no pasa de 30MIPS. Olvídate de combinaciones con cuarzos y PLL, en la hoja técnica te lo deja bien claro, no puede superar los 30MIPS como bien te dijo el amigo nocturno. Aquí tienes un enlace directo a la hoja técnica de tu dsPIC.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en024766

Te recomiendo que hagas una combinación de cuarzo y PLL de manera que no pases de los 30MIPS y a ver que resultado obtienes. Trabajando a 8MHz y PLL x8, es que no puede funcionar jamás, ya que lo estás llevando a un rango muy por encima de sus limitaciones.

Suerte!!!!
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 14 de Febrero de 2007, 17:43:50
http://ww1.microchip.com/downloads/en/DeviceDoc/70099D.pdf

Pagina 39 (43 del PDF) te explica como se calculan los mips y es el pll por la frecuencia del oscilador divido por 4, se puede extraer de los resultados que pone creo que es por los flancos, a la de 4 es un ciclo o algo así.
Por cierto aunque sea un cable apantallado debe trenzarse ?,  de todas formas si envío "algo" por el bus can sin cable con el osciloscopio veré si hay algo ¿no?, por cierto Deimos eres de Tiana ? yo soy de Badalona :)

Gracias.
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 14 de Febrero de 2007, 19:30:14
El CAN debe trenzarse, además has de colocar la resistencia de 60 ohm cerrando el lazo, como te sale en el datasheet del MCP2551. Mirate bien el data del transceiver, porque si no has calculado bien la resistencia de referencia, no va a ir ni de broma.

Con respecto a la velocidad has lo que quieras, pero no encontraras a nadie en el foro que le meta tanta velocidad a un dsPIC, simplemente porque no se puede. Haz pruebas sin el PLL, simplemente en HS y deberias empezar a ver algo, si es que el programa está bien hecho. Empieza a hacer ensayos a poca velocidad y si ves resultados, entonces le empiezas a poner PLL a todo lo que te deje el micro.

En el osciloscopio verás la trama entera de CAN, pero has de pinchar entre H y L, no entre una linea y masa, recuerda que el CAN es diferencial, no comun.

PD: somos vecinos, lo de tiana es el grupo de astronomia al que pertenezco.

Salu2
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 14 de Febrero de 2007, 19:46:10
Ok bajare de velocidad, solo haciendo funcionar un nodo para mirar las tramas hace falta la resistencia ? si miro directamente, una pregunta (de programación mas o menos pero electronica...)quieres decir que la sonda del osciloscopio la pinza de tierra la ponga en h y la sonda en l por ejemplo ¿?
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 14 de Febrero de 2007, 19:57:45
la resistencia siempre hace falta. mira el datasheet del mcp2551.

la pinza en L y la punta de la sonda en H

Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 14 de Febrero de 2007, 20:06:47
Pero el osciloscopio donde lo conecto, y si no hay cable solo ese nodo puedo mirar la señal ¿no?
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 14 de Febrero de 2007, 20:22:08
Veo algo a pesar de que el otro nodo no me detecta nada en la interrupcion de entrada, cuando envia sale una trama por debajo y luego sube (el osciloscopio no es digital y no puedo parar ni nada) antes no salia esta trama
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 15 de Febrero de 2007, 04:55:23
La sonda has de conectarla a la resistencia que cierra el lazo en la salida del mcp2551.

Parece que almenos ves que del micro sale una trama de CAN. Configura bien las velocidades para que el otro nodo entienda lo que le estas mandando, mi asegurate que tanto el identificador como la dirección a donde mandas sean las que tiene el nodo receptor, sino el slave no te devolverá nada.

Aunque el osciloscopio no sea digital, puedes hacer un hold y congelar una sección de la trama, almenos verás si tienes realmente valores digitales o cosas raras.
Título: Re: Ayuda BUS-CAN
Publicado por: Milo en 15 de Febrero de 2007, 05:29:12

Buennass:

Quería puntualizar una cosa para que no hayan confusiones con los mips y la frecuencia del oscilador, sin animo de entrometerme ni ofender a nadie.

Deimos
Citar
Trabajando con un PLL x8, tu cuarzo no lo puedes pasar de 4MHz, como bien dice el compañero, con disipador.

Prueba a bajar el valor del PLL, que te saldrá más barato que cambiar el cristal. Quizas a PLL x4 consigas que funcione, aunque 8MHz x 4 son 32MIPS. Mejor usa un cuarzo de 7.3728MHz y el PLL x 4, estarás casi en 30MIPS, casi al límite de la máquina.

Una cosa es la frecuencia del oscilador, que en un dspic junto con el  (PLL) puede llegar a unos 120 Mhz aproximadamente (del dspic que estamos hablando), que son los 30 MIPS famosos, por lo tanto puede trabajar a mas 32 y 64 Mhz, exactamente hasta unos 120 Mhz.

Por lo tanto para trabajar a esa velocidad con el dspic, si es lo que quieres, lo conveniente es que hagas lo te comentaba Deimos, es decir, un cuarzo de 7,3728 Mhz pero el PLL x16, con lo que conseguirás trabajar a unos 118 Mhz, que son casi los 120 Mhz es decir los 30 MIPS máximos, o 32 con disipador como bien ha probado Nocturno.

Espero haber resuelto la confusión en vez de liarla mas.

saludos,


Título: Re: Ayuda BUS-CAN
Publicado por: Milo en 15 de Febrero de 2007, 05:34:53

Pongo aquí un recorte del dsPIC30F Family Reference Manual, para aclarar mas,

página 172

VERSION 1
30F6010,
30F6011,
30F6012,
30F6013,
30F6014


PLL Clock Multiplier:
• 4 MHz-10 MHz input frequency range
• 4x Multiplier mode (FOUT = 16 MHz-40 MHz)
• 8x Multiplier mode (FOUT = 32 MHz-80 MHz)
• 16x Multiplier mode (FOUT = 64 MHz-120 MHz)
• PLL VCO lock indication plus ‘out of lock’ trap option
• PLL input provided by the following sources:
- XT or EC Primary oscillator

saludos,
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 15 de Febrero de 2007, 16:49:33
Esto a mejorado algo ahora me detecta que llega algo pero me llega una trama vacia (miro lo que va entrando en la variable del buffer y no hay nada....)¿? es el problema de no saber exactamente que proceso realiza el can de manera automatica cuando yo envío una trama y que envía en la trama, por cierto es curioso con el pll x 4 funciona por 8 no (una cosa parecida me paso con el i2c) quizas sea un bug del silicio es la primera revision de los dspic 306014 y sin A.
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 16 de Febrero de 2007, 08:15:21
Más que un bug de silicio, yo diria que la resistencia de referencia del mcp2551 no la tienes bien calculada para 8Mz, y cuando has bajado a 4MHz es cuando se ha puesto a funcionar algo. Con el i2c tambien pasa, las pull-up le marcan la velocidad máxima a la que puede ir el i2c. Hay mucha gente que cree que la cuestión es meterle pulsos de reloj y andando, y son los componentes periféricos los que normalmente marcan la velocidad. Lo mismo que los condensadores en los cristales de cuarzo, poner esos condensadores mal hace que el cuarzo no oscile correctamente.

Quizas en el registro de entrada no tienes nada porque no estas poniendo bien la dirección del nodo receptor. Si la dirección no está bien, el nodo no reconoce y por consiguiente no actualiza el registro.

Salu2
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 16 de Febrero de 2007, 12:01:35
Ese es uno de mis problemas:

Si no te importa mirar esto:

Esta es mi inicializacion del can:


CAN1SetOperationMode(CAN_IDLE_CON & CAN_MASTERCLOCK_1 & CAN_REQ_OPERMODE_CONFIG & CAN_CAPTURE_DIS);
// Baud preescale con Fcy 6,144 sin PLL -> baud rate = 5,144
// Baud preescale con Fcy 6,144 con PLLx4 -> baud rate = 23.576
CAN1Initialize(CAN_SYNC_JUMP_WIDTH2 & CAN_BAUD_PRE_SCALE(23), CAN_WAKEUP_BY_FILTER_DIS  & CAN_PROPAGATIONTIME_SEG_TQ(4) & CAN_PHASE_SEG1_TQ(4) & CAN_PHASE_SEG2_TQ(5) & CAN_SEG2_FREE_PROG & CAN_SAMPLE1TIME);      

// Cargamos el filtro de aceptación de registro.
CAN1SetFilter(0, CAN_FILTER_SID(0) & CAN_RX_EID_EN, CAN_FILTER_EID(0));

// Cargamos la mascara del filtro del registro.
  CAN1SetMask(0, CAN_MASK_SID(0) & CAN_MATCH_FILTER_TYPE, CAN_MASK_EID(0));
      
      
// Configuramos los modos de transmisión y recepción
CAN1SetTXMode(0, CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH );
CAN1SetRXMode(0, CAN_RXFUL_CLEAR & CAN_BUF0_DBLBUFFER_EN);
 CAN1SetOperationMode(CAN_IDLE_CON & CAN_MASTERCLOCK_1 & CAN_REQ_OPERMODE_NOR & CAN_CAPTURE_DIS );
ConfigIntCAN1(0x3F, CAN_INT_PRI_5 & CAN_INT_ENABLE);

Recibo en este vector de interrupción:

oid _ISR _C1Interrupt(void){
   C1EC = 0;          // Ponemos a cero los contadores de error
   C1INTF = 0;       // Deshabilito las interrupciones
   IFS1bits.C1IF = 0;    // Borro el flag de la interrupción
   if((C1INTFbits.TXEP)||(C1INTFbits.RXEP)){
         //C1CTRLbits.ABAT = 1;
         C1CTRL |= 0x400;
         while((C1CTRL & 0x80) == 0);
         C1CTRL &= 0xF800;
      }
   if(!C1TX0CONbits.TXREQ){
      // Buffer 0  está vacio y preparado para la siguiente transmisión.
      
   }
   if (C1RX0CONbits.RXFUL){
       // Mensaje completo en el buffer 0, listo para ser procesado.
       C1RX0CONbits.RXFUL = 0;    // Vaciamos el buffer 0.
   }
}

Y envio así (es una prueba)

void SendBUSCAN(void){
   char * data;

   data = "Microchip";
   CAN1SendMessage((CAN_TX_SID(0)) & CAN_TX_EID_EN & CAN_SUB_NOR_TX_REQ, (CAN_TX_EID(0)) & CAN_NOR_TX_REQ, data, 8, 0);

   while(CAN1IsTXReady(0) == 0){ // Mientras aun no este preparado para la transmisión....
      asm("clrwdt");
   }

}





De momento pongo filtro y mascara a 0,  las dudas que tengo son:

1 Para que sirve CAN_CAPTURE
2 Que es CAN_SYNC_JUMP_WIDTHN
3 Que es CAN_PROPAGATIONTIME_SEG_TQ(N)
4 Que es CAN_PHASE_SEG1_TQ(N)
5 Que es CAN_PHASE_SEG2_TQ(N)
6 Que es CAN_SEG2_FREE_PROG
7 Que es CAN_SAMPLE1TIME
(De la inicializacion no me entero de el significado de casi ningún campo ni mirandolo en el datasheet)

Y por ultimo como se el identificador de un dispositivo o como lo asigno y como envio a un dispositivo en concreto ?



Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 16 de Febrero de 2007, 12:37:21
Voy avanzando SID y EID son identificador extendido y estandar ¿no?

Debo decir a que nodo (identificador) envio el sendmessage
así ?
   char * data;
   data = "Microchip";
   CAN1SendMessage((CAN_TX_SID(1)) & CAN_TX_EID_EN & CAN_SUB_NOR_TX_REQ, (CAN_TX_EID(1)) & CAN_NOR_TX_REQ, data, 8, 0);

   while(CAN1IsTXReady(0) == 0){ // Mientras aun no este preparado para la transmisión....
      asm("clrwdt");
   }

Envio al can 1 ¿ok?

A ver que tal....

 y quien soy se lo digo con el

CAN1SetFilter(FilterNo, CAN_FILTER_SID(1) & CAN_RX_EID_EN, CAN_FILTER_EID(1));

OK ?
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 16 de Febrero de 2007, 13:14:49
Ahora el id me funciona me entra cuando es para mi es decir se "direccionarlo"
la mascara como se usa ?

y el siguiente proble ma es que todos los mensajes me lee lo mismo ¿?
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 16 de Febrero de 2007, 13:20:23
el baud rate se calcula con PLL o sin
Yo tengo un oscilador de 6,144 Mhz
Quiero emitir a 125Kh
Y tengo el PLL x4
Los resultados que me salen son: sin PLL -> baud rate = 5,144  y con PLLx4 -> baud rate = 23.576
Es correcto, cual es el bueno, Gracia sy perdonas las parrafadas, cuand me tire todo os ,lo dejare por aqui
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 16 de Febrero de 2007, 13:23:28
Me voy a comprar unoc MCP 2551 y luego a casa a seguir con esto (ahora estoy en el curro) Por favor si pasais por aqui leed mis post que estoy un poco desesperado :)
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 17 de Febrero de 2007, 08:04:10
Creo que mi problema esta en como calcular el tiempo de sincronización, de propagacion y el phase buffer 1 y 2 además del bit rate....Alguien sabe como se hace ¿?
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 17 de Febrero de 2007, 10:57:12
Hola zer0. Es que no puedes pinchar el osciloscopio directamente a la salida del dsp hombre, no me digas que estas comunicando dos nodos sin transceiver??? no te va a funcionar jamás. Si puedes conseguir un 82C251 de philips mejor que el mcp2551 de microchip te irá mejor, almenos es lo que tengo comprobado.

Todo tu problema te viene con la resistencia de referencia del transceiver. Esa es con la que marcas los tiempos de velocidad del bus CAN.

El baud rate lo calculas con PLL, asi que el bueno es PLLx4.

Otra cosa, estas programando en CCS??? es que yo de ccs no tengo ni idea de como va, se que son rutinas precocinadas que las puedes llamar y te ahorran bastante faena, pero no se como se configura ni nada, yo me quedé en C y asm.

Porqué no te miras las rutinas que te puse? las que vienen dentro del mcc18, échales un vistazo, quizás te aclare algunas ideas.

Por cierto, aun no has dicho si trabajas en CAN, CANopen o EnhancedCAN, o que usas, porque dependiendo del protocolo que uses dentro del CAN, la cosa te puede variar bastante.

Suerte zer0
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 17 de Febrero de 2007, 12:55:27
No hombre no....es que tego tres dispositivos y uno se le jodio el transceiver :))
Título: Re: Ayuda BUS-CAN
Publicado por: zer0 en 17 de Febrero de 2007, 12:56:16
Estoy programando con el C30
Título: Re: Ayuda BUS-CAN
Publicado por: Deimos en 17 de Febrero de 2007, 22:00:13
Ya se que programas un C30 hombre, lo que te pregunto que tipo de lenguaje de programacion usas, porque esa manera de configurar el CAN parece en CCS o CSS o como se escriba. Quiero decir si usas el mplab para picar el programa o usas otro programa para que te genere las cabeceras? Tampoco me suena como sirves la interrupcion. En c30 es attribute, y no lo veo por ninguna parte. Mirate las rutinas que te dige del mcc18, y veras como se configura dependiendo del tipo de CAN que estes empleando.

Los mcp2551 son muy malos, por eso te dije lo del 82c251, yo tambien me cargué un 2551. Es que son malos de narices.

Salu2