Professional Documents
Culture Documents
Claude Barbaud
10 janvier 2011
Principe:
Le fonctionnement par interruptions sur un microcontrleur permet celui-ci
d'excuter une tche(programme principal) qui peut tre interrompue par un
vnement. Le processeur doit alors excuter une tche(sous-programme)
associe cette source d'interruption. Quand la tche est excute, le processeur
revient sa tche principale.
On peut faire une analogie avec quelqu'un qui fait la cuisine tranquillement: il
peut tre interrompu par plusieurs sources: la sonnette de la maison, le tlphone,
la minuterie de ses appareils de cuisson, le dtecteur de fume. Il doit traiter
l'vnement avant de revenir sa tche principale. Le traitement de ces
vnements peut lui-mme tre interrompu par un vnement jug plus important.
De la mme faon, avec un systme ordin, on doit souvent dfinir des priorits
dans les interruptions:
Le traitement d'une interruption peut tre interrompu par une interruption
qui lui est prioritaire.
Le traitement d'une interruption ne doit pas tre interrompu par une
interruption de niveau infrieur.
Le traitement d'une interruption ne peut tre interrompu par aucune autre.
Sources d'interruptions
Les interruptions peuvent tre causes par des sources externes ou par des sources
internes
Sources externes:
broches parallles (Exemples: clavier, alarme)
ports sries
Sources internes
Timer
Convertisseur A-N
Reset
19-1
}
//---------------------------------------------------//
// void cligne(int x)
//
//
//
// Clignotement de la led verte x fois a
//
// intervalle de 200 ms.
//
//-------------------------------------------------- //
void cligne(int x)
{
int i;
for (i=0; i<x; ++i)
{
output_low(led);
delay_ms(80);
output_high(led);
19-2
delay_ms(80);
Source de l'interruption
La source de l'interruption est indique au dbut du sous-programme d'interruption par la
directive #int_ext . Cette directive identifie RB0 comme source de l'interruption.
Autre directive concernant les sources externes:
#int_rb
Seules les broches dfinies en entre peuvent dclencher une interruption. Ces directives
ne discriminent pas quelle entre est la source, mais on peut utiliser bit_test()
Validation de l'interruption
L'interruption ne peut tre active que si elle est valide
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// adresse du port B
19-3
#int_rb
rb_ext( )
{
int lecture;
disable_interrupts(GLOBAL); // Evite de s'interrompre soi-meme
lecture = port_b & 0xF0;
// isole les 4 bits d'en haut
if(bit_test(lecture, 4))
// on peut tester les bits pour
// decider des actions
cligne(4);
if(bit_test(lecture, 7))
cligne(7);
enable_interrupts(GLOBAL);
}
//-------------------- Programme
void main(void)
{
set_tris_b(0xFF);
//
enable_interrupts(INT_RB); //
enable_interrupts(GLOBAL); //
cligne(4);
}
while(1);
//---------------------------------------------------//
// void cligne(int x)
//
//
//
// Clignotement de la led verte x fois a
//
// intervalle de 200 ms.
//
//-------------------------------------------------- //
void cligne(int x)
{
int i;
for (i=0; i<x; ++i)
{
output_low(led);
delay_ms(200);
output_high(led);
delay_ms(200);
19-4
// Tmoin
19-5
ms_100=10;
i=0;
min=0;
sec=FALSE;
set_timer1(3035);
// 65535-62500 = 100 ms avec
setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 ); // un cristal de 20
mHz.
TMR1IF=0;
// Reset de l'indicateur d'int. du
timer1
enable_interrupts(int_timer1);
enable_interrupts(GLOBAL);
do {
if (sec) {
i++;
if (i==60) {
i=0;
++min;
if (min==60) min=0;
}
printf("\r%2u:%2u",min,i);
sec=FALSE;
}
} while (TRUE);
}
disable_interrupts(int_timer1);
//---------------------------------------------------//
// void cligne(int x)
//
//
//
// Clignotement de la led tmoin x fois
//
// intervalle de 200 ms.
//
//-------------------------------------------------- //
void cligne(int x) {
int i;
for (i=0;i<x;i++) {
output_high(TEMOIN);
delay_ms(100);
output_low(TEMOIN);
delay_ms(100);
}
}
19-6
last_b;
// memorisation de l'ancienne valeur du port
cmpt1, cmpt2, cmpt3;
19-7