Estado del pin de E/S del PIC al encender

Tengo un LED conectado al pin RA1 de PIC18F25K20 (alimentado por fuente de 3.3V) de la siguiente manera:

Carril de 5V -> Resistencia (200 Ohm) -> Ánodo LED -> Cátodo LED -> RA1

RA1: Entrada -> El LED está apagado
RA1: Salida baja -> El LED está ENCENDIDO.

¿Es esta la forma correcta de conectar el LED, ya que el PIC está alimentado por 3.3V y el LED está conectado a 5V?

Inicialicé RA1 para que fuera una entrada como se muestra en la DEVICE_Initrutina. El código está escrito en lenguaje C - compilador Microchip C18.

void main()
{
    DEVICE_Init();
    //wait one second
    while (1)
    {
        TRISA = 0; //led is on
        //wait 2 seconds
        TRISA = 0x06; //led is off
        //wait 4 seconds
    }
}

void DEVICE_Init (void)
{
    OSCCON = 0x73; //PRIMARY INTERNAL OSCILLATOR
    PORTA = 0;  
    LATA = 0;           
    TRISA = 0x06;           //RA1, RA2 INPUT
    ....
}

Cuando enciendo el chip por primera vez, el LED se enciende durante una fracción de segundo y luego se apaga. Tengo entendido que los pines IO se ingresan al reiniciar. Entonces, ¿por qué el LED se enciende por un breve momento al encender?

Tenía RA1 y RA2 como entradas con LED conectados... ignore RA0 por favor... por otro lado, independientemente de los pines de E/S, se comporta igual en todos...

Respuestas (3)

Los pines de E/S del PIC se activan en un estado de alta impedancia al encenderse.

La razón por la que ve la falla del LED es probablemente porque el suministro de 5 V aumenta más rápido que el suministro de 3.3 V, y el cátodo del LED se mantiene temporalmente bajo a través del diodo de protección en ese pin en el PIC. Esto no es bueno y puede provocar un bloqueo al encender.

Si puede hacer arreglos para asegurarse de que el suministro de 3.3 V suba antes y disminuya después del suministro de 5 V, entonces su esquema puede funcionar. Sin embargo, es mejor usar un transistor o hacer funcionar el LED desde el suministro de 3,3 V. Este último también desperdiciará menos energía, suponiendo que su suministro de 3.3 V sea razonablemente eficiente.

No puedo ejecutarlo desde 3.3V ya que es un led azul ... y trato de evitar el uso de transistores ...
¿Cómo puedo asegurarme de que el riel de 3.3V suba primero antes de 5V y muera después de 5V? Una forma en la que estaba pensando es cambiar los capacitores electrolíticos de filtrado de derivación para cada uno de estos reguladores lineales ... ¿qué más puedo hacer para asegurar esto?
@usuario: Puede ser difícil asegurarlo. Usar un transistor para cambiar el LED probablemente sea más fácil y confiable.

Su LED se enciende durante una fracción de segundo porque las salidas se restablecen como Hi-Z (alta impedancia) o flotante. Para solucionar este problema, coloque algo como una resistencia de 10k desde la salida a tierra. Esto se conoce como resistencia desplegable y hará que la salida sea baja en el arranque. Hice una pregunta similar aquí:

https://stackoverflow.com/questions/41557868/atmega128-output-flicker-on-startup

Para un valor de resistencia pequeño (menos de 100K), el LED permanece tenue cuando no se supone que debe estar encendido y para un valor de resistencia más alto, veo que se enciende en el encendido por una fracción de segundo.
Esto se debe a que con las resistencias más altas, la ruta del LED aún tiene menos resistencia, por lo que tomará el voltaje flotante. Probablemente haya un número mágico, pero sin ver todo lo que estás usando, me será imposible conseguirlo.

No los inicialice como entradas solo como salidas. Las salidas pueden generar y hundirse. Las resistencias desplegables no funcionarán, ya que en esta configuración el diodo está generando corriente. ¡¡No tire hacia arriba!!. Simplemente inicialice los puertos lo antes posible. Su diodo debe tener Uv> 1.7V.

Entonces, ¿quiere decir que para apagar el LED, debo hacer que la salida del pin sea alta en lugar de la entrada?