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.