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

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1275 en: 03 de Noviembre de 2012, 14:13:57 »
Dandole vueltas a la interrupción para leer el mensaje de la FIFO, he pensado en hacer éste otro método, me parece más sencillo que el que me explicabas MerLinz.

En lugar de ver que FIFO provoca la interrupción habilitar la interrupción de FIFO no empty, de tal manera, que cuando tenga un dato en la FIFO0 que es la de lectura, realizar las operaciones.

No es así más sencillo?? O tiene alguna pega comparado con el método que me proponías??

Pongo aquí el nuevo método.

Citar

    C1CONbits.ON = 1;       /*Activo el módulo CAN1*/

    C1INTbits.RBIE = 1;     /*Activo Interrupción de Recepción en el Buffer*/
    C1FIFOINT1bits.RXNEMPTYIE = 1; /*Activo bit interrupción FIFO no vacía*/

    IPC11bits.CAN1IP = 1;   /*Prioridad 1*/
    IPC11bits.CAN1IS = 0;   /*Subprioridad 0*/

    IFS1bits.CAN1IF = 0;    /*Limpio la bandera de interrupción*/

    INTEnableSystemSingleVectoredInt(); /*Activa el modo Single Vector*/

    IEC1bits.CAN1IE = 1;    /*Activa la interrupción de CAN1*/
   
    while(1);

    return 0;
}

//Rutina de Interrupción
void __ISR(0, ipl1) InterruptHandler(void){
   
    CANRxMessageBuffer buffer;
    unsigned int * bufferToRead;
   
    if (C1INTbits.RBIF){        /*Si ha sido interrupción de lectura*/

        //if (C1VECbits.ICODE && '0000001'){ /*Verifico que la INT es en la FIFO1*/
            /*Compruebo que hay un mensaje para leer*/
            if (C1FIFOINT1bits.RXNEMPTYIF == 1){

                /*Obtengo la dirección del buffer de lectura*/
                 bufferToRead = (CANRxMessageBuffer*)(PA_TO_KVA1(C1FIFOUA1));

                 bufferToRead[0] = buffer -> messageWord[0];
                 bufferToRead[1] = buffer -> messageWord[1];
                 bufferToRead[2] = buffer -> messageWord[2];
                 bufferToRead[3] = buffer -> messageWord[3];

                 //C1FIFOCON1SET = 0x2000;     /*Ya se ha leido la FIFO1*/

                 /*Actualizo el puntero al buffer de mensajes*/
                 C1FIFOCON1bits.UINC = 1;

                /*Comprobar si hay algún mensaje para leer*/
                /*if(buffer -> CMSGEID.DLC == 4){*/

                }
            //}
           
        }
    }
    /******************/
    IFS1bits.CAN1IF = 0; /*Limpio la bandera de interrupción*/
}


Mira que me va a costar la lectura (Y todavía no he empezado con la escritura  :shock:), jejeje.

Un saludo.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Mis experiencias con el BUS CAN
« Respuesta #1276 en: 03 de Noviembre de 2012, 15:18:47 »
Si, todos los caminos llevan a roma XD

Yo es que lo hacia mediante DMA entonces tenia un array de X mensajes, cuando recibia un mensaje tenia que saber el numero de mensaje que era para leer la direccion apropiada del array, por eso utilizaba este modo. El caso es que no se como ira el FIFO en el pic32, pero en teoria cuando se queda vacio el 0 y el 1 esta ocupado el 1 deberia pasar al 0, si es asi bien.

Desconectado mogollan

  • PIC10
  • *
  • Mensajes: 4
Re: Mis experiencias con el BUS CAN
« Respuesta #1277 en: 10 de Noviembre de 2012, 02:17:33 »
Hola a todos he estado intentando echar andar el bus CAN, en microcontroladores PIC sin modulo CAN integrado (16F877A), pero no sé que estoy haciendo mal y ya llevo un tiempo no encontrando el problema...

La conexión que estoy haciendo como la de la imagen, pongo los pines de mayor interés


Me da incertidumbre el valor de los osciladores, tengo entendido que las librerías "can-mcp251x.c" y "can-mcp251x.h" estan por defecto a 125 kBps y he modificado la  los pines que trae por defecto "can-mcp251x.c" para que trabaje con el 16F877A como lo muestro en la figura


Tengo la duda si los pines de:   
#define EXT_CAN_SI   PIN_C4
#define EXT_CAN_SO   PIN_C5
estan bien conectados como lo tengo en mi esquematico =/

Adjunto los programas de mi Nodo A y mi Nodo B
De antemano muchas gracias, saludos desde México

Desconectado peteorito

  • PIC16
  • ***
  • Mensajes: 136
Re: Mis experiencias con el BUS CAN
« Respuesta #1278 en: 10 de Noviembre de 2012, 07:11:29 »
Hola mogollan
 Mirando el esquema creo  que en el MCP2515  patilla resest(17) e int(12) tiebe que estar a nivel alto, (resistencia 10k a 5v)
   y en el mcp2551 RS (pin 8) tiene que poner a   gnd con una resistencia  de 10 o 100 . A lo mejor los mcp2551 se te han  quemao.. yo al principio de trastear con ellos me murieron varios en el intento.  Prueba a ver
