Bien le bonjour,
je galère sérieux avec le timer 1 d'une carte nano.
Voici mon code:
je suis censé rentré dans timerIsr() de façon périodique (stable).
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 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
Partager