Afficheur LCD et commande bcdtoascii

MGU

Senior Member
Bonjour,

Pour information, il y a chez Gotronic un petit afficheur LCD alphanumérique (LCD16209FGH) 2 X 16 caractères, rétroéclairé blanc à moins de 7 Euros qui fonctionne parfaitement avec un Picaxe. Avec la nouvelle série M2, beaucoup de possibilités pour un prix dérisoire.

Pendant les essais, avec un 14M, puis un 14M2, j'ai eu un problème avec la commande bcdtoascii.

Elle semble destinée (d'après la doc) a transformer un nombre Ex 45 en deux caractères ascii "4" et "5".

Ok jusqu'à 9, mais ensuite, au lieu de "1" et "0", arrivent ":" puis ";" jusqu'à "?".

On tourne sur 16 caractères au lieu de 10. Il faut donc redécouper "à la main".

Peut-on utiliser cette commande pour afficher des chiffres, sinon, comment faire le plus simplement?

H.S. J'ai lu qu'il y avait une traduction en français (?), merci au traducteur, j'aimerais avoir le lien pour l'ajouter dans mon blog sur les Picaxes.

Merci

MM
 

fuse

Senior Member
Bonjour,
En BCD, les nombres sont représentés en chiffres décimaux et chacun de ces chiffres est codé sur quatre bits. En utilisant le BCD, la manipulation des données numériques est simplifiée en traitant chaque chiffre dans un seul sous-circuit.
Le fonctionnement est le suivant : chaque nombre (variable) est décomposé en chiffre de 4 bits, par exemple pour afficher 47, on décompose 4 en base 2 soit 0100 et on décompose 7 en base 2 soit 0111 ainsi le nombre 47 est codé en BCD sous la forme 0100.0111
Or 01000111(2)= 71(10) Ce qui indique que le nombre BCD 47 qui n'est pas converti donnera une variable de valeur 71.

Imaginons une variable contenant 47
La commande
bcdtoascii variable, b0,b1
permet de positionner 4 en b0 et 7 en b1 sinon l'affichage indique 71


Ce code BCD est utilisé par le module ''temps réel'' DS1307 pour stocker les informations temporelles...
Ce code est plus gourmand en ressource mémoire étant donné qu'un octet de 8 bits codé en BCD peux contenir un nombre de 00 à 99 alors qu'un octet (normal) peux contenir un nombre de 0 à 255...

Au dela de 99 il faut rajouter un octet qui permet donc de compter jusqu'à 9999... (au lieu de 65535 pour 2 octets)etc...
Après 1001 en base 2 (donc 9 en décimal), il y a 1010 (donc 10 en décimal) provoquant l'affichage du '':''

J'espère que cela éclairci vos interrogations.
Cordialement
 

MGU

Senior Member
Bonjour fuse

Merci pour la réponse.
Ce n'est pas le coté "DCB" qui me pose le plus de problème, mais le coté "ascii".

Je reviens sur mon explication:

Dans : bcdtoascii b1,b2,b3

b1 est un nombre de 0 à 99. b2 la valeur ascii des dizaines, b3 la valeur ascii des unités.

En simulation, comme en réalité,

Pour b1=9, on trouve bien b2=$30 (le code ascii de "0" ), b3=$39 (code ascii de "9")

Mais pour b1=10, on trouve b2=$30 (toujours "0") et b3=$3A (code de ":"). C'est là, mon problème.

Je m'attendais à avoir les codes b2= $31 etb3= $30 à envoyer directement à l'afficheur (trop facile!)

Mais on affiche bien [ 0 : ]

Où est l'erreur?

Merci
 

westaust55

Moderator
Oui je lis votre explication et confirme cela dans le rédacteur de programmation, sous la simulation pour beaucoup/tous les modèles de PICAXE le BCDTOASCII a une erreur avec les valeurs 10 de BCD et plus grand. J'ai essayé également avec 20M2, 20X2 et 28/40X2 en mode de simulaiton. Ceci peut être rapporté à Rev Ed.


EDIT:
J'également ai maintenant examiné avec quelques morceaux réels et vois les mêmes résultats. J'ai signalé un message sur le forum anglais pour Rev Ed pour étudier.
 
Last edited:

MGU

Senior Member
bonjour Westaus55,

Il y aurait donc un problème avec "bcdtoascii".
La documentation sur cette commande est en effet assez claire, et le résultat différent.

Si c'est confirmé, j'espère qu'il y aura une modification. Cette commande semblait vraiment pratique pour les afficheurs.

Avant de partir, si vous êtes intéressé par des applications Picaxe, je vous invite sur ce blog (toutes les critiques sont les bienvenues):

http://electromag1.over-blog.com

Cordialement,

MM
 

fuse

Senior Member
Bonjour MGU,
La visite de ton blog indique que vous êtes loin d'être un ''newbie''... La réponse que j'ai fourni est standard mais ne répondait pas à votre interrogation...
Comme Westaust55, je constate aussi une mauvaise gestion de la commande bcdtoascii, j'espère que la prochaine version de PE sera mise à jour.:confused:
Pour le moment, il faudra écrire un sous-programme effectuant cette conversion.
A ce propos je regrette que PE ne gère pas cette possibilité : la création d'une commande personnelle qui pourrait être appelée dans un programme...
Cordialement
 
Last edited:

zebulon

Member
Bonjour à tous,

Je ne suis pas tout a fait d'accord avec vous (mais je n'ai pas la science infuse alors je me trompe peut-être ...)

