Se está ejecutando el problema de lectura-modificación-escritura al escribir en el registro de puerto.
Es probable que cada línea de código C produzca una instrucción de configuración de bits. Esas instrucciones leen todo el registro en el que operan, establecen el bit especificado y luego escriben la palabra completa. Esto tiene un efecto secundario en los puertos de E / S de congelar cualquiera de los bits que no está configurando en el estado en el que se leyeron.
Digamos que en un ciclo haces BSF PORTB, 0. Eso hace que los controladores de salida vayan altos. Si en el siguiente ciclo hace BSF PORTB, 1, primero leerá cuál es realmente el estado de los pines de RB0, no lo que configuró en la instrucción anterior. Si el circuito externo evita que el pin del puerto suba lo suficientemente rápido, seguirá siendo 0 cuando se lea con la segunda instrucción. Dado que esa instrucción no está operando en ese bit, la escribirá de nuevo en la forma en que la encontró, que es 0. Ahora, el pin RB0 se activará de nuevo de forma activa.
La mejor manera de evitar esto es hacer las instrucciones de manipulación de bits en el registro LAT, si este PIC las tiene. Si necesita hacer un montón de configuraciones de pin en un puerto a la vez, lea el puerto, realice todas las configuraciones en la copia local y luego escríbala de nuevo en el puerto una vez. O bien, deje suficiente tiempo antes de las operaciones de lectura-modificación-escritura en los registros de puertos para que la tensión del pin real se haya estabilizado.
Algunos que se quejan de las rodillas están seguros de decir que siempre debes usar registros de sombra, pero eso generalmente es innecesario y mucho más de lo necesario. He realizado más de 100 proyectos PIC, y no creo que haya usado registros ocultos para solucionar los problemas del puerto R-M-W una vez. Una vez que entiendes lo que está pasando, un poco de sentido común va muy lejos.