conversion simple précision en décimal

PieM

Senior Member
Quand aux 143 et 171, merci à PieM d'expliquer ce qui pose problème ? je ne vois rien d'anormal puisque nous parlons d'un système sur 8 bits ?
Micro_33 donné la réponse : il avait donné ces valeurs en hexa : $143 et $171. :)

La doc indique qu'il faut en principe les 32 bits soit 4 octets de datas précédés de deux octets DLE et id et finalisé par un DLE et un ETX.

Mais comme dans les datas, on peut rencontrer un code identique à DLE, pour le différencier, il semble qu'à l'encodage, on ajoute un DLE supplémentaire qu'il faut enlever au décodage !!

Donc une trame variable avec un mini de 8 octets + autant d'octets que de $10 dans les datas ... :( :confused: :cool:
 

BESQUEUT

Senior Member
C'est celà même, puisque les datas peuvent contenir plusieurs DLE de suite. Donc, la fin de paquet est signalée par un nombre impair de DLE suivi d'un ETX. (le tout avec les bits inversés)
Suis chaud là...
Allez Micro_33, envoie les octets (ceux reçus par le Picaxe) et ton bout de code : ça va le faire !
 

micro_33

New Member
Bon si l'on me prend par les sentiments !!!!!!

Non je n'abandonne pas, mais je vais bucher dans mon coin.

Je ne sais pas par contre faire la fenêtre défilante pour le code !!

De plus la copie à ajouté des espaces dans la ligne SERIN

Les valeurs reçues par le pic :

si je ne met pas de qualifiers (lecture de tous les octets, enfin les 4) $10 $8C $ED $00 au lieu de $10 $8F $AC $07

'29/05/2012__14h 'Lecture des trames Thunderbolt.


#picaxe 08M2 'indique au compilateur le type de PIC
setfreq m8 'permet le 9600

symbol origine = b0 'adresse début mise en mémoire
symbol donnees = b1 'adresse données à récupérer

origine = 10
donnees = 15

init: pause 5000 'tempo init OLED
serout C.2,N2400_8,(254,1) 'effacement message accueil
pause 30

reception:

'exemple de données: 16,140,"ABCDEFGHIJKLMNOBienTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"

bptr = origine 'adresse de stockage
'(16,140) octets "qualifiers" 16=début de trame 140=ID trame
serin [2500,timeout],C.1,N9600_8,($10,$8C),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptr
pause 100

bptr = b0 + b1

serout C.2,N2400_8,(254,1) 'effacement des 2 lignes
serout C.2,N2400_8,(254,130) 'curseur ligne 1
serout C.2,N2400_8,(@bptrinc," ",@bptrinc," ",@bptrinc," ",@bptrinc)

goto reception

timeout:
serout C.2,N2400_8,(254,192) 'curseur ligne 2
serout C.2,N2400_8,("Trame pas vue") 'écriture ligne 2
goto reception
 
Last edited:

BESQUEUT

Senior Member
Je ne sais pas par contre faire la fenêtre défilante pour le code !!
fo juste écrire [ CODE] avant le code
et [ /CODE] juste après.

Code:
#picaxe 08M2 'indique au compilateur le type de PIC 
setfreq m8 'permet le 9600
 
symbol origine = b0 'adresse début mise en mémoire
 symbol donnees = b1 'adresse données à récupérer
 
origine = 10 
donnees = 15
 
init: pause 5000 'tempo init OLED
 serout C.2,N2400_8,(254,1) 'effacement message accueil
 pause 30

 reception:

 'exemple de données: 16,140,"ABCDEFGHIJKLMNOBienTUVWXYZABCDEFGHIJKLMNOP QRSTUVWXYZ"
 
bptr = origine 'adresse de stockage
 '(16,140) octets "qualifiers" 16=début de trame 140=ID trame 
serin [2500,timeout],C.1,N9600_8,($10,$8C),@bptrinc,@bptrinc,@bptrinc, @bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptr inc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@ bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptri nc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@b ptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrin c,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bp trinc,@bptrinc,@bptr
 pause 100

 bptr = b0 + b1

 serout C.2,N2400_8,(254,1) 'effacement des 2 lignes
 serout C.2,N2400_8,(254,130) 'curseur ligne 1
 serout C.2,N2400_8,(@bptrinc," ",@bptrinc," ",@bptrinc," ",@bptrinc) 

goto reception

 timeout:
 serout C.2,N2400_8,(254,192) 'curseur ligne 2 
