IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Faire une pause de X microsecondes


Sujet :

Réseau C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut Faire une pause de X microsecondes
    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

  2. #2
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par damien99
    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?
    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.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    En effet clock permet ceci mais ça bouffe les ressources CPU, il me faudrait un truc qui mange de ressources.

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    jusqu'a la microseconde
    Que veux-tu faire exactement avec ce timer à la microseconde près... ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    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...

  6. #6
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    il me semble que usleep et nanosleep ne sont pas disponible sous dos.

    usleep et nanosleep sont posix.1 toutefois ...
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  7. #7
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par damien99
    En effet clock permet ceci mais ça bouffe les ressources CPU, il me faudrait un truc qui mange de ressources.
    ____________________________________
    Je débute dans l'API windows (C++)...............ben oui, toute chose a un début..........
    Tu programme en C ou C++??
    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.

  8. #8
    Membre du Club

    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Août 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 33
    Points : 64
    Points
    64
    Par défaut
    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 ?

  9. #9
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par Ozwald
    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?
    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.

  10. #10
    Membre du Club

    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Août 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 33
    Points : 64
    Points
    64
    Par défaut
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #if defined(WIN32)
    #define usleep(micro) Sleep(micro/1000)
    #endif
    (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 ^^ )
    En revanche je persiste et signe : usleep et nanosleep n'existe pas sous dos/windows

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par Ti-R
    Que veux-tu faire exactement avec ce timer à la microseconde près... ?
    Je veut gérer des moteurs pas à pas avec le port parallèle (LPT1) pour piloter une machine à graver (le bois).
    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.

  12. #12
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    à 2 tours / secondes ça fait 2*400
    Pourquoi tu imposes 2 tours/seconde ?

    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

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par Ti-R
    Pourquoi tu imposes 2 tours/seconde ?

    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.
    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 ?

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Points : 26
    Points
    26
    Par défaut il y atoujours des limites
    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.

  15. #15
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    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

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par buzard
    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.
    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)

    Citation Envoyé par buzard
    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.
    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....?

  17. #17
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    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)

  18. #18
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par damien99
    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)
    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.
    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.


    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....?
    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.

    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)

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/11/2005, 17h33
  2. [console]Comment faire une pause?
    Par aminee009 dans le forum MFC
    Réponses: 5
    Dernier message: 20/10/2005, 10h33
  3. Faire une pause
    Par loutente dans le forum Access
    Réponses: 5
    Dernier message: 03/10/2005, 17h23
  4. Faire une pause dans le programme
    Par shinobi dans le forum Access
    Réponses: 6
    Dernier message: 13/06/2005, 16h37
  5. [MFC] Faire une pause dans un thread
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 21/02/2005, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo