Soucis avec Hserout et Hserin

gandalf60

New Member
Bonjour

Je souhaite envoyer un octet, d'un 20m2 vers un autre 20m2 avec hserout et hserin.

L'envoi et la réception se font, mais parfois la valeur reçu est fausse.

Je prend bien les pins dédiées a cet effet.

ex: j’envoie la valeur 100, elle est reçu, mais celle-ci change par une autre valeur pendant 1-2 seconde et reprend la bonne valeur et ainsi de suite...

Les cartes sont cote a cote.

Même souci, si alim par pile.
J'ai essayé a 16 puis 8 Mhz aussi pour voir, idem.

Avec serout et serin, pas de problème.

Je fait surement une chose "pas comme il faut", mais quoi?

ci-joint le prog emission et le prog réception.

Merci de vos conseils



Code:
main:
#no_data
'picaxe 20M2 emission
symbol potar=b0
setfreq M16
b2=75

   hsersetup b2400_16,%00
        
    do
debug

readadc C.1,potar

hserout 0,(b2)
    pause 100
    
loop





main:  ' reception Hserin
'20M2
#no_data
symbol LCD=C.1
symbol led=B.0
setfreq M16
symbol baud =T9600_16

Hsersetup B2400_16,%00
serout LCD,baud, (254,1)
pause 500
do
debug

hserin b2
pause 200
'high led
'pause 200
'low led
pause 1000

