Bien le bonjour,

je galère sérieux avec le timer 1 d'une carte nano.
Voici mon code:
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
#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