domingo, 12 de junio de 2011

SetFilters(uint16_t *Filters,uint16_t *Masks)

DESCRIPCIÓN

Permite configurar máscaras y filtros hardware. Estas máscaras y filtros determinan si un mensaje debe ser aceptado a los buffer de recepción del controlador. Esto libera al microcontrolador enormemente de tener que monitorizar todo el rato el bus en busca de los mensajes deseados (ID's).

El integrado MCP2515 tiene 2 buffer de entrada. El buffer 0 (alta prioridad) al cual se le aplica la máscara 0 (Mask[0]) y 2 filtros (Filters[0] y Filters[1]), y un segundo buffer (baja prioridad) al que se aplica una segunda máscara (Masks[1]) y los cuatro filtros restantes.

SINTAXIS

CAN.SetFilters(Filters,Masks);
siendo uint16_t  Filters[6] y uint16_t Masks[3].

PARÁMETROS

Masks[]: Array de 2 posiciones que contiene la máscara que se aplicará al buffer 0 (Mask[0]) y al buffer 1 (Mask[1]). Una máscara, en este caso, es la forma de decirle a nuestro controlador CAN (MCP2515), que bits son ignorados por los filtros.

Filters[]: Array de 6 posiciones, en los que las dos primeras posiciones Filters[0] y Filters[1] corresponden a filtros del buffer0, y las 4 restantes al buffer1. Los filtros nos indican que valor ha de tener el ID de un mensaje de entrada, para que el controlador CAN le permita alojarse en el buffer de entrada y nosotros después lo podamos leer en nuestro Arduino.
    Por lo tanto, como resumen podemos resumir el uso de filtros y máscaras en el siguiente procedimiento:

    • Entrada de mensaje por el bus
    • ¿Tenemos espacio libre en los buffer?
    • Comparamos los bits del ID del mensaje entrante con aquellos bits de los filtros.Sólo se comparan los bits que en la máscara estan a "1".
    • Si los bits, indicados por la máscara, del filtro y del mensaje de entrada coinciden, el controlador CAN alojará el mensaje de entrada en el buffer libre y nosotros podremos leerlo cuando deseemos con nuestro arduino. 

    Proponemos según tu nivel, 3 formas de usar esta función:

      Nivel "Novato":
      No te aconsejamos que uses ni filtros ni máscaras hasta que te sientas cómodo con los conceptos que se han explicado. Puedes encontrarte en la situación en la que creas que no recibes ningún mensaje, porque has configurado mal los filtros y máscaras.

      Nivel "Intermedio":
      Si quieres recibir 6 (o menos) diferentes ID puedes configurar Masks[0] y Masks[1] con el valor 0x3FF.
      Si pasamos a binario el valor 0x3FF obtenemos (111 1111 1111). Como vemos son todo 1's, lo que significa, que se comparan todos los bits de la ID entrante con los filtros.
      TODOS los bits han de coincidir con Filters[0] o Filters[1] para el Buffer 0.
      TODOS los bits han de coincidir con Filter[2],Filter[3],Filter[4] y Filter[5] para ser almacenado en Buffer 1.

      En resumen, SOLO RECIBIRÁS los mensajes cuya ID se corresponda íntegramente con alguno de los ID configurados  en los filtros(Filters[]).

      Nivel "Alto" :
      Entiendes perfectamente que es una máscara y un filtro.
      Ejemplo:
        Filters[0]=0x350;
        Filters[1]=0x00;   //No lo uso para sencillez del ejemplo
        Masks[0]=0x7F0;

      En el buffer 0 se recibirán todos los mensajes desde 0x350 a 0x35F. Veámos una explicación:
      • La máscara es 111 1111 0000, por lo que los 4 bits últimos de la ID entrante serán ignorados.
      • El filtro esta configurado como 0x350 (011 0101 0000).
      • Por lo que cualquier ID que sea de la forma 0011 0101 XXXX será aceptado.


      DEVUELVE

      Nada

      EJEMPLO