combien de variables pour un 20M2...

spheris

Senior Member
Bonjour,
J'utilise 8 sondes DS18B20 sur mon picaxe et lit les températures dans ma boucle main avec cette instruction :

Read temp12 w1,C.1

Je souhaite avoir une chaine envoyée avec SERTXT de longueur égale à chaque fois.
Je transforme donc ma chaine sur 4 digits en utilisant BINTOASCII.
Maintenant, reste à savoir quelle variable je peux utiliser.
J'ai 8 sondes, et fais l'acquisition respectivement de w1 à w8.
par contre pour la conversion, Je n'ai pas assez de variables car il me refuse b30 et plus...
Pourriez-vous m'expliquer pourquoi?
Merci pour vos réponses.
 

PieM

Senior Member
Bonjour,

En fait sur un 20M2, il y a 512 variables disponibles.

De l'adresse 0 à 27 elles sont directement accessibles par des variables nommées b0 à b27.
Au delà il faut utiliser les instruction peek et poke pour lire et écrire de la position 28 à 511 en adressage direct, ou bien l'adressage indirect (@bpr) , plus indiqué peut être dans ce cas.

Il est aussi possible d'utiliser des variables word non utilisées par le système, à savoir s_w1 à s_w6 sur un M2.

Mais je ne comprends pas trop le problème, car vos 8 valeurs sont contenues dans w0 à w7.
Ensuite vous n'utilisez que les mêmes 4 bytes pour le sertxd. (b16 à b19)
 

spheris

Senior Member
PieM,
merci pour votre réponse.
En fait mon problème se situe je pense dans la compréhension du plan mémoire du 20M2.
si je veux envoyer les valeurs w0 à w7 sous la forme de 4 bytes, cmment dois-je m'y prendre ?

