Ordonancer une fonction dans le temps

Bonjour,

Je cherche à ordonancer une fonction, c'est à dire qu'elle se délcenche à un moment précis basé sur une échelle de temps au niveau de la microseconde ou pas loin (le compteur micros() par exemple pourrait suffir).

Cela vous semble-t-il envisageable ?

Séverin

On en parle tous les jours. :grin:

A voir également SoftTimer de barbu :

http://arduino.cc/forum/index.php/topic,101814.0.html

Merci Osaka,

J'utilise des bouts de code à la "BlinkWithoutDelay", mais c'est de l'ordonnancement "relatif" qui nécéssite que le code sois lu très régulièrement, et de plus on est bien loin de l'échelle micro-seconde (µs), puisqu'on est à l'échelle de la boucle.

Ce que je souhaite c'est :

Préparer un interruption qui se lancerait lorsque le compteur de microsecondes attendrait TEL valeur.

Mais je dois à mon avis expliqer l'objectif :
Construire un signal servo (pseudo PWM) "à la mano" dont les fronts montants et déscendants s'orchestrent avec le reste du code (dont d'autres interruptions), de façon très précise.

Je regarde le SoftTimer poilu du menton.

Séverin

hum hum dur ce que tu veux faire :s le ARDUINO sera peut être pas capable de t'offrir autant de précision..

Skizo !

Bonjour,

unisev:
Ce que je souhaite c'est :

Préparer un interruption qui se lancerait lorsque le compteur de microsecondes attendrait TEL valeur.

Une librairie existe pour faire cela sans ce prendre la tête : FlexiTimer2
http://arduino.cc/playground/Main/FlexiTimer2

Cette librairie travaille par défaut avec des millisecondes mais la fonction set() peut prendre en argument une unité de temps arbitraire.

Et en plus c'est du tout cuit pour toi :wink:

The original author of FlexiTimer2 needed to simulate PWM over a 8x8 multiplexed grid of LEDs.

skizoh:
hum hum dur ce que tu veux faire :s le ARDUINO sera peut être pas capable de t'offrir autant de précision..

Oh que si que l'arduino peut, enfin l'Atmega :wink:

Donc, si j'ai bien compris, le code suivant :

...
delayFromNow = 5000;
FlexiTimer2::set(delayFromNow/4, 4.0/1000000, CHANGESTATE);
...

Devrait lancer la fonction CHANGESTATE 5ms après avoir été lancée ?

J'ai volontairement utilisé une échelle à 4µs pour compliquer un peu :), et surtout parce que c'est surement l'échelle que je vais utiliser, car c'est la même que celle de la commande micros().

Sev

EDIT : Ce message a été traduit à posteriori :roll_eyes:

bon ba ravi de l'apprendre alors ^^'

Oups, j'm'a cru dans la partie international du forum, désolé.

5000 / 4 = 1250
4 / 1000000 = 0,000004 = 4us
1250 * 4 = 5000us = 5ms

Le compte est bon ? :slight_smile:

unisev:
Oups, j'm'a cru dans la partie international du forum, désolé.

Ralala ... C'pas sérieux tout ça :stuck_out_tongue:

skywodd, oui le compte est bon, maintenant on passe aux lettres...

Mais après tout, pourquoi changer le Timer2, pourquoi ne pas utiliser le timer0 de la commande micros() ?

Et pourquoi ne pas modifier la commande micros() directement, pour lui faire lancer des fonctions, si le compteur dépasse un nombre précis ?

Sev

unisev:
Mais après tout, pourquoi changer le Timer2, pourquoi ne pas utiliser le timer0 de la commande micros() ?

Le "core arduino" travail en ce basant sur le Timer0, si tu lui change la config du timer0 tout ce qui est lié au temps (delay, millis, micros, ...) cessera de fonctionner correctement.

unisev:
Et pourquoi ne pas modifier la commande micros() directement, pour lui faire lancer des fonctions, si le compteur dépasse un nombre précis ?

Ça demanderai de modifier le "core arduino" ce qui n'est pas du tout une bonne idée, mieux vaut utiliser une librairie faite pour cela que d'aller taper dans le code bas niveau du "core arduino".