projet en RS485...

spheris

Senior Member
Bonjour,
Je réalise un projet de surveillance des températures, hygrométrie par le biais de cartes picaxe 20m2 avec max485 et démarre des appareils suivant les valeurs obtenues(distance environ 60m).
Le schéma de principe en piece jointe vous explique comment je battis ce systeme.

Photo0127.jpg

Un pc genere une commande Texte (exemple : "A01") envoyée par le RS232.
Ensuite un picaxe 20M2 sur une carte d'interface envoi cette chaine via un MAX485 par la commande :

Code:
high B.6 'ligne ecriture a 1 , lecture a 0
serrxd b0,b1,b2
serout B.7,N2400,(b0,b1,b2
et reste en position d'attente de recevoir une reponse du periph concerné.

J'ai compris le fait que mettre la ligne lect/ecrit à 1 ou a 0 me permet d'envoyer ou de recevoir et cela fonctionne.
Mais je ne recois pas tout le temps la bonne chaine en retour.
Auriez vous un exemple de dialogue d'envoi et de réception de chaine sur un exemple concret avec des MAX485 ?
Merci pour vos réponses.
;)
 

PieM

Senior Member
Mais le MAX485 est transparent dans la transmission. d'un coté comme de l'autre on se retrouve en 232.
c'est quoi le programme complet ? parce que ces deux ligne de code incomplètes ne disent pas grand chose !
En plus vous avez plusieurs périphériques sur la même ligne ? et pas d'adressage ?
Si vous êtes en multipoint, il y a un protocole à respecter afin que le maître adresse chaque esclave à tour de rôle. Mais je ne crois pas que le picaxe soit bien indiqué pour ça ...
 
Last edited:

spheris