serout C.2,N2400_8,("Trame pas vue") 'écriture ligne 2
 goto reception
 

PapyJP

Senior Member
Je ne sais pas si BESQUEUT est Petit-boutiste ou Gros-boutiste ( cf l' URL en #38 ) mais je suis sûr qu' il est Jusqu'auboutiste !
Chapeau ..............
 

BESQUEUT

Senior Member
MDR

Je ne sais pas si BESQUEUT est Petit-boutiste ou Gros-boutiste mais je suis sûr qu' il est Jusqu'auboutiste !.
:D

Manque plus que les octets réellement reçus...
Merci ne pas chercher à séparer les en-têtes du contenu des trames : mettre tout ce qui vient...
 

PieM

Senior Member
Donc, la fin de paquet est signalée par un nombre impair de DLE suivi d'un ETX. (le tout avec les bits inversés)
Moi, je le comprends différemment ... Dans toute la trame on doit avoir un nb impair de DLE, après celui de départ.
Si dans la trame il y a un DLE EXT, il est ajouté un DLE comme avant tout DLE data. donc avant EXT, le nombre de DLE est pair, donc le EXT est une data. A la fin, il y aura un DLE + EXT d'où un nb impair de DLE d'où validation du EXT. Ouf !

Ce qui pourrait se formuler par : la fin de paquet est signalée par un ETX à condition que nombre de DLE après le start soit impair.

Bon, sous réserve, en fait suis pas certain de ce que j'avance !!!! :rolleyes:
 

micro_33

New Member
Bonsoir Messieurs

Bottez moi les fesses, ça y est, ça marche, je récupère bien les bonnes valeurs, bêtement une histoire de timing, j'avais pourtant poussé la vitesse à 8 Mhz, mais ce n'était pas suffisant, la capture shiftée de +/- 1 octet .
A 16 Mhz, plus quelques pauses entre les instructions, la lecture des valeurs peu variables est stable et la conversion des valeurs hexa donne la bonne valeur décimale.

Bottez moi encore, ça me fait du bien.
Vraiement désolé du surcroit de travail que je vous ai donné. par contre j'ai beaucoup appris.

Je ne comprenais pas pourquoi des valeurs non nulles de la trame ( 4 ième octet en l'occurence) qui devait faire $07, affichait 0.
Dans une boucle, j'ai fait afficher tous les octets de la trame, et il en manquait donc j'ai pensé au problème de vitesse

J'espère Pesqueut et PieM, que vous n'ètes pas en train de Pi!!! des lignes, au lieu de profiter du soleil.
Je vais pouvoir commencer à mettre bout à bout les lignes qui s'accumulent.
Je n'ai pas fini de vous de soliciter votre aide !!!


Cordialement
JP
 
Last edited:

BESQUEUT

Senior Member
ça marche
en voilà une nouvelle qu'elle est bonne...
plus quelques pauses entre les instructions
Je suis toujours dubidatif quand je lis ce genre de chose... En dehors du temps nécessaire pour que le LCD s'initialise (et encore : il peut faire ça pendant qu'on fait autre chose...) un programme ne devrait pas se synchroniser avec l'émetteur sur la base de "pauses" mais sur les événements reçus. Le risque étant une dérive progressive ou aléatoire (due à un traitement particulier à un moment donné, qui change le timing d'une boucle...) et en conséquence la perte de données.
Dans votre cas, ce n'est sans doute pas bien grave, car si une trame est perdue l'indicateur sera mis à jour à la prochaine trame. Mais c'est quand même une bonne habitude d'avoir un chronogramme fiable.
Par exemple, dans le programme publié, combien vaut le timeout ? Et pourquoi autant de @bptrinc ?
Si c'est censé correspondre au nombre d'octets susceptibles d'être reçus dans une trame, que se passe-t-il si la trame est incomplète ? Supposez-vous que le picaxe ne peut pas être mis en marche au milieu d'une trame ? Si oui, il faut bien viser...
par contre j'ai beaucoup appris.
C'est bien ça l'essentiel !
 

micro_33

New Member
]Bonjour

Merci pour la réponse, ok pour les pauses, vous allez être content, d'avoir rajouté du code, plus aucune pose n'est nécessaire.
Les datas se trouvent en position 22 dans la trame si je ne prend que l'erreur de fréquence, mais comme cela semble bien fonctionner, je pense récupérer sur demande, la température interne en position 34 et même la tension d'asservissement qui renseigne sur le vieillissement de l'oscillateur.
la synchro sur la trame semble parfaite, je ne vois aucune valeur bizzare à l'affichage.
Mais je vais essayé de rajouter la reconnaissance de l'entête + le code de la trame au cas ou l'envie me prendrée d'en récupérée une autre.

