En mi proyecto, planeo tener un ajuste de configuración configurable por el usuario usando un interruptor. Lamentablemente, parece que no sé leer desde un puerto.
Estoy usando PIC18F4680 y compilador C18.
Aquí está la foto del circuito:
Descripción del circuito:
El pin 19 se establece como alto y la resistencia R3 se establece entre el pin 19 del PIC y el pin 3 del interruptor. El pin 20 del PIC está conectado al pin pin 2 del interruptor. El pin uno del interruptor está conectado a través de R37 a la tierra del circuito. Al usar un multímetro, puedo ver que cuando el interruptor se configura de manera que los pines 2 y 3 del interruptor estén conectados al pin 20 del PIC, hay un alto voltaje lógico (alrededor de 4.96 V). Cuando se establece el interruptor de modo que los pines 1 y 2 del interruptor estén conectados, puedo ver que el pin 20 del PIC está en baja tensión lógica (alrededor de 40 mV). La configuración de los pines es exactamente como se muestra a continuación. Por lo que sé, en este PIC no hay resistencias de pull-up internas en el puerto D.
El pin 19 es RD0 en este PIC y el pin 20 es RD1 en este PIC.
He configurado el RD0 de esta manera:
TRISDbits.RD0=0;//Set as output
LATDbits.LATD0=1;
y RD1 como este:
TRISDbits.RD1=1;//set as input
Cuando el interruptor está configurado para que el RD0 esté conectado al RD1, puedo leer 4.96 V en el pin RD1, por lo que después de leer, debería obtener un valor alto. Desafortunadamente, cuando lo leí usando este código:
PortD1=PORTDbits.RD1;
donde PortD1 es un char.
Siempre obtengo el valor de PortD1 de cero, sin importar en qué posición se encuentre el interruptor.
No estoy usando ninguno de los dispositivos multiplexados en los pines RD0 y RD1.
Entonces, ¿qué estoy haciendo mal aquí?
ACTUALIZACIÓN 1 :
Agregué
CMCON = 0;
TRISEbits.PSPMODE=0;
al inicio de mi programa, por lo que el comparador y el puerto esclavo paralelo deben estar deshabilitados y no deben interferir con el puerto D. Además, no estoy usando hardware PWM, por lo que no debería estar causando problemas.
ACTUALIZACIÓN 2
En este chip, estoy usando el puerto E para manejar un multiplexor de 8 bits, que funciona correctamente. Lo extraño es que cuando intento leer el estado del puerto E, utilizando
PortD1=PORTE;
PortD1=LATE;
Obtengo ceros en ambas ocasiones, aunque sé que el valor no es cero. Así que parece que el problema no es específico del puerto D.
ACTUALIZACIÓN 3
Después de algunas pruebas más, no pude repetir los problemas con la lectura de los registros LAT. Parece que se leen bien ahora.
ACTUALIZACIÓN 5
Después de realizar algunas pruebas más, parece que los puertos A, B y C proporcionan los mismos resultados que los registros LAT A, B y C. Los puertos D y E siempre leen cero, sin importar lo que esté escrito en sus registros LAT. Resulta que el puerto E era cero porque estaba configurado como entrada analógica. Después de configurar ADCON1bits.PCFG=255;
, el puerto E funciona ahora.
ACTUALIZACIÓN 6
También he deshabilitado el módulo ECCP usando ECCP1CONbits.ECCP1M=0;
y no hizo ninguna diferencia. He contabilizado todos los módulos multiplexados en el puerto D y todos están deshabilitados.