Interruption timer 1 sur nano v3
Bien le bonjour,
je galère sérieux avec le timer 1 d'une carte nano.
Voici mon code:
Code:
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
| #include <TimerOne.h>
//#include <avr/interrupt.h>
unsigned int cpt = 0;
unsigned int cptIt = 0;
void setup()
{
pinMode(6, OUTPUT);
Timer1.attachInterrupt(timerIsr);
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= (1<<WGM12);// ctc 4, clear tcnt at top
TCCR1B |= (1<<CS12); // /256
OCR1A = 200;
TIMSK1 =0;
TIMSK1 |= (1<<OCIE0A); //output compare A Match Interrupt Enable
TIFR1 |= OCF0A;//output compare A Match Flag
}
//*****************
void loop()
{
}
//*****************
void timerIsr()
{
digitalWrite( 6, 1);
digitalWrite( 6, 0);
} |
je suis censé rentré dans timerIsr() de façon périodique (stable).
Je surveille à l'analyseur logique sur mon port USB de PC.
quand je mets OCR1A = 200; la période de rentrée dans l'isr est 57.35 ms !! Je m'attendais plutôt à 256*200*1/16 000 000 soit 3.2ms
quand je mets autre chose que 200, c à d 100, 190, 400, ... peu importe, ça devient carrément non périodique !!
Pour 400 par exemple, les timing entre interruption sont des multiples de 6.354ms (soit environ la période attendue)
Pour 100, ils sont des multiples de 1.5885 (soit environ la période attendue)
Quelqu'un gère-t-il le timer 1 sans aucun soucis? Peut m'aider?
Mon objectif sera, à partir d'un événement gpio (probablement géré aussi en interruption) de programmer le timer pour qu'il positionne une autre broche à 1, puis l'arréter, et ainsi de suite. Je ne veux pas entendre parler de delay() ou autres fonctions bloquantes.
bonne journée