Salut,
Je sais qu'il y a moyen de faire une pause de X millisecondes avec "time.h", mais moi j'ai besoin d'aller jusqu'a la microseconde.... une idée?
Je suis sous DOS et j'utilise le compilateur Turbo C (Borland)
Merci d'avance
Salut,
Je sais qu'il y a moyen de faire une pause de X millisecondes avec "time.h", mais moi j'ai besoin d'aller jusqu'a la microseconde.... une idée?
Je suis sous DOS et j'utilise le compilateur Turbo C (Borland)
Merci d'avance
Clock?Envoyé par damien99
Prenez le temps d'aller vite...
Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.
En effet clock permet ceci mais ça bouffe les ressources CPU, il me faudrait un truc qui mange de ressources.
Que veux-tu faire exactement avec ce timer à la microseconde près... ?jusqu'a la microseconde
tu peux utiliser la fonction
usleep
qui permet de faire dormir jusqu'a la microseconde, tu peux meme aller plus loin, en faisant dormir jusqu'a la nanoseconde avec :
nanosleep
mais sache que quand tu fais dormir quelqu'un , il n'est pas assurée de se reveiller quand tu le demande, ce qui est sur, c'est que tu le fais dormir au moins le temps que tu as demandé !! Dans la plupart des cas, il dormira plus longtemps que prévu, tout ca dépend du scheduler de ton système, et changement de contexte car la plupart du temps il y en aura un...
il me semble que usleep et nanosleep ne sont pas disponible sous dos.
usleep et nanosleep sont posix.1 toutefois ...
click my www
............|___
...................\
.................._|_
..................\ /
..................."
Tu programme en C ou C++??Envoyé par damien99
Et dos dans tout ca ca se trouve ou?
Prenez le temps d'aller vite...
Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.
Je confirme que usleep et nanosleep ne sont pas dispo sous dos.
En revanche la fonction sleep l'est, et il me semble qu'elle peut prendre des flotants en arguments (à vérifier) donc tout bétement un bon petit sleep(x/1000) devrait fonctionner. Nan ?
Sleep prend des flotants?Envoyé par Ozwald
Prenez le temps d'aller vite...
Programme sous Windows, en C avec Code::Blocks, en Java JRE 1.6. avec Eclipse, en PHP/HTML/CSS avec Dreamweaver CS5 ou NotePad++ et en VBA sous avec Access 2010, Excel 2010, Word 2010 et Outlook 2010.
Bon bon bon, après vérifications : sleep ne prend pas de flotants (heureusement que j'avais dit que c'était à vérifier )
Je me suis laissé abusé par l'usage classique du :
(oui, je sais, en plus ça parlait de Sleep, et pas de sleep, et ça ne fait pas apparaitre de flotants, j'me suis trompé vala tout ^^ )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #if defined(WIN32) #define usleep(micro) Sleep(micro/1000) #endif
En revanche je persiste et signe : usleep et nanosleep n'existe pas sous dos/windows
Je veut gérer des moteurs pas à pas avec le port parallèle (LPT1) pour piloter une machine à graver (le bois).Envoyé par Ti-R
Mes moteurs ont 200 pas par tours je les fait marcher en mode demi pas ça me fait donc 400 positions par tours, à 2 tours / secondes ça fait 2*400, je doit réécrire sur mon port 800 fois par secondes. Jusque la ça va, je peut faire avec Sleep(1) (800microS ~ 1mS)
Le truc c'est que les moteurs déplacent une défonceuse de 1000 Watt il y a donc des efforts importants je doit donc maitriser l'accélération.
Or de Sleep(2) à Sleep(1) le moteur double sa vitesse, résultat : l'energie cinétique accumlée par la machine fait que mon moteur rate des pas. Et comme je ne suis pas en boucle fermée je ne peut pas savoir le nombre de pas ratés (si je pouvait le savoir il suffirait de faire ce nombre de pas en plus) peu a peu les pas ratés s'additionnent et le défaut sur la gravure devient de + en + visible.
C'est pourquoi il me faut un timer qui va jusqu'a la microseconde.
Je prefèrerai ne pas bouffer les ressources CPU, parce que après la pause est variable (fonction de la fréquence du CPU), le cas de clock() il me semble
Sinon vu que je suis sous DOS usleep() et nanosleep() ne fonctionnent pas.
Pourquoi tu imposes 2 tours/seconde ?à 2 tours / secondes ça fait 2*400
Car logiquement, tu pourrais mettre un rythme moins soutenu à tes moteurs, qui empêcheraient une accélération et des sauts de pas, non ?
Doit me manquer un détail la
Avec la puissance de la machine, je suis obligé de mettre des vis à billes (mes vis ont bille ont un pas de 4mm), et si je descend en dessous de 2tours/sec la vitesse sera inférieure à 2*4 = 8mm/seconde.Envoyé par Ti-R
Ca fait deja pas rapide, (il faudrait même que j'aille un peu plus vite) parce que après si ça va trop doucement la chaleur dégagée par le fraise (l'outil monté sur la défonceuse) brule un peu le bois et ça fait une couleur noire a l'endroit de l'usinage. Pour ceux qui ne le savent pas une défonceuse c'est plutot de la haute vitesse (c'est pas une vitesse de perceuse)
Sinon avec clock() la pause dépend de la vitesse de CPU ?
Bonjour,
Apparement tu ne trouveras pas ton bonheur, avec une quelconque fonction de haut niveau. Il va falloir te retrousser les manches, et faire tes bouts de codes tout seul, en assembleur. Ainsi tu pourra faire tes propre pauses aussi courte que tu le souhaite.
Tu n'est pas obligé de tout programmer en assembleur, juste les fonctions dont t'as besoin (la pause). Et englober le tout dans ton programme en C. Par contre il faudra faire attention aux interruptions, qui vont te fausser le résultat. T'es d'ailleurs obligé d'utiliser une interuption si tu veut récupérer le contenue de l'horloge système.
C'est vrai qu'avec clocks tu aura une granularité de l'ordre de la milliseconde. Il te faudra donc directement aller chercher dans l'horloge système, pour avoir une granularité plus fine. Mais tes résultats seront de toute manière faussé par le faite que tu effectue la mesure, et à cause d'interuption possible lors d'appel de procedure et sauts.
Pas facile, ton problème, je ne vois pas trop de solution
Pour un timer plus précis sous Windows Il y a
QueryPerformanceFrequency
Sinon pour faire un peu plus sale, il y a les sockets
Et dans la partie select, tu peux mettre un timeval qui prend 2 paramètres, un les secondes, et l'autre en microsecondes. Bon ensuite à tester si cela fonctionne...
http://lifc.univ-fcomte.fr/~philippe...cs/node12.html
J'en ai pour combien d'heure d'après toi si j'ai jamais touché à l'assembleur. (juste pour savoir si c'est 100H ou 3H)Envoyé par buzard
Y'aura t'il beaucoup d'interuption sous DOS si on bouge pas la souris et on touche pas clavier. (la souris fait quant même des interruptions si y'a pas de pilote?)Envoyé par buzard
Est-ce que ça fausse vraiment le résultat, si on mesure la nanoseconde oui mais avec des microsecondes....?
Salut,
Je sais que sous DOS, ce n'est pas évident de réaliser des petites temporisations.
Pour piloter des moteurs pap sur le port //, je prenais mon oscillo et je testais des petites boucles jusqu'à trouver mon timing (exp : for(i=0; i<TIMING; i++) ; ).
Le problème, c'est que cette boucle dépend de la cadence de ta machine. Prend une machine plus/moins rapide et tes timing sont dans les choux.
Donc, si ton prog tourne sur la même machine, à ton oscilloscope, sinon, il faudra passer sur une solution hardware (timer externe type NE555 ou autre).
Par exemple pourquoi pas piloter un petit géné de fréquence par ton port // ?
- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
- Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)
Il ne faut pas croire que l'assembleur c'est du binaire ou de l'hexadecimal, certe au final oui mais même ton code ecrit en C est transformé en binaire.Envoyé par damien99
Pour faire cette fonction pause il ne te faudrat guère trés longtemp, juste à chercher le numero de l'interruption qui récupère le contenue de l'horloge système. faire une boucle pour savoir si on est dans les temps.
ton compilateur peut sûrement assemblé un code assembleur (gcc le permet en tout cas). Et le vieux CL (compile and link de microsoft aussi d'ailleur)
Sinon c'est quoi le processeur, un 486? ou mieux? Et pour savoir exacetement comment faire (mise en forme des segments et nom des instruction) tu désassemble un programme simple (une petite boucle) que t'aura écrit en C, puis compilé. Ainsi t'aura la syntaxe exacte pour ton processeur. sous dos t'a disass (il me semble ou quelque chose d'approchant) pour désassembler, peut etre aprés un dump, mais j'en suis pas sûre.
En faite les interruption, t'en aura toujours, je présume que la machine est connecté sur le port série, ou le port parallèle de la bécane. Ne serais-ce que ça, cela génère des interuptions. L'affichage à l'ecran génère des interruption. Le refraichissement de la mémoire aussi. Bref y'a beacoup de cause possible pour des interruptions.Y'aura t'il beaucoup d'interuption sous DOS si on bouge pas la souris et on touche pas clavier. (la souris fait quant même des interruptions si y'a pas de pilote?)
Est-ce que ça fausse vraiment le résultat, si on mesure la nanoseconde oui mais avec des microsecondes....?
C'est essentiellement, le rafraichissement mémoire, qui empêche de faire des mesures de temps trés précise, parce qu'on ne sait jamais vraiment quand ils vont se déclencher. C'est pour cela que les fonctions d'attente sont parametrées à la milli-seconde, on amortie ainsi le risque d'un rafraichissement mémoire sur une longue période (et donc on peut considéré qu'il y en a un nombre constant)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager