1

Bonsoir,

je suis debutant dans la programmation de microcontrôleur et j´espere que je pourrais trouver de l´aide aupres des membres du forum.

En fait, je bosse avec l´atmega644p. L´atmega644p possede deux USARTs. A savoir l´USART0 (RS232) et l´USART1(RS485). L´USART0 de l´atmega644p receptione les donnees ou les commandes qui lui sont envoyes par le pc sous la forme "/n X,Y /r".
\n ----> represente le debut de la commande
X -----> represente la position X
, -----> sert a separer la position X et Y
Y -----> represente la position y
\r-----> Fin de la commande

Concernant la reception des commandes "/n X,Y /r" a partir de L´USART0, je n´ai pas de probleme. tout se passe bien.

Cependant l´USART1 (RS485) de l´atmega644p permet d´envoyer uniquement les positions X et Y vers deux moteurs de commande identique. Chaque moteur de commande possede une entree RS485 pour receptionner les commandes envoyees par l´atmega644p. Lorsqu´un moteur de commande receptionne une commande, alors le moteur de commande doit retourner automatiquement une reponse a l´atmega644p via l´USART1, pour confirmer si la commande receptionnee est valide ou invalide.

Exemple: Commande envoyee au moteur de commande -------------------------------------> "#1A\r"
Reponse du moteur de commande si la commande receptionnee est valide -----> "1A\r" ---> commande valide
Reponse du moteur de commande si la commande receptionnee est invalide ---> "1A?\r" --> commande invalide

Le moteur de commande ne peut que recevoir et comprendre les commandes qui sont sous forme ASCii, c-a-dire sous la forme "#1p2\r"

Explications: "#1p2\r"
# ---------------> Marque le debut d´une commande
1 ---------------> Represente l´adresse du moteur de commande
p2 --------------> Represente le mode de travail du moteur de commande
\r --------------> Represente la fin d´une commande

Voici en quelques mots la maniere donc mon atmega644p a ete programme:

- Quand on reçoit \r sur l'USART0, au lieu de renvoyer ACK à la fin, on stocke les échos(Reponses moteurs) qu'on attend dans des chaînes statiques.
- Quand on reçoit \n sur l'USART0, on vide ces chaînes (machaîne[0] = 0). C'est pour le cas 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.
ACK ---> signifie que l´envoi a ete un sucess et ensuite on peut passer a l´envoi de d´autres positions.
- Si on reçoit autre chose que ce qui était attendu, je pense qu'il faut l'ignorer.

J´ai programme avec l´aide de certaines personnes mon atmega644p afin de realiser mon experience. Helas mon programme ne marche pas. Pourriez-vous, s´il vous plaît me donner un coup de main. En fait je crois que mon stress vient des fonctions ISR(USART0_RX_vect), ISR(USART1_RX_vect) et ParametrageMoteur().

Mon code se trouve en piece jointe



Merci.

tromb Fichier joint : transfer_position.c

2

char machainereponse[30] ; machainereponse[30] = UDR1;
fouet

3

!call Zerosquare
--- Call : Zerosquare appelé(e) sur ce topic ...


embarrassed

4

(la prochaine fois, si c'est un mec avec un PIC, je saurais m'en souvenir grin)

Bon déjà, comme l'a signalé robinHood, tu as un débordement de buffer qu'il faut corriger.

Ensuite, "mon programme ne marche pas", c'est vague tongue

Qu'est-ce qui ne fonctionne pas exactement ?
As-tu vérifié que chaque sous-partie de ton programme est fonctionnelle ? (par exemple, en envoyant une chaîne fixe et en vérifiant que ton moteur l'a bien reçue)
Quel est le schéma du circuit ?
Es-tu sûr qu'il n'y a pas de problème au niveau du matériel ?
De quels instruments de mesure disposes-tu ?
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo