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

Signaler
Messages postés
1
Date d'inscription
mardi 20 novembre 2007
Statut
Membre
Dernière intervention
14 janvier 2009
-
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
-
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

Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011

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.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011

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.