@ 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
}
}