Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---

I2C MCC XC8

Forum général sur le langage C !

Modérateur : Jérémy

phil
Membre
Membre
Messages : 1
Enregistré en : juillet 2020

I2C MCC XC8

Messagepar phil » lun. 6 juil. 2020 10:59

bonjour, je tente de faire fonctionner un pic 18f26K22 en I2C avec les fonctions proposées par MCC et XC8 en C.
un picserial est en esclave et le Pic en master.
Si j'utilise la commande I2C_Write1ByteRegister(0x40, 0x00, 0x01) ça fonctionne, je reçois bien les valeurs : AD 80 RX 01 RX 02 sur l'esclave
mais lorsque j'utilise I2C_WriteNBytes(0x40, *buffer, 0x03) les mots reçu le serial sont AD 80 RX FD RX FD RX 00
Je précise que j'utilise des 'int' qui sont convertis en "string" voici mes lignes :
integer_value_1 = 31;
integer_value_2 = 32;
integer_value_3 = 33;

sprintf(buffer [0], "%d", integer_value_1);
sprintf(buffer [1], "%d", integer_value_2);
sprintf(buffer [2], "%d", integer_value_3);

I2C_WriteNBytes(0x40, *buffer, 0x03)

Si vous avez une idée, je prends Merci

Avatar de l’utilisateur
Claudius
Passionné
Passionné
Messages : 260
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

I2C MCC XC8

Messagepar Claudius » lun. 6 juil. 2020 17:33

Bonjour,

- Comment est définie la variable buffer ?
- Le code:

Code : Tout sélectionner

integer_value_1 = 31;
integer_value_2 = 32;
integer_value_3 = 33;

sprintf(buffer [0], "%d", integer_value_1);
sprintf(buffer [1], "%d", integer_value_2);
sprintf(buffer [2], "%d", integer_value_3);

I2C_WriteNBytes(0x40, *buffer, 0x03)

ne me parait pas adapté pour envoyer 3 octets qui doivent se suivre en mémoire (sauf erreur de ma part, gros problème de Langage C)

Avatar de l’utilisateur
paulfjujo
Expert
Expert
Messages : 2597
Enregistré en : juillet 2015
Localisation : 01800
Contact :

I2C MCC XC8

Messagepar paulfjujo » mar. 7 juil. 2020 16:11

bonjour,


sur le bus I2C ne transitent des datas qu'au format byte (octet)
il faut donc eviter les entier int 16bits

pourquoi utiliser sprintf ?

Code : Tout sélectionner

#define Byte unsigned char
char buffer[20];

Byte value_1 = 31;
Byte value_2 = 32;
Byte value_3 = 33;

*(
buffer)=value_1;
*(
buffer+1)=value_2;
*(
buffer+2)=value_3;

I2C_WriteNBytes(0x40, buffer, 0x03);

ou plus simplement
buffer
[0]=value_1;
buffer[1]=value_2;
buffer[2]=value_3;
I2C_WriteNBytes(0x40, buffer, 0x03);



:!!: Non testé !


Remarques :
I2C_WriteNBytes n'existe pas sous MikroC
sprintf (MikroC) ne fonctionne pas avec des bytes !, uniquement avec des int
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 119 invités