PORT PARALLÈLE : PILOTEZ JUSQU'A 8 SERVOMOTEURS.

cs_DJ Ox Messages postés 2 Date d'inscription mardi 2 août 2005 Statut Membre Dernière intervention 3 août 2005 - 3 août 2005 à 23:52
sparrow2104 Messages postés 2 Date d'inscription samedi 7 avril 2007 Statut Membre Dernière intervention 9 juin 2013 - 9 juin 2013 à 18:48
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32274-port-parallele-pilotez-jusqu-a-8-servomoteurs

sparrow2104 Messages postés 2 Date d'inscription samedi 7 avril 2007 Statut Membre Dernière intervention 9 juin 2013
9 juin 2013 à 18:48
Merci pour cette réponse rapide!
J'ai effectivement compris maintenant, les fonctions QueryPerformanceFrequency et QueryPerformanceCounter inscrivent en fait une valeur dans la variable entre parenthèses.
Utilisateur anonyme
8 juin 2013 à 13:27
Salut,

regarde cette reprise de la fonction de rylryl par Bactérius
il y a ajouté quelques commentaires qui devront t'aider à comprendre.

// Je vais modifier cette fonction pour la rendre plus lisible à moi
// Je cite donc son auteur : Rylryl !!

procedure Wait(MS: int64); // On fait une pause en microsecondes !!
var
Frq_Base, T_Mem,
T_Now, Dif: Int64;
begin
// On récupère l'indice fréquence du système
if QueryPerformanceFrequency(Frq_Base) then
begin
// On récupère le repère temps origine
QueryPerformanceCounter(T_Mem);
repeat
// On récupère le temps actuel
QueryPerformanceCounter(T_Now);
// On compare le temps actuel au temps d'origine
Dif := (T_Now - T_Mem) * 1000000 div Frq_Base;
until Dif > MS; // Jusqu'à ce qu'on ai atteint notre délai voulu
end;
end;
sparrow2104 Messages postés 2 Date d'inscription samedi 7 avril 2007 Statut Membre Dernière intervention 9 juin 2013
8 juin 2013 à 12:44
Bonjour,

Je vois que le sujet n'a pas été traité depuis 2006 mais qui sait, peut être quelqu'un passera par ici pour répondre à ma question.

Je suis en fait intéressé par ce programme et plus particulièrement par la fonction d'attente, mais malheureusement je ne comprends pas tout.

Je n'ai retrouvé nulle part dans le programme d'initialisation ou de "remplissage" des variables Frq_Base, Time_memo et Time_Now. Du coup, je ne comprends pas bien à quoi servent la condition "if QueryPerformanceFrequency(Frq_Base) then" et les requêtes "QueryPerformanceCounter(Time_memo);" et "QueryPerformanceCounter(Time_Now);"

Quelqu'un, Ryl peut être, saurait-il donc m'expliquer un peu plus en détail cette partie du code?

Merci d'avance!
rylryl Messages postés 311 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 15 décembre 2006 1
21 oct. 2006 à 12:40
Bonjour SMDWD,

Cette simplification ne donnera rien de bon...
Cherche plutôt pouquoi "EAbstractError" mais n'ayant pas ce pb je ne peux pas t'aider (peut être un problème de "thread")...

A+
ryl...
smdwd Messages postés 3 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 20 octobre 2006
20 oct. 2006 à 23:26
Bonsoir Rylryl,

J'ai donc simplifié votre programme, il se compile bien, mais mon servo tourne de 30° à chaque
appuis sur le bouton envoyer (quelque sois la position du curseur), et ne tourne que dans un seul sens !
Je vous joint le code, si vous pouvez m'aider.... Merci !

==========================================================================

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
ButtonEnvoyer: TButton;
position1: TScrollBar;
procedure ButtonEnvoyerClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

procedure Out32(PortAddress:word;Value:byte);stdcall;export;
external 'inpout32.DLL';

var
Form1: TForm1;
Valeur,LPTx:integer;

implementation

{$R *.DFM}

