Autor Tema: Mis experiencias con el BUS CAN  (Leído 607104 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Mis experiencias con el BUS CAN
« Respuesta #1095 en: 21 de Septiembre de 2011, 12:17:07 »
algo que te queria preguntar MGLSOFT, me he leido el post completo, pero claro asi rapido y tal de algunas cosas no me acuerdo xD

el tema es saber si con los pics de ecan integrado habeis mostrado el como usar los distintos buffers para recepcionar/enviar mensajes, es decir, el ke yo uso tiene 3 buffers para enviar, y 2 buffers para recibir, adicionalmente tiene 6 buffers mas que se pueden poner para TX o RX.
Yo esque los uso todos los buffers, osea 6buffers de envios, y 5buffers de recepcion, los de recepcion van por interrupciones.

Por si no lo habeis explicado para explicarlo yo asi por encima y aportar algo. Ademas una buena forma y sencilla de poner los mensajes en cola en los 6buffers para que se vayan enviando segun su prioridad.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7841
Re: Mis experiencias con el BUS CAN
« Respuesta #1096 en: 21 de Septiembre de 2011, 14:35:34 »
Adelante con la explicación.
Se hizo alguna vez una pequeña introducción al tema, por lo tanto si lo explicas aquí, ademas de poder debatirlo, te servirá para tu trabajo final.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Mis experiencias con el BUS CAN
« Respuesta #1097 en: 21 de Septiembre de 2011, 14:45:48 »
Adelante con la explicación.
Se hizo alguna vez una pequeña introducción al tema, por lo tanto si lo explicas aquí, ademas de poder debatirlo, te servirá para tu trabajo final.

xD, el caso es que yo no tengo "trabajo final" lo hago por voluntad propia, no he estudiado electronica tampoco, unicamente aprendo con lo que veo por alli y por alla xD

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7841
Re: Mis experiencias con el BUS CAN
« Respuesta #1098 en: 21 de Septiembre de 2011, 14:55:36 »
Disculpas, creí que eras vos quien estaba preparando su tesis.
Respecto a que estudiamos cada uno, yo soy electromecánico, de electrónica vi válvulas solamente, en mi época hace 30 años atrás, así que no te hagas rollos. :mrgreen: :mrgreen:

El hilo es tuyo para exponer lo que interpretas de como utilizar los buffer de envío y recepción.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Mis experiencias con el BUS CAN
« Respuesta #1099 en: 21 de Septiembre de 2011, 15:05:55 »
juas, igual que yo, el año pasado termine el curso de electromecanica, dimos algo de can bus y me parecio interesante asiq aki estoy xD

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Mis experiencias con el BUS CAN
« Respuesta #1100 en: 21 de Septiembre de 2011, 15:32:25 »
Bueno señores, pues voy a poner como funcionan los buffers de un pic el cual tiene el CAN integrado. Yo uso el 18F46K80 por lo que en otros pics puede cambiar, que no tengan los mismos buffers, pero se puede aplicar a cualquier pic en mayor o menor medida.

Para empezar empezamos por lo sencillo, una breve explicacion. Este pic tiene 3 buffers para enviar, 2 buffers para recibir, y 6 buffers adicionales para configurarlos segun queramos (RX/TX). Ahora os preguntareis, para que tantos buffers? Pues sencillo, si tenemos una aplicacion que envia mensajes sin parar con 1 solo buffer nos veriamos limitado a esperar que ese buffer quede libre y luego enviar el siguiente mensaje. Para aplicaciones que no se deben bloquear estos buffers nos son de mucha utilidad.

Es decir seria de la siguiente manera:
-Buscamos buffer libre (bit TXB*CON:TXREQ=0)
-Escribimos los datos (tamaño, filtro, datos...)
-Declaramos la prioridad del mensaje (TXB*CON:TXPRI<0:1>) entre 0 y 3 (3 mayor prioridad, 0 menor).
-Ponemos el TXB*CON.TXREQ=1 para solicitar el envio.

*El mismo modulo se encarga de verificar que mensaje tiene mayor prioridad (TXPRI) y envia ese, es decir si llenamos los 3 buffers a la vez, ponemos a uno 0, al otro 1, y al otro 3, el modulo enviara primero el 0, luego 1 y luego 3...

Con todo esto nos olvidamos de tener que poner el while(!TXREQ); unicamente tendriamos que poner un control de errores (TXERR) para verificar que mensaje nos da error de envio, y decidir si abortarlo, dejarlo hasta que se envie... Eso ya al gusto del programador.

Ahora me preguntareis, que rollo tener que estar mirando si el TXB0 esta libre, luego el TXB1.... No hay problema, yo he hecho lo siguiente:
En la funcion de CAN INIT he declarado un array de punteros (global) donde se guarda la direccion de TXB0CON, TXB1CON, TXB2CON...
Ejemplo:
char *txcon[2];
txcon[0]=&TXB0CON; txcon[1]=&TXB1CON; ....
Unicamente tendriamos que poner un for con if(! (*txcon[ x] & 0b1000)) { entonces usamos ese buffer x... }

Ahora, vale muy bien, y como escribimos los filtros, DLC, ... sencillo:
Todos los buffers tienen su memoria por orden, es decir TXB0CON, TXB0SIDH, SIDL, EIDH, EIDL, DLC, D0, D1, D2.... D7.
Para escribir el dlc del buffer 2 por ejemplo seria:
*(txcon[2]+5)=dlc;
Para el D0:
*(txcon[2]+6)=data0;
Facil no? Para gente que sepa usar punteros sera muy sencillo.

Ahora, como se configuran los buffers "extras" que nos regalan microchip?, los buffers se llaman B0CON, B1CON.... B5CON
Tenemos un registro que se llama BSEL0 (mirar el datasheet para mas info). Para configurar por ejemplo el buffer 5 y 4 como TX seria:
BSEL0=0b11000000
de los bit (7:2) es el buffer 5 al 0; 1=TX, 0=RX.
« Última modificación: 22 de Septiembre de 2011, 18:57:20 por MerLiNz »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Mis experiencias con el BUS CAN
« Respuesta #1101 en: 21 de Septiembre de 2011, 15:32:46 »
Bien, ahora que ya sabemos aprobechar los buffers de TX veamos como funcionan los de RX.

Yo como ODIO los programas bloqueantes, es decir los WHILE(hastaquenoseenvie);... Siempre he evitado al 100% esto, para un programa normal no pasa nada, pero para un programa bien desarrollado evitar los bloqueos del codigo siempre es lo ideal.
Con todo esto quiero decir que yo uso las INTERRUPCIONES que MICROCHIP nos ha dado xD.
Al margen de explicar las interrupciones como funcionan y tal, miramos el datasheet ya que es bastante largo de explicar. Para TX no he usado interrupciones ya que me da igual saber cuando se completa el envio o no. Pero si me interesa muchisimo saber cuando llega un mensaje.

Pues configurando el ECAN como modo 1 (modo no fifo), activando gieh... obtendremos la interrupcion RXBnIF (tal y como suena, la n es una 'n'), activando los bits del BIE0 (mirar datasheet) para activar las interrupciones...

Cada vez que recibamos un mensaje en el CAN el codigo nos enviara al punto de interrupcion (0x08 o 0x18 segun prioridades).

Cosas a tener en cuenta:
*Es importante limpiar el RXFUL del buffer del cual recibamos el mensaje (ponerlo a 0), si no lo acemos la interrupcion se volvera a producir continuamente hasta que RXFUL sea 0.
*Limpiar el RXBnIF

Bien, imaginemos que recibimos 2 mensajes consecutivos (realmente es dificil hacer esto ya que al recibir 1 se activaria la interrupcion para atenderla, pero imaginemos que por ejemplo hemos desactivado el GIE para escribir en la EEPROM del pic, y en el momento de la escritura recibimos 2 mensajes.

Los mensajes iran a los buffers que esten libres es decir que tengan RXFUL=0, en caso de que todos esten ocupados se producira un error overflow (el que quiera saber mas, datasheet), de todas formas este error no causa ningun problema, unicamente se perderian los mensajes (se escribiria uno encima de otro o bien se ignora el ultimo).

Bien, llegamos a la interrupcion, despues de escribir la eeprom, y activar GIE el codigo nos tirara directamente a la interrupcion. Joder ahora tenemos 2 buffers, como se cual de los X es el que tiene los mensajes??

Para eso tenemos el registro CANSTAT:ICODE bits < 3:1>, este registro nos dice que buffer nos ha activado la interrupcion, desconozco cual de los buffers seria el primero en mostrarlo en el ICODE, supongo que el primero en recibirlo.

el ICODE tiene muchas convinaciones, segun modo 1 y 2. Por lo cual al datasheet y veis que significa cada convinacion, en nuestro caso diremos que se activaron el buffer 0 y 1, osea el ICODE sera 0b10000.
*Leemos el dlc, filtro si es necesario, datos... todo lo que necesitemos
*PONEMOS EL RXFUL=0.
*Salimos de la interrupcion (como normalmente) (RXBnIF=0).

Joer y ahora que pasa con el otro mensaje?? Pues nada, como dije antes hasta que todos los RXFUL no sean 0 (de todos los buffers configurados) se volvera a la interrupcion una y otra vez, por lo cual el codigo volvera al inicio de la interrupcion. Ahora el ICODE nos apuntara al buffer que no haya sido leido, en este caso el buffer 1, osea ICODE=0b10001.
*Leemos todo lo que queramos
*PONEMOS RXFUL del buffer 1 a 0.
*Salimos.

Con todo esto nos aseguramos de que cuando recibamos un buffer tengamos un buffer disponible para otro mensaje, asi tendriamos una cola de mensajes a la espera de procesarlos.
Para manejar los buffers se puede hacer el mismo sistema de punteros que en el envio, todo es cuestion de como querais hacerlo.
Para manejar los buffers adicionales, igual que antes BSEL0, ponemos los bits a 0 para los buffers que queramos recepcion, y usamos los B*CON que hayamos puesto como recepcion.

Cosa importante que me he dado cuenta:
*En modo 1 ECAN los filtros se asignan por buffer, es decir el filtro1 lo asignas al buffer 1, el filtro 2 al buffer 2... segun quieras
*Para que funcione el modo sin asignar filtros a buffers es necesario configurarlo en modo 2, FIFO, asi se usan los filtros pero se ignora la asignacion de buffer por filtro
« Última modificación: 25 de Septiembre de 2011, 12:43:22 por MerLiNz »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17671
    • MicroPIC
Re: Mis experiencias con el BUS CAN
« Respuesta #1102 en: 22 de Septiembre de 2011, 01:41:14 »
Muy interesante MerLiNz, gracias
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7841
Re: Mis experiencias con el BUS CAN
« Respuesta #1103 en: 22 de Septiembre de 2011, 08:46:43 »
Perfecto!!
Ya le puse links en la primera pagina del hilo.   ;-) ;-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Mis experiencias con el BUS CAN
« Respuesta #1104 en: 22 de Septiembre de 2011, 10:24:43 »
jeje, gracias

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 278
Re: Mis experiencias con el BUS CAN
« Respuesta #1105 en: 23 de Septiembre de 2011, 11:52:20 »
hola, he estado investigando sobre el bus can, he visto que hay TRANSCEPTORES, CONTROLADORES Y EXPANSORES
ya he entendido algo, pero seria bueno que alguien ducho nos explique con toda claridad la diferencias que hay entre ellos

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7841
Re: Mis experiencias con el BUS CAN
« Respuesta #1106 en: 23 de Septiembre de 2011, 11:59:52 »
Aqui se vio el tema de los expansores.

Expansores CAN

Luego hay PICs que tienen modulo CAN incorporado y controladores CAN (mcp2515) que pueden darle conectividad CAN a un PIC que no tiene ese modulo incorporado, usando conexión SPI.

Los transceptores son los que realmente conectan al BUS CAN y deben ser utilizados por TODOS los dispositivos anteriores.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 278
Re: Mis experiencias con el BUS CAN
« Respuesta #1107 en: 23 de Septiembre de 2011, 12:02:00 »
seria algo asi    (controlador<====>transceptor)<==========bus can==========>(transceptor<====>expansor)

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Mis experiencias con el BUS CAN
« Respuesta #1108 en: 23 de Septiembre de 2011, 12:39:54 »
si, asi es, el transceptor por asi decirlo es el enlace entre el bus del can, y el dispositivo (pic, expansor...).

juas, no sabia que existiesen los "expansores" he estado mirando el datasheet y parece muy interesante, para cosas simples, por ejemplo donde quieres activar o desactivar una bombilla, o leer el estado de voltaje (ADC).
Yo creia que era unicamente un dispositivo que funcionaba con mensajes can, pero no, por lo visto tambien se puede programar como un pic!
« Última modificación: 23 de Septiembre de 2011, 12:57:02 por MerLiNz »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7841
Re: Mis experiencias con el BUS CAN
« Respuesta #1109 en: 23 de Septiembre de 2011, 13:36:41 »
En la placa experimental que hice y muestro en este mismo hilo (si lo leyeron habran visto el esquematico) tengo dos nodos expansores, un nodo que puede ser con un PIC sin CAN asociado a un controlador CAN externo (mcp2515) o usando un PIC con CAN y por ultimo un Nodo con display y teclado para usarlo en analisis de tramas, etc.
Si bien es una sola placa, puede ser troquelada y dividirla en 4 nodos diferentes.
Alli, uno de los expansores, tiene la posibilidad de conectarse al programador y bajarle el programa.
Esa programacion la hice con el ICDS de CCS, que es el unico programador no hecho por Microchip que lo soporta, incluso varios de los conocidos de Microchip tampoco lo soportan.
Si bien el dispositivo puede ser configurado a traves de instrucciones por mensajeria CAN, el Id del nodo y la configuracion de velocidad y otros temas deben ser realizadas a traves del programador.

Un detalle importante:
Estos dispositivos son OTP, si uno pifia la primer programacion, solo Dios sabe como se pueden acceder despues, aunque no lo crean, en tres pruebas solo tire uno, eso si, tengo la costumbre de doblar las patillas para no pincharse con ellas al manipular la basura... :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.