¿Alguien tiene algún ejemplo o sugerencia que utilice el ATMEGA2560 de Atmel y las interrupciones externas?

3

Estoy intentando utilizar un ATMEGA2560 y es una interrupción. Tengo un código que debo ejecutar hasta que se presione un botón, momento en el que necesito que el código se detenga y espere a que se presione otro botón para continuar.

¿Alguien está familiarizado con este tipo de circuito y las interrupciones?

Esto es a lo que me refiero actualmente para ATMEGA2560 interrupciones .

    
pregunta Michael Eakins

2 respuestas

4

@ LoneTech: Pensé que este sitio era para ayudar a la gente. No los deje por falta de información, sino que se los proporcione si es necesario. Además, las interrupciones se pueden usar para interrumpir otros códigos sin dañar la velocidad de su bucle principal. Si tu botón debe cambiar un proceso y tu bucle principal está controlando una ola o algo así. INT0 podría ser utilizado. Tampoco sabe para qué otras operaciones planea utilizarlo este individuo.

@ Michael: Este código me tomó un tiempo para localizar y comprender también. He escrito código para AVRs por más de 5 años y por PC 13+ años. Es sorprendente la poca documentación que hay a tu alcance. Me encontré con un buen tutorial y finalmente hice clic.

void InitINT0()
{
    // Enable INT0 External Interrupt
    EIMSK |= 1<<INT0;

    // Falling-Edge Triggered INT0 - This will depend on if you
    // are using a pullup resistor or a pulldown resistor on your
    // button and port
    MCUCR |= 1<<ISC01;
}

int main(void)
{
    //Init Timer
    InitINT0();

    //Which Interrupt pin you need to enable
    //can be found in the datasheet, look at the pin
    //configuration, usually within the first 5 pages
    //track down INT0 - which is PORTD pin 0.
    //This needs to be an input.
    DDRD &= 0;

    // Enable Interrupts
    sei();

    //Givin that PORTD0 is the INT0, your button should
    //be hooked up to it.

    while(1)
    {
        //Do your operation
    }
}

// External Interrupt 0 ISR
ISR(INT0_vect) 
{
    while (/*Button is down*/) //0 is the pin for your button
    { 
        //Pause your operation , this will pause everything though
        //because Interrupts take priority over pretty much everything
        //This includes other interrupts and your main loop
    }
} 
    
respondido por el Jimmie Clark
2

Mucha gente está familiarizada con eso, sí, ya que no es diferente a cualquier otro AVR. Los detalles dependen del compilador y la biblioteca que utilice, y debe verificar su documentación, así como la hoja de datos. AVRfreaks, que te vinculaste a ti mismo, tiene mucho más sobre el tema y es probablemente un mejor lugar para preguntarte si te quedas atascado (en lugar de que nunca hayas empezado a leer ...). Por ejemplo, avr-libc se usa con GCC.

Como una nota al margen, la situación que describe no se hace evidente por qué necesita interrupciones. Por lo general, es más fácil simplemente presionar el botón.

    
respondido por el Yann Vernier

Lea otras preguntas en las etiquetas