Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Homme Profil pro Alban
    Développeur en informatique industrielle / électronicien
    Inscrit en
    mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme Alban
    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 :
    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 Alban
    Développeur en informatique industrielle / électronicien
    Inscrit en
    mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme Alban
    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 :
    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 omar abdelhak
    Inscrit en
    février 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Nom : omar abdelhak
    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 :
    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 :
    1
    2
    mot1 = (int) valeur[k+1];
    par ces deux ligne
    Code :
    1
    2
    3
    k++
    mot1 = (int) valeur[k];
    désolé pour la langue

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •