¿Por qué configurar PORTx antes que TRISx?

Estaba examinando el código de ejemplo que proporciona MikroE para la programación de PIC con MikroC, y siempre configuran PORTx antes de configurar TRISx. ¿Cuál es la razón para esto?

Dado que TRIS solo selecciona si el puerto o el pin es modo de salida/entrada, ¿por qué importa en qué pin está configurado antes de configurar el modo?

Código de ejemplo

  PORTA = 255;
  TRISA = 255;                        // configure PORTA pins as input
  PORTB = 0;                          // set PORTB to 0
  TRISB = 0;                          // designate PORTB pins as output
  PORTC = 0;                          // set PORTC to 0
  TRISC = 0;                          // designate PORTC pins as output
Siempre que vea comentarios como PORTB = 0; // set PORTB to 0, sabe con certeza que el programador no estaba prestando atención a lo que estaba haciendo.
¿Porqué es eso? ¿No es eso lo que hace PORTB=0?

Respuestas (3)

Los bits PORTx se ajustan antes que los bits TRISx para que sepa cuál será la salida antes de convertir el pin en una salida. Si está configurando los bits TRISx en las entradas, no importa. Sin embargo, si está borrando los bits TRISx y convirtiéndolos en salidas, es más seguro determinar cuál será la salida antes de que cambie de entrada a salida. Por lo tanto, si una alarma o algo se activa cuando un pin está alto, querrá asegurarse de que cuando se convierta en una salida, comience bajo.

Para este bit específico de código, la respuesta es que el programador quiere configurar los pines en un estado/voltaje conocido antes de configurarlos como salidas. Pero, en general, los bits TRIS hacen más que configurar un pin en modo de entrada o salida.

El mnemotécnico TRIS significa tri-estado. Cuando se prueba un pin, la resistencia de ese pin sube tanto que se desconectan efectivamente del circuito.

Si alguna vez has mirado autobuses, habrás visto circuitos tri-estatales. Son la forma pobre de conectar múltiples salidas sin usar un multiplexor o un interruptor. Todo lo que necesita es asegurarse de que solo haya una salida en el bus que no esté en modo de tres estados en ningún momento.

También existe un método "seguro" para implementar buses al no permitir que ningún dispositivo emita ningún voltaje que no sea cero voltios. Los valores en el bus obtienen voltaje VCC a través de una o varias resistencias pull-up. Muchos buses seriales hacen esto. Si no recuerdo mal, el bus CAN hace esto. La contención nunca es un problema con este esquema. Solo necesita encargarse de las colisiones que se pueden hacer en el software.

Por lo tanto, en muchos códigos con los que he trabajado (y, de hecho, en muchos de mis propios códigos), los bits de PUERTO están codificados 0y los pines se controlan configurando los bits TRIS en 1o 0. Entonces, a veces verá código en producción donde las salidas se controlan a través de los bits TRIS en lugar de los bits PORT.

Solo para que quede escrito, esos tipos o salidas son salidas de "colector abierto" o "drenaje abierto".
Lo último que sugieres, eso básicamente los haría abrir salidas de drenaje, ¿verdad?
Como mencionó jrtrzeciak, sí.

Tal vez sea una forma de evitar que la salida falle y luego baje inmediatamente después de un tris. Si establece salidas bajas antes de tris, se garantiza que serán bajas después de tris. ¡Tal vez! Supongo que esto supone que el registro del puerto de salida puede contener bits aleatorios o tal vez estén todos altos después de un reinicio.

Existe la posibilidad de que en el arranque se haya configurado la ubicación del ram para el registro de salida. Este fue un problema aún peor cuando los eproms de MCU solo podían borrarse con UV y se olvidó de cubrir la ventana...