25 |
|
|
26 |
/* $Id$ */ |
/* $Id$ */ |
27 |
|
|
28 |
/** \defgroup avr_interrupts <avr/interrupt.h> <avr/signal.h>: Interrupts and Signals |
/** \defgroup avr_interrupts <avr/interrupt.h>: Interrupts |
29 |
|
|
30 |
\note This discussion of interrupts and signals was originally taken from Rich Neswold's |
\note This discussion of interrupts was originally taken from Rich Neswold's |
31 |
document. See \ref acks. |
document. See \ref acks. |
32 |
|
|
33 |
<h3>Introduction to avr-libc's interrupt handling</h3> |
<h3>Introduction to avr-libc's interrupt handling</h3> |
51 |
|
|
52 |
These details seem to make interrupt routines a little messy, but all these |
These details seem to make interrupt routines a little messy, but all these |
53 |
details are handled by the Interrupt API. An interrupt routine is defined with |
details are handled by the Interrupt API. An interrupt routine is defined with |
54 |
SIGNAL(). This macro register and mark |
ISR(). This macro register and mark |
55 |
the routine as an interrupt handler for the specified peripheral. The |
the routine as an interrupt handler for the specified peripheral. The |
56 |
following is an example definition of a handler for the ADC interrupt. |
following is an example definition of a handler for the ADC interrupt. |
57 |
|
|
58 |
\code |
\code |
59 |
#include <avr/signal.h> |
#include <avr/interrupt.h> |
60 |
|
|
61 |
SIGNAL(ADC_vect) |
ISR(ADC_vect) |
62 |
{ |
{ |
63 |
// user code here |
// user code here |
64 |
} |
} |
73 |
installed, which usually indicates a bug), then the default action is to reset |
installed, which usually indicates a bug), then the default action is to reset |
74 |
the device by jumping to the reset vector. You can override this by supplying |
the device by jumping to the reset vector. You can override this by supplying |
75 |
a function named \c __vector_default which should be defined with |
a function named \c __vector_default which should be defined with |
76 |
SIGNAL() as such. |
ISR() as such. |
77 |
|
|
78 |
\code |
\code |
79 |
#include <avr/signal.h> |
#include <avr/interrupt.h> |
80 |
|
|
81 |
SIGNAL(__vector_default) |
ISR(__vector_default) |
82 |
{ |
{ |
83 |
// user code here |
// user code here |
84 |
} |
} |
107 |
|
|
108 |
\anchor attr_interrupt |
\anchor attr_interrupt |
109 |
\code |
\code |
110 |
void SIG_XXX(void) __attribute__((interrupt)); |
void XXX_vect(void) __attribute__((interrupt)); |
111 |
void SIG_XXX(void) { |
void XXX_vect(void) { |
112 |
... |
... |
113 |
} |
} |
114 |
\endcode |
\endcode |
115 |
|
|
116 |
where \c SIG_XXX is the name of a valid interrupt vector for the MCU |
where \c XXX_vect is the name of a valid interrupt vector for the MCU |
117 |
type in question, as explained below. |
type in question, as explained below. |
118 |
|
|
119 |
<h3>Chosing the vector: Interrupt vector names</h3> |
<h3>Chosing the vector: Interrupt vector names</h3> |
138 |
The historical naming style might become deprecated in a future |
The historical naming style might become deprecated in a future |
139 |
release, so it is not recommended for new projects. |
release, so it is not recommended for new projects. |
140 |
|
|
141 |
\note The SIGNAL() macro cannot really spell-check |
\note The ISR() macro cannot really spell-check |
142 |
the argument passed to them. Thus, by misspelling one of the names |
the argument passed to them. Thus, by misspelling one of the names |
143 |
below in a call to SIGNAL(), a function will be created |
below in a call to ISR(), a function will be created |
144 |
that, while possibly being usable as an interrupt function, is not |
that, while possibly being usable as an interrupt function, is not |
145 |
actually wired into the interrupt vector table. The compiler will |
actually wired into the interrupt vector table. The compiler will |
146 |
generate a warning if it detects a suspiciously looking name of a |
generate a warning if it detects a suspiciously looking name of a |
147 |
SIGNAL() function (i.e. one that after macro replacement does not |
ISR() function (i.e. one that after macro replacement does not |
148 |
start with "__vector_"). |
start with "__vector_"). |
149 |
|
|
150 |
*/ |
*/ |