[µcontrolleur Microchip] - Stoquage de données series dans une variable
ClacMer2
Messages postés1Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention14 janvier 2009
-
14 janv. 2009 à 19:58
uaip
Messages postés1466Date d'inscriptionmardi 20 février 2007StatutMembreDernière intervention 7 février 2011
-
15 janv. 2009 à 00:46
Bonjour,
Voila mon problème, je suis actuellement en train de me pencher sur la liaison rs232, liaison série, et les données y sont envoyées à l'envers, (d'abord le MSB pour finir sur le LSB), je désirerais, sur mon pic, enregistrer un octet entrant dans une variable, mais dans l'ordre (MSB;x;x;x;x;x;x;LSB).
J'urtilise le compilateur CC5x,
Et je ne connais la façon, même si les donnée arrivent dans l'ordre de les stoquée dans un buffer (c'est comme ça qu'on dis? ).
J'avais comme idée :
definir x =8
lire le 1er bit reçu
le mettre dans l'octet de destination au x bit
décrementer x
lire le 2nd bit reçu
le mettre dans l'octet de destination au x bit
Etc...
Si vous pouviez m'éclairer je vous en serais infiniment reconnaisant.
Merci d'avance
uaip
Messages postés1466Date d'inscriptionmardi 20 février 2007StatutMembreDernière intervention 7 février 2011 15 janv. 2009 à 00:43
Salut,
Tu dis : "et les données y sont envoyées à l'envers, (d'abord le MSB pour finir sur le LSB)" Je pense que c'est une erreur d'étourderie de ta part mais c'est le LSB qui est d'abord envoyé.
Si j'ai bien compris, imaginons l'octet entrant comme tel : (LSB) 0100 0100 (MSB)
Et toi tu veux l'enregistrer comme ceci : (MSB) 0010 0010 (LSB).
Prenons un char (type figé, je crois), c'est 1 octet, donc 8 bits.
Ensuite on fait une boucle (x8) pour chaque bit de l'octet, puis on lui applique des masques.
J'explique vite fait l'algorithme et je poste le code C :
- on initialise un octet-résultat à zéro.
- on boucle 8 fois, avec un compteur de 7 à 0 :
- - si un ET logique entre le bit le plus faible et 1 retourne 1, on ajoute la valeur décimale correspondante dans l'octet-résultat à zéro
- - on décale l'octet d'un cran vers la droite
Personnellement je trouve ça très logique, donc je détaille peu, j'ai testé et ça fonctionne sur plusieurs exemples. Si tu veux d'avantages d'explication, n'hésite pas.
Voici le code C. J'ai fait un programme complet, prends uniquement ce qui t'intéresse.
Je précise que ma fonction exposant(); (bien qu'il existe déjà une fonction pow(); dans le header math.h) permet justement de ne pas inclure ce header simplement pour cette fonction.
#include <stdio.h>
int exposant(int nbr,int expo) {
int result=nbr;
for(int i=0;i < (expo-1);i++) result*=nbr;
return result;
}
int main() {
/* Simulation de donnée entrante */
char data=0x44;
/* Donnée à stocker */
char result=0;
/* Inversion */
int a,retenue;
for(a=7;a >= 0;a--) {
if (data&1) result+=exposant(2,a);
data>>=1;
}
/* Affichage sur la sortie standard */
printf("%c\n",result);
return 0;
}
uaip
Messages postés1466Date d'inscriptionmardi 20 février 2007StatutMembreDernière intervention 7 février 2011 15 janv. 2009 à 00:46
Oups... tu risques d'avoir une erreur de compilation si tu es en C.
Remplaces
for(int i=0;i < (expo-1);i++) result*=nbr;
par
int i;
for(i=0;i < (expo-1);i++) result*=nbr;