[µcontrolleur Microchip] - Stoquage de données series dans une variable

ClacMer2 Messages postés 1 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 14 janvier 2009 - 14 janv. 2009 à 19:58
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Derniè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

2 réponses

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Derniè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;
}

Bonne continuation.

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Derniè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;

Cordialement, uaip.
0
Rejoignez-nous