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 ---
Forum général sur le langage C !

Modérateur : Jérémy

I2C MCC XC8
phil
Membre
Membre
Messages : 1
Enregistré en : juillet 2020

#1 Message par 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

I2C MCC XC8
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#2 Message par 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)

I2C MCC XC8
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par 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 45 invités