|
Publicité ' | ||||||||||||||||||||||||
|
|
#81 | |||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Okay, j´ai saisis.
J´ai des soucis sur les lignes 132, 135 et 138 de la fonction ISR(USART0_RX_vect). Citation:
Citation:
Citation:
|
|||
|
|
00
|
|
|
#82 | |||
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Citation:
- usart_command_size est la taille de la commande reçue - usart_command_max_size est la taille (- 1) du buffer contenant la commande reçue On lit la commande qu'on a reçue du PC. Sa taille est variable et on la connaît grâce à usart_command_size. Citation:
Citation:
C'est un peu redondant avec \n mais c'est pas grave. |
|||
|
|
00
|
|
|
#83 | |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Salut,
lorsque je deboggue le programme du pc et celui du µC, j´obtiens le resultat suivant dans ma console: Citation:
|
|
|
|
00
|
|
|
#84 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Tu peux commencer par rajouter des messages d'erreur détaillés dans la fonction EnvoieCommande, pour savoir si c'est le ReadFile qui a fait un time out (c'est le plus probable).
|
|
|
00
|
|
|
#85 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonsoir Hibernatus34,
PC: J´ai deboggue le programme c++ du PC et helas la fonction EnvoieCommande ne fonctionne pas bien. J´ai filme les erreurs du programme c++ lors du debogge. la photographie de trouve en piece jointe. Microcontrôleur: J´ai lus avec attention le programme du microcontrôleur et j´aimerais te communiquer la maniere dont j´ai compris le transfert des positions. 1er alternative: - Les positions sont transferees de la fonction ISR(USART0_RX_vect) vers la fonction USART1_Send(), car RXEN0 = 1 et RXCIE0 = 1. - La fonction USART1_Send transmet quant-a elle les positions dans la fonction USART1_QueueIn(). - la fonction USART1_QueueIn() transmet a son tour les positions dans la fonction USART1_QueueOut() - Puis a travers l´activation de l´interruption UDRIE1, la fonction d´interruption ISR(USART1_UDRE_vect) se chargera de transmettre les positions aux moteurs de commande, car ISR(USART1_UDRE_vect) contient le contenu de la file USART1_QueueOut(). 2ieme Alternative: concernant le renvoie des reponses ACK ou NAK au pc, le procede d´envoie est selon moi semblable a la 1er alternative. Sauf qu´elle s´effectuera a travers l´USART0. C´est a dire: ISR(USART0_RX_vect), puis USART0_Send, puis USART0_QueueIn(), puis USART0_QueueOut et enfin ISR(USART0_UDRE_vect) se chargera de l´envoie a travers USART0. Cependant, j´ai compris les codes des fonctions que tu as programmes. Mais une fonction specialement me donne des maux de tête. J´ai bosse la dessus avec l´aide d´un ami. Mais on n´a pas vraiment compris en integralite le fonctionement de la fonction ISR(USART0_RX_vect). Peux-tu stp jetter encore un coup d´oeil sur la fonction ISR(USART0_RX_vect). 1er question (Ligne 143 et 144): les variables usart_command[i] = 0; et usart_command[usart_command_size] = 0; seront tjs egal a zero d´apres ton code. Du coup je me dis que x possedera toujours la valeur zero en int. Qu´en penses-tu ? 2ieme question (Ligne 130 a 140) : Je ne comprends pas ton raisonnement a ce niveau. je comprends ce que tu veux faire, mais je trouve qu´il manque quelque chose. 3ieme question: Le buffer de l´USART0 recoit-il d´abord /r, puisY, puis X et /n ou /n, puis X, puis Y et /r. Car d´apres le programme c++, les commandes du fichier texte sont envoyees a l´USART0 comme suit: /n, puis X, puis Y et /r. Qui sait, peut-être je me trompe. En bref, je t´avoue que les codes de la fonction ISR(USART0_RX_vect) m´ont secoues. S´il te plaît, jette y un coup d´oeil. Je comprends ce que tu essaies de faire dans la fonction, mais pas en integralite. Merci pour ton aide. |
|
|
00
|
|
|
#86 | |||||
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Je comprends pas l'utilité de ta capture d'écran.
Je n'ai pas non plus compris le début de ton message. Pour le reste, voici une explication de mon code : Principe :
usart1_tx_buffer est une file d'attente. L'ISR sur UDRE1 est appelée de manière répétée, tant que : - UDR0 est dispo - UDRIE0 est vrai Donc cette ISR est une espèce de service permanent qui s'occupe de vider la file d'attente dès qu'il y a des données dedans. Je l'active dès que j'entre une donnée dans la file et je la désactive dès que j'ai sorti le dernier caractère de la file. Citation:
Code :
Citation:
Donc je traite la commande présente dans command_buffer :
Citation:
\n est envoyé au début d'une commande pour vider le buffer et être sûr de ne pas avoir des restes d'un envoi raté au début. Donc : \n, puis (X,Y), puis \r. |
|||||
|
|
00
|
|
|
#87 | |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonjour,
Citation:
J´ai a nouveau deboggue le programme c++ du pc, mais l´envoie n´est toujours pas operationel. Je resois comme reponse : "Erreur" J´ai essaye d´observer les valeurs des variables et tout semble normal. Du moins je ne sais pas comment remedier au probleme de la fonction EnvoieCommande. Merci pour les explications de la fonction ISR(USART0_RX_vect). |
|
|
|
00
|
|
|
#88 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Je commence à fatiguer...
La fonction EnvoieCommande signale une erreur, ça ne veut pas dire que c'est elle qui a un bug. Il y de grandes chances pour qu'il y ait des bugs dans le code du µC. Je peux aussi m'être planté sur le reste du code PC. Je te demande de regarder pourquoi la fonction renvoie faux, car il y a 3 cas possibles (erreur sur WriteFile, erreur sur ReadFile, réception d'autre chose que ACK). |
|
|
00
|
|
|
#89 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
salut,
stp ne fatigue pas. Je vais faire des efforts considerables pour eviter de te contrarier. Je vais immediatement suivre tes consignes. Merci et bonne journee. |
|
|
00
|
|
|
#90 | ||||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonsoir Hibernatus34,
j´etais certes muet ces derniers jours, mais j´essayais de travailler de maniere autonome afin de deceler les problemes du programme c et c++. J´ai insere les messages d´erreurs sur les instructions WriteFile et ReadFile comme suit: Code :
Citation:
Citation:
Bonne soiree. |
||||
|
|
00
|
|
|
#91 | ||
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Salut,
Je pensais plus à quelque chose comme : Code :
Soit dit en passant, je pense que ça sert à rien d'envoyer la chaîne caractère par caractère. J'ai laissé ça parce que tu m'avais dit que c'était nécessaire et que j'ai pas l'habitude de cette API, mais dès que tu auras quelque chose de fonctionnel il faudra essayer avec l'envoi de chaînes dans WriteFile. Sinon j'ai pas trop le temps de regarder en ce moment, j'essaierai avant la fin de la semaine. |
||
|
|
00
|
|
|
#92 | ||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonjour Hibernatus34,
J´ai deboggue le programme c++ en me servant de la version modifiee de la fonction EnvoieCommande() que tu m´as suggeres et j´ai obtenu le resultat suivant: Citation:
Je crois que le microcontrôleur bug !! Citation:
|
||
|
|
00
|
|
|
#93 | ||
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Ah, j'ai zappé une chose importante. Je crois que ReadFile renvoie TRUE en cas de time-out.
Essaie avec ce code plutôt : Code :
|
||
|
|
00
|
|
|
#94 | |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
J´ai a nouveau deboggue le programme c++ avec la nouvelle version de la fonction EnvoieCommande() et la console affiche ceci:
Citation:
|
|
|
|
00
|
|
|
#95 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Voilà, maintenant tu sais que le µC n'a rien répondu.
C'est le pire cas, puisque le bug peut être n'importe où, mais c'était aussi le plus probable. |
|
|
00
|
|
|
#96 |
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
C´est clair que le µC n´a pas repondu !!! Je m´en doutais aussi. J´ai revu le programme du µC et je pense que le probleme vient de la fonction d´interruption ISR(USART0_RX_vect). Mais j´ai pas assez d´arguments pour le prouver. sinon les autres fonctions sont ok.
|
|
|
00
|
|
|
#97 |
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Si tu soupçonnes cette fonction, tu peux la simplifier pour ne tester que les autres : quand tu reçois '\r' retourne directement "\x06".
Après ça, si tu ne reçois pas ACK côté PC après avoir envoyé un '\r' seul, c'est que le problème est ailleurs. Pourquoi tu ne fais pas ce genre de test de toi-même ? Remue-toi un peu ! (je dis pas ça méchamment, ne le prends pas mal surtout) |
|
|
00
|
|
|
#98 | |||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Bonjour,
J´ai pas mal pris ta remarque et je pense que t´a tout de même raison. Je vais me remuer. j´ai modifie et teste la fonction ISR(USART0_RX_vect) comme ceci: Code :
Citation:
Comme tu l´as suppose, le probleme vient d´ailleurs. Je vais examiner la fonction USART0_Send(). |
|||
|
|
00
|
|
|
#99 | ||||||
|
Membre Expert
![]() Inscription : août 2010 Messages : 533 ![]() |
Attention à l'ordre des conditions, mon code était de la forme :
Code :
Code :
Essaie d'augmenter les time-out dans un premier temps (mets 1000 le temps des tests, on s'en fiche pour le moment). J'ai beaucoup de mal à voir les bugs à travers tes tests. Déjà quand on avait testé un simple écho ça a pris beaucoup de temps pour finalement se rendre compte que le code était plutôt correct dans le principe. Le programme minimal à faire fonctionner avant de réactiver tout le reste, c'est : - Dans l'ISR USART0_RX, si UDR0 == '\r' alors activer l'interruption sur UDRE0 - Dans l'ISR USART0_UDRE, faire UDR0 = '\x06' et désactiver l'interruption sur UDRE0 Si ça ne te renvoie pas un ACK à la 1ère commande, je ne peux plus rien pour toi, car c'est la même chose que l'écho mais en plus simple. En gros ça devrait donner : Code :
|
||||||
|
|
00
|
|
|
#100 | ||||||||
|
Invité régulier
![]() arthur Étudiant Inscription : mars 2012 Messages : 110 ![]() |
Salut Hibernatus34,
tu avais poste ceci dans le programme du microcontrôleur: Code :
Je propose ceci: Code :
Citation:
Code :
Citation:
|
||||||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com