exemple de code pour 2 temperatures:
readtemp12 w0,C.1
readtemp12 w1,C.2
bintoascii w0,b1,b2,b3,b4,b5
bintoascii w1,b6,b7,b8,b9,b10
SERTXT(#b2,#b3,#b4,#b5,";",#b7,#b8,#b9,#b10)

ce code me renverra w0 et w1 sur 4 bytes. Il est impératif que pour chaque sonde j'ai une chaine de caractères sur 4 bytes.
Merci pour votre aide.
 

BESQUEUT

Senior Member
Si vous souhaitez envoyer 8 caractères (et non 8 bytes) il faut retirer les # :
SERTXT(b2,b3,b4,b5,";",b7,b8,b9,b10)
 

PieM

Senior Member
PieM,
merci pour votre réponse.
En fait mon problème se situe je pense dans la compréhension du plan mémoire du 20M2.
si je veux envoyer les valeurs w0 à w7 sous la forme de 4 bytes, cmment dois-je m'y prendre ?

exemple de code pour 2 temperatures:
readtemp12 w0,C.1
readtemp12 w1,C.2
bintoascii w0,b1,b2,b3,b4,b5
bintoascii w1,b6,b7,b8,b9,b10
SERTXT(#b2,#b3,#b4,#b5,";",#b7,#b8,#b9,#b10)

ce code me renverra w0 et w1 sur 4 bytes. Il est impératif que pour chaque sonde j'ai une chaine de caractères sur 4 bytes.
Merci pour votre aide.
Bon ça ne va pas marcher ça !

Il faut savoir que w0 est formé de b0 et de b1, w1, formé de b2 et b3 , etc ...
les variable byte sont de b0 à b27, ce qui correspond aux variables w0 à w13.
Il faut donc faire attention à ne pas faire des doubles emplois.

sinon pour le problème la solution est de faire:

'lire les capteurs -----------------
readtemp12 w1,C.1
readtemp12 w2,C.2
............
readtemp12 w8,C.8 '(utilise b16 et b17)

'traiter chaque valeur par un changement de variable

w0 = w1 : gosub transmis
w0 = w2 : gosub transmis
.....................
w0 = w8 : gosub transmis

'Routine d'affichage ----------------
Transmis:
bintoascii w0,b18,b19,b20,b21,b22
SERTXD (b19,b20,b21,b22)
return

On peut économiser encore 3 variables byte si nécessaire.
 

PieM

Senior Member
Version eco:

Code:
readtemp12 w0,C.0
readtemp12 w1,C.1
readtemp12 w2,C.2
.................
readtemp12 w7,C.7'(utilise b14 et b15)
 

[COLOR="#0000FF"]'traiter chaque valeur par un changement de variable[/COLOR]
gosub transmis
w0 = w1 : gosub transmis  [COLOR="#008000"]'on réutilise w0[/COLOR]
w0 = w2 : gosub transmis
.....................
w0 = w7 : gosub transmis

[COLOR="#0000FF"]'Routine d'affichage ----------------[/COLOR]
Transmis:
	bintoascii w0,b16,b16,b17,b18,b19  [COLOR="#008000"] 'b16 est réutilisé pour le chiffre des 10000 non utilisé[/COLOR]
	SERTXD (b16,b17,b18,b19)
return
 

BESQUEUT

Senior Member
Ou bien j'ai raté un épisode,
ou bien il ne sert à rien de mémoriser toutes ces mesures...
Code:
readtemp12 w0,C.0 : gosub Transmis
readtemp12 w0,C.1 : gosub Transmis
readtemp12 w0,C.2 : gosub Transmis
.................
readtemp12 w0,C.7 : gosub Transmis
 

'Routine d'affichage ----------------
Transmis:
	bintoascii w0,b16,b16,b17,b18,b19   'b16 est réutilisé pour le chiffre des 10000 non utilisé
	SERTXD (b16,b17,b18,b19)
return
Petite remarque sur la réutilisation de b16 : ça suppose que les variables sont affectées par BinToASCII de la gauche vers la droite dans cet ordre...
Je suppose que c'est vrai, et qu'il n'y a donc aucun problème,
mais dans le cas général, il vaut mieux être prudent avec ce genre de conditions non spécifiées...
Par exemple, une nouvelle version du Firmware ou un autre Picaxe pourrait fonctionner différemment.
 

BESQUEUT

Senior Member
On peut supposer tout de même que ces mesures servent à autre chose qu'à faire de l'affichage !
Il n'est pas dit non plus que ce soit de l'affichage : c'est peut être un transfert vers un autre équipement ou un ordinateur chargé de faire le traitement, ce qui expliquerait la rigueur du formatage.

Mais là, on rêve... laissons à Sphéris le soin de préciser (ou pas) ses besoins...
 

spheris

Senior Member
Merci pour vos réponses.
En fait j'envoi une chaine de caractères séparés par des point virgules.
Je la réceptionne de l'autre coté par un PC en série et effectue la conversion en degrés celsius derrière pour un simple affichage toute les 30 secondes.
J'ai malgrè tout pas mal de problèmes car en usb je ne reçois pas toute la chaine complète du premier coup.
ce qui me pousse à utiliser un formatage précis et compter les caractères. De ce fait une simple condition à la réception, me donnera toute la chaine complète avec toutes mes valeurs.
 
Last edited:

PieM

Senior Member
En fait j'envoi une chaine de caractères séparés par des point virgules.
Je la réceptionne de l'autre coté par un PC en série et effectue la conversion en degrés celsius derrière pour un simple affichage toute les 30 secondes.
Alors il ne sert à rien de passer par un bintoascii si ce n'est pas pour de l'affichage.!

une valeur w0 (0 à 65535) est formée de b1 (MSB) et de b0 (LSB)
il vous suffit de transmettre les valeurs de b0 et b1
à l'arrivée vous récupérez votre valeur w0 en calculant b1*256 + b0.

Code:
readtemp12 w0,C.0
readtemp12 w1,C.1
readtemp12 w2,C.2
.................
readtemp12 w7,C.7'(utilise b14 et b15)
 

'traiter chaque valeur par un changement de variable
gosub transmis
w0 = w1 : gosub transmis  'on réutilise w0
w0 = w2 : gosub transmis
.....................
w0 = w7 : gosub transmis

'Routine d'affichage ----------------
Transmis:
	SERTXD (#b1,";",#b0)
return
 

MGU

Senior Member
Alors il ne sert à rien de passer par un bintoascii si ce n'est pas pour de l'affichage.!

une valeur w0 (0 à 65535) est formée de b1 (MSB) et de b0 (LSB)
il vous suffit de transmettre les valeurs de b0 et b1
à l'arrivée vous récupérez votre valeur w0 en calculant b1*256 + b0.
Je crois bien que dans ce cas, il n'y a même rien à calculer.

MM
 

spheris

Senior Member
Merci pour ces précisions.
Je comprends maintenant pourquoi mon système ne marchait pas.
Je recevais une valeur de wo (exemple 130) et la divisais par 20 à l'aide du PC et lisais 6,5°c.
 
Top