Bonjour,

J'ai récupéré sur un site,un morceau de code que j'ai modifié pour mon fréquencemètre et qui fonctionne...
Pourriez vous m'expliquer et me décortiquer des lignes de code que je ne comprends pas.

Je sais que ce code n'est pas optimisé , mais je suis en train d'apprendre...


Voici les lignes que je ne comprends pas :

1) deltaT = 1.0*ninter*1024*256/F_CPU; Que veut dire 1.0
2) count = ((uint32_t)count_high)<<16 | count_low; Pourriez vous me l'expliquer
3) TCCR2A |= (1 << WGM21); // CTC mode 'clear timer on compare), top = OCR2A; Je ne comprends pas la barre verticale avant le signe égal

Voici le code complet:

Merci

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
int inputPin = 5; // entrée T1 pour Timer1
 
volatile uint32_t count_high,count_low;
volatile uint32_t count;
volatile uint16_t ni; // compteur d'interruptions
uint16_t ninter = 60; // nombre d'interruptions pour un comptage 
float deltaT;
 
 void setup() {
  Serial.begin(115200);
  pinMode(inputPin,INPUT);
  deltaT = 1.0*ninter*1024*256/F_CPU;
  cli();               
 
         //déclenche le Timer1 (pour le comptage en mode capture) et le Timer2 pour les interruptions.
 
       // Timer 2 : génération d'interruptions périodiques
  TCCR2A |= (1 << WGM21); // CTC mode 'clear timer on compare), top = OCR2A
  OCR2A = 0xFF; // fréquence d'interruption 16 MHz /1024/256
  TIMSK2 = 1 << TOIE2; // overflow interrupt enable
  TCNT2 = 0;
  ni = 0;
 
  // Timer 1 : compteur d'impulsions
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  TIMSK1 = 1<<TOIE1; // overflow interrupt enable
  count = 0;
 
 
  TCCR2B |= (0 << CS12) | (1 << CS11) | (1 << CS10); // prescaler = 8
  TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10); // external clock on rising edge
  sei(); // activation des interruptions
}
 
 
//Voici la fonction appelée lors de l'interruption déclenchée par le débordement du Timer 2. 
//Lorsque le nombre d'interruptions atteint ninter, on enregistre le nombre d'impulsions comptées dans count puis on remet le compteur d'impulsions à zéro.
 
ISR(TIMER2_OVF_vect)
{  
       // Overflow interrupt
   ni++;
   if (ni==6) 
   {
     ni = 0;
     count_low = TCNT1;
     TCNT1 = 0;
     count = ((uint32_t)count_high)<<16 | count_low;
    count_high = 0;
   }
}
 
 
   ISR(TIMER1_OVF_vect) 
  {
    count_high++;
 
  }
 
 
//La fonction loop affiche, toutes les 100 ms. La fréquence divisé par 10
 
void loop() {
  delay(100);
  uint32_t freq = count/deltaT;
 
  Serial.print("Frequence (Hz) = ");
  Serial.println(freq);