apagar los 4 LEDs deja uno encendido

2
        PORTCbits.RC13 = 1;
        PORTDbits.RD0 = 1; 
        PORTDbits.RD11 = 1;
        PORTDbits.RD9 = 1; 

Las líneas de arriba apagarán un LED. Uno a la vez, todos funcionan, pero si uso los 4, ¡dejarán uno por alguna razón!

Puedo reorganizarlos y es un LED diferente. Siempre parece salir de la 2da a la última entrada. ¿Por qué?

    
pregunta Funkodebat

2 respuestas

5

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.

    
respondido por el Olin Lathrop
1

Los PIC tienen tres registros diferentes para sus E / S digitales:

TRIS define si un pin es entrada o salida
PORT lee el nivel digital de un pin
LAT escribe un nivel digital a un pin

(Mantengo los nombres cortos aquí. Debes agregar un puerto para direccionar todo el puerto o ese identificador de bits para tratar los pines de salida individuales ...)

Me pregunto si escribir en PORT tiene algún efecto, pero la forma correcta de configurar una salida es escribir en LAT .

Por cierto: PORT y LAT son independientes. Reading LAT le indica cuál debe ser el nivel lógico, si el pin está configurado como salida, mientras que leer PORT le indica el estado real. Si PORT y LAT no dan la misma lectura, el pin puede configurarse como entrada o el pin puede estar vinculado a un nivel lógico por un cortocircuito.

    
respondido por el sweber

Lea otras preguntas en las etiquetas