|
Publicité ' | ||||||||||||||||||||||||
|
|
#101 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Oui, là où j'ai écrit "data" c'était bien "c" que je voulais dire.
Concernant ton test, j'ai un gros doute tout d'un coup : dans l'initialisation, est-ce que tu mets le bit UDRIE0 à 0 ou à 1 ? Je le répète, UDRIE0 doit être à zéro au démarrage de ton programme. Il doit être mis à 1 quand on a des données à envoyer. Dans ton test qui "fonctionne", tu balances des ACK sans arrêt. Essaie côté PC de virer le WriteFile et tu recevras toujours des ACK sans avoir rien demandé. |
|
|
00
|
|
|
#102 | ||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Du moins j´ai active UDRIE0 dans le registre UCSR0B et le test a marche.
Code :
|
||
|
|
00
|
|
|
#103 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Okay, je vais suivre ta logique.
|
|
|
00
|
|
|
#104 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Je ne comprends pas tes réponses. Il ne s'agit pas de suivre ma logique, mais celle de la doc du µC.
Peut-être que je me plante sur le fonctionnement de l'interruption sur UDRE0 et dans ce cas il faut me l'expliquer. Sinon, fais le test dont je t'ai parlé (ne faire aucun WriteFile côté PC), ça permettra de valider le fait que l'interruption est cyclique. |
|
|
00
|
|
|
#105 | |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
J´ai vire "WriteFile" du test et j´ai obtenu ceci:
Citation:
|
|
|
|
00
|
|
|
#106 | ||||
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Je remets mon code après correction de quelques fautes de frappe et une réorganisation du code de RX.
Si tu modifies à nouveau quelque chose (comme quand tu avais passé le flag UDRIE0 à 1), préviens-moi. Code :
Code :
|
||||
|
|
00
|
|
|
#107 | |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonjour Hibernatus34,
tout d´abord je tiens a m´escuser pour mon silence. En fait j´ai revu en integralite les codes et je n´ai decele aucune erreurs de notre part. Bref je ne comprenais pas ce qui clôchait. Alors j´ai decide de tester a nouveau la communication entre le pc et le µC. Mais le test n´a pas marche. C´est alors que j´ai compris que l´erreur ne venait pas des codes, mais de mon circuit electronique. En fait, une entree de mon circuit ne recevait pas assez de courant. Au lieu de recevoir 5volt, l´entree en question du circuit recevait moins de 1Volt. Bref j´ai remedie au probleme et j´ai teste a nouveau les derniers codes que tu as postes. Le resultat donne ceci: Citation:
Cependant, j´ai teste les codes precedents et ils fonctionnent aussi. Dire que mon circuit me jouait un sale tour. merci. |
|
|
|
00
|
|
|
#108 | ||||||||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Une fois de plus bonjour,
J´ai parametrer les moteurs de commande dans le code du µC comme ceci: Code :
Code :
Code :
Code :
|
||||||||
|
|
00
|
|
|
#109 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Content que ça marche.
Je pense que tu es sur les rails maintenant, tu n'as plus tellement besoin de moi. |
|
|
00
|
|
|
#110 | |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Citation:
Merci encore . |
|
|
|
00
|
|
|
#111 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonsoir Hibernatus,
j´ai quelques soucis avec le pc, le µC et les deux moteurs de commande. J´ai envoye en integralite les positions X et Y du pc vers le µC. L´envoi des donnees fonctionnent, mais les deux moteurs (axe X et Y) de la platine relies aux deux moteurs de commande ne recoivent pas toutes les positions envoyees par le microcontrôleur. Pour être plus clair, si le pc envoie 15 couples (X,Y) de position, alors la platine effectue uniquement le deplacement d´un couple de position. Pourtant la platine devrait aussi effectuer le deplacement de 15 couples de position qui lui ont ete transmis par le µC . Mais la platine ne recoit pas toutes les 15 positions, elle(platine) recoit seulement une position. J´ai verifie la configuration du pc et du µC et tout semble être ok. Helas la platine n´effectue pas le deplacement de toutes les positions qui sont envoyes par le pc et puis le microcontrôleur. Se pourrait-il que le microcontrôleur et le pc soient trop rapide pour les deux moteurs de commande? Ou bien on doit diminuer la vitesse d´envoi des positions du pc vers le microcontrôleur ?? j´ai essaye de regler le probleme, mais je n´y arrive pas !! Sais-tu comment on pourrais ressoudre ce probleme ? Merci d´avance et bonne soiree. |
|
|
00
|
|
|
#112 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Salut,
Il y a plusieurs possibilités. Évidemment le buffer d'entrée des moteurs n'est pas infini, mais surtout il pourrait être limité à une commande. Dans ce cas il faut attendre la réponse du moteur avant d'en envoyer une autre. Je n'en sais rien, c'est à toi de te renseigner sur ces moteurs, mais de toute façon, à moins que le débit d'envoi temporise lui-même suffisamment, il est certain que tu ne peux pas envoyer une infinité de commandes en continu. Je crois que les moteurs renvoient un écho à chaque commande. Il est probable que cet écho suffise à dire "je suis prêt à recevoir une autre commande" (même si la rotation n'est pas terminée, le buffer de commande est prêt). Sinon, il y a peut-être une fonction de polling pour demander au moteur "es-tu prêt ?". Tu peux par exemple renvoyer le ACK au PC uniquement quand tu as reçu l'écho des moteurs. Puisque le PC attend ce ACK après chaque commande, ça temporisera automatiquement. (sous réserve d'un réglage du time-out) Pour ça il faut gérer une ISR sur le RX de l'USART1. Quand on reçoit \r sur l'USART0, au lieu de renvoyer ACK à la fin, on stocke les 2 échos qu'on attend dans des chaînes statiques. Quand on reçoit \n sur l'USART0, on vide ces 2 chaînes (machaîne[0] = 0). C'est pour le cas d'un time-out ou d'un redémarrage. Quand on reçoit quelque chose sur l'USART1, on le compare à l'écho attendu, et quand on l'a reçu, on envoie un ACK sur l'USART0. Si on reçoit autre chose que ce qui était attendu, je pense qu'il faut l'ignorer. Je ne connais pas le RS-485, je ne sais pas ce qui garantit que tu reçois une réponse complète de chaque moteur, sans entrelacement entre les deux. Faisons comme si c'était géré pour l'instant, donc il suffit d'un buffer d'entrée etc. (comme le buffer de commande qu'on utilise sur l'USART0, ou une file pour ignorer facilement des reliquats d'une autre réponse) Là il faudrait l'avis de quelqu'un qui a de l'expérience dans ce domaine. |
|
|
00
|
|
|
#113 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
PS. J'ai cherché un peu des infos sur le RS-485, visiblement c'est du half-duplex géré en "software". Je suis pas sûr d'avoir compris, mais j'ai l'impression il faudrait donc envoyer une commande à un moteur, attendre sa réponse, envoyer celle de l'autre moteur et attendre sa réponse. Et pas envoyer les 2 commandes d'un coup et attendre les 2 réponses après.
Si quelqu'un connaissant le RS-485 peut te renseigner, ça sera mieux. Ou peut-être que c'est expliqué dans la doc du moteur. |
|
|
00
|
|
|
#114 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonjour Hibernatus,
J´ai recueuillis les infos et j´aimerais te communiquer le concept. 1er etape: Le pc envoie sucessivement les positions ligne par ligne au µC 2ieme etape: -si le µC ne recoit pas les positions , il retourne "NAK" au pc -si le µC recoit les positions, alors il retourne "ACK" au pc -Ensuite le µC envoie sucessivement les positions (X,Y) simultanement vers les deux moteurs de commande. 3ieme etape: -Des lors que les deux moteurs de commande recoivent sucessivement une position (X,Y), alors les moteurs de commande retournent respectivement les reponses pour confirmer si oui ou non la position recue a ete parcourue par la platine sur les deux axes x et y. - Une fois que la platine aura atteint la position (X,Y) envoyee, il va falloir faire une courte pause, afin que un trou soit perce sur la platine. - En suite on peut passer a l´envoie de la 2nde position, 3ieme position, 4ieme position, ainsi de suite. Biensûr toutes les positions envoyees par le pc devront respecter le protocol que je viens de decrire. En bref, il faut qu´on envoie une position (X,Y) d´un coup, ensuite les deux moteurs de commande retournent les reponses pour confirmer si oui ou non la platine s´est deplaacee a la position (X,Y). Apres il va falloir faire une courte pause pour faire un trou sur la platine correspondant a la position (X,Y) parcourue par la platine. En suite on passe a partir du pc a l´envoi de la 2nde, 3ieme , 4ieme position ...etc En fait, c´est le protocol qu´on m´a propose afin qu´il n y ait plus de conflit pendant le transfert des positions entre le pc, le µC et les deux moteurs de commande. Je crois que ce concept suit aussi tes idees. Mais c´est vraiment primordial qu´une position soit envoyee d´un coup. Je me suis renseigne et on m´a dit que le RS485 peut le faire. Qu´en penses-tu ? |
|
|
00
|
|
|
#115 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Il faut m'expliquer comment le RS-485 peut le faire.
Sur ce sujet, si je ne comprends pas comment ça marche, je vais partir du principe que ça ne marche pas. D'après ce que j'ai lu (ou plutôt survolé), c'est au maître (ton µC) de faire respecter un protocole. Quand il envoie un message à une adresse spécifique, il doit attendre sa réponse avant d'envoyer tout autre message. Là, si on envoie une commande à chaque moteur presque en même temps, et si le décalage inverse est produit par un moteur plus long que l'autre à répondre (oui c'est un peu tiré par les cheveux), il vont se retrouver à vouloir émettre en même temps une réponse. Donc il faut m'expliquer pourquoi et comment ça va marcher quand même. Concernant le reste, tu sembles dire au début de la 3ème étape que la réponse du moteur est envoyée à la fin du mouvement. Tu es sûr de ce point ? C'est important à savoir. Ce qui ne va pas dans ton protocole, c'est que rien ne permet au PC de savoir quand il peut envoyer une nouvelle commande, car il reçoit le ACK trop tôt. |
|
|
00
|
|
|
#116 | ||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
salut hibernatus,
ce que tu dis est vraiment pertinent. Pourrais-tu me suggerer une amelioration du protocol que je t´ai presente. Citation:
Lorsque j´ai effectue le deboggage en transferant les positions du fichier texte en direction des deux moteurs de commande, j´ai remarque que la platine effectue uniquement le deplacement d´une position (X,Y) simultanement sur l´axe x et y. Biensûre c´est grâce a tes codes du pc et µC que j´ai observe cela. C´est pourquoi je pense que c´est possible d´envoyer simultanement une position (X,Y) via le RS485 du µC en direction des deux moteurs de commande. Citation:
Qu´en dis-tu ? Apparement, il faut a tout prix que les moteurs de commande nous fournissent des reponses. Mais je ne sais pas si cela doit se faire avant ou apres le deplacement de la platine !! Tout compte fait, je pense que la reponse doit intervenir avant le deplacement de la platine. |
||
|
|
00
|
|
|
#117 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Ton explication n'est pas suffisante.
D'après ce que j'ai cru comprendre, le RS-485 ne ferait que du half-duplex (un seul point émet à la fois, donc le µC ne pourrait pas émettre une commande Y en même temps qu'il reçoit l'écho de X). Et, toujours d'après ce que j'ai cru comprendre, l'orchestration se fait par la couche supérieure, en général avec un système maître/esclaves : - Le maître peut envoyer des trames nominatives, il attend alors la réponse de chacune avant d'émettre à nouveau. - Il peut aussi envoyer des trames en broadcast, et là il ne doit pas y avoir de réponse. - Enfin, les esclaves ne doivent émettre que pour répondre aux trames du maître (l'écho renvoyé par les moteur, qui ne commence pas par #, d'ailleurs). Mais bon, je peux pas te garantir que j'ai bien tout compris. |
|
|
00
|
|
|
#118 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Okay, essayons ta proposition. C´est fort probable que mon explication ne soit pas suffisant!!!
|
|
|
00
|
|
|
#119 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonjour Hibernatus34,
J´ai relus la doc du moteur de commande et il s´avere effectivement que le moteur de commande retourne une reponse lorsqu´il recoit une commande valide ou invalide. J´ai recueillis ces explications a la page 10 de la doc (Controller response). - Si le moteur de commande reconnaît une commande comme etant valide, alors le moteur de commande confirme la reception en retournant la commande recue comme echo, mais sans le caractere '#' , qui marque le debut d´une commande. Exemple: Commande envoyee au moteur de commande ------> '#1G10000000\r' Reponse du moteur de commande ------> '1G10000000\r' - Si le moteur de commande reconnaît une commande qu´il recoit comme etant une commande invalide, alors le moteur de commande retourne comme reponse la commande recue en incluant un point d´interrogation '?' avant le caractere '\r', qui marque la fin d´une commande. Exemple: Commande envoyee au moteur de commande ------> '#1°\r' Reponse du moteur de commande - -----> '#1°?\r' D´apres ces explications, je pense qu´il est preferable que les deux moteurs de commande retournent une reponse lorsqu´il recoivent une commande valide ou invalide avant que la platine se deplace. Une fois les reponses retournees par les deux moteurs de commande, le uc retourne "ACK" ou "NAK" au pc et la platine se deplace a la position de la commande qu´il a recue. Puis une courte pause sera effectuee pour percer un trou sur la platine. Dans la même lancee, les prochaines positions qui seront envoyees respecteront ce procesus. En clair, tes propositions etaient les bonnes. Dis Hibernatus34, comment va-t-on s´y prendre pour la programmation. Elle sera a coup sûre complexe. |
|
|
00
|
|
|
#120 | |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Citation:
Une remarque, quand même : Je ne sais pas ce qu'est cette histoire de trou, mais si tu dois déclencher une autre action à la fin du positionnement, il te faudra interroger les moteurs pour savoir quand ils ont terminé leur mouvement. |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com