dsPIC 30F6012A no lee RD9, parece ser un problema de software

1

Estoy usando un dsPIC 30F6012A . Tengo dos PCB con este chip, ambos muestran los mismos síntomas, lo que implica que no es un daño aislado. RD9 definitivamente se está conduciendo a cinco voltios, confirmado con un multímetro. Las versiones anteriores de mi firmware leen la entrada digital RD9 sin problemas. Las versiones más nuevas no lo hacen; RD9 siempre se lee como bajo, independientemente del voltaje real en el pin. No hay diferencias entre las versiones de código que están obviamente relacionadas con RD9. RD8 y RD10 leen correctamente. He actualizado MPLAB X y el compilador XC16 a las últimas versiones, sin efecto.

¿Qué problemas de software podrían hacer que una entrada digital se lea siempre con poca frecuencia?

El ensamblaje relevante para mi cumplimiento actual es:

177:                       TRISD = 0xFF07;
002214  2FF074     MOV #0xFF07, W4
002216  881694     MOV W4, TRISD

debounce_input_state.RTR = PORTDbits.RD9;
0027C6  8016A4     MOV PORTD, W4
0027C8  DE2249     LSR W4, #9, W4
0027CA  624261     AND.B W4, #0x1, W4
0027CC  FB8204     ZE W4, W4
0027CE  620261     AND W4, #0x1, W4
0027D0  DD2249     SL W4, #9, W4
0027D2  804346     MOV debounce_input_state, W6
0027D4  2FDFF5     MOV #0xFDFF, W5
0027D6  630285     AND W6, W5, W5
0027D8  728204     IOR W5, W4, W4
0027D2  8845C4     MOV W4, debounce_input_state

He intentado diferentes lecturas de PORTD en diferentes lugares, sin un beneficio o cambio aparente. En mi código nunca se hace referencia a LATD, y la referencia a TRISD anterior es la única referencia. Forzar TRISDbits.TRISD9 a 1 inmediatamente antes de la lectura no tiene ningún beneficio. Solo hay dos periféricos conectados al mismo pin de hardware, y están explícitamente desactivados, y en ningún caso deben interferir con la entrada digital.

El depurador está de acuerdo con mis observaciones: PORTD < 9 > nunca lee alto, mientras que < 8 > y < 10 > hacer. TRISD < 9 > se establece alta PORTD < 9 > se muestra como alto en el depurador en mi firmware anterior. El código relevante del firmware antiguo es el siguiente:

172:                       TRISD = 0xFF07;
002210  2FF070     MOV #0xFF07, W0
002212  881690     MOV W0, TRISD

530:                       debounce_input_state.RTR = PORTDbits.RD9;
0027E0  8016A0     MOV PORTD, W0
0027E2  DE0049     LSR W0, #9, W0
0027E4  604061     AND.B W0, #0x1, W0
0027E6  FB8000     ZE W0, W0
0027E8  600061     AND W0, #0x1, W0
0027EA  DD0049     SL W0, #9, W0
0027EC  8045C2     MOV debounce_input_state, W2
0027EE  2FDFF1     MOV #0xFDFF, W1
0027F0  610081     AND W2, W1, W1
0027F2  708000     IOR W1, W0, W0
0027F4  8845C0     MOV W0, debounce_input_state

Parece ser semánticamente idéntico, solo nombres de registro diferentes.

    
pregunta Stephen Collings

2 respuestas

0

Como más allá de mí (lo que señala una bolsa de gas arrogante), establece C1CTRL < 15 > habilita IC2, deshabilitando RD9 como GPIO. Incluso si deshabilitas manualmente IC2 después de ese punto, RD9 aún no puede usarse para GPIO.

    
respondido por el Stephen Collings
0

Este es exactamente el síntoma que se obtiene cuando el pin está configurado como analógico. Tenga en cuenta que el análogo anula la configuración de TRIS. Cuando se configura en analógico, el receptor digital en el pin se desactiva y ocasiona que cualquier lectura obtenga un 0.

Varias partes utilizan diversos medios para definir qué pines son analógicos. Algunas partes tienen registros ADPCFG con un bit para cada pin ANx posible. Algunas partes tienen registros ANSELp por puerto. Revise su hoja de datos para ver cómo maneja exactamente su chip.

Añadido:

Acabo de mirar, y el 30F6012A tiene un solo registro ADPCFG para seleccionar cuáles de los posibles pines analógicos están configurados como entradas analógicas.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas