salida de entrada de E / S pic16f887

1

Estoy tratando de leer un botón pulsador y encender un led en caso de que esté presionado. tengo el siguiente código. Tengo una resistencia de 1k con el LED y conecto el botón directamente a RD0. ¡Pero el led está siempre encendido! Si desconecto vcc un poco "funciona". ¿Qué estoy haciendo mal?

#define _XTAL_FREQ 8000000

#pragma config FOSC = INTRC_CLKOUT, WDTE = OFF, PWRTE = ON      
#pragma config MCLRE = ON, CP = OFF, CPD = OFF, BOREN = OFF      
#pragma config IESO = ON, FCMEN = ON, LVP = OFF        

#include <xc.h>
#include <pic16f887.h>

void main() {
    PORTD = 0;
    TRISD = 0;
    TRISD0 = 1;
    RD1 = 0;
    OSCCON = 0x70;

    while (1) {
        if (RD0) {
            RD1 = 1;
        } else {
            RD1 = 0;
        }
    }
}

simular este circuito : esquema creado usando CircuitLab

    
pregunta Aram

2 respuestas

5

Cuando no se presiona el botón, ¿qué estado debe leer RD0? ¿Alto o bajo? Mire el esquema por un minuto y piénselo.

Si no estás seguro, eso es bueno. Porque el 16F887 tampoco está seguro. Cuando no se presiona el botón, RD0 en realidad está flotando. Nada lo conduce hacia arriba o hacia abajo. Desafortunadamente, no existe una opción "meh" para la electrónica digital. El MCU debe elegir alto o bajo. A falta de una fuerza motriz en RD0, el pin actuará como una pequeña antena y puede cambiar aleatoriamente el estado con el campo eléctrico local a su alrededor. En tu caso, suena como si se estuviera quedando alto. El campo electrostático alrededor de su mano puede realmente cambiar el estado del pasador si acerca su mano al MCU.

La solución es poner una resistencia desplegable en RD0. Cualquier valor de resistencia razonablemente grande funcionará (4.7k, 10k y 100k son valores muy comunes). Esto proporcionará una fuerza motriz a 0 V cuando no se presiona el botón. Cuando se presiona el botón, la resistencia aparecerá despreciable y el pin verá 5V.

    
respondido por el Dan Laks
2

Hay algunas cosas fundamentales que se necesitan cuando desea leer un botón:

  • El puerto MCU debe configurarse como entrada. Esto significa que el pin debe ser conducido a un estado conocido externamente, para poder leerlo de manera confiable.
  • En su circuito, el pin MCU se deja flotando cuando no se presiona el interruptor. Esto significa que no puede leer de manera confiable desde el puerto.
  • Para conducir el pin a un estado conocido, puede usar una resistencia de extracción para conectarlo a 5 V o tierra como estado predeterminado.
  • El interruptor anulará el estado predeterminado establecido por la resistencia de extracción, ya que cuando se presiona, cortará el pin a 5V.
  • Los valores estándar de facto de la industria para resistencias de tracción son 4k7 o 10k. Los microcontroladores modernos tienen resistencias internas incorporadas, como parte del hardware del puerto. Luego se pueden activar a través del software, escribiendo en un registro.
  • Una vez que esté ordenado, debes "rebotar" la señal. Se produce un fenómeno electromecánico cuando se presiona o suelta un botón, no lo hará de manera limpia, sino que "rebotará hacia arriba y hacia abajo" por un corto tiempo. Puedes observar esto con un osciloscopio.
  • Los botones de lectura de código sin implementar algún tipo de eliminación de rebotes se comportarán de forma errática y no se puede confiar en los valores.
  • El rebote se puede hacer ya sea en electrónica con un filtro RC, o más comúnmente en software. En el software, se puede hacer de muchas maneras, la forma más simple es leer el pin, luego leerlo nuevamente después de un corto tiempo (10-20ms).
  • Es una buena idea tener algún tipo de resistencia en serie después del botón, para evitar la descarga de ESD en la MCU. Particularmente cierto cuando las cosas pequeñas se tocan con dedos grandes, como cuando se usan conmutadores tácticos SMD o puentes.

Próximo problema: debe cambiar la resistencia a una resistencia de serie adecuada si desea que el LED emita algún tipo de luz. Los LED suelen tener una tensión directa de 1,5 V o menos. Si su suministro es de 5 V, habrá aproximadamente 5 - 1.5 = 3.5 V sobre el LED. Con 10k en serie, la ley de Ohm da 350uA. La corriente óptima para controlar un LED suele ser de 20 mA, aunque 5 mA o algo así generalmente está bien.

También verifique la hoja de datos de la MCU y asegúrese de que la MCU sea capaz de quemar / hundir la corriente necesaria para el LED.

    
respondido por el Lundin

Lea otras preguntas en las etiquetas