//pour µ328 donc UNO, NANO
#define sortie_signal 9                                   //portB bit 1 => D9   sortie du signal 
#define entree_signal 2                                   //portD bit 2 => D2   entrée du signal
int regime                                    =      0;   //régime moteur en tr/mn
unsigned long periode                         =      0;
unsigned long frequence                       =      0;
unsigned long duree_positive                  =   6000;
unsigned long duree_negative                  =      0;
volatile unsigned long nombreCycles_2         =      0;
volatile unsigned long top_horloge_positif    =      0;
volatile unsigned long top_horloge_negatif    =      0;

// ****************************************************** ISR TIMER 2 chrono parties haute et basse signal entrant
ISR(TIMER2_OVF_vect) {                           //256*((1/16000000)*1024)
  (nombreCycles_2 += 256);                       // compte les tops horloge prescalés niveaux hauts/bas entrants
}
// ****************************************************** ISR TIMER 1  signal sortant
ISR(TIMER1_COMPA_vect) {
}
// ****************************************************** ISR SIGNAL ENTRANT INT 0 détermine les niveaux signal entrant
void isr_signal_entrant()
{
  TCCR2B = 0b00000000;                                 //stoppe le timer 2
  if (PIND & 0b00000100)                                 //si D2 arrive sur un niveau HAUT
  {
    top_horloge_negatif = (nombreCycles_2 + TCNT2);      //en tops horloge prescalés
    TCNT2 = 0; nombreCycles_2 = 0;                       //ré-initialise le timer 2
    TCCR2B = 0b00000111;                                 //relance le timer 2
  }
  else                                                   //sinon D2 arrive sur un niveau BAS
  {
    top_horloge_positif = (nombreCycles_2 + TCNT2);
    TCNT2  = 0; nombreCycles_2 = 0;                     //ré-initialise le timer 2
    TCCR2B = 0b00000111;                                //relance le timer 2 en mode overflow
    periode = ((top_horloge_positif + top_horloge_negatif) * 64); // calcule de la periode entrante
    frequence = (1000000 / periode); regime = (frequence * 60);   // calcul fréquence signal et régime moteur
  }
  OCR1A = ((((top_horloge_positif + top_horloge_negatif) >> 1)) * 9) / 12;
}
//  ********************************************************************************************** setup
void setup()
{
  Serial.begin(115200);                           // vitesse de com avec le moniteur en bauds
  DDRB |= 0b00000010;                             // 1 =  D9 en sortiee -> (signal origine)
  DDRD &=0b11111011;                             // 0 =  D2 en entrée
  attachInterrupt(0, isr_signal_entrant, CHANGE );// INT0 = interruption sur D2 -> entrée du signal
  cli();
  TCCR1A = 0b01000000;                     // OC1A en toggle
  TCCR1B = 0b00001101;         // init des registres timer 1 pour calcul du nombre de cycles prescalés
  TIMSK1 = 0b00000010; TCNT1 = 0; OCR1A = 0;      // du µ pour la partie basse du signal sortant

  TCCR2A = 0; TCCR2B = 0b00000111;                // init des registres timer 2 pour calcul du nombre de cycles
  TIMSK2 = 0b00000001; TCNT2 = 0;  sei();         // des parties hautes et basses du signal entrant
  Serial.println("*************************pret");
}
// ********************************************************************************************** loop
void loop()
{}
100
Loading chip...chip-scope