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:
¿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;
}
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.
m.alin
Genba