Senior Member
En fait, tous les picaxes sont en reception par defaut
Un seul (celui relié au Pc par le cable de programmation) trasmet une chaine du style A01 (A correspondant au picaxe que je veux interroger.
puis bascule en reception le temps de recevoir la chaine du picaxe concerné.


Voici le programme complet en transmission.

Code:
main:
[B]high B.6[/B] 'ligne ecriture a 1 , lecture a 0
[B]serrxd b0,b1,b2,b3,b4[/B] 'reception du PC
[B]serout B.7,N2400,(b0,b1,b2,b3,b4) [/B]'envoi sur le bus 485
[B]low B.6 [/B]mode lecture
[B]serin [400],B.4,N2400,(b6,b7,b8,b9,b10,b11,b12)[/B] 'reception chaine du picaxe
[B]goto main[/B]
Et voici un programme de reception d'une carte (carte sondes de t°)
Le premier caractere de la chaine indique quel picaxe doit traiter la chaine et me renvoyer une info.

Code:
[B]debut:[/B]
[B]low B.5[/B] 'mode reception rs485 =0,emmission =1
[B]goto main
[/B]
[B]main:[/B]
[B]serin B.4,N2400,b0,b1,b2 [/B]'lecture du bus
[B]if b0 = "T" then oktemp[/B] 'si 1er carctere = T donc carte temperature doit repondre
[B]goto main[/B]
[B]
oktemp:
if b2 = "1" then sonde1
if b2 = "2" then sonde2
goto main[/B]

[B]envoidata:
high B.5 '[/B]passe en ecriture sur le bus
[B]pause 100
serout B.6,N2400,("T0",b2,"0",#w5)[/B] 'envoi la valeur de temperature
[B]pause 100
[B]low B.5[/B] passe le bus en lecture
goto main[/B]

[B]sonde1:
readtemp B.7,w5
goto envoidata[/B]
 
Last edited:

BESQUEUT

Senior Member
En fait, tous les picaxes sont en reception par defaut
...

Code:
[B]pause 100
serout B.6,N2400,("T0",b2,"0",#w5)[/B] 'envoi la valeur de temperature
[B]pause 100
[B]low B.5[/B] passe le bus en lecture
goto main[/B]

[B]sonde1:
readtemp B.7,w5
goto envoidata[/B]
Beaucoup de GOTOs dans ce programme : pas facile à lire...
Vous supposez que w5 fait toujours exactement 3 caractères. Est-ce toujours le cas ?
Où est le label sonde2: ?
J'ai compris le fait que mettre la ligne lect/ecrit à 1 ou a 0 me permet d'envoyer ou de recevoir et cela fonctionne.
Mais je ne recois pas tout le temps la bonne chaine en retour.
Donc l'architecture globale fonctionne, mais le timing n'est pas bon. Quand à savoir où....
Peut être pourriez vous en dire un peu plus sur ce que vous recevez "pas bon"
Mettre une valeur "singulière" dans b10,b11,b12 pour savoir si vous avez reçu quelque chose ou si vous êtes passé en timeout et donc que vous avez les valeurs du dernier envoi.
Après... il faudrait sniffer les coms à chaque niveau pour comprendre ce qui est altéré ou ne passe pas...
 
Last edited:

spheris

Senior Member
sonde2:
readtemp C.0,w5
goto envoidata


en fait sonde 2 est la meme chose, j'ai mis des goto pour eviter de reecrire toujours la meme fonction.
Si ce n'est pas bon et si vous avez une autre astuce, je suis preneur.

Quant à w5, j'ai constaté le probleme de taile 1 a 4 caracteres je passerai par un BIN TO ASCII après avoir résolu mon souci de chaine.

Comment scruter le port COM ?

J'ai le cable de prog qui me sert d'echange avec le premier picaxe mais impossible de scruter le picaxe des temperatures.
Je vais retenter des essais en mettant des PAUSE 100 par exemple pour voir.
Merci encore pour votre aide précieuse.
 

PieM

Senior Member
Commencez à sérier les problèmes:
Le pc envoie une chaine "A01" au picaxe maître.
Que reçoit le picaxe ? car il envoie 4 octets sur le bus sans aucun contrôle.
En réception il vaut mieux utiliser un qualifier qui serait l'adresse du récepteur: serin B.4,N2400,("T"),b1,b2 'lecture du bus

votre programme restera en attente de réception du serin avec un "T"
là aussi vérifier par un debug que votre picaxe a bien reçu quelque chose.
même contrôle pour le retour vers le maître.

donc le prog se résume à :
Code:
[color=Black]debut:[/color]
[color=Blue]low B.5 [/color][color=Green]'mode reception rs485 =0,emmission =1[/color]

[color=Blue]serin B.4[/color][color=Black],[/color][color=Blue]N2400[/color][color=Black],[/color][color=Blue]([/color][color=Red]"T"[/color][color=Blue])[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2 [/color][color=Green]'lecture du bus boucle si pas OK avec "T"[/color]

[color=Blue]select [/color][color=Purple]b2
   [/color][color=Blue]case [/color][color=Navy]1
   [/color][color=Blue]readtemp B.7[/color][color=Black],[/color][color=Purple]w5
   [/color][color=Blue]case [/color][color=Navy]2
   [/color][color=Blue]readtemp B.7[/color][color=Black],[/color][color=Purple]w5 [/color][color=Green]'A changer[/color]
[color=Blue]endselect   

high B.5 [/color][color=Green]'passe en ecriture sur le bus[/color]
[color=Blue]pause [/color][color=Navy]100[/color]
[color=Blue]serout B.6[/color][color=Black],[/color][color=Blue]N2400[/color][color=Black],[/color][color=Blue]([/color][color=Red]"T0"[/color][color=Black],[/color][color=Purple]b2[/color][color=Black],[/color][color=Red]"0"[/color][color=Black],[/color][color=Purple]b10[/color][color=Black],[/color][color=Purple]b11[/color][color=Blue]) [/color][color=Green]'envoi la valeur de temperature[/color]
[color=Blue]pause [/color][color=Navy]100[/color]

[color=Blue]goto [/color][color=Black]debut[/color]
la température mesurée est utilisée en tant que valeur numérique je pense, donc c'est serout b10 et b11, au lieu de #w5.

J'ai le cable de prog qui me sert d'echange avec le premier picaxe mais impossible de scruter le picaxe des temperatures.
Faites un prog qui tourne en boucle sur le maître en envoyant quelquechose, et branchez vous sur le recepteur.
ou mettez une led qui s'allume après reception de la bonne chaîne.
 

spheris

Senior Member
PIeM,
Encore merci pour ces précisions.
Maintenant j'ai deux problemes :
Au tout premier demarrage, je suis obligé d'envoyer deux fois la chaine T01 pour que le 2eme picaxe reagisse. Apres tout va bien.
Second probleme, j'envoi la chaine, le picaxe interprete, renvoi une chaine basique genre "TRE" mais je ne recois que des triangles sur le PC. J'ai intercalé un display sur la broche B.0 de l'emetteur et rajouté le code suivant :

serrxd b0,b1,b2,b3,b4
serout B.7,N2400,(b0,b1,b2,b3,b4)
pause 40
serout B.0,N2400, ("ENVOI: ",b0,b1,b2)

et en reception sur le meme picaxe :

serout B.0,N2400, (254,1)
pause 40
serout B.0,N2400, ("RECEP: ",b6,b7,b8,b9,b10)
sertxd (b6,b7,b8,b9,b10,b11,b12,10)


sur le display j'ai bien ENVOI :T01 d'affiché,
mais en réception j'ai :
RECEP:
00/00/00 00:00


que cela veut-il dire?

sur le picaxe recepteur
j'ai RECEP: T01 et
ENVOI : T01OK
 

PieM

Senior Member
et en reception sur le meme picaxe :

serout B.0,N2400, (254,1)
pause 40
serout B.0,N2400, ("RECEP: ",b6,b7,b8,b9,b10)
sertxd (b6,b7,b8,b9,b10,b11,b12,10)


sur le display j'ai bien ENVOI :T01 d'affiché,
mais en réception j'ai :
RECEP:
00/00/00 00:00
Il est où le serin ? mettre les programmes complets et en les identifiant (maître- esclave) ça facilite les choses ...

d'autre part, vous envoyez serout B.7,N2400,(b0,b1,b2,b3,b4)
et vous dites que vous ne recevez que des 0. Mais il faut maintenant aller sur le récepteur (mettre le display dessus) et voir ce qu'il reçoit. Visiblement il ne reçoit rien!

Et laissez le PC de coté pour l'instant ! il n'a rien à faire la dedans.
réglez les pb entre picaxes, la liaison pC viendra après. Si vous recevez des caractères bizarres c'est qu'il y a certainement un pb de débit.
 

spheris

Senior Member
PIeM,
J'ai suivi vos conseils avec attention, isoler le PC et ne s'occuper de la com des picaxe, et maintenant cela fonctionne.
Par contre, j'ai quelque chose d'assez surprenant.
Sur le display sur la carte emission je recois n'importe quoi durant les 24 premieres secondes puis apres je recois bien ma chaine correcte "A".

Voici les deux programmes :

Code:
'EMMISSION pcbus avec display sur B.0
debut:
high B.6
goto main

main:
serout B.7,N2400,("T1")
low B.6
serin [1000],B.4,N2400,b0

serout B.0,N2400,(b0)
pause 1000
high B.6
goto main
et la carte esclave :

Code:
'RECEPTION temperature
debut: 
low B.5
goto main

main:
serin B.4,N2400,("T"),b0
high B.5
serout B.6,N2400, ("A")
pause 100
low B.5
goto main
pour l'instant, je me contente juste d'afficher un "A" si la com se passe bien. Je rajouterai les routines readtemp12 apres.
 

PieM

Senior Member
mettez une pause de 500 entre high B.5 et le serout B.6,N2400, ("A")

votre programme (simplifié) est en fait:

Code:
'RECEPTION temperature
main:
do
low B.5  'passe en reception
serin B.4,N2400,("T"),b0
high B.5  'passe en emission
pause 500 'pour laisser le temps à l'émetteur de passer en reception
serout B.6,N2400, ("A")
loop
et coté emission:

Code:
'EMISSION pcbus avec display sur B.0

main:
do
high B.6
serout B.7,N2400,("T1")
low B.6
serin [1000],B.4,N2400,b0
serout B.0,N2400,(b0)
pause 1000
loop
 

spheris

Senior Member
Après quelques heures passées, la communication fonctionne correctement.
Petit bémol cependant :
Le premier échange entre les picaxe renvoit des triangles. (le maitre envoi bien ,l'esclave recoit bien, l'esclave envoit bien et le maitre recoit des triangles...)
Puis après tout fonctionne correctement au deuxième et plus...
Comme si il y avait besoin d'une init quelque part la premère fois
J'ai quand même pu en venir à bout. Encore merci pour vos conseils et votre aide.
Au fait, comment doit-on passer en RESOLU un post ?
 
Top