Hello,
J'ai un doute sur la programmation d'un timer qui me donne des résultats qui ne correspondent pas au calcul
Sur un Aruino Nano V3.0, voilà le programme :
// Faire clignoter la led en utilisant une interrruption Timer2
// Calcul prescaler :
// Fréquence horloge / prescaler / fréquence souhaitée = OCRnA
// 16000000 / 1024 / 100 = 156.25
#define ledPin 13
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
// initialize timer1
noInterrupts(); // disable all interrupts
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
//compare match register 16MHz/256/2Hz
OCR2A = 156; // 256 maxi pour timer 2 (8bits)
TCCR2B |= (1 << WGM21); // CTC mode
TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20); // 1024 prescaler
TIMSK2 |= (1 << OCIE2A); // enable timer compare interrupt
interrupts(); // enable all interrupts
Serial.println("OK");
}
//timer compare interrupt service routine
// toggle LED pin
ISR(TIMER2_COMPA_vect){
static int nbre = 0;
nbre++;
if (nbre > 100){
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
nbre = 0;
}
}
void loop(){
static boolean lastLed;
boolean valLed = digitalRead(ledPin);
if (valLed){
if (lastLed){
Serial.println(millis());
lastLed = false;
}
}
else{
lastLed = true;
}
}
Et voilà le résultat :
1647
4957
8266
11576
14885
18195
21505
24814
28124
soit un interval de 3,31s.
si je reprends le calcul du prescaler et le traitement de l'affichage, je devrais avoir 2s!...
Alors je me suis certainement mélangé les pinceaux sur les registres de l'ARDUINO mais je ne sais pas où, si quelqu'un a vu ma boulette...