Pardon Me?

Today we have a new tutorial all about Processor Interrupts with Arduino. First, let's talk a little bit about what an "interrupt" is. No, it's not the guy from down the hall who comes in your office every five minutes to chat. Rather, an interrupt in this context describes when a processor is performing its normal program while waiting for some kind of event - or an "interrupt." It could be the push of a button, the presence of a certain level of ambient light, or any number of disruptive-type things.

In this tutorial from SparkFun Engineer Jordan, he explains the basics of using an interrupt function, what the benefits are, and provides some sample code so you can start playing around with interrupts on your own. Check out the tutorial for more information!

Comments 25 comments

  • Completely off-topic, but could you guys change the font/size of the main text above to be the same as the comments?

    • Hey now that you mention it, yeah it does look kinda weird.. just the news section has a serif font, the rest of the site is sans

    • I dunno, I like that Georgia font they’re using for the news/articles. The Arial font in the comments section isn’t even designed for screen media. Verdana would probably be a better choice than Arial. I also like how the font color in the article text is a darker shade of gray.

  • Would you mind creating a similat tutirial for Picaxe?

  • “Never interrupt me when I’m trying to interrupt you.” – Winston Churchill

    Seems appropriate…..

  • Neat. Coincidentally I just checked some code into Github for Ardunio Mega that controls 3 steppers (Via EasyDrivers I got from Sparkfun) from 3 analog inputs using a TIMER3 interrupt.

  • please help me,in which terminals of MQ-6 gas sensor we have to connect Vcc,output,ground?

  • So wait… will there be a follow-up post tomorrow to tell us what to do about the other kind of interrupt?

  • How does the interrupts priority work on Arduino? For exemple, if the Arduino is treating interrupt 0, and an event on interrupt 1 occurs, what happens? Another issue is that the function “delay()” doesn´t work inside an interrupt but the millis() works, so the priority of an interruption for counting millis is higher than priority for interrupts 0 & 1 and takes place even if Arduino is executing an interruption 0 or 1 code!!!

    • Usually in the body of an interrupt the code disable interrupts globally and then when the interrupt exits re-enables those interrupts. This is my experience from using straight C with AVR-GCC and not Arduino code but I would be very surprised if it worked any other way.

      Also, delay makes use of a timer interrupt so I suspect other interrupts are disabled until the delay finished. See SEI and CLI in the avr-gcc documentation.

      • Now when I have an interrupt routine usually at the beginning I call a CLI and at the end I call SEI. Are you saying this is not needed? I never did fully understand the implementation of multiple interrupts.

        • Check your documentation. I know that avr-gcc libraries do this automatically (although you can make a naked ISR routine that doesn’t).

          • I checked and, for ATMEGA328, when an interrupt occurs all other are disabled when the interrupt code is been executed and enable on the return of the interrupt (RET) automatically. If you need that a higher priority interrupt occurs inside another one with lower priority, you must enable manually the higher priority interrupt inside the lower interrupt priority code. The millis() function, I believe, is builded on this way, because it works inside a code for the interrupt 0 for example like this code (debouncing) posted at

      • Correct, many companies have different ways of handling it, but Atmel chose to disable any interrupts from occurring when it is processing one. However, if you need to keep all the interrupts working, you do need to enable them again in the interrupt function. So in this case, what happens when a higher priority interrupt occurs? Well, most interrupts occur in stacks, so the MCU should pause the current interrupt do the higher priority one, and then go back to the one it was processing. There are a lot of articles around interrupt prioritization and handling on CPUs and MCUs.

        I am not totally familiar with what delay() and millis() contain, but when writing pure C code, to handle delay you basically run a for-loop with a NOP instruction. Basically, you’re polling nothing for a finite time.

        • I am fairly certain that delay() uses timer1 and disables other interrupts so as to not miss the timed event. This is why I am avoiding Arduino for my lasertag project, I didn’t want the library to get in my way for timing critical problems.

  • An Arduino interrupt is so easy to implement. I have been working with PICs for years and they are, at the very least, painful.

    • Well, Arduino makes everything easy. ;) It’s a bit more work on a bare AVR. I always rather liked the PICs interrupt architecture.

    • You know another platform that was painful on using? Freescale’s HC11’s. Luckily they provided header files to help, but it was still painful to basically instantiate the interrupt 3 times in the course of the code. Luckily with the S12 and Code Warrior, it is super simple.

      • OMG i had to use the HC12 in school on the “dragon12” board. my instructor actually had to write his own header files to be able to use the stupid thing. also needed of board power supply for servos. it was ugly and cannabilised as soon as i graduated for headers and the LCD.

This Week

This Month


Happy Arduino Day!