[Aide plz] Regler le timer

Bonjour a tous, j'ai fait l’acquisition d'un arduino diecimila et je commence à m'amuser (dernièrement j'ai réussi a utiliser la PWM, les entrées analogiques (j'ai fait un voltmétre :) ). Et maintenant j'ai besoin des Timers. Et la c'est le vide. J'ai beau chercher, aucun forum n'explique comment on paramètre et utilise les timers, même sur le site officiel j'ai pas trouvé... Du coup désespéré je tente ma chance ici =D Quelqu'un peut-il avoir la gentillesse de m'expliquer comment configurer et utiliser un timer ? Merci

je sais pas si c'est exactement ce que tu cherches, mais vois la fonction millis

sinon, tu as la lib time

Quand tu parles "timer", tu parles de quoi ? de lancer un morceau de prog tous les x secondes ? De gerer un évenement (dans ce cas il s'agit d'une interruption) ? de chronométrer quelque chose ? etc...

Je suis étonné que tu n'ai rien trouvé :astonished:

Ce que je veux c'est : J'envoie un signal (qui traverse un circuit exterieur) et je récupère la sortie de mon système sur une patte Analogique. Ce que je veux c'est le temps que met mon signal pour aller de l'émission a la réception par la patta Analogique.

En fait j'ai cherché comment paramétrer un des 3 timers mais j'ai pas trouvé de documents qui m'explique ligne par ligne ce que fait le code de setup ni comment on utilise les timers. Si tu as un liens a me donner je regarderai avec plaisir (de préférence en Francais =) =

Bonjour,

p301: En fait j'ai cherché comment paramétrer un des 3 timers mais j'ai pas trouvé de documents qui m'explique ligne par ligne ce que fait le code de setup ni comment on utilise les timers. Si tu as un liens a me donner je regarderai avec plaisir (de préférence en Francais =) =

Tout simplement parce que la gestion des timers ce fait soit par un librairie comme MsTimer2 ou FlexTimer soit directement avec du code c avr-gcc Le timers 1 gére la fonction millis donc celui ci ne doit pas être toucher de préférence.

Pour ton programme inutile d'utiliser un timer, tu prend le temps à l'émission (avec millis()) tu fait une boucle qui regarde l'état de l'entré analogique et si elle dépasse un valeur tu prend la nouvelle valeur de millis() ensuite tu soustrait les deux et tu obtient le temps entre émission/réception.

Ok je vais tester comme tu me l'as dis. Cependant les Timers c'est super utile donc faudra tôt ou tard que j'apprennes a m'en servir je vais consulter msTimer2 pour me faire une idée. Existe t'il une description de msTimer2 simple et efficace ? (de préférence en francais XD )

En français :sweat_smile: ça va être dur désolé XD ( cmb s'abstenir merci ;))

Sinon librairie timer qui gère plutôt pas mal le truc (timer 1,2 et3). http://www.arduino.cc/playground/Code/Timer1

Ou sinon l'utilisation des timers par manipulation des registres http://popdevelop.com/2010/04/mastering-timer-interrupts-on-the-arduino/ (ça c'est du code du vrai 8))

Bah sinon pour faire ce qu’il a besoin ya pas besoin d’autre chose que millis() :

int Depart=millis();
envoideladonnéeverstoncircuit();
while (analogRead(0)<5) {}; //attente du retour du circuit
int fin=millis();
int delai=fin-depart;
Serial.println(delai);

une petite question concernant ce while: ne risque t-on pas de rencontrer des pb si on ne lève jamais la condition ?

Genre pour une raison ou une autre il n'y aura jamais un niveau supérieur à 5 sur l'entrée 0 (par exemple pour la simple raison que le développeur s'est trompé de pin et qu'il visait la 1.) Un reset pour demander une autre programmation va t-il être suivi des faits ?

Je demande ça car j'ai déjà eu des pb similaires avec mon arduino: je faisais le reset mais le temps que l'IDE rentre en contact avec l'arduino, celle-ci était déjà partie dans ses tours ... mais je ne fais que supposer que c'était lié car je n'ai jamais osé retenter l'aventure ;) , j'ai eu un mal de chien à reprendre la main sur ma platine ...

Un petit delay quelconque dans la boucle ne permettrait-il pas d'avoir une sécurité ?

vincelge:
une petite question concernant ce while:
ne risque t-on pas de rencontrer des pb si on ne lève jamais la condition ?

Oui il faudrait faire un time-out:
unsigned long temps = millis()
while (analogRead(0)<5) {
if((millis() - temps) > 100) fonctionAppelerQuandYaUnSouci();
delay(1);
temps ++;
}

vincelge:
Genre pour une raison ou une autre il n’y aura jamais un niveau supérieur à 5 sur l’entrée 0 (par exemple pour la simple raison que le développeur s’est trompé de pin et qu’il visait la 1.)
Un reset pour demander une autre programmation va t-il être suivi des faits ?

Un reset hardware est toujours efficace même sur une boucle infini.

vincelge:
Je demande ça car j’ai déjà eu des pb similaires avec mon arduino: je faisais le reset mais le temps que l’IDE rentre en contact avec l’arduino, celle-ci était déjà partie dans ses tours … mais je ne fais que supposer que c’était lié car je n’ai jamais osé retenter l’aventure :wink: , j’ai eu un mal de chien à reprendre la main sur ma platine …

