emission/réception série filaire

zebulon

Member
Bonsoir,

Nouveau petit soucis.

J'essaye d'envoyer des données en série, par liaison filaire entre 2 PICAXE 18M2.

Emetteur :
Code:
symbol pinout = B.1



debut:

	serout pinout, T1200_4, ("A")

	pause 1000

	serout pinout, T1200_4, ("B")

	pause 1000

	serout pinout, T1200_4, ("C")

	pause 1000

	serout pinout, T1200_4, ("D")

	pause 1000

	serout pinout, T1200_4, ("E")

	pause 1000

	serout pinout, T1200_4, ("XYZ")

	goto debut
Récepteur :
Code:
symbol pinin = C.0
symbol car_recu = B2

gosub message_init
pause 5000
gosub LCD_Clear

boucle_principale:



	serin pinin, T1200_4, car_recu	' réception d'un caractère


	let LCDByte = car_recu

	gosub LCD_write

			

	goto boucle_principale

message_init:

	let LCDByte = "T"

	gosub LCD_write
	let LCDByte = "E"

	gosub LCD_write
	let LCDByte = "S"

	gosub LCD_write
	let LCDByte = "T"

	gosub LCD_write
	let LCDByte = " "

	gosub LCD_write
	let LCDByte = "L"

	gosub LCD_write
	let LCDByte = "C"

	gosub LCD_write

	let LCDByte = "D"

	gosub LCD_write
	return
Le problème est que je reçois BCDEXBCDEXBCDEX... au lieu de recevoir ABCDEXYZABCDEXYZABCDEXYZ...
Il manque le A et il manque les caractères de la chaine après le 1er.

Cela fait plusieurs soirée que je passe dessus sans voir de solution.

Avez-vous une idée ? Merci.

En fait, si j'ajoute une pause après l'envoi de XYZ, le A apparait bien. J'en déduis que les octets sont perdu car ils arrivent trop rapidement sur le récepteur et le récepteur n'a pas le temps de terminer l'affichage du caractères et de revenir à la commande serin que le caractère suivant est déjà passé.

Comment puis-je faire ? Bufferiser la réception et ne réaliser l'affichage que lorsque plus rien n'arrive sur la liaison série ? Augmenter la fréquence du µC ? Optimiser les routines d'affichage sur LCD ?
Une autre solution plus efficace ?

Guillaume
 
Last edited:

fuse

Senior Member
Bonjour Zebulon,
J'ai, moi aussi, eu des problèmes lors de l'utilisation de cette commande avec un module HF...
Après beaucoup d'essai et l'aide du forum (PieM et Westaust), j'ai pu résoudre mes problèmes et analyser les commandes serin et serout...
J'imagine que cela pourra être utile... Voici donc le protocole utilisé :