serout LCD,baud,(254,128,"Val=",#b2," ")
pause 500
loop
 

PieM

Senior Member
Bonjour,

symbol potar=b0
......
hserout 0,(b2)
Y a comme un problème !

Vérifier que la tension ana est stable.
utiliser plutôt sertxt que debug.
 

gandalf60

New Member
Bonjour

symbol potar=b0
......
hserout 0,(b2)
Y a comme un problème !

Pas de problème...(du moins je ne pense pas)
Au départ j'envoyais la valeur du potar
pour m'affranchir d'un éventuel soucis sur lui
j'ai envoyé une valeur fixe, donc b2 qui a la valeur de 75.

A moins que le fait de garder la ligne "symbol potar=b0" ne pose un soucis.
 

PieM

Senior Member
Sorry! lu un peu vite...
essayer avec une variable word
w1 = 75
...........
hserout 0,(w1)
.............
hserin w1
 

PieM

Senior Member
Georges,
Tu as raison, mais je sais que j'avais déjà rencontré un pb avec les M2 et leurs 2 octets de buffer.
Si tu regardes la doc, le principe est de prédéfinir une valeur pour la variable lue ($FFFF) et ne la prendre en compte que si elle a changé.
C'est un peu tordu cette histoire...
 

gandalf60

New Member
Bonjour a tous

merci pour vos retours


j'ai essayé avec w1, le prog le prend, mais encore plus d'erreurs (par rafales de 4,5).

Essayé aussi le truc de piem, qui est sur le manuel, effectivement c'est tordu et de toute façon, ça ne va pas, (a moins que je fasse mal).

j'ai aussi essayé avec divers picaxes, autant en émission qu'en réception...pareil
blindé les fils de transmission pareil, mis un tore idem

changé mes platines d'essai, je les ai eloigné l'une de l'autre, regardé l'alim a l'oscillo (elle est bien), j'ai bien mes condos de decouplage sur les bornes d'alim des picaxes.

Question : pas besoin de resistances de tirage sur les bornes Hserout et/ou Hresin ?


Par dépit, je me résoudrait a faire avec serin/serout, mais bon... dommage.

personne n'a utilisé ces commandes ? (avec succès)
 

jojojo

Senior Member
Tu peux tenter de mettre une 10K entre le port Hserin, et la masse.
Si ça ne fait pas de bien ça ne fera pas de mal.

J'ai déjà eu ce problème. Le tout, c'est que je me souvienne du projet associé ... Ça va me "reviender"
 

jojojo

Senior Member
Il me semble que ...

Tu as codé :

hserout 0,(b2)


Tente

hserout 1,(b2)

Le "break" est censé "réveiller" le système... Demain, je fais un test, vite fait.
 

gandalf60

New Member
Bon ben la résistance de tirage n'a aucun effet positif.

il me semble que j'ai essayé le hserout 1,(b2) .

merci pour le test, il m’intéresse beaucoup .
 

PieM

Senior Member
Fais un essai avec des
Hsersetup B2400_16,%10

et éventuellement à 4 ou 8 MHz

Non, ça ne marche pas avec des M2 :-( !
 
Last edited:

GM39

Senior Member
Hello,
Après la réception avec hserin essaie un hsersetup off pour désactiver la réception avant d'envoyer les données avec serout.
Avec un X2, quand on utilise la réception avec hserin en tâche de fond, les envois avec serout sont perturbés par les interruptions.
Avec un M2 il semble que la réception avec hserin soit en réalité en tâche de fond et il pourrait y avoir un soucis avec les interruptions.
 

gandalf60

New Member
Bonsoir

désolé du silence, mais avec les fêtes...

je viens de rentrer et je (re)fais des essais.

Bon il y a du mieux, pour l'instant je note ce qui se passe, pour vous en faire part, surement demain.

En tout cas, cette commande Hserin est très très très pointilleuse.

Comme le dit GM39 la réception en tache de fond fonctionne sur les M2.

Bonne soirée
 

gandalf60

New Member
Bonjour

Déjà, ce n'était pas un pb de hard, mais un pb de temps et de gestion de buffer a la réception.

Sur le picaxe émetteur j'envoie W0
sur b0 la valeur du potar1
sur b1 la valeur du potar 2

En réception, je n'arrive a afficher que b0, b1 apparait toujours a 0

===================

Si j'envoie B0, pause 200 puis B1

j'arrive a afficher B0 puis B1 au rythme des pauses que j'ai insérées, mais toujours sur la ligne serout ...B0

Donc je pense que je ne peux envoyer/recevoir fiablement qu'un seul octet.
Car je recois bien les 2 octets, mais comme (apparemment) le buffer de réception fait un décalage, je ne peux pas savoir qui je reçois, et quand.

J'espère avoir été assez clair dans mes explications.

Si quelqu'un a une idée pour différencier les 2 octets a la réception, je suis preneur.

Merci et bonne journée
 

GM39

Senior Member
A priori hserout n'envoie que des octets, donc il y a des chances que si on met w0 il n'envoie que b0
Je pense qu'il est préférable de mettre hserout 0,(b0,b1)
 

gandalf60

New Member
je vais essayer comme tu dis.

mais j'ai peur que cela ne fasse la même chose que quand j’envoie b0 et b1 en 2 fois.

on verra bien...
 

gandalf60

New Member
Bon ben, les valeurs b0 et b1 sont bien reçus, mais s'affichent toujours alternativement sur la ligne serout b0....
je met le code de réception au cas ou

Code:
main:  ' reception Hserin
'20M2
#no_data
symbol LCD=C.1
setfreq M16
symbol baud =T9600_16

Hsersetup B9600_16,%00
serout LCD,baud, (254,1)
pause 100

do
hserin (w0)
pause 200
serout LCD,baud,(254,128,"Val1=",#b0," ")
pause 100

serout LCD,baud,(254,192,"Val2=",#b1," ")

loop
 

PieM

Senior Member
Bonjour,

Non, il faut utiliser 2 hserin pour lire les 2 valeurs reçues dans le buffer en tâche de fond.
Il se peut qu'il y ait un pb de timing, si les hserout sont plus fréquent que les lectures à l'arrivée, puisque les données sont reçues dans une pile FIFO.
 

gandalf60

New Member
Bonjour

même avec 2 hserin, je n'ai toujours que b0 qui s'affiche.

Code:
main:  ' reception Hserin
'20M2
#no_data
symbol LCD=C.1
setfreq M16
symbol baud =T9600_16

Hsersetup B9600_16,%00
serout LCD,baud, (254,1)
pause 100

do
hserin b0

serout LCD,baud,(254,128,"Val1=",#b0," ")
'pause 100

hserin b1
serout LCD,baud,(254,192,"Val2=",#b1," ")

'sertxd ("valeur de b1: ",#b1)
loop
 

gandalf60

New Member
cela fait la même chose, il ne veut toujours pas m'afficher b1.
par contre sur la ligne serout....b1 il m'affiche la valeur de b0

même en mettant b1 sur la meme ligne serout que b0 il n'affiche que b0

quand même tordue cette histoire...
 

jojojo

Senior Member
J'ai revérifié, pour être sûr.

Page 2.46 de la doc:

Syntaxe (puces M2):
HSERIN variable
- Variable est la variable qui stocke le byte reçu


Pas le Word.
 

jojojo

Senior Member
Je ferais comme dit Pierre: En deux fois.
Et, avec la pause qui va bien, entre les deux.

Toujours dans la doc:

Cependant, sur les puces M2, la commande hserin n’est pas bloquante, elle s’exécute toujours immédiatement. Si des données entrantes sont présentes dans le tampon, le premier des bytes est transféré dans la variable, sinon, la variable n’est pas modifiée, et le programme se poursuit à la ligne suivante. Si deux bytes sont attendus, il est nécessaire d’utiliser deux commandes hserin, pour récupérer ces deux bytes.
 
Last edited:

GM39

Senior Member
Ce qui est curieux c'est que pour l'exemple donné dans la doc ils utilisent un mot pour récupérer l'octet
Code:
    hsersetup B9600_4, %00    ; baud 9600 at 4MHz

main:    w1 = $FFFF        ; set up a non-valid value
    hserin w1        ; receive 1 byte into w1
    if w1 <> $FFFF then    ; if a byte was received
      hserout 0,(w1)    ; echo it back out
    end if
    goto main        ; loop
Pourquoi ne pas essayer
hserin w0
hserin w1
pour lire b0 et b2
 

gandalf60

New Member
toujours dans la doc:

Cependant, sur les puces M2, la commande hserin n’est pas bloquante, elle s’exécute toujours immédiatement. Si des données entrantes sont présentes dans le tampon, le premier des bytes est transféré dans la variable, sinon, la variable n’est pas modifiée, et le programme se poursuit à la ligne suivante. Si deux bytes sont attendus, il est nécessaire d’utiliser deux commandes hserin, pour récupérer ces deux bytes.
j'ai bien lu la même chose que toi

même avec 2 hserin cela ne va pas (voir ex plus haut), pas moyen de trouver le bon timing,
ou alors... c'est moi qui merdoie, ce qui est vraisemblable.

je pense que je vais laisser tomber cette commande.
 

PieM

Senior Member
Essaie de réduire la fréquence d'envoi de tes hserout en augmentant la pause de ta boucle.
et à la réception, tu fais comme l'exemple:
tu satures ton buffer avec $FFFF et tu lis avec 2 hserin si ça a changé.
Avec des X2, on a l'avantage de disposer d'un flag de réception, et on est pas limité à 2 bytes.
 

gandalf60

New Member
Merci pour les liens
je vois que le hserin sur M2 posent des problèmes a tout le monde...ça me rassure.

J'attends un 20X2 cette semaine, c'est lui qui sera chargé de la réception, et un 14M2 pour l’émission.
Si j'ai bien compris ça devrait aller mieux (enfin si j'y arrive).

ps : c'est quoi au juste les registres SFR?
 

GM39

Senior Member
Le code donné par Hippy doit fonctionner également avec un 18M2 puisque c'est la même adresse $11 et bit5

2000 transmissions, toutes les 100ms sans erreur !

Avec le X2 il faudra faire attention avec le serout.

Les docs en français c'est très très rare, au mieux c'est en anglais, au pire c'est en chinois.
 
Last edited:

gandalf60

New Member
De ce que j'ai compris (mon anglais scolaire remonte a 45 ans)
il se sert d'un byte comme flag et l'autre en data, mais peut-être me gourre je.
donc si c'est bien ça, il ne passe qu'un byte de data.

Sinon, j'avais vu, d'après un poste de jojo que l'on pouvait se servir de RFout et RFin en filaire, mais cela
prend obligatoirement 8 bytes, et c'est déjà limite en nombre sur les M2.
 

PieM

Senior Member
Si tu as un X2, utilise le en slave d'une liaison I2C. Tout se fait en transparence via son scratchpad. Ton M2 en master pourra aller lire ou écrire dedans
 

gandalf60

New Member
Ok, ça m'a l'air très bien, et cela me plairait beaucoup, mais vous parlez a un grand débutant.

j'ai l'intention d'y mettre aussi une horloge ds3231 en I2C aussi, et gérer plusieurs I2C sur le même picaxe je ne sais pas faire (pour l'instant).
 

GM39

Senior Member
De ce que j'ai compris (mon anglais scolaire remonte a 45 ans)
il se sert d'un byte comme flag et l'autre en data, mais peut-être me gourre je.
donc si c'est bien ça, il ne passe qu'un byte de data..
Son but est de trouver un changement de programme dans un flux de données MIDI
Il recherche la séquence $C0 (changement de programme sur le canal 0) suivi du numéro de programme (un nombre < 128)
 

PieM

Senior Member
Ok, ça m'a l'air très bien, et cela me plairait beaucoup, mais vous parlez a un grand débutant.

j'ai l'intention d'y mettre aussi une horloge ds3231 en I2C aussi, et gérer plusieurs I2C sur le même picaxe je ne sais pas faire (pour l'instant).
Il n'y a qu'une seule liaison I2C sur un picaxe, mais elle peut s'adresser à plusieurs picaxes esclaves.
 
Top