Saltar al contenido principal
LibreTexts Español

8.1: Introducción

  • Page ID
    83162
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Este ejercicio examina el código básico de entrada digital y el hardware para el microcontrolador. Típicamente, el controlador necesitará reaccionar a cambios de estado verdadero/falso externos de un usuario o algún otro circuito. Por ejemplo, un usuario puede presionar un botón que indica que quiere iniciar o detener un proceso, como silenciar una señal de audio o activar un motor eléctrico. No hay “a mitad de camino” con este tipo de cosas; no “arrancas un poco un motor”, o lo haces o no lo haces Los pines de entrada digital del controlador están diseñados precisamente para este tipo de señal.

    Las señales de entrada deben ajustarse a los niveles lógicos adecuados para activar correctamente el controlador. En el caso del Arduino Uno eso significa que las señales deben adherirse al estándar 0V y 5V. Las fuentes de señal pueden pensarse en términos de dos categorías amplias: activa y pasiva. Una fuente activa sería un circuito como una puerta lógica o un comparador que acciona el pin de entrada a 5V o 0V. Para algunas aplicaciones esto es excesivo y podemos arreglárselas con algo mucho más sencillo, es decir, el tipo pasivo. Para estos, se habilita una resistencia interna de pull-up en el pin de entrada del controlador. El pull-up es una resistencia de gran valor ligada entre la fuente de alimentación y el pin de entrada. El pull-up creará una lógica alta en la entrada (es decir, el pin de entrada se “tira alto”). Para lograr un bajo, conectamos un simple interruptor del pin a tierra. No se necesita ningún otro circuito externo o alimentación. Obviamente, un pull-up debe desactivarse cuando se utilizan fuentes activas.

    Para leer el nivel lógico en una entrada, se deben hacer dos cosas. Primero, el bit de registro de dirección de datos correspondiente debe establecerse para el modo de entrada o lectura (y opcionalmente, también podemos desear activar el pull-up). Una vez hecho esto, leemos el bit de pin de puerto apropiado. Vale la pena señalar que en algunos microcontroladores se usa el mismo registro tanto para entrada como para salida (por ejemplo, el registro PORTB como se usa en el ejercicio de escritura digital). En la serie Atmel AVR (como la ATMega 328P utilizada en el Uno), sin embargo, se utilizan dos direcciones diferentes: PortX para escritura y PinX para lectura. Un error común para el nuevo programador AVR es intentar leer desde PORTB cuando realmente quieren leer del PINB.

    En nuestro primer ejemplo alternaremos un pin de entrada con un interruptor SPST simple usando un pull-up interno. El estado se observará usando el Monitor Serial. Inicialmente haremos esto usando las bibliotecas Arduino pero también veremos formas más genéricas.

    Suelde un par de cables a un interruptor SPST y conéctelos al pin 8 y a tierra. Si lo prefieres, simplemente puedes insertar un cable en el pin 8 de Arduino y luego insertar manualmente el extremo libre en uno de los contactos de tierra cuando sea necesario. Escriba el siguiente código en el editor:

    /* Read Digital Input V1. Monitors Arduino pin 8 and sends value to the 
    Serial Monitor */
    
    void setup()
    {
          Serial.begin(9600);
          pinMode(8, INPUT_PULLUP);
    }
    
    void loop()
    {
          int i;
    
          i = digitalRead(8);
          Serial.println(i);
    }
    

    Esto es casi tan básico como se pone. Primero abrimos el monitor serie y luego configuramos el registro de dirección de datos para el modo de entrada con pull-up a través de la función PinMode () (configurando el modo a solo INPUT deshabilita el pull-up). En la sección de loop leemos el valor del pin 8 y luego lo reportamos de nuevo al Monitor Serial. Compilar el código y transferirlo a la placa Arduino. Abra el Monitor Serial. Deberías ver una serie de agudos lógicos (1) desplazándose por. Ahora inserte el extremo libre del cable en uno de los cabezales de tierra. El Monitor en serie ahora debería mostrar una serie de mínimos lógicos (0) desplazándose por. A medida que conecta y desconecta el cable (o lanza el interruptor) los valores deben voltear hacia adelante y hacia atrás.

    /* Read Digital Input V2. Monitors Arduino pin 8 and sends value to the 
    Serial Monitor, generic form */
    
    // Arduino pin 8 is bit 0 of port B, also known as port bit B.0
    #define BITMASK 0x01
    
    void setup()
    {
          Serial.begin(9600);
    
          DDRB &= (~BITMASK);     // initialize the pin as an input.
          PORTB |= BITMASK;       // enable pull-up
    }
    
    void loop()
    {
          int i;
    
          i = PINB & BITMASK;
          Serial.println(i);
    }
    

    En comparación con el original, las dos llamadas para establecer el modo de entrada son un poco más de trabajo pero resultan en un código de idioma de máquina notablemente menor (bajo V1.0.4 la primera versión utilizó 2726 bytes mientras que la segunda usó 2340 bytes como se señala en la barra de estado del IDE). También tenga en cuenta que la variable impresa es el valor de bit real, no el idealizado 1 para verdadero y 0 para falso (en este caso un 1 en el bit 0 es el valor 1 por lo que no es inmediatamente aparente). Esto generalmente no es un problema ya que cualquier valor distinto de cero se trata como verdadero en el lenguaje C. Como recordatorio, no verifique si una variable es verdadera probando para ver si es lo mismo que 1. En su lugar, verifique si “existe”:

    if(v==1)    // don’t do this to check for true
    if(v)       // do this instead
    if(!v)      // and do this to check for false
    

    Ingresa la segunda versión del programa Read Digital Input, compilarlo, transferirlo y probarlo. Al ver el Monitor en serie, el desplazamiento constante puede ser un poco doloroso (juego de palabras intencionado). Actualmente, es como si el Uno estuviera diciendo “el interruptor está abajo, el interruptor sigue abajo, el interruptor sigue abajo” una y otra vez. Sería más conveniente si solo reportara un cambio de estado. Para ello, el código deberá recordar el estado actual para una comparación futura. Considera la siguiente alteración:

    /* Read Digital Input V3. Monitors Arduino pin 8 and sends value to the 
    Serial Monitor, generic form, only reports state changes */
    
    // Arduino pin 8 is port bit B.0
    #define BITMASK 0x01
    
    int priorstate=0;
    
    void setup()
    {
          Serial.begin(9600);
    
          DDRB &= (~BITMASK);     // initialize the pin as an input.
          PORTB |= BITMASK;       // enable pull-up
    }
    
    void loop()
    {
          int state;
    
          state = PINB & BITMASK;
    
          if( state != priorstate )
          {
                Serial.println(state);
                priorstate = state;
          }
    }
    

    Inicializamos la variable priorstate a 0 ya que eso es lo que es el pin de entrada antes de encender y reiniciar. La variable de estado solo se envía al Monitor Serial si ha habido un cambio de estado. Editar, compilar, transferir y probar la nueva versión. Tenga en cuenta que la ráfaga de valores desplazados es reemplazada por una salida más útil. Si lanza el interruptor de un lado a otro varias veces mientras ve el Monitor en serie, es posible que vea algo extraño. Probablemente notarás que obtienes más cambios de estado que lanzamientos del interruptor. ¿De dónde vienen estos extras aleatorios?


    This page titled 8.1: Introducción is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.