Emetteur
serout pinout, T1200_4, ("ABC",#b0,#b1) ou serout pinout, T1200_4, ("ABC",b0,b1)
"ABC" correspond à la chaine de validation (qui doit être identique sur le récepteur sinon pas de réception). Il est bien sur possible de mettre n'importe quelle chaine....
b0 et b1 correspond aux données à envoyer, le # permet d'envoyer la valeur ASCII, il est possible de rajouter d'autres variables.
Mettre une pause entre chaque serout (j'ai mis 20 ms)

Récepteur
serin pinin, T1200_4,("ABC"),b0,b1
Remarque
La commande serin bloque le programme, il est possible de mettre une option dans la commande
serin [50,sprog], pinin, T1200_4,("ABC"),b0,b1
dans ce cas là, si il n'y a pas de réception au bout de 50 ms, l'ensemble est dérouté vers sprog.
Cette option est possible que sur certain Picaxe.

Il reste cependant quelques essais à effectuer pour tout faire fonctionner....Essayer avec d'autres protocoles : N2400 par exemple...
 
Last edited:

PieM

Senior Member
Bonjour à tous ,

Serout T1200_4 peut poser un problème. Au départ la sortie serout est à l'état bas . Comme on est en mode T, les pulse data sont négatifs, et le premier caractère envoyé peut être défectueux. Essayer de mettre pinout à l'état haut juste avant le premier serout.
Sinon, comme le conseille fuse, travailler de préférence en mode N. Et la chaîne de validation ne fait pas de mal . :)
Le mode T est à réserver pour l'utilisation d'un interface qui inverse le signal, comme le MAX232 par exemple.
 

zebulon

Member
Bonjour,

Merci à vous deux, fidèles "dépanneurs" du forum.

J'ai déjà eu l'occasion d'utiliser les chaines de validation avec des montages emetteur/récepteur de température ( pour identifier les différents capteur notamment).

Mais ici, en fait, j'essaye de réaliser un clône de ce que fait le AXE033, c'est à dire un circuit d'interface à intercaler entre un montage et un afficheur LCD traditionnel (parallèle à 13€ en 4x20 et 5€ en 2x16) afin de pouvoir l'utiliser comme un afficheur LCD série/i2c.

Donc, je voudrais pouvoir utiliser des commandes telle que
Code:
serout pinout, speed, ("BONJOUR")
qui sont envoyées à un AXE033.

Je ne voudrais donc pas avoir à utiliser les "qualifier".

Ce soir, je testerais l'histoire du N au lieu du T qui règlera probablement le cas du 1er caractère.

Actuellement, mon afficheur est commandé en mode 4 bits.
Etant donné que j'utilise un 18M2 dans mon circuit d'interface et que je ne suis pas limité par le nombre de pin (le 18M2 est entièrement dédié à la gestion de l'afficheur), pensez-vous que j'obtiendrais de meilleurs résultats en pilotant l'afficheur en mode 8 bits (à condition que la perte des caractères lors de l'affichage de ma chaine XYZ soit lié à un problème de vitesse de traitement) ?

Merci,
Guillaume
 
Last edited:

westaust55

Moderator
Comme exemple travail au moment passé basé comme mentionné ci-dessus par fuse et PieM essayez le suivant

Emetteur:
Code:
symbol pinout = B.1
symbol Index = b2
symbol characte3r = b3

	HIGH pinout

debut:
	b2 = 0
	DO
        LOOKUP b2, ("ABCDEXYZ_"), b3
        SEROUT  pinout, T1200_4, ("UUUUUU") ; préambule pour aider la serrure de récepteur sur le signal 
        pause 16
        SEROUT  pinout, T1200_4 , ("M",b3) ; "M" est un qualificateur 
        pause 1000
        INC b2
	LOOP UNTIL b2 = 6 
	goto debut
Récepteur : ; Employez ceci pour la boucle principale
Code:
boucle_principale:
	serin pinin, T1200_4, ("M"), b4  ; réception d'un caractère après le "M"  qualificateur est reçu 
	let LCDByte = b4
	gosub LCD_write
	goto boucle_principale
 

zebulon

Member
Bonjour westaut55,

je me doutais bien que tu interviendrais ... quelle présence sur tous les fronts ...
Merci, mais ...
- il s'agit d'une connexion filaire (it's a wired connection) donc je n'ai pas besoin de la trame de réveil (I don't need the wakeup sentence).
- je ne souhaite pas utiliser de "qualifier" car je veux réaliser un clône du axe033 pour piloter des afficheurs 2x16, 2x40, 4x20.

Merci,
Guillaume
 

zebulon

Member
Eureka

Bon,
Après différent essai, j'ai une solution qui fonctionne super bien.
Seul problème, je ne comprend pas bien pourquoi ça marche. Probablement parce que je ne connais pas le fonctionnement précis de serin.

Comme je suspectais que des octets étaient perdu lors du traitement de l'affichage sur le LCD, je me suis dis que j'allais "bufferiser" (c'est un bien grand mot !) les données reçues.

J'ai donc fais ceci pour le récepteur (filaire je précise) :
Code:
boucle_principale:

    for x = 10 to 27
      poke x, 0
    next x
    serin [500, rien_de_plus], pinin, N2400_4, b10 b11, b12, B13, B14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27

rien_de_plus:
    for x = 10 to 27
        peek x, val

        if val <> 0 then
  	    let LCDByte = val

	    gosub wrchr
        endif

    next x
goto boucle_principale
et ça fonctionne très bien.
Si 5 caractères sont reçus, b10 à b14 sont renseigné et b15 reste à 0.
Après 500ms, si rien de plus n'arrive, on sort du serin par le timeout et on affiche les caractères.

Donc là, ça marche car tant qu'on reçoit des caractères, ils sont stockés.
Il n'y a que si on envoie 20 caractères d'un coup qu'il y a des pertes.

Je me suis dis, essayons de mettre une seule variable de réception.

Code:
boucle_principale:

	serin [100, rien_de_plus], pinin, N2400_4, val
rien_de_plus:
		if val <> 0 then

			if val <> 254 then ' Ce n'est pas une commande

				let LCDByte = val

				gosub wrchr

			else

				goto traitement_commande

			endif

		endif
		goto boucle_principale
Et ça fonctionne super bien aussi.

Et là je ne comprend pas pourquoi !
Le timeout permet de sortir du serin et traiter la suite du programme, mais quand on reçoit plein de caractères dans une durée supérieur à 100 ms, je ne vois pas la différence avec le code précédent.

Je suis preneur de toutes explications.

Guillaume
 

zebulon

Member
Bonjour,

Oui, j'ai vu qu'il y avait quelques optimisation à faire :
- ajouter des délais entre les octets,
- utiliser les pointeurs directement avec serin car plus rapide,
- augmenter la vitesse du PICAXE afin qu'il dispose de de cycle de temps pour traiter les données reçues

Merci,
A+
 
Top