Ce genre de problème est très simple à régler si on connait l’astuce :wink:
L’ide compile puis upload, il suffit d’appuyer sur reset au bon moment, avec le temps on finit par savoir quand appuyer.

Ce genre de problème est très simple à régler si on connait l'astuce ;) L'ide compile puis upload, il suffit d'appuyer sur reset au bon moment, avec le temps on finit par savoir quand appuyer.

C'est bien comme ça que je m'en suis tiré, mais impossible sous Linux (et pourtant, des essais, j'en ai fait). Il m'a fallu squatter une machine Windows (mais j'avais mis des gants pour pas choper de virus :grin: ). Apparemment, sous Windows, ça met plus de temps pour se lancer au niveau de la carte. Peut-être la couche de drivers supplémentaire ...

vincelge: C'est bien comme ça que je m'en suis tiré, mais impossible sous Linux (et pourtant, des essais, j'en ai fait). Il m'a fallu squatter une machine Windows (mais j'avais mis des gants pour pas choper de virus :grin:). Apparemment, sous Windows, ça met plus de temps pour se lancer au niveau de la carte. Peut-être la couche de drivers supplémentaire ...

hohoho le beau troll que voila, allez 9/10 ;) Ce qui t'as sauver sous windows c'est le temps d'attente par defaut du driver FTDI ;)

Je sais "don't feed the troll" mais juste comme ça ^^ Tout ce qui est réalisable sous linux, est d'une manière ou du n'autre réalisable sous windows et inversement, Les virus linux existe, il sont plus rare mais beaucoup plus méchant (exploit root voir juste user-land), Linux peut être aussi lent que windows si mal configuré, Les surcouches kernel existe sous linux et windows.

Je sais. C'était juste pour le trait d'humour ... J'ai un PC linux et un win à la maison. Si j'ai du linux, c'est surtout parce que je ne bosse qu'avec ça au boulot, et qu'il m'arrive d'en ramener le week-end. Bien que bossant toujours sous cet environnement, je ne me passerai pas de Windows: beaucoup d'appli n'existent pas sous linux, ou ne sont pas aussi bien implémentées.

Fin du troll ;) mais je voulais bien insister sur le fait que windows m'a permis de m'en sortir sur une manip que normalement j'aurai pu mener à bien sous linux. On ne sait jamais, ça peut servir à d'autres ...

Bonjour,

à la lecture de ce sujet, j'aimerai mettre en avant un point sur les timers. Il est très fortement conseillé de savoir les utiliser, et ne pas faire que les utiliser via millis() et delay(). Les timers sont un des éléments centraux des Atmel, et donc des Arduino. Pour cela, une seul référence, la datasheet du composant. Pour un Diecimilia : http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf

Tu y apprendras comment manipuler les timers pour en faire exactement ce que tu veux, et au passage, tu verras comment les coupler avec une interruption.

En espérant avoir aidé,

Bonne journée.


Stéphane.

un très gros plussin avec snootlab.

Je suis arrivé sur ce forum suite à une tentative de comptage d’événements via la lib Timer2 et des valeurs complètement aléatoires, alors que la source était un GBF très stable.

il fallait que je compte précisément le nombre d’impulsions du moteur de ma voiture (mesure de vitesse) dans une fenêtre de temps très précise. Finalement, j’ai viré la lib et imprimé une vingtaine de pages du PDF de Atmell. Les timers Hard de l’ATMEGA sont d’une précision à toute épreuve, et en trois instructions, on les fait tourner à volonté! il y a des registres à connaître :

TCCRnA, TCCRnB, TCCRnC (sur mega2560), TIMSKn, OCRnX et TCNTn. Si tu arrives à déchiffrer les fonctions de ces registres, tu seras le roi du timer! Ne cherche pas les libs toutes faites, elle ne sont pas fiables (notamment Timer2 qui désactive le timer pendant le traitement de ton INT, donc si tu mets du conditionnel dedans, tu perds toute la précision. De plus, timer2 bouffe de la pile en appelant 3 procs avant la tienne, et c’est franchement décevant…).

Ca m’a pris 3h pour voir comment tout ça fonctionnait, et le premier test a été plus que convainquant! tu peux donc t’affranchir de toute une gestion de timer trop lourde, utilise Excel pour te faire un tableau de calculs (ou abaques), ce que j’ai fait, c’est terrible! une fois trois registres initialisés, le timer tourne tout seul et tu as 100% du temps UC pour le reste (faut enlever le temps de traitement de tin ISR). Parcontre, prévois un oscillo et utilise une broche témoin qui sera mise à 1 au départ de l’ISR et à 0 à la fin : ton oscillo te montrera le temps de traitement de l’ISR (si l’ISR prend plus de temps que celui déclaré dans le timer, tu cours à la perte, redondance etc etc)…

Donc je te conseille de foncer lire le PDF, et d’oublier un peu les libs non documentées… Pour finir, j’ai fait un régulateur de vitesse pour ma voiture, et je n’utilise que deux libs : LCD et EEPROM. tout le reste (PWM, Comptage, Timers…), je l’ai reprogrammé en dur, et c’est beaucoup plus efficace… en mesurant les ISR, il me reste à peu près 85% du temps UC de libre pour faire tout un tas de trucs en plus!

On n’est jamais si bien servi que par soi même!

avec un peu d’entraînement (1/2 journée), tu pourras même oublier les fonctions millis() et delay(), tu pourras donc utiliser le timer0, la liberté t’attend!