[Programmation] PIC 18F et communication I2C
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

PIC 18F et communication I2C



  1. #1
    invite7109501a

    PIC 18F et communication I2C


    ------

    Bonsoir tout le monde voila , dans le cadre d'un projet a l’université je dois paramétrer un pic 18f46k22 en master I2C afin de réguler la température , hygrométrie , pression et afficher sur un LCD déporté , je viens vers vous après plus de 4 mois d’échec , donc je suis bien imprégné de la doc , de l'I2C , toussa toussa malgré tout rien ne fonctionne , pour être plus précis je fait clignoter une led qui me permet de voir que mon programme tourne bien , mais lorsque j'observe a l' oscilloscope il ne se passe rien les lignes SCL et SDA sont a 5 V mais c'est le calme plat... parlons de câblage j’utilise un quartz de 20 mhz , les sorties scl et sda sont relier en pull-up au 5v avec des résistances de 1K , j'ai une led sur le port E1. J'ai fait deux codes différent le premier avec la librairie i2c fournit par c18 ( je me suis dit que quelqu’un connait peut être ) l'autre "en manuelle" avec la doc...les deux ne donnent rien ...


    voici le celui avec la lib
    Code:
    #include <delays.h>
    #include <i2c.h>
    #include <p18f46k22.h>
    
    void main()
    {
    unsigned char addr = 0x12 ;
    TRISD = 0b00000011; 
    TRISE = 0b00000000;
    OpenI2C2(MASTER, SLEW_ON);    SSP2ADD = 12; // horloge = 20Mhz  => 400 Kbit/s
    IdleI2C2(); // verification bus libre 
    StartI2C2();  //startx 
    WriteI2C2(addr<<1); // adresse decaler vers la gauche (r/w = 0 )
    //AckI2C2();  // attente ack 
    WriteI2C2(0x18);   //valeur 
     
    StopI2C2(); // stop 
    
    	while(1)
    	{
        PORTEbits.RE1 = 1 ;
        Delay10KTCYx(250);// 500 ms
    	Delay10KTCYx(250);// 500 ms
    
        PORTEbits.RE1 = 0 ;
        Delay10KTCYx(250);// 500 ms 
    	Delay10KTCYx(250);// 500 ms
    
    
    	}

    le deuxieme :


    Code:
    #include <delays.h>
    
    #include <p18f46k22.h>
    
    void main()
    {
    unsigned char addr = 0x12 ;
    addr = addr<<1 ; // adresse sur 7 bits + bit R/W
    TRISD = 0b00000011; 
    TRISE = 0b00000000;
    SSP2STATbits.SMP = 0 ; //slew control 400 kb/s
    SSP2STATbits.CKE = 0 ; // compatibilité i2c 
    SSP2ADD = 12 ; // vitesse 400 kb/s
    SSP2CON1bits.SSPEN = 1 ; // module mssp activé
    SSP2CON1bits.SSPM = 1000 ;//mode master
    /////////////////////////////////////////////////////////////
    
    //tentative de communication 
    SSP2CON2bits.SEN = 1 ; // condition de start
    while(SSP2CON2bits.SEN); // verifie que la condition de start a bie eu lieu ( SEN est remis a zero par le hardware ) 
    
    
    SSP2BUF = addr ; // on place le une donnée dans le registe SSPxBUF ce qui lance automatiquement l'emmission ( ici l'adrrese ) 
    while(SSP2STATbits.R/W); // on attend la fin de l'emmission 
    
    SSP2BUF = 250 ; // on place le une donnée dans le registe SSPxBUF ce qui lance automatiquement l'emmission 
    while(SSP2STATbits.R/W); // on attend la fin de l'emmission 
    
    SSP2CON2bits.PEN = 1 ; // condition de stop
    while(SSP2CON2bits.PEN); // verifie que la condition de start a bie eu lieu ( PEN est remis a zero par le hardware ) 
    
    
    
    
    
    
    
    	while(1)
    	{
        PORTEbits.RE1 = 1 ;
        Delay10KTCYx(250);// 500 ms
    	Delay10KTCYx(250);// 500 ms
    
        PORTEbits.RE1 = 0 ;
        Delay10KTCYx(250);// 500 ms 
    	Delay10KTCYx(250);// 500 ms
    
    
    	}
    
    
    
    
    }

    donc si quelqu'un est un pro en PIC qu'il se montre ^^
    Personnellement je programme quasiment que sur des Atmel ou Arduino ou Raspberry , j'ai d'ailleurs fini ce projet avec une arduino pour m'assurer quelques points... et je n'ai eu aucun souci avec l'i2c... , mais mon tuteur est branché PIC et il s'en fou de Arduino , Atmel et tout le tralala enfaite j'ai compris qu'il veut que je fasse ça sur pic pour récupéré mon code et l'utiliser dans ses petites affaires ^^ .

    bon WE a tous et merci .

    -----

  2. #2
    invite03481543

    Re : PIC 18F et communication I2C

    En fait tu vois ton prof à raison d'insister et qu'il se foute d'arduino me suggère que c'est plutôt un bon prof.
    Sur Arduino ça fonctionne et pas sur µC, tu m'étonnes.
    Dès qu'il faut comprendre comment ça fonctionne ça devient forcément plus compliqué.

    Pour pouvoir t'aider il faut que tu m'indiques sur quels ports sont branchés SCL et SDA, j'ai pas envie de chercher la doc du PIC.
    Connaitre ton compilateur serait également un plus.
    Il faut aussi que tu apprennes à commenter tes codes avec des informations utiles, l'organisation c'est la base en développement et participe au succès.

  3. #3
    invite03481543

    Re : PIC 18F et communication I2C

    Faire un décalage tel que tu l'écris:

    Code:
    WriteI2C2(addr<<1); // adresse decaler vers la gauche (r/w = 0)
    n'est pas correct.
    Par exemple si ton adresse de base est 0x12 (0001 0010)b et que tu décales à gauche de 1 elle vaudra (0010 0100)b soit 0x24...
    Je doute fort que ça fonctionne comme tu le souhaites.

    Pour éviter toute confusion écris plutôt:

    Code:
    #define I2C_addr_R   0x12   // adresse en lecture
    #define I2C_adrr_W   0x11  // adresse en écriture
    et ensuite tu utilises avec

    Code:
     WriteI2C2(I2C_addr_W);
    Pour vérifier avec ton oscillo, je te conseille d'envoyer une commande I2C en boucle ce sera plus commode à visualiser que tu as bien du trafic sur ton bus.

  4. #4
    invite7109501a

    Re : PIC 18F et communication I2C

    Bonjour et merci de m'avoir lu alors les pin scl et sda sont sur 19 et 20 , le compilateurs que j'utilise est c18 ( j'en connais pas d'autres et je débute coter pic ) , je vais utiliser les
    Code:
    #define
    pour gérer mes adresses , c'est entendu
    vu que c'est le week end je n'ai pas accès aux oscilloscope pour le moment .
    je vois que tu a donner un exemple qui utilise la lib i2c.h ( fourni avec c18) as tu déjà utilisé cette lib ? ça fonctionne ? vraiment ?

    autre petite question , sur les "configurations bits " (je suis sous mplab ) est t'il possible que ce soit ca mon problème ? car j'en ai régler quelques uns ( le watchdog est désactivé , j'ai réglé oscillateur sur " HS high power > 16 mhz " vu que j'utilise un quartz a 20 mhz) , la PLL est désactivé et c'est tout ce que j'ai laisser par défaut le reste car je ne sais pas trop ce que sais. Il faut dire que passer de Arduino a PIC 18f46k22 c'est un peu un traumatisme je suis convaincu , que le pic que j'utilise offre beaucoup de possibilité surement plus qu'une bête arduino j’espère juste pouvoir m'en sortir meme sans tout savoir dessus ... je vais refaire mon code que je posterai un peu plus tard bonne journée

  5. A voir en vidéo sur Futura
  6. #5
    invite03481543

    Re : PIC 18F et communication I2C

    Heu non, je n'utilise pas C18, mais MikroC, le C ANSI en général.
    De ce que je peux lire dans tes 2 codes me fait dire que la raison que je t'ai expliqué plus haut devrait être la bonne cause de tes malheurs.
    Utilise ton scope, il sera toujours ton meilleur ami en pareil circonstance pour déboguer.
    Et ajoute toujours une led qui te sera utile pour savoir si tu accèdes à une fonction ou pas.
    Bon courage.

  7. #6
    invite03481543

    Re : PIC 18F et communication I2C

    Quand je demandais les pin affectées à SCL et SDA je ne demandais pas les numéros de pattes mais les numéro des ports (RD0 et RD1 en l'occurrence j'ai depuis regardé).
    Je n'ai pas l'intention de monter une maquette.

  8. #7
    paulfjujo

    Re : PIC 18F et communication I2C

    bonjour,

    si cela peut t'inspirer:
    un exemple de commande en I2C d'un RTD DS1307 et un expander MCP23017
    avec un 18F26K22 MPLAB C18
    adapter les pin SCL et SDA en consequence

    18f26k22_I2C_MCP23017_DS1307.zip


    Sequence d'init I2C et test presence device sur le BUS
    ici un LCD I2C


    Code:
     // Initialise PIC18F26K22 mode Hardware I2C Master avc RC3 & RC4
       CloseI2C();    
       addr=PCF8574_ADDR;               // 4E pour le LCD
       // modulo I2C a 100KHz
       OpenI2C(MASTER, SLEW_OFF);
       SSPADD = 24 ;  // at 10Mhz et  49 at 20MHz;
       IdleI2C();
       StartI2C();
       
       donnee = SSPBUF;        // clear buffer 
       do
       {
       status = WriteI2C( addr);    //write the address of slave
       if(status == -1)             //check if collision happened
       {
        donnee = SSPBUF;            //empty the buffer,
        SSPCON1bits.WCOL=0;     // clear the collision status bit
        }
        j++;
       }
       while((status!=0)&& (j<100));        //write untill successful communication
       if (j<100)
        k=fprintf(_H_USART,"Init PCF8574 correcte Adresse=%02X j=%3d\r",addr,j); 
         else
        k=fprintf(_H_USART,"PB adressage %02X, Init I2C INcorrecte Status=%3d  j=%5d\r",addr,status,j);
      CRLF();
    Dernière modification par paulfjujo ; 14/12/2015 à 10h40.

  9. #8
    invite7109501a

    Re : PIC 18F et communication I2C

    merci pour vos réponses je fais des essai demain je posterai mon code . bonne soirée

Discussions similaires

  1. Communication RS 485
    Par inviteb5a95b47 dans le forum Électronique
    Réponses: 25
    Dernier message: 06/08/2015, 22h22
  2. Power Line communication sur une ligne DC. Communication CAN
    Par invitee2723b34 dans le forum Électronique
    Réponses: 3
    Dernier message: 21/02/2012, 11h28
  3. communication USB PIC 18F
    Par invite2923c468 dans le forum Électronique
    Réponses: 5
    Dernier message: 15/12/2010, 19h32
  4. BTS Communication
    Par invite83f4eae0 dans le forum Orientation après le BAC
    Réponses: 1
    Dernier message: 14/06/2010, 13h29
  5. communication can pic C
    Par inviteb8e69e81 dans le forum Électronique
    Réponses: 1
    Dernier message: 23/02/2006, 13h59
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...