Saltar al contenido principal
LibreTexts Español

29.3: Interrupciones internas - LED parpadeante

  • Page ID
    82344
  • \( \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}}\)

    En esta sección vamos a examinar una serie de ejemplos usando interrupts trigger por el temporizador/contadores internos. Esta técnica hace uso del desbordamiento o comparar eventos de coincidencia. Por lo general, se usa cuando se desea que los eventos ocurran en momentos predecibles pero sin la penalización y limitaciones de usar un enfoque de estilo simple delay (). Es decir, los desencadenantes de estos eventos no necesitarán tu atención en el ciclo principal del programa sino que generalmente serán de una variedad de “establecer y olvidar”. Hay un registro de máscara de interrupción de temporizador para cada uno de los contadores (TIMSK0, TIMSK1 y TIMSK2). Se deben establecer los bits apropiados para habilitar la interrupción deseada.

    El primer ejemplo muestra un método sencillo de parpadear un LED “manos apagadas”. El ciclo de trabajo del parpadeo siempre será del 50% aunque es posible alterarlo. El ejemplo también muestra cómo generar intervalos de tiempo largos a partir de un temporizador/contador de ocho bits mediante el uso de una variable global. El ejemplo se muestra a continuación.

    /* Timer/Counter Interrupt Example
       Shows how to blink an LED "hands off" using overflow
       Also shows how to get a large timing value from an 8 bit counter
       normal count mode
    */
    volatile int g_time = 0;
    
    #define LEDMASK 0x01
    #define ISR_COUNT 50
    
    void setup()
    {
        DDRB |= LEDMASK;
    
        TCCR2A = 0;           // normal mode, OC2x pin disconnected
        TCCR2B = 0x07;        // 1024x prescale
    
        TIMSK2 = (1<<TOIE2);  // enable overflow interrupt
    }
    
    ISR(TIMER2_OVF_vect)
    {
    if(!g_time)
        PORTB ^= LEDMASK;
    
    g_time++;
    if( g_time >= ISR_COUNT )
        g_time = 0;
    }
    
    void loop()
    {
    }
    

    Temporizador/contador 2 se usa aquí en modo normal, lo que significa que contará de 0 a 255 y luego se desbordará y repetirá. El preescalador está configurado para 1024x, produciendo ticks a aproximadamente 16 kHz. Entonces se habilita la interrupción de desbordamiento para este contador. Esto activa el Timer2_OVF_VECT.

    Un conteo completo de 0 a 255 creará un desbordamiento a una velocidad de poco más de 60 Hz. Esto significa que el LED tendrá un solo ciclo de encendido/apagado a una velocidad de aproximadamente 30 por segundo que es un poco demasiado rápido a simple vista. Por lo tanto, no podemos simplemente alternar el LED ya que siempre aparecerá encendido. En cambio, hacemos uso de una variable global, g_time, que hará un seguimiento de cuántas veces ha ocurrido la interrupción. Una vez que llegue a nuestro máximo predeterminado, ISR_COUNT, se restablecerá y el LED se activará. Ahora tenemos un LED parpadeante que está completamente “manos fuera” en lo que respecta al flujo de código principal. Nuevamente, tenga en cuenta que loop () está vacío. Este seguirá siendo el caso en los ejemplos restantes.


    This page titled 29.3: Interrupciones internas - LED parpadeante 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.