:)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1279 en: 10 de Noviembre de 2012, 08:32:28 »
Los pines SDI y SDO del micro están bien conectados.

Aquí una imagen de mi placa, mira el primer MCP2515, que va conectado a IC2 que es un PIC de 28 o 40 Pines, y lleva las demás señales.
En el MCP2515 es muy importante usar la patilla INT, para no estar continuamente ocupando el micro haciendo poolling para ver si llego un nuevo dato.
Esto que digo es para cuando quieras hacer una aplicación mas comercial, para pruebas te sirve tal como viene.
Lo otro muy importante es determinar bien que cristal vas a poner y su frecuencia de oscilación.



Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado peteorito

  • PIC16
  • ***
  • Mensajes: 136
Re: Mis experiencias con el BUS CAN
« Respuesta #1280 en: 10 de Noviembre de 2012, 10:24:37 »
Pues despues de revisar de nuevo este esquema.. nose porque INT lo tenia como entrada..

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1281 en: 10 de Noviembre de 2012, 11:01:38 »
Hay que leer la hoja de datos del MCP2515...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado radioelf

  • PIC10
  • *
  • Mensajes: 42
    • Radioelf
Re: Mis experiencias con el BUS CAN
« Respuesta #1282 en: 30 de Noviembre de 2012, 05:22:24 »
Hola,tengo una duda que seguro ya se comento en este hilo, pero no tengo narices de encontrar la respuesta :oops:, y ésta es si usamos las librerías de CCS para trabajar con el MCP2515 con SPI sin ninguna modificación la velocidad del CAN bus es de 125 kb/s, ¿pero para que frecuencia del oscilador del MCP2515? 20Mhz, o 16Mhz....
Gracias

Desconectado peteorito

  • PIC16
  • ***
  • Mensajes: 136
Re: Mis experiencias con el BUS CAN
« Respuesta #1283 en: 30 de Noviembre de 2012, 06:15:27 »
Yo  sin tocar las librerias  me  va a 20Mhz  y Ok

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1284 en: 30 de Noviembre de 2012, 08:27:25 »
A ver...
El MCP2515 es un controlador CAN externo, que se puede aplicar a cualquier PIC que no disponga de CAN y dotarlo de este tipo de bus.
Para comunicarse con ese controlador se usa el bus SPI, y la velocidad de procesamiento o clock del PIC no influye demasiado en ese bus y absolutamente NADA en como se configura el funcionamiento del bus CAN.

Para que este bus CAN funcione, se deben poner valores a unos cuantos registros que hacen funcionar el bus a la velocidad que uno elije.  Allí es donde influye el tiempo de bit, que esta íntimamente ligado a la frecuencia del cristal que tiene en este caso el controlador MCP2515 y como se hayan configurado los registros correspondientes.

Si en un ejemplo de CCS, usas la configuración original y el mismo cristal que pone CCS en sus placas, tus ejemplos funcionaran a 125 Kbps, y pasa lo mismo con los ejemplos de Microchip en sus placas.

Es por ello que recomendamos no cambiar el cristal del MCP2515 cuando este es usado con los ejemplos, y del mismo modo con los ejemplos cuando hay PICs con controlador CAN incorporado, para que la experiencia no sea frustante... se entiende ???

Igual si luego de esa primera experiencia aun no has perdido interes, vas a tener que aprender a configurar y dominar todos y cada uno de los registros de configuración, y jugar con diferentes frecuencias de cristal y asi dominaras tu el CAN y no el CAN a ti !! :D :D  (leer bien en este hilo, como se configura esto según el cristal, explicado paso a paso)...

Para ello, como dicen los Americanos, deberás aplicar RTFM !! :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado radioelf

  • PIC10
  • *
  • Mensajes: 42
    • Radioelf
Re: Mis experiencias con el BUS CAN
« Respuesta #1285 en: 30 de Noviembre de 2012, 09:20:26 »
OK, la pregunta es ¿el cristal que pone CCS en sus placas es de 20Mhz?, el resto lo tengo claro..

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1286 en: 30 de Noviembre de 2012, 11:57:40 »
Dimelo tu mismo...

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado radioelf

  • PIC10
  • *
  • Mensajes: 42
    • Radioelf
Re: Mis experiencias con el BUS CAN
« Respuesta #1287 en: 30 de Noviembre de 2012, 18:53:20 »
Está claro 20Mhz para 125 Kbps con las librerías de CCS (defecto), la verdad es que no fui capaz de encontrarlo por ningún lado de forma clara. Gracias

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1288 en: 30 de Noviembre de 2012, 22:32:01 »
Es dificil de encontrar, pero buscando se encuentra... ;-) ;-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado mogollan

  • PIC10
  • *
  • Mensajes: 4
Re: Mis experiencias con el BUS CAN
« Respuesta #1289 en: 28 de Diciembre de 2012, 23:23:08 »
Hola a todos tengo una duda, he conseguido habilitar el BUS CAN en MikroC de Mikroelectronika, y veo que en sus librerias usan el PIN RST, pero en las de CCS no lo ocupan , en todo caso deberia de mandar RST a VCC (pasando por una resistencia de 100K)?? estoy usando por cada nodo PIC16f877a+MCP2515+MCP2551