Teensy USB Interrupts

6

Estoy tratando de aprender acerca de las interrupciones utilizando una de las tarjetas Teensy USB . Tiene un chip AVR AT90USB1286 en él. Estoy usando el código a continuación, y espero que se llame a mi bloque ISR y parpadee periódicamente el LED en el pin 6. Pero no pasa nada. ¿Alguien puede ver lo que estoy haciendo mal?

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define PIN_ON(n) (PORTD |= (1<<(n)))
#define PIN_OFF(n) (PORTD &= ~(1<<(n)))

#define LED_CONFIG  (DDRD |= (1<<6))
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))

#define OVERFLOW_INTERRUPT_ENABLE (TIMSK0 |= (1<<TOIE0))


volatile unsigned int overflow_count = 0; //Count of overflows

ISR(TIMER0_OVF_vect) {
  cli(); //Disable Global Interupt
  if (overflow_count < 0xFFFF) {
    overflow_count++;
  }
  else {
    PIN_ON(6);
    _delay_ms(500);
    PIN_OFF(6);
    overflow_count = 0;
  }
  sei(); //enable global interupt

}
int main(void)
{

    // set for 16 MHz clock, and make sure the LED is off
    CPU_PRESCALE(0);
    LED_CONFIG;
    OVERFLOW_INTERRUPT_ENABLE;
    sei(); //enable global interupts


    while (1) {
      _delay_ms(1000);
      //analogWrite(6, 10);
    }
}
    
pregunta MattyW

2 respuestas

4

Su ISR no debe deshabilitar y volver a habilitar las interrupciones y no debe retrasarse.

Prueba:

ISR(TIMER0_OVF_vect)
{
  PORTD ^= 1<<6;
}

O incluso:

ISR(TIMER0_OVF_vect)
{
    if (overflow_count < 0xFFFF)
        overflow_count++;
    else
    {
        overflow_count = 0;
        PORTD ^= 1<<6;
    }
}

Luego, configure la frecuencia de interrupción del temporizador cambiando TCCR0B .

Para comenzar el temporizador, es posible que también deba borrar el contador:

TCNT0 = 0
    
respondido por el Toby Jaffey
1

Algunas cosas para verificar:

  • El vector para la interrupción en cuestión apunta a su ISR
  • La interrupción está habilitada
  • La interrupción se está activando. Si el dispositivo de interrupción es un reloj de funcionamiento libre, el reloj se ha iniciado correctamente. Si es un disparo único, el disparo único se reinicia después de cada interrupción.
respondido por el JRobert

Lea otras preguntas en las etiquetas