IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MPLAB Discussion :

Programmation I2C sur PIC24


Sujet :

MPLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Programmation I2C sur PIC24
    Bonsoir à tous,

    Je découvre la communication en I2C sur MPLAB, et j'aimerais lire les données d'un accéléromètre LIS3DH sur un microcontroleur PIC24FJ1024GB610
    Pour cela j'ai téléchargé la librairie I2C pour PIC24 : https://www.microchip.com/forums/m745734.aspx
    Dans cette librairie se trouve une fonction read (détaillée ci-dessous), j'aimerais l'utiliser pour afficher les valeurs (selon les 3 axes x,y,z) d'accélération sur l'écran de ma carte.
    Après avoir consulté la documentation du LIS3DH, son adresse I2C est 0011000, et les données selon l'axe horizontal sont stockées à l'adresse 0x28, sachant qu'en mode "normal" le data output est de 10 bits.

    Je pensais donc appeler la fonction de la sorte :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    I2C1_M_Read(0011000, 0x28, 10, mybuffer);

    De ce que je comprends, les 10 bits en output seront stockés dans ma chaine buffer. Et je pourrai donc ajouter un printf("%d" ,mybuffer) pour lire les données ?
    Je précise que je n'ai pas accès à la carte...

    Merci

    Code C : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    int  I2C1_M_Read(BYTE DevAddr, BYTE SubAddr, int ByteCnt, char *buffer)
    {
    	BYTE SlaveAddr;
    	int retval;
    	int i;
     
    	if(IsI2C1BusDirty)										//Ignore requests until Poll cmd is called to fix err.
    		return I2C_Err_BusDirty;
     
    	if(I2C1_M_Start() != I2C_OK)							//Start
    	{//Failed to open bus
    		SetI2C1BusDirty;
    		return I2C_Err_CommFail;
    	}
     
    	SlaveAddr = (DevAddr << 1) | 0;							//Device Address + Write bit
    	retval = I2C1_M_WriteByte((char)SlaveAddr);
    	if(retval == I2C_Err_NAK)
    	{//Bad Slave Address or I2C slave device stopped responding
    		I2C1_M_Stop();
    		SetI2C1BusDirty;									//Will reset slave device
    		return I2C_Err_BadAddr;
    	}
    	else if(retval<0)
    	{
    		I2C1_M_Stop();
    		SetI2C1BusDirty;
    		return I2C_Err_CommFail;
    	}
     
    	if( I2C1_M_WriteByte((char)SubAddr) != I2C_OK)			//Sub Addr
    	{
    		I2C1_M_Stop();
    		SetI2C1BusDirty;
    		return I2C_Err_CommFail;
    	}
     
    	if( I2C1_M_Restart() != I2C_OK)							//Repeated start - switch to read mode
    	{
    		I2C1_M_Stop();
    		SetI2C1BusDirty;
    		return I2C_Err_CommFail;
    	}
     
    	SlaveAddr = (DevAddr << 1) | 0x01;						//Device Address + Read bit
    	if( I2C1_M_WriteByte((char)SlaveAddr) != I2C_OK)		//Slave Addr
    	{
    		I2C1_M_Stop();
    		SetI2C1BusDirty;
    		return I2C_Err_CommFail;
    	}
    	for(i=0;i<ByteCnt;i++)									//Data
    	{
    		if(i==(ByteCnt-1) )
    		{
    			retval = I2C1_M_ReadByte(I2C_M_NACK);			//NACK on last byte so slave knows this is it
    		}
    		else
    		{
    			retval = I2C1_M_ReadByte(I2C_M_ACK);
    		}
    		if(retval >= 0)
    		{
    			buffer[i] = retval;
    		}
    		else
    		{//Error while reading byte.  Close connection and set error flag.
    			I2C1_M_Stop();
    			SetI2C1BusDirty;
    			return I2C_Err_CommFail;
    		}
    	}
     
    	if(I2C1_M_Stop() != I2C_OK)
    	{//Failed to close bus
    		SetI2C1BusDirty;
    		return I2C_Err_CommFail;
    	}
    	return I2C_OK;												//Success
    }

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    novembre 2006
    Messages
    20 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : novembre 2006
    Messages : 20 269
    Points : 54 595
    Points
    54 595
    Par défaut
    Je ne connais pas cette bibliothèque mais à la lecture du code, il faut passer l'adresse I²C sur 7 bits (comme c'est généralement le cas) :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    I2C1_M_Read(0b001100, 0x28, 10, mybuffer);

    Le code se charge de faire le décalage lecture/écriture :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SlaveAddr = (DevAddr << 1) | 0;							//Device Address + Write bit
     
    SlaveAddr = (DevAddr << 1) | 0x01;						//Device Address + Read bit

    Sinon, pourquoi ne pas plutôt utiliser MCC dans un premier temps ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci c'est noté, j'aimerais mettre un timer, pour que mon accéléromètre se 'réveille' périodiquement et affiche ses données.
    Je devrais pouvoir trouver des fonctions toutes faites sur MCC ? Je vais jeter un coup d'oeil.

    Du coup si dans la fonction read, je remplace le return 0 par un return buffer.
    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mybuffer_xl = I2C1_M_Read(0b001100, 0x28h, 10, mybuffer);	// OUT_X_L
    mybuffer_xh = I2C1_M_Read(0b001100, 0x29h, 10, mybuffer);	// OUT_X_H
    mybuffer_yl = I2C1_M_Read(0b001100, 0x2Ah, 10, mybuffer);	// OUT_Y_L
    mybuffer_yh = I2C1_M_Read(0b001100, 0x2Bh, 10, mybuffer);	// OUT_Y_H
    mybuffer_zl = I2C1_M_Read(0b001100, 0x2Ch, 10, mybuffer);	// OUT_Z_L
    mybuffer_zh = I2C1_M_Read(0b001100, 0x2Dh, 10, mybuffer);	// OUT_Z_H
    Ensuite je concatène les x ensemble etc..., je convertis le binaire en décimal et je peux printf() ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    novembre 2006
    Messages
    20 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : novembre 2006
    Messages : 20 269
    Points : 54 595
    Points
    54 595
    Par défaut
    Citation Envoyé par Maelstro Voir le message
    Du coup si dans la fonction read, je remplace le return 0 par un return buffer.
    Absolument… pas ! La fonction renvoi l'état de la lecture I²C et c'est très bien comme ça. Les valeurs lues sont passées via le dernier argument char *buffer
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    D'accord, je crois comprendre, vu que mybuffer est un pointeur , je peux utiliser le code directement de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    I2C1_M_Read(0b001100, 0x28h, 10, mybuffer_xl);
    I2C1_M_Read(0b001100, 0x28h, 10, mybuffer_xh);
    etc...
    et ensuite manipuler 'mybuffer_xl' etc... pour afficher les données ?

    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    novembre 2006
    Messages
    20 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : novembre 2006
    Messages : 20 269
    Points : 54 595
    Points
    54 595
    Par défaut
    Je pense que tu devrais reprendre les bases du langage C.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je n'en doute pas, je n'ai jamais eu de cours de C... malheureusement je n'ai pas le temps de tout reprendre car mon code pour lire l'accéléromètre doit être terminé aujourd'hui ...
    Donc si vous pouviez me donner quelques indications ça serait très aimable

Discussions similaires

  1. Programmation I2c sur raspberry Pi
    Par Rémi duino dans le forum Raspberry Pi
    Réponses: 5
    Dernier message: 03/04/2019, 18h18
  2. Programme fonctionnant sur Eclipse mais pas avec le jar?
    Par kirik dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 10/02/2004, 14h43
  3. Réponses: 11
    Dernier message: 17/03/2003, 11h56
  4. Lancer un programme, mais sur une autre machine
    Par GOUGOU1 dans le forum Réseau
    Réponses: 12
    Dernier message: 08/12/2002, 21h36

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