Executer une opération à intervalles réguliers, précision à la microseconde ?
ChrisPM
Messages postés17Date d'inscriptionjeudi 27 novembre 2003StatutMembreDernière intervention11 septembre 2006
-
24 févr. 2006 à 19:45
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 2014
-
26 févr. 2006 à 12:22
Bonjour,
Pour un projet perso, j'ai besoin d'exécuter une opération à intervalle réguliers, mais avec une précision de l'ordre de la microseconde. Avec des millisecondes c'est pas assez précis, genre arbitrairement 70 ms c'est trop peu, mais 71 ms c'est trop grand. il me faudrait donc un intervalle quelque-part entre les deux. Je ne connais pas la fréquence exacte, puisque la milliseconde n'est pas assez précise, du coup j'ai un tâtonnement d'environ 20 ms qui me donne un mauvais résultat.
Mon projet, pour expliquer vaguement, consiste à envoyer une impulsion à un mécanisme (via port parralèle) qui as une fréquence propre à lui, mais inconnue.
Le sleep est à proscrire, je l'ai utilisé pour mes premiers essais, mais 2 inconvénients : d'une part la précision, d'autre part je ne peux rien faire pendant le sleep, alors que j'ai besoin d'exécuter des opérations également pendant le temps d'attente entre deux impulsions. (allumer et éteindre des leds)
Je sui encore (trèèèssss) débutant en C/C++ et mon appli est encore en mode console. Je développe avec code::blocks (c'est comme dev-cpp poour ceux qui ne connaissent pas).
Merci d'avance !
A voir également:
Executer une opération à intervalles réguliers, précision à la microseconde ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 25 févr. 2006 à 00:23
Salut,
Je pense que c'est possible en DOS pur après avoir bloqué toutes les
interruptions matérielles (IRQ). Cela risque de poser quelques
problèmes. La durée de l'impulsion doit être calculée par rapport à la
fréquence horloge du microprocesseur. L'idéal est de réaliser une carte
à microcontroleur avec un quartz pour générer ce genre d'impulsions à
grande précision. Elle sera soit autonome soit commandée par PC.
ChrisPM
Messages postés17Date d'inscriptionjeudi 27 novembre 2003StatutMembreDernière intervention11 septembre 2006 25 févr. 2006 à 11:23
Merci pour vos réponses !
Pour expliquer plus précisément, mon projet est un afficheur à
persistance rétiniènne, c'est à dire, une série de leds au bout d'une
tige de 30 cm qui oscille continuellement.
La tige est fixée sur le tête de lecture d'un disque-dur HS, dont
la bobine est alimentée par une pile, et commendée, via un transistor,
par le port parralèle. Le tout est maintenu en équilibre par deux
ressorts (un de chaque coté)
Le déplacement régulier de la tige permets d'afficher du texte en
faisant varier dans le temps les informations affichées sur les leds.
Ce mécanisme as donc une fréquence propre à lui, inférieure à 50 Hz
(déterminé par les ressorts et la longueur de la tige) et l'angle
d'ouverture maximal ne peut être atteint que si on envoie un signal
régulier à la même fréquence, pour entrer en résonnance.
Quelqu'un à déja fait un programme de contrôle, basé sur une boucle
infinie et une mesure du nombre de cycles écoulés apparemment (je ne
comprends pas bien son code) mais cette technique est dépendante du
processeur, si je ne me trompe pas, et utilise certainement beaucoup de
ressources.
Donc j'aurais voulu savoir si, et uniquement avec le PC, par
programmation, on pouvait faire ça différemment, par des timers par
exemple.
Vous n’avez pas trouvé la réponse que vous recherchez ?
ChrisPM
Messages postés17Date d'inscriptionjeudi 27 novembre 2003StatutMembreDernière intervention11 septembre 2006 25 févr. 2006 à 13:44
Hum... plutot "itérations" alors ? (à la place du mot cycle dans mon dernier message)
En fait je débute réellement en C, je n'ai pas encore acquis la notion de pointeurs, donc quand tu me parle d'asm avec des adresses et des notions de 64 bits, je décroche complètement
ChrisPM
Messages postés17Date d'inscriptionjeudi 27 novembre 2003StatutMembreDernière intervention11 septembre 2006 25 févr. 2006 à 17:53
en fait après quelques tests plus poussés, la fréquence est de l'ordre de 11 Hz (avec un sleep à 85 ms j'ai une oscillation presque maximale)
il me faudrait sans doute un 84,5 ms en fait, c'est là ou se trouve le souci.
Mais en fait je vais déja essayer avec un timer à la place du sleep, c'est peut-être un peu plus précis (toujours en ms, mais moins de variations) ?
J'ai tenté avec la carte son, mais soit c'est pas assez précis, soit le mécanisme est sensible à 0,00001 Hz.... ou soit c'est moi qui pense que ça peut faire mieux et en fait c'est pas le cas............
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 26 févr. 2006 à 12:22
Bonjour,
Comme l'a précisé BruNews, il est impossible d'obtenir un signal de
durée stable et précise sous Windows. En effet, le microprocesseur fait
tourner plusieurs programmes en même temps. Le temps du microprocesseur
est donc partagé. Il exécute une portion d'un programme puis passe à
une portion d'un autre programme et ainsi de suite. Sans parler des
événements système qui peuvent intervenir à tout moment et interrompre
l'exécution des instructions des programmes. Il parait donc impossible
d'obtenir des durées précises et stables. La solution de la carte son
me parait donc meilleure. Mais l'idéal reste toujours l'utilisation
d'une carte à microcontroleur ou même un simple oscillateur.