¿Cómo leo desde el puerto D de PIC18F4680?

3

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.

    
pregunta AndrejaKo

4 respuestas

4

Creo que Wouter tuvo la idea correcta, pero necesitas poner CMCON = 0x07; para apagar los comparadores (consulta la página 258 de la hoja de datos, arriba a la derecha)

    
respondido por el Oli Glaser
6

Debido a que Wouter no lo hizo (fue una estimación razonable dada la información que proporcionó), puede ser algo eléctrico. ¿Cómo está conectado exactamente el interruptor al pin del puerto? Normalmente, el interruptor estaría entre el pin del puerto y la conexión a tierra, lo que significa que debe haber un pullup para Vdd. Algunos pines en algunos PIC tienen estos internos. Si es así, puedes encenderlo. Si no es así, debe agregar su propia resistencia de activación externa.

Si el interruptor está conectado entre el pin y el Vdd, entonces necesita un menú desplegable. Eso tiene que ser externo porque sé que este PIC no tiene resistencias internas desplegables.

Su interruptor muestra 3 pads. ¿Estás usando todos ellos? Muestra un esquema de cómo está conectado todo exactamente.

Añadido:

Tu circuito (que no se describió antes) no tiene mucho sentido. No veo el punto a los dos resistores ni por qué una segunda línea de E / S está envuelta de una manera tan extraña. La forma normal de conectar un conmutador es:

EsteeselcasomássimpleenelquesolotieneunconmutadorSPST.Tengaencuentaqueestemétodotambiénfuncionabienconpulsadoresmomentáneos.Comodijeanteriormente,algunospinesPICtienenpullupsinternosopcionales.Enesecaso,simplementepuedeconectarelinterruptorentreelpinPICytierrasinnadamás.R1estáesencialmentedentrodelPIC.

TieneuninterruptorSPDT,porloquepuedehacerestosinpartesadicionalesquesoloelinterruptor:

    
respondido por el Olin Lathrop
3

Deshabilitar el módulo comparador:

CMCON = 0;

    
respondido por el Wouter van Ooijen
1

Tuve el mismo problema con un PIC18F46K20, encontré que era porque configuré LATE = 0b11111111; en mi inicialización. Mirando la hoja de datos PORTE solo tiene 3 pines físicos en LATE y los otros tienen otras funciones. Tan pronto como cambié mi código para que fuera LATE = 0b00000111; , funcionó y pude leer PORTD otra vez

    
respondido por el Andy Mac

Lea otras preguntas en las etiquetas