#include <avr/io.h>
#include <avr/interrupt.h>
#include "pin_macros.h"
unsigned char led=0;
ISR(INT0_vect) {
if (led){
b0_high;
led = 0;
} else {
b0_low;
led = 1;
}
}
int main (void)
{
b1_input; //switch
b0_output; //led output
MCUCR = 1<<isc01; //set INT0 as falling edge trigger
GIMSK = 1<<INT0; //enable INTO in global interrupt mask
sei(); //enable interrupt
while(1) {
;; //interrupt do the rest
}
}
B1 is connected to a switch, and B0 is connected to a LED.
When B1 is pressed, it would toggle the LED On or Off.
Download the whole project : http://labs.bitartist.org/test_int0.tar.gz
Reference:
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
2 comments:
Thanks.
However note that "isc01" should be changed to "ISC01".
Note that mechanical switches bounce. That is, switch opening or closure is rarely a clean digital state transition. So when you flip the switch, it may actually register open-closed-open-closed-open... multiple times. This would cause your LED to turn on and off multiple times for a single change of the switch state.
There are various debouncing schemes - but a simple addition to this program would be to add a delay in the ISR. Something like _delay_ms(100) should do the trick. If you turn the switch on and off in less than a 10th of a second, it may not register, but otherwise, you should be okay.
Post a Comment