Code:
symbol calc1 = B0
symbol calc2 = B1
symbol calc3 = B2

let calc1 = %00010000 ' 10 (Hex) = 16 décimal
bcdtoascii calc1, calc2, calc3

stop
et le résultat :

résultat_bcdtoascii.png

Dans l'exemple si dessus, 10 en DCB (en Français), c'est %00010000 (Binaire) ou 16 (décimal) ou 10 (héxadécimal).

A mon avis, dans l'exemple que donne MGU, il indique 10 décimal et non pas en DCB, soit %00001010 ou encore 0x0A (héxadécimal).
Cette valeur 10 (décimal) n'étant pas une valeur DCB correct, il est donc normal que la fonction BCDTOASCII renvoie une valeur inattendue.

Il faudrait plus voir comment cela se fait que l'on appel la fonction BCDTOASCII avec une valeur à convertir qui n'est pas une valeur DCB.

Guillaume
 
Last edited:

westaust55

Moderator
Oui, ceci a été juste clarifié.
Je ne pensais pas correctement et n'ai pas oublié que dans le BCD qui est un cas spécial d'hexadécimal, ce le sewquqnce est
$08, $09, $10, $11, $12,….
avec l'équivalent de décimale
08, 09, 16, 17, 18,….
Les valeurs telles que la décimale 10, 11, 12, 13, 14 et 15 sont inadmissibles dans le système de numération de BCD
 

MGU

Senior Member
Bonjour zebulon,

Je suis d'accord avec ton explication.
Ce que tu décris est effectivement ce que fait cette commande, elle fonctionne en héxadécimal.

Mais le nombre 99 pris en exemple dans la description est-il en décimal ou héxadécimal?
Si ce nombre est décimal, ce que je pensais, la description ne correspond plus au fonctionnement

