Je voudrais configurer une minuterie afin d'appeler une fonction 800 fois par seconde. J'utilise l'Arduino Mega et Timer3 avec un pré-échelle de 1024. Pour choisir le facteur de pré-échelle, j'ai considéré les étapes suivantes:
- Fréquence du processeur: 16 MHz
- Résolution de la minuterie: 65536 (16 bits)
- Diviser freq du processeur par l'étage d' adaptation choisi: 16x10 ^ 6/ 1024 = 15625
- Divisez le reste à la fréquence souhaitée 62500/800 = 19 .
- Mettez le résultat + 1 dans le registre OCR3.
J'ai utilisé le tableau suivant pour définir les registres de TCCR3B:
L'erreur
Il est impossible de compiler le code. C'est l'erreur retournée par le compilateur:
Servo \ Servo.cpp.o: Dans la fonction '__vector_32': C: \ Program Files (x86) \ Arduino \ bibliothèques \ Servo / Servo.cpp: 110: définition multiple de '__vector_32' AccelPart1_35.cpp.o: C: \ Program Files (x86) \ Arduino / AccelPart1_35.ino: 457: d'abord défini ici c: / program files (x86) / arduino / hardware / tools / avr / bin /../ lib / gcc / avr / 4.3.2 /. ./../../../avr/bin/ld.exe: Désactiver la relaxation: cela ne fonctionnera pas avec plusieurs définitions
Le code
volatile int cont = 0;
unsigned long aCont = 0;
void setup()
{
[...]
// initialize Timer3
cli(); // disable global interrupts
TCCR3A = 0; // set entire TCCR3A register to 0
TCCR3B = 0; // same for TCCR3B
// set compare match register to desired timer count: 800 Hz
OCR3A = 20;
// turn on CTC mode:
TCCR3B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR3B |= (1 << CS30) | (1 << CS32);
// enable timer compare interrupt:
TIMSK3 |= (1 << OCIE3A);
// enable global interrupts:
sei();
}
void loop()
{
// Print every second the number of ISR invoked -> should be 100
if ( millis() % 1000 == 0)
{
Serial.println();
Serial.print(" tick: ");
Serial.println(contatore);
contatore = 0;
}
}
[...]
// This is the 457-th line
ISR(TIMER3_COMPA_vect)
{
accRoutine();
contatore++;
}
void accRoutine()
{
// reads analog values
}
Comment résoudre le conflit avec la bibliothèque de servomoteurs?
SOLUTION
Conflit résolu en utilisant le code suivant. Il compile mais le compteur associé au temporisateur 800Hz n'incrémente pas sa valeur.
volatile int cont = 0;
void setup()
{
Serial.begin(9600);
// Initialize Timer
cli(); // disable global interrupts
TCCR3A = 0; // set entire TCCR3A register to 0
TCCR3B = 0; // same for TCCR3B
// set compare match register to desired timer count: 800 Hz
OCR3B = 20;
// turn on CTC mode:
TCCR3B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR3B |= (1 << CS30) | (1 << CS32);
// enable timer compare interrupt:
TIMSK3 |= (1 << OCIE3B);
// enable global interrupts:
sei();
Serial.println("Setup completed");
}
void loop()
{
if (millis() % 1000 == 0)
{
Serial.print(" tick: ");
Serial.println(cont);
cont = 0;
}
}
ISR(TIMER3_COMPB_vect)
{
cont++;
}
Depuis que le problème principal a été résolu, j'ai créé ici une autre question liée au problème de l'incrémentation du compteur.
#define _useTimer3
ligne, ou essayez de mettre un #undef _useTimer3
droit après l'inclusion.