Executer une opération à intervalles réguliers, précision à la microseconde ?

ChrisPM Messages postés 17 Date d'inscription jeudi 27 novembre 2003 Statut Membre Dernière intervention 11 septembre 2006 - 24 févr. 2006 à 19:45
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 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 !

11 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 févr. 2006 à 21:03
La microseconde sur system multitache préemptif, c'est par définition impossible.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
24 févr. 2006 à 23:01
Conclusion: il faut passer en dos pur?
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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.
0
ChrisPM Messages postés 17 Date d'inscription jeudi 27 novembre 2003 Statut Membre Dernière intervention 11 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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 févr. 2006 à 11:46
Il te faudra un OS dédié le plus proche du type 'temps réel' sinon peine perdue.

Les cycles par instruction asm RDTSC, sort sur 64 bits dans EDX:EAX

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
ChrisPM Messages postés 17 Date d'inscription jeudi 27 novembre 2003 Statut Membre Dernière intervention 11 septembre 2006
25 févr. 2006 à 11:53
Mouais ok... [grande déception] :D

Je vais essayer de faire comme l'a fait le gars dont je parle, avant de fabriquer un circuit de contrôle dédié alors...

Merci pour les réponses en tout cas !

PS : j'ai pas pigé la ligne " Les cycles par instruction asm RDTSC, sort sur 64 bits dans EDX:EAX "....
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 févr. 2006 à 12:01
Tu as parlé des "cycles écoulés" plus haut donc...

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
ChrisPM Messages postés 17 Date d'inscription jeudi 27 novembre 2003 Statut Membre Dernière intervention 11 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
0
cs_chris91 Messages postés 54 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 4 avril 2007
25 févr. 2006 à 17:35
bonjour,
et avec la carte son, c'est pas possible? (de générer un signal d'environ 50hz)
http://www.cppfrance.com/codes/GENERATEUR-FICHIER-WAV-REFERENCE-POUR-CD-TEST_34327.aspx
http://www.cppfrance.com/codes/ACCORDEUR-GUITARE_34211.aspx
bref, bonne chance.
0
ChrisPM Messages postés 17 Date d'inscription jeudi 27 novembre 2003 Statut Membre Dernière intervention 11 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............

Merci pour votre aide dans tous les cas !
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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.
0
Rejoignez-nous