Bonjour, j'ai un projet dans lequel je déclenche une interruption à chaque front descendant pour un compteur de vitesse avec aimants et capteur à effet Hall.
Et je voudrais aussi gérer un timer pour effectuer le rafraîchissement des diverses informations collectées.
Or, il y a un petit souci avec les interruptions;
je déclare :
attachInterrupt(digitalPinToInterrupt(pinInterrupt), function, FALLING);
pour associer la pin à la routine d'interruption mais ceci fait quoi exactement ?
Il fait l'association mais il active aussi implicitement toutes les interruptions pour pouvoir activer, au moins, la sienne.
Je préfère de loin utiliser cli() et sei() pour gérer les interruptions quand je veux
Des fois on peut avoir besoin de désactiver toutes les interruptions
Comment peut-on faire pour associer une pin à une interruption timer et ne la mettre en service que lorsque la fonction sei() apparaît ?
#include "define.h"
//storage variables
boolean toggle1 = 0;
void setup(){
//set pins as outputs
pinMode(LED, OUTPUT);
// ????????????????????
attachInterrupt(digitalPinToInterrupt(pinInterrupt), function, FALLING);
pinMode(pinInterrupt, INPUT);
cli();//stop interrupts
//set timer1 interrupt at 1Hz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;//initialize counter value to 0
// set compare match register for 1hz increments
//OCR1A = 15624;// = (16*10^6) / (1*1024) - 1 (must be <65536)
// maximum de registre compare, soit 0.28 Hz soit 4.19 secondes
OCR1A = 65535;// = (16*10^6) / (1*1024) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS12 and CS10 bits for 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//allow interrupts
}//end setup
//////////////////////////////////////////////////////////////////
// //
// routines d'interruptions //
// //
//////////////////////////////////////////////////////////////////
ISR(TIMER1_COMPA_vect){//timer1 interrupt 1Hz toggles pin 13 (LED)
//generates pulse wave of frequency 1Hz/2 = 0.5Hz (takes two cycles for full wave- toggle high then toggle low)
if (toggle1){
digitalWrite(LED,HIGH);
toggle1 = 0;
}
else{
digitalWrite(LED,LOW);
toggle1 = 1;
}
}
// fonction appelée à chaque front descendant sur la pin 2
void function() {
compteur += 1;
tempfunc = millis();
}
void loop(){
//do other things here
}