Je vous met le bout de code que j'ai fait.

cordialement
JP
Code:
'29/05/2012__14h 'Lecture des trames Thunderbolt.


#picaxe 08M2 				'indique au compilateur le type de PIC
setfreq m16 						'

symbol origine  = b2			'adresse début mise en mémoire
symbol donnees  = b3 
symbol division = w12 			'adresse données à récupérer
symbol Signe    = b5
symbol Entier   = b6
symbol Indice   = b10
symbol Puiss    = w10
symbol Mantisse = w11

origine = 30			'laisse libre jusqu'à w12						
donnees = 22	'attention mettre bonne adresse
					'22 adresse PPB    division par 10 000
					'34 adresse T°C    division par 100  * par 1,0024
					'30 adresse ADC    pas de division   * par 1.05
	if donnees = 22 then
		division = 10000
	else
		division = 1
	end if
		
init: pause 3000 				'tempo init OLED
serout C.2,N2400_16,(254,1) 		'effacement message accueil

'exemple de données:   16,143,172,"azertyuiopqsdfghj20",61,184,"kkkkkk",62,194,"kk",66,43,"kkkkk"

reception:
bptr = origine 				'adresse de stockage
					'(16,140) octets "qualifiers" 16=début de trame 140=ID trame
serin [8500,timeout],C.1,N9600_16,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptr

	bptr = origine+donnees		'adresse contenant le premier byte du nombre recherché		
	b0   = @bptrinc			'byte 1
	b1   = @bptrinc			'byte 2
 
Float_Entier:				'le flottant à convertir est dans W0
	if bit7=0 then
		Signe="+"
	else
		Signe="-"
	endif

	b0   = b0*2 			'shift left
	bit0 = bit15			'on copie le bit de gauche de b1 dans celui de droite de b0
	b0   = 127-b0
	bit15 = 1				'1 implicite à gauche de la mantisse
	
select case b0
	case 0 : Puiss=10000
	case 1 : Puiss=5000
	case 2 : Puiss=25000
	case 3 : Puiss=12500	
	case 4 : Puiss=6250
	case 5 : Puiss=31250
	case 6 : Puiss=15625
	case 7 : Puiss=7813	
	case 8 : Puiss=3906
	case 9 : Puiss=19531
	case 10 :Puiss=9766
	case 11 :Puiss=4883
	case 12 :Puiss=24414
	case 13 :Puiss=12207
	case 14 :Puiss=6103
	case >14 : Puiss=30518