// Attendre N microSeconde
procedure DelayUS(MicroS: int64);
var Limite,Time_memo,Frq_Base,Time_now : Int64;
begin
if QueryPerformanceFrequency(Frq_Base) then
begin
QueryPerformanceCounter(Time_memo); // Repère temps
Limite := Time_Memo + round(MicroS * Frq_Base / 1000000); // calcul fait une seule fois
repeat
QueryPerformanceCounter(Time_now); // Comparer le Repère temps au temps actuel
until Time_now >= Limite; // Si pause pas suffisante recommencer
end;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
LPTx:=888; //LPT1 par defaut
end;


procedure TForm1.ButtonEnvoyerClick(Sender: TObject);
begin
out32(LPTx,1); // Servo sur Voie 1
DelayUS(position1.position); // Durée de l'impulsion pour cette voie
out32(LPTx,$00); // Forcer niveau bas
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
out32(LPTx,0); // Le Registre DATA est mis à zero
end;

end.
smdwd Messages postés 3 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 20 octobre 2006
19 oct. 2006 à 18:51
SWDWD => Désolé je ne sais pas !

Re soir,

Merci quand même pour votre réponse sincère et rapide...
Apparament votre source : PORT PARALLÈLE : LIRE/ÉCRIRE DANS LES REGISTRES DATA/CONTROL/STATUS DU PORT // semble fonctionner,,, donc je vais adapter !

Merci encore !
rylryl Messages postés 311 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 15 décembre 2006 1
19 oct. 2006 à 18:32
Bonjour,

Bryant823 => Merci, Les PC un peu lent ou les PC surchargés(CPU) auront quelques probs...
Il est peut être mieux d'arreter d'envoyer le signal sur le port parallèle quand les servos doivent être au repos...
Le pb vient de l'exclusivitée de la boucle de tempo (il faut bien qu'a moment donné windows gére ses processus...

SWDWD => Désolé je ne sais pas !

ryl...
smdwd Messages postés 3 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 20 octobre 2006
19 oct. 2006 à 17:51
Bonsoir Rylryl,

Je ne suis pas très doué en programmation et quand j'execute votre programme, avec Delphi 5,
j'ai ce message d'erreur :

Le projet Lpt_servo_8.exe a provoqué une classe d'exception EAbstractError avec le message
'Erreur abstraite'. Processus stoppé. Utilisé pas à pas pour continuer ou executer...

Le projet est bien compilé : est ce grave ? que dois je faire ???

Merci pour votre réponse !
bryant823 Messages postés 1 Date d'inscription mardi 3 octobre 2006 Statut Membre Dernière intervention 12 octobre 2006
12 oct. 2006 à 11:42
Salut rylryl.

Je tiens deja à te felliciter pour ton code. Et j'ai un petit problème, je sais pas si tu pourras m'aidé où pas. A la sortir de mon port parallele, sur la pin qui sert aux données du servo, j'ai des problèmes de parasites. Mon servo gresille... J'ai utilisé un oscilloscope pour voir la forme des signaux... J'ai triggé sur le flanc montant du signal. Et j'ai vu au flanc descendant des variations de temps de presque 1 ms...et j'arrive pas à les supprimer. Si tu connais où tu vois le problème sa serai aimable de m'aidé.

Merci beaucoup
rylryl Messages postés 311 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 15 décembre 2006 1
2 mars 2006 à 19:17
Bonjour jlen100,

Merci beaucoup c'est corrigé !

A+
ryl...
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
2 mars 2006 à 17:10
excusez moi pour le double post
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
2 mars 2006 à 17:05
salutRylRyl,
j'avais mis ta source en lien et il avait des PB de compilation.
Après l'avoir rechargée je me suis apperçue qu'il manquait le end. final
il à curieusement disparu depuis que je l'avais testée!!

@+
jlen
rylryl Messages postés 311 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 15 décembre 2006 1
25 août 2005 à 00:04
Bonjour DJ Ox,
J'ai oublié d'enlever "Variants" et autre...(inutile pour ce code).
Le ZIP est mis a jour.
Désolé pour le pb!

A+
ryl...
cs_DJ Ox Messages postés 2 Date d'inscription mardi 2 août 2005 Statut Membre Dernière intervention 3 août 2005
3 août 2005 à 23:52
Je suis un newbee, c surement pour ca que j'ai un pb, mais il me maque: Variants.dcu, quelqu'un pourrai m'aider?
Rejoignez-nous