Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Autres EDI > MPLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/05/2011, 11h59   #1
SuperWax
Invité de passage
 
Homme Alban
Développeur en informatique industrielle / électronicien
Inscription : 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.
SuperWax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 15h52   #2
SuperWax
Invité de passage
 
Homme Alban
Développeur en informatique industrielle / électronicien
Inscription : 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
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 !
SuperWax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 04h07   #3
PIC16F877A
Nouveau Membre du Club
 
omar abdelhak
Inscription : février 2010
Messages : 82
Détails du profil
Informations personnelles :
Nom : omar abdelhak
Localisation : Algérie

Informations forums :
Inscription : février 2010
Messages : 82
Points : 30
Points : 30
Envoyer un message via MSN à PIC16F877A Envoyer un message via Yahoo à PIC16F877A Envoyer un message via Skype™ à PIC16F877A
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
PIC16F877A est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h57.


 
 
 
 
Partenaires

Hébergement Web