Académique Documents
Professionnel Documents
Culture Documents
Systèmes Embarqués 1: Les Interruptions: Activités Pratiques
Systèmes Embarqués 1: Les Interruptions: Activités Pratiques
Systèmes Embarqués 1: Les Interruptions: Activités Pratiques
Une ISR n’est pas interrompue par une nouvelle interruption. La nouvelle
interruption ne sera prise en compte que lorsque l’ISR en cours se terminera.
Les Interruptions ont chacune une priorité. Par exemple, les interruptions externes
sont plus prioritaires que les interruptions des Timers. L’Arduino exécutera les ISR
dans leur ordre de priorité. L’ordre de priorité est donné dans la table ci-dessous.
La source d’interruption située la plus en haut de la table est la plus prioritaire.
Source Rôle
INT0 Interruption externe sur la broche 2
void loop() {
digitalWrite(ledPin, state);
}
void blink() {
state = !state;
}
BOARD INT.0 INT.1 INT.2 INT.3 INT.4 INT.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
32u4 based (e.g
3 2 0 1 7
Leonardo, Micro)
Exemple 2
detachInterrupt(numero);
void compteur() {
static unsigned long temps_dernier = 0;
unsigned long temps = millis();
while ((temps - temps_dernier) <= 1000); {
compt++;
temps_dernier = temps; }
affichage(); }
void affichage() {
vitesse = valeur*compt; //calcul de la vitesse du vent
Serial.print("vitesse du vent :");
Serial.println(vitesse);
compt = 0; }
int anemometre = 3; // broche de l'anémometre
void setup() {
pinMode(anemometre, INPUT);
Serial.begin(9600);
temps=millis();
attachInterrupt(digitalPinToInterrupt(3),compteur,RISING); //fonction pour compter le nombre d'interruption
}
void loop() {
if (interrupt != 0) {
temps_maintenant = millis();
while (temps - temps_maintenant <= 1000) {
vitesse = valeur*interrupt; //calcul de la vitesse du vent
Serial.print("vitesse du vent :");
Serial.println(vitesse); }
interrupt = 0; }
Serial.print("Pas de vent"); }
void compteur() {
interrupt++; // on incrémente interrupt
}
Exemple inspiré
int pin = 4;
const byte interruptPin = 2; on voudrais calculer la vitesse d’un train, on a un
volatile byte compteur; capteur à effet hall dessous un wagon et un aimant qui
float Temps;
est sur l’essieu.
unsigned long timeold;
float DP = 3.5;
On calcule le temps entre deux interruptions pour
ensuite calculer la vitesse avec le temps.
void setup() {
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), compte, LOW);
pinMode(pin, INPUT);
Serial.begin(9600);
timeold = 0; }
void loop() {
Temps = (millis() - timeold)*compteur;
Serial.println(Temps); }
void compte ( ) {
compteur = compteur+1; }
Timer
Timer
• Le timer0, sur 8 bits, utilisé par les fonctions delay(), millis() et micros(). Il
commande également des PWM (Pulse Width Modulation ou Modulation par Largeur
d’Impulsion) sur les broches 5 et 6.
• Le timer2, sur 8 bits, qui est utilisé par la fonction Tone() ou bien pour de la PWM
sur les broches 3 et 11.
Les registres de contrôle