¿Cómo conducir el LED cuando se hunde la corriente a la MCU?

0

Esperemos que una simple. ¿Debo controlar siempre escribiendo en la salida digital GPIO? ¿O debería dejarlo siempre bajo y luego tri-indicar la salida?

El LED

se enciende cuando el pin de MCU hunde la corriente:

En el código, me refiero a la diferencia entre lo siguiente para el esquema dado:

// Control entirely via GPIO    
TRISBbits.TRISB5 = 0; // configure as digital output
LATBbits.LATB5 = 0; // turn on the LED
LATBbits.LATB5 = 1; // turn off the LED

// Tri-state output to always just enable/disable
LATBbits.LATB5 = 0; // drive output low
TRISBbits.TRISB5 = 0; // turn on by configuring as digital output
TRISBbits.TRISB5 = 1; // turn off by configuring as digital input
    
pregunta tarabyte

4 respuestas

2

En el caso que has mostrado, en realidad no importa demasiado también . Dejaría la salida como salida y controlaría el LED desde el bit LAT. Si la entrada no es una entrada de Schmitt Trigger, podría obtener un consumo de energía innecesario al tener una entrada flotando alrededor, y tener entradas flotando no es una buena práctica en ningún caso.

Donde podría es más importante si está utilizando un PIC antiguo que no tiene un registro LAT separado (o si está escribiendo directamente en el registro de puerto en un PIC que tiene un registro LAT, en cuyo caso, no hagas eso).

En tal caso, podría encontrarse con un problema de lectura-modificación-escritura en el que una instrucción para modificar un bit diferente (no relacionado) en el mismo registro de puerto podría convertir el bit del puerto de LED en un estado alto, por lo que la próxima vez establece el bit TRIS bajo, el LED no se enciende. Puede que no sea confiable de una manera u otra, ya que el pin está flotando alrededor.

    
respondido por el Spehro Pefhany
1

Efectivamente, la solución de tres estados le ofrece las opciones de "resistencia pequeña (encendido) / resistencia grande (apagado)". Pero es muy poco intuitivo para alguien que está leyendo tu código (y quizás incluso para ti, después de un par de semanas).

Solo sugeriría usar el método de tres estados si es la única forma, es decir, el voltaje de la batería es más alto que el VCC de µC y si el pin µC está a la altura solo atenúa el LED.

El uso de GPIO como salida siempre deja más claro lo que está haciendo el código.

    
respondido por el hoosierEE
0

Estoy de acuerdo con aquellos que sugieren hacer que el pin esté bajo para encender el LED, y configurarlo en alto para apagarlo, pero creo que también debe configurar la salida como drenaje abierto para que no esté obteniendo ninguna corriente. (Debido a que el LED actúa como diodo, esto sería muy pequeño de todos modos).

Sin embargo, es una buena práctica utilizarlo, en los casos en que no hay diodo, y esencialmente está golpeando el riel de suministro a través de la resistencia y la carga que esté conduciendo.

Hacer la salida OD del pin de salida es similar a cambiar entre un pin de entrada y salida, pero es más intuitivo.

// Control entirely via GPIO    
TRISBbits.TRISB5 = 0;       / configure as digital output

ODCBbits.ODCB5 = 1;        // ADDED to make pin open-drain

        .
        .
        .

LATBbits.LATB5 = 0;         // turn on the LED
LATBbits.LATB5 = 1;         // turn off the LED
    
respondido por el tcrosley
0

Estoy de acuerdo con los demás en que cambiaría la salida alta o baja para controlar el LED porque esto documenta mejor la intención y evita el problema de la entrada flotante.

Sin embargo, hay un caso en el que necesita cambiar entre bajo y alto-Z como se indica entre bajo y alto. Algunos microcontroladores tienen salidas de drenaje abierto especiales que pueden soportar voltajes más altos que Vdd (como RA4 en algunos PIC 16 más antiguos). Si el LED está siendo impulsado desde un voltaje más alto que Vdd pero dentro de lo que puede manejar la salida de drenaje abierto, entonces la salida debe cambiarse entre la impedancia activa baja y alta. Como Wouter señaló en un comentario, esto todavía puede permitir el mismo firmware. Los viejos PIC 16s con drenaje RA4 abierto nunca pueden impulsar la salida de forma activa, por lo que el control del bit PORT aún funciona.

Tenga en cuenta que este es un caso inusual, especialmente hoy. Parece que los micros más nuevos ya no tienen las salidas de drenaje abierto de alto voltaje.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas