//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()
{}