Si ce nombre est en héxadécimal (d'où le "BCD", mais il faudrait le préciser dans la doc et prendre un autre exemple), la commande est faite pour un usage que j'ignore.

Bon, en attendant, je découpe "à la main".

Michel

MM
 

fuse

Senior Member
Bon, ce n'est donc pas exactement une erreur... Cependant, comme l'indique MGU, l'utilisation de cette fonction permettait de gérer facilement un affichage de 0 à 99 mais réserve quelques surprises...

L'utilisation d'un compteur simple de 0 à 255 sur l'afficheur LCD fonctionne avec la commande bintoascii

Code:
main:
		let b0 = 0
label_1:	bintoascii b0,b8,b9,b10
		serout 1,N2400_4,(254,128,b8,b9,b10)
		pause 500
		let b0 = b0 + 1
		goto label_1
 
Last edited:

westaust55

Moderator
Bonjour zebulon,

Je suis d'accord avec ton explication.
Ce que tu décris est effectivement ce que fait cette commande, elle fonctionne en héxadécimal.

Mais le nombre 99 pris en exemple dans la description est-il en décimal ou héxadécimal?
Si ce nombre est décimal, ce que je pensais, la description ne correspond plus au fonctionnement

Si ce nombre est en héxadécimal (d'où le "BCD", mais il faudrait le préciser dans la doc et prendre un autre exemple), la commande est faite pour un usage que j'ignore.

Bon, en attendant, je découpe "à la main".

Michel

MM
Le format de BCD devrait être considéré comme sous-ensemble d'hexadécimal. Il est nécessaire de traiter les valeurs de BCD en tant qu'hexadécimal pour rechercher la valeur décimale réelle. Par conséquent de votre exemple plus tôt:

b0 = $47 ; BCD $47

tens = b0 / 16 ; au b0 / $10 ==> 4
units = b1 // 16 ; au units = b1 AND $0F ==> 7

Le format de BCD est employé avec quelques morceaux externes comprenant le DS1307 et l'horloge temps réel semblable IC's.

Dans ces cas quand on souhaite montrer la valeur il est très utile extraire chaque chiffre et convertir la commande de BCDTOASCII en code d'ASCII equvalent. Ceci vous sauve devant additionner 48 ($30) à chaque chiffre avant l'envoi à l'affichage à LCD.

Si vous avez des nombres décimaux, tels que peut être le résultat d'une certaine formule de maths ou d'autres données que le format de BCD, alors vous êtes meilleur d'employer la commande de BINTOASCII comme déjà mentionné par le fuse.
 

zebulon

Member
Bonjour,

Comme le dit westaust55, BINTOASCII devrait faire ce que tu désires.

Code:
symbol A1 = B0
symbol A2 = B1
symbol A3 = B2
symbol i = B3

for i = 88 to 105
	bintoascii i, A1, A2, A3
	sertxd(#I,"=>", #A1,"-",#A2,"-",#A3)
next i
qui donne le résultat suivant (dans la simulation :
Code:
'sertxd output - baud 4800,n,8,1
88=>48-56-56
'sertxd output - baud 4800,n,8,1
89=>48-56-57
'sertxd output - baud 4800,n,8,1
90=>48-57-48
'sertxd output - baud 4800,n,8,1
91=>48-57-49
'sertxd output - baud 4800,n,8,1
92=>48-57-50
'sertxd output - baud 4800,n,8,1
93=>48-57-51
'sertxd output - baud 4800,n,8,1
94=>48-57-52
'sertxd output - baud 4800,n,8,1
95=>48-57-53
'sertxd output - baud 4800,n,8,1
96=>48-57-54
'sertxd output - baud 4800,n,8,1
97=>48-57-55
'sertxd output - baud 4800,n,8,1
98=>48-57-56
'sertxd output - baud 4800,n,8,1
99=>48-57-57
'sertxd output - baud 4800,n,8,1
100=>49-48-48
'sertxd output - baud 4800,n,8,1
101=>49-48-49
'sertxd output - baud 4800,n,8,1
102=>49-48-50
'sertxd output - baud 4800,n,8,1
103=>49-48-51
'sertxd output - baud 4800,n,8,1
104=>49-48-52
'sertxd output - baud 4800,n,8,1
105=>49-48-53
Cordialement,
Guillaume
 

MGU

Senior Member
Bonjour,

Je vous remercie de vos réponses
J'ai aussi abandonné bintoascii.

J'ai quand même résolu le "problème":
Une variable "temps" de 0 à 3600 secondes à afficher sous la forme: MM SS

Je fais donc ceci:


Code:
        nmn=temps/60		'Min	décomposition du temps total en Minutes
	ndmn=nmn/10+48		'diz de minutes
	nmn=nmn//10+48		'minutes
				
	nsec=temps//60		'secondes restantes		
	dsec=nsec/10+48		'dSec	Dizaines de secondes
	usec=nsec//10+48       'uSec	Unités de secondes
J'envoie ndmn, nmn, nsec et usec sur le LCD et j'obtiens exactement le résultat voulu.
Bientôt une page de plus sur mon blog.

Cordialement
Michel
 

fuse

Senior Member
Bonjour à tous,

L'écriture d'une fonction "maison" est souvent la meilleure chose à faire....
Bravo à MGU pour cette résolution.

Une petite précision pour parler de cette commande : //
La commande modulo // permet d'obtenir le reste d'une division, exemples :
14//2=0 (14=7x2+0)
15/2=1 (15=7x2+1)
26//3=2 (26=8x3+2)
54//8=6 (54=6x8+6)

En effectuant le modulo avec la valeur 10, on peut séparer facilement un nombre en unité, dizaine, centaine etc... Exemples pour la variable 123 :
Code:
unite=variable//10  'donc unite=123//10=3
dizaine=variable/10  'donc dizaine=123/10=12
dizaine=dizaine//10   'donc dizaine =12//10=2
centaine=variable /100  'donc centaine=123/100=1
Cordialement
 
Last edited:

zebulon

Member
...

En effectuant le modulo avec la valeur 10, on peut séparer facilement un nombre en unité, dizaine, centaine etc... Exemples pour la variable 123 :
Code:
unite=variable//10  'donc unite=123//10=3
dizaine=variable[B][SIZE=5][COLOR="#FF0000"] /[/COLOR][/SIZE][/B]10  'donc dizaine=123/10=12
dizaine=dizaine//10   'donc dizaine =12//10=2
centaine=variable /100  'donc centaine=123/100=1
Cordialement
Un petit slash de trop.:)
A+,
Guillaume
 
Top