end select

	Mantisse=0
	Mantisse=bit15*Puiss+Mantisse
	Puiss=Puiss/2
	Mantisse=bit14*Puiss+Mantisse
	Puiss=Puiss/2
	Mantisse=bit13*Puiss+Mantisse
	Puiss=Puiss/2
	Mantisse=bit12*Puiss+Mantisse
	Puiss=Puiss/2
	Mantisse=bit11*Puiss+Mantisse
	Puiss=Puiss/2
	Mantisse=bit10*Puiss+Mantisse
	Puiss=Puiss/2
	Mantisse=bit9*Puiss+Mantisse
	Puiss=Puiss/2
	Mantisse=bit8*Puiss+Mantisse
	Mantisse = Mantisse /w12
	
	serout C.2,N2400_16,(254,1) 			'effacement des 2 lignes
	serout C.2,N2400_16,(254,128) 	
	serout C.2,N2400_16, ("Fce = ",Signe,#mantisse," * 10-11")
	'serout C.2,N2400_16, ("Temp = ",#mantisse,$D0,"C")
	'serout C.2,N2400_16, ("Dac = ",Signe,#mantisse,"0 ",$C8,"V")
goto reception

timeout:
serout C.2,N2400_16,(254,192) 			'curseur ligne 2
serout C.2,N2400_16,("Trame pas vue") 		'écriture ligne 2
goto reception
 
Last edited:

BESQUEUT

Senior Member
voir post #44 pour poster du code...
Vous voilà quasiment autonôme !
Juste un petite remarque : la puissance n'est pas systématiquement -11
mais dépends de b0... (voir le 2ième sélect case b0 du post #23)
Attention également : dans le programme, Puiss est une puissance de deux, pas de dix.
Si réellement l'erreur est en 10 puissance -11 le programme ne marche pas !
 
Last edited:

micro_33

New Member
Je me suis permis de simplifier l'affichage, j'ai encore des retouches à faire.
Je ne vais afficher que lorsque c'est à -11 , au delà je mettrai soit un message, soit une indication quelconque, montrant que l'on est hors "norme"

Pour poster du code j'ai bien mis entre "cote" en utilisant l'icone de droite.
 
Last edited:

BESQUEUT

Senior Member
Si l'erreur est plus faible (en valeur absolue) on peut être à -12 ou -13 et ce n'est pas anormal...
Si on est à -10 en puissance de 2, on est dans le même ordre de grandeur en puissance de 10...
Je ne sais pas si c'est techniquement possible, mais il serait intéressant de "perturber" légèrement l'appareil pour lui faire transmettre une erreur plus grande, ce qui vous permettrait de juger du caractère plus ou moins variable de l'information transmise.
A mon sens, pour un dispositif qui affiche un taux d'erreur, c'est l'ordre de grandeur de cette erreur qui importe, avant même sa valeur exacte...
Dans le cas où l'erreur est très petite (inférieure à 2 puissance -11 = 0,00049) vous pouvez afficher zéro, mais en supposant que l'erreur décroisse lentement, c'est un peu bizarre d'afficher
0.00052 0.00051 0.00050 0.00049 puis brutalement 0.00000

Dans le cas où l'erreur est grande (supérieure à 2 puissance -10 = 0,00098) c'est quand même intéressant de savoir si c'est juste limite (0.00099)
ou complètement en vrac ! (0.012 par exemple)

Pour le code, voir post #44 :
Il faut écrire en toutes lettres et avec les crochets la balise
Code:
 avant le code.
 
Last edited:

micro_33

New Member
Bonjour Besqueut

Bon j'ai compris pour l'insersion de code, j'avais mal lu (pas lu?) et confondu code et cote, pb réglé.

Grace à la vitesse supplémentaire, 16 Mhz, le PIC à le temps maintenant de traiter la reconnaissance de l'ID complet soit 3 octets, et si je rajoute des trames, la bonne est bien sélectionnée.

Je crois avoir trouvé une façon élégante de régler le problème de la gamme unique du bargraph, j'affiche en numérique si la valeur dépasse, ce qui normalement n'arrive qu'au démarrage, à froid.

J'ai commencé à traiter les possibles erreurs de valeurs hors normes, et je peux récupérer d'autres valeurs en les mettant à l'échelle, température et tension du VCO, à afficher sur demmande.

Je ne pensais pas m'en sortir à si bon compte.

Merci pour votre aide.

Le plus ch!!!!! va être la mise en boite.

Cordialement
JP
 

micro_33

New Member
Bonjour à tous.

La fin du projet.
Après avoir inclus le code du décodage dans le 18M2 de l'afficheur, cela m'a permis de supprimer une liaison et le 08M, j'ai opté pour l'affichage sur un LCD 2 lignes sous la forme d'un galva dont l'échelle est de +/- 7 graduations, au-delà de ces valeurs,je remplace l'index par la valeur.

Pour le fun j'aimerai doubler l'étendue des graduations et donc faire des caractères spéciaux, à priori 4 seraient suffisants.

J'ai fouillé, mais pas trouvé de code traitant de cela. Connaissez vous un lien ?

j'ai trouvé l'outil qui permet de dessiner et obtenir les valeurs des caractères spéciaux

Je ne comprends bien qu'avec un exemple ( un vrai singe ), aussi, si ce n'est pas abuser, un bout de code, du stockage des données, à l'expédition vers l'afficheur me dépannerait.

Merci

Cordialement JP
 

PieM

Senior Member
Bonjour,

de quel circuit s'agit-il ? à base d'un Hitachi 44780 ?

Voir Ici

Sinon faire une recherche avec "Bargraph" ; il y a pas mal de codes.
 

micro_33

New Member
Bonjour PieM

Merci de la réponse.

Oui c'est bien le circuit utilisé par l'afficheur OLED ou LCD

j'avais déjà vu ce code, qui malheureusement est un peu éloigné de ce que je cherche, je vais essayer de comprendre la partie génération de caractère.

Merci encore de votre aide

Cordialement JP
 

PieM

Senior Member
Last edited:
Top