p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Invité de passage
    Homme Profil pro
    Développeur en informatique industrielle / électronicien
    Inscrit en
    mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en informatique industrielle / électronicien
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2011
    Messages : 4
    Points : 3
    Points
    3

    Par défaut [PIC 18F87J11] 2 char vers 1 int

    Bonjour bonjour ,

    Me voilà parmi vous pour mon premier post. Je me suis inscrit en voyant le sérieux de vos réponses et j'espère que vous saurez encore m'épater ^^.

    Je suis actuellement en stage, et dans le cadre de mon stage, je dois développer une application en langage C sur un PIC18F87J11 (3,3V).

    J'utilise un module SPI distant accéléromètre, gyroscope tri-axe où je vais récupérer les valeurs des différents capteurs régulièrement puis je les range dans un premier tableau d'octets. Seulement, ces valeurs étant sur 16 bits au complément à deux, je me dois de créer une fonction qui regroupe les octets deux à deux (ils sont rangés dans l'ordre) puis de réaliser un formatage en complément à deux tout en sachant que même si le module m'envoie 16 bits, seuls 14 bits sont significatifs de la valeur mesurée. Les deux premiers (MSB) font état des erreurs. Et là, je sèche. Étant nouveau sur les architectures PIC, je n'ai pas encore saisi toutes ces subtilités.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    short int conv_triaxe (unsigned char* valeur)
    {
    	int i=0;
    	int conv[6] = {0, 0, 0, 0, 0, 0};
    	int k=0;
    	char mot1=0;
    	char mot2=0;
    	
    	while (i<=5)
    	{
    		mot1=valeur[k];
    		mot2=valeur[k+1];
    		conv[i]=(mot1<<=8) | mot2;
    		k=k+2;
    		i++;
    	}
    
    	return *conv;
    }
    Et là c'est le drame, j'obtiens des valeurs incohérentes ! Je me demande si ma fonction ne reconvertit pas les variables mot1 et mot2 au format int avant de réaliser la mise dans le tableau et fausse complètement la valeur ? Comme vous pouvez le voir dans ce code, pour le moment, la conversion n'est pas réalisée (procédant par étape et celle-ci ne fonctionnant pas...).

    Quelqu'un saurait-t-il pourquoi ? Aurait-il une idée ?

    Merci d'avance.

  2. #2
    Invité de passage
    Homme Profil pro
    Développeur en informatique industrielle / électronicien
    Inscrit en
    mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en informatique industrielle / électronicien
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2011
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    J'ai trouvé ! En réalité, je décalais mes bits dans le char ce qui équivalait à perdre mes bits ! En bidouillant un peu à l'aide d'un cast, j'obtiens cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    float conv_triaxe (unsigned char* valeur)
    {
    	int i=0;
    	int conv[6] = {0, 0, 0, 0, 0, 0};
    	int k=0;
    	char mot1=0;
    	char mot2=0;
    	float aX, aY, aZ, gX, gY, gZ;
    
    	while (i<=6)
    	{
    		mot1=valeur[k];
    		mot2=valeur[k+1];
    		conv[i]=((int)mot1<<8) | ((int)mot2&0x00FF); // Assemblage des octets
    		k=k+2;
                    i++;
    
            }
    }
    Ce n'est qu'une partie du code, concernant uniquement ce problème, si cela peut en aider certains ! !

    Bonne journée !

  3. #3
    Nouveau Membre du Club
    Profil pro
    Inscrit en
    février 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : février 2010
    Messages : 86
    Points : 31
    Points
    31

    Par défaut ())))))))

    salut

    je pense que normalement ton code sera comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    float conv_triaxe (unsigned char* valeur)
    {
    
    	int conv[6] ;
    	int k=0;
    	int i,mot1;
    	float aX, aY, aZ, gX, gY, gZ;
    
    		for(i = 0;i < 6;i++)
    		{
    		   mot1 = (int) valeur[k];
    		   mot1 << 8;
    		   mot1 = (int) valeur[k+1];
    		   conv[i] = mot1; //Assemblage des octets
    		   k++
    		}
    
    }
    si ça marche pas changé le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mot1 = (int) valeur[k+1];
    par ces deux ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    k++
    mot1 = (int) valeur[k];
    désolé pour la langue

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertion char vers int
    Par barthelv dans le forum C
    Réponses: 8
    Dernier message: 08/10/2011, 21h45
  2. Conversion d'un *(?) char vers int
    Par theclem35 dans le forum Débuter
    Réponses: 3
    Dernier message: 02/06/2011, 14h08
  3. Cast de char vers int
    Par Bernardtapis dans le forum C
    Réponses: 15
    Dernier message: 28/07/2006, 16h58
  4. Réponses: 6
    Dernier message: 07/05/2006, 21h42
  5. Conversion char * vers wchar_t
    Par Zapan dans le forum C++
    Réponses: 4
    Dernier message: 24/02/2005, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo