Los puertos de entrada digital del dsPIC30F4011/4013 no funcionan en la placa de desarrollo dsPICDEM 2

Tengo una placa de desarrollo Microchip dsPICDEM 2 con dos microcontroladores: una dsPIC30F4011 (Familia de control de motores) y una dsPIC30F4013 (Familia de uso general). Estoy programando en C usando MPLAB IDE.

Lo que quiero hacer es leer una señal de entrada digital con niveles TTL (0-5 V), pero la lectura de los puertos siempre es 0.

Si configuro el puerto para que sea una salida usando el registro TRIS correspondiente y luego escribo en el registro LAT correspondiente, funciona bien. Por ejemplo:

TRISBbits.TRISB0 = 0; // set RB0 to be an output
LATBbits.LATB0 = 1;

funciona perfectamente.

Sin embargo, cuando configuro el puerto para que sea una entrada, sigo leyendo 0 tanto en el registro LAT como en el PORT. Por lo tanto, ninguno de los siguientes extractos de código funciona:

// This doesn't work:

TRISBbits.TRISB0 = 1; // set RB0 to be an input
value = LATBbits.LATB0;

// This doesn't work either:

TRISBbits.TRISB0 = 1; // set RB0 to be an input
value = PORTBbits.RB0;

Mi programa es tan simple como esto:

int main(void)
{
    TRISBbits.TRISB0 = 1;
    TRISBbits.TRISB1 = 0;

    while (1)
    {
        int rb0 = LATBbits.LATB0;
        LATBbits.LATB1 = rb0;
    }

    return 0;
}

por lo que no hay otra posible fuente de error en el programa.

Estos son los documentos que he usado como referencia:

  1. Manual de referencia de la familia dsPIC30F
  2. Hoja de datos de dsPIC30F4011/4012
  3. Hoja de datos de dsPIC30F3014/4013

¿Qué estoy haciendo mal?

EDITAR: después de las correcciones señaladas por Tut (ver respuesta aceptada), el código del programa se ve así:

int main(void)
{
    TRISBbits.TRISB0 = 1; // set RB1 as input
    TRISBbits.TRISB1 = 0; // set RB1 as output
    ADPCFGbits.PCFG0 = 1; // set RB0 as digital input (i.e. disable analog input)

    while (1)
    {
        LATBbits.LATB1 = PORTBbits.RB0;
    }

    return 0;
}
Lo más probable es que los pines en cuestión estén multiplexados con otros periféricos o que haya algunas resistencias desplegables activas en los pines.
Sí, de hecho, están multiplexados, pero las hojas de datos especifican que, después de un reinicio, los pines se configuran como entradas digitales por defecto y los pines solo se usan para los otros periféricos si los periféricos están habilitados (que no es el caso). Además, puedo usarlos como salidas, pero no como entradas.

Respuestas (1)

Los pines PORTB tienen funciones alternativas como entradas analógicas. Debe configurar el registro ADPCFG para pines digitales (bits establecidos en 1) ya que el valor de reinicio es todo ceros (pines analógicos). Consulte la página 18-9 del Manual de referencia de la familia dsPIC30F .

Tenga en cuenta también que para usar los pines como entradas digitales, configure los TRISBbits deseados en 1 (entradas). Luego, debe leer desde PORTBbits, no desde LATBbits, que es un pestillo para las operaciones de salida.

¡Muchas gracias! Me acabo de dar cuenta de que esto se menciona en la página 11-4 del Manual de referencia de la familia dsPIC30F . De alguna manera me salté ese bit al leer. Mi error :( También he visto que el valor de reinicio de ADPCFG se especifica en las páginas 95 y 149 de la hoja de datos de dsPIC30F4011 , en caso de que alguien se lo pregunte.