mariuso31:
Je vais donc partir sur l'utilisation du Timer 1 ...
68tjs:
Je pense revenir à la base et utiliser directement le compteur d'un timer.
Il te faut alors regarder le mode normal, (pas CTC), le timer tourne en permanence, et quand on veut deux points de mesures, on met à 0 le compteur, et sur le deuxième, on lit sa valeur.
La lecture des deux valeurs se font alors par interruption, sur front des broches (pin interrupt). Dans mon test j'avais pris le mode CTC parce que c'est le timer qui interrompait et pas les pins.
mariuso31:
Je vois qu'il me reste beaucoup à apprendre.
A moi aussi, je viens de voir comment fonctionne millis()!
mariuso31:
Okay Vileroi, merci pour ton explication claire et précise,
C'est le but du forum, et pour les fonctions d'interruption, ne as hésiter à poster de nouveau. Ce serait bien exceptionnel que cela fonctionne du premier coup, et que tu comprennes toute la doc du timer!
vileroi:
Ce qui change surtout, c'est que dans une routine d'interruption millis() retournera toujours la même valeur.
C’était surtout pour montrer que l'on peut utiliser millis() dans une routine d'interruption.
J-M-L:
Il me semble que lire micros() juste à l’entrée de l’ISR au pire sera en retard de 3 microsecondes, non ? ( on se fiche de lire millis() qui n’est pas assez précis ) et on a le même coût dû à la gestion de l’interruption dans les deux cas donc la différence de temps gomme ce retard dans la mesure.
La différence fait effectivement que que la mesure n'est pas faussée. Et si il y a une différence ente les instructions, on peut toujours corriger.
Mais le problème n'est pas là; c'est qu'entre les deux évènements il peut y avoir le débordement et on se retrouve avec t2-t1 négatif; Mais apriori (je dis à priori, mais je n'ai pas vérifier), en rajoutant 1024, la mesure devrait être juste.
J-M-L:
Bien sûr il faut que l’interruption soit super courte pour ne pas perdre une ms.
Inférieure à 1ms pour ne pas perdre un incrémentation du compteur du timer 1, mais 1ms ce n'est pas vraiment très court ("2ms c'est une éternité pour un processeur même à 16MHz")!
J-M-L:
Sinon utiliser print dans une interruption c'est pas top.
C'est pour monter que micros() est encore vivant dans une routine d'interruption, et pour voir que la valeur peut présenter des erreurs toutes les ms. Dans mon cas même si la fonction durait 10mn cela fonctionnerait quand même. Le but aussi est que la fonction dure plusieurs ms pour voit les erreurs dues au manque de comptage du temps. Bien entendu, à chaque appel, l'horloge système se retarde, mais je n'ai pas besoin de l'utiliser.
D'habitude j'essaie de soigner particulièrement mon code et les fonctions d'interruptions.
C'est pour cela que j'avais fait des suppositions sur le fonctionnement de l'horloge qui sont fausses. Je trouve ce code vraiment bizarre. Si l'on veut compter les ms, pourquoi avoir pris un timer qui compte jusqu'à 256 et pas 250? Cela aurait eu une influence sur le PWM? Cela aurait été si simple avec une fonction d'interruption très courte, sans ajustements.... 
68tjs:
Contrairement à ce qu'on lit le timer0 n'est pas sanctuarisé, il sert à la PWM sur 2 pins bien précises (voir datasheet du micro) et aux fonctions wiring/arduino : delay, micro et millis
C'est pas ça? Réservé pour ces cas? A un moment j'ai voulu utiliser le timer0, mais on ne peut pas utiliser ISR(TIMER0_OVF_vect) qui est pris par l'horloge système.
68tjs:
Je pense revenir à la base et utiliser directement le compteur d'un timer.
Je pense que c'est une bonne solution, mais à y réfléchir, cela revient à se faire la fonction micros() un peu plus adaptée.
Pour la précision en utilisant un timer on peut avoir une résolution sur la mesure du temps de 62,5ns. et pour les basses vitesses, on utilise la résolution de 64µs... Après comme les instructions durent de 1 à 3 cycles d'horloge, la précision maximale va dépendre de l'instruction qui est interrompue et que l'on doit terminer avant, et devra se situer de l'ordre de 400ns.
68tjs:
Le risque de non fonctionnement que je vois est dans l'amplitude de la gamme de vitesse.
Faire une mesure à 500km/h ± 10% ne devrait pas poser de problème, il suffira de bien choisir la valeur du diviseur d'horloge du timer choisi, par contre une mesure entre 50 et 500 km/h me parait difficilement faisable avec cette solution
Pour l'instant je ne parle que de mesure de temps. Pour la mesure de vitesse, il faut la mécanique.... Faire une mesure de temps précise avec une variation de 10 fois, ne me semble pas poser de problèmes. Si on sait mesurer 500km/h ± 10% soit 500km/h ± 50km/h soit encore temps ± temps/10, si la vitesse est 10 fois plus faible, le temps est 10 fois plus long, et comme l'erreur sur le temps est quasi constant, on fera une mesure 10 fois plus précise soit 50km/h ± 0.5km/h
Ceci à condition que la mesure du temps utilise la même base de temps (pas de débordement). Sinon, en changeant de base de temps, on aura moins de précision.
Pour avoir une précision de 10% sur la vitesse avec un timer, je peux générer des implusions entre 0,4s et 6µs. On devrait bien pouvoir mesurer une vitesse entre 5 et 500km/h.
68tjs:
Point de passage = point de mesure,
"Plusieurs" c'est combien ?
Deux me paraîtrait logique, est bien cela ? S'il y en a plus de deux le logiciel va se compliquer.
Pas forcément, une fonction d'interruption qui se déclenche pour tous les points de mesure, et qui met dans un tableau la valeur du compteur. Avec micros() c'est sans doute plus compliqué, et encore.
Reste le top secret pour savoir si on peut mettre des capteurs...