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

Configuration liaison I2C entre deux PICs !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#11 Message par Jérémy » jeu. 28 janv. 2016 21:39

Dur dur.

J'avance un peu. j'arrive en appuyant sur mon Bouton à l’écran à effectué une tache en reception ; Mais je ne sais pas trop ce que c'est que cette tache.

Voici le programme de reception ( partie utile )Comme vous le voyez je patauge encore avec l'ACSII :D .

Code : Tout sélectionner

// Déclaration des  variables utilisées  -------------------------------------------

char Rx_I2C_Buffer[50];
char P_Variable[32];    // Tableau contenant  les caractéres des 8 variables de 3 chiffres ( 3x8=24) + 6 espaces + 2 terminateur = 32
unsigned short RegistreI2C;
unsigned int Registre, Flag_Data_OK=0, Flag_I2C_OK=0, i=0, Flag_Erreur=0, compteur = 95,Index_Buffer=0;


// Fin des variables----------------------------------------------------------------

// Début Interruption---------------------------------------------------------------
void interrupt (){
   if (PIR1.SSP1IF) // On check le FLAG de l'INT et si elle est autorisée
      {

             RegistreI2C = SSP1BUF;
             //RegistreI2C = I2C1_Rd(0);    // On lit et stock dans le buffer

            if ((RegistreI2C == 'A') ||(RegistreI2C == 65) || (Index_Buffer>=3)) // Si on recoit "CR" ou qu'on dépasse la taille du buffer
               {
                   Flag_I2C_OK = 1;  // On léve le drapeau pour indiqué que le mot est fini
                   Rx_I2C_Buffer[Index_Buffer]=0;  // terminateur de string
                }
               else
                
{
                   Rx_I2C_Buffer[Index_Buffer]= RegistreI2C; // On enregistre la lettre à l'emplacement de l'index dans le buffer
                   Index_Buffer ++ ;                    // On incremente l'index pour la lettre suivante
                 }

        PIR1.SSPIF = 0; // Réarme le flag
       }

}
// Fin Interruption ----------------------------------------------------------------

//##################################################################################
//#########################      PROGRAMME PRINCIPAL       #########################
//##################################################################################
void main() {

    ANSELB = 0x00;            // Configure le PORTB en digital pour le LCD
    ANSELC = 0x00;            // PORTC en digital
    ANSELD = 0x00;            // PORTD en digital
    ANSELE = 0x00;            // PORTD en digital

    TRISB = 0x00;             // PORTB en sortie
    TRISC = 0x00;             // PORTC en sortie
    TRISD = 0xFF;             // PORTD en entrée
    TRISE = 0x00;             // PORTD en sortie


//----- config. interrutpion ------------------------------------------------------
    INTCON.GIE = 1;           // Activation Global des INT
    INTCON.PEIE = 1;          // Active l'INT sur periphérique
    PIE1.RC1IE = 1;           // Active l'INT sur reception EUSART
    PIR1.RC1IF = 0;           // bit=0 --> buffer vide
    PIE1.SSP1IE = 1;          // Active l'INT sur SSP
    PIR1.SSP1IF = 0;          // Flag de l'I2C
//---------------------------------------------------------------------------------

    UART1_Init(9600);          // Initialisation de l'UART
    delay_ms(100);            // Petite pause

    Lcd_Init();               // Initialisation du LCD
    Lcd_Cmd (_LCD_CLEAR);     // On efface l'écran
    Lcd_Cmd (_LCD_CURSOR_OFF);// On arrete le clignotement du curseur
    delay_ms(100);            // Petite pause

    SSPM1_bit = 0x06;
    SSP1ADD = 0x78;
    I2C1_Init(100000);

 //#######################    BOUCLE INFINIE     ####################################
 while (1)
 {
    if (Flag_I2C_OK == 1)             // reception d'un mot dans le buffer
       {
          PORTE.B0 = 1 ;delay_ms(100);PORTE.B0 = 0 ;

          Lcd_Out (2, 7, "I2C=");
          Lcd_Out (2, 11, Rx_I2C_Buffer);   // On l'affiche sur le LCD
          delay_ms(2000);              // Petite pause
          Lcd_Out (2, 7,"         ");  // On l'efface

          Flag_I2C_OK = 0;            // on rearme notre drapeau
          Index_Buffer = 0;            // on raz l'index
        }


J'ai donc après 2 appuis sur le BP, le texte I2C= qui s'affiche avec trois petits triangles rectangles a la suite .

J’en déduis que j'arrive à recevoir des données en I2C, et que je remplis le buffer, je l'affiche car j'arrive a la taille maximal du buffer non ? mais il est remplis pas avec les valeurs attendues
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration liaison I2C entre deux PICs !
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#12 Message par paulfjujo » ven. 29 janv. 2016 18:01

bonsoir,


Je n'ai pas testé ton programme,mais

Code : Tout sélectionner

 if ((RegistreI2C == 'A') ||(RegistreI2C == 65) || (Index_Buffer>=3)) // Si on recoit "CR" ou qu'on dépasse la taille du buffer 


65 ou 'A' c'est pareil
par contre il manque le test du CR

Code : Tout sélectionner

 if ((RegistreI2C == 'A') ||(RegistreI2C == 13) || (Index_Buffer>=3)) // Si on recoit "CR" ou qu'on dépasse la taille du buffer 
Aide toi, le ciel ou FantasPic t'aidera

Configuration liaison I2C entre deux PICs !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#13 Message par Jérémy » ven. 29 janv. 2016 19:42

Oui Paulfjujo, tu as raison .

J'ai fais tellement de test que maintenant j'essaye de verrouiller mes infos , alors j'ai mis 'A' ou 65 car je n'étais pas sur de moi .
Pour le test du CR , je vais ré-essayer car j'ai fais des modifs hier soir .

Je vous tiens au jus.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration liaison I2C entre deux PICs !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#14 Message par Jérémy » ven. 29 janv. 2016 20:39

Quand ça veut pas ben ça veut pas .

Voici le code émission amélioré . Une sous routine permettant d'envoyer proprement une donnée . j'envoie 5 données de suite de la valeur binaire 63 à 68 . donc qui comprends un 65 dedans . A la fin de l'envoi de ces 5 données j'envoie un CR.
durant la fonction je vois bien mon texte "test" qui clignote au rythme des envois . Je pense que de ce cote je suis bon , si la procédure I2C est bien celle-ci .
I2C_start , envoie de l'adresse esclave ici 0x69 . puis envoi d'une donnée , puis I2C_stop .

Code : Tout sélectionner

void Envoi_I2C(unsigned int donnee){

   I2C2_Start();
   I2C2_Wr(0x69);    // adresse de l'eclave
   I2C2_Wr(donnee);
   I2C2_Stop();
}

void Tx_I2C_OnClick() {

     TFT_Set_Font(TFT_defaultFont, CL_YELLOW, FO_HORIZONTAL);
     TFT_Write_Text("TX_I2C", 130, 45);  // On ecrit un mot  sur l'écran pour verifier l'execution de la fonction
     delay_ms(250);
     TFT_Set_Brush(1, CL_BLACK, 0, LEFT_TO_RIGHT, CL_BLACK, CL_WHITE); // On efface le texte par un rectangle noir
     TFT_Rectangle(130,48, 200,60);
     
     I2C2_Init
(100000);
     delay_ms(100);

     for (i=0;i<=5;i++)
         {
          TFT_Write_Text("test ", 130, 45);
          Envoi_I2C(63+i);
          delay_ms(150);
          TFT_Set_Brush(1, CL_BLACK, 0, LEFT_TO_RIGHT, CL_BLACK, CL_WHITE); // On efface le texte par un rectangle noir
          TFT_Rectangle(130,48, 200,60);
          delay_ms(150);

         }

     Envoi_I2C(13);   // Envoi d'un CR

     TFT_Set_Brush(1, CL_BLACK, 0, LEFT_TO_RIGHT, CL_BLACK, CL_WHITE); // On efface le texte par un rectangle noir
     TFT_Rectangle(130,48, 200,60);
     delay_ms(100);
}


Cote reception le point délicat je pense.
Quoi que je fasse , le seul moyen de finir la reception c'est d'arriver à la limite du buffer ; je ne reçois jamais de CRou le 65 . J'ai donc bien mon flag de reception I2C qui se lève ( avec affichage du texte) seulement après l'avoir remplit de 4 lettres . Les lettres sont des symbol triangle rectangle ( angle à 90° en haut a gauche), 4 symbols s'affiche à la place des données envoyées .
Je ne suis pas certain de bien vider mon buffer à la lecture de celui-ci . sinon je ne vois pas trop d'ou ca peut venir . Tout inidque qu'il recoit bien quelques chose mais pas la bonne chose ou alors qu'il l'affiche mal .

Code : Tout sélectionner

/*##################################################################################
Programme de test pour liaison UART-USB sur carte EasyPIC_V7 avec ecran PIC18FJ
Fait par Jérémy sur FantasPic.fr
- Version du "23-01-2016"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC à 8MHZ, Quartz extrene de 8Mhz, PLL désactivée
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
- manuel et schéma de la carte : http://www.mikroe.com/downloads/get/1711/easypic_v7_manual_v104c.pdf
#################################################################################*/

#define BP0 PORTD.B0
#define BP1 PORTD.B1
#define BP6 PORTD.B6
#define BP7 PORTD.B7


// Connections de l'écran LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin connections LCD

// Déclaration des  variables utilisées  -------------------------------------------

char Rx_I2C_Buffer[50];
char Rx_buffer[50];
char P_compteur[7];     // tableau contenant mon compteur de 5 chiffres ( int) + 2 pour le terminateur de string /0
char P_Variable[32];    // Tableau contenant  les caractéres des 8 variables de 3 chiffres ( 3x8=24) + 6 espaces + 2 terminateur = 32
char texte[55]= "1---5----10----15----20----25----30";  // Tablmeua contenant du texte
unsigned short RegistreI2C;
unsigned int Registre, j, Flag_Data_OK=0, Flag_I2C_OK=0, i=0, Flag_Erreur=0, compteur = 95,Index_Buffer=0;
unsigned int var0=100, var1=101,var2=102, var3=103, var4=104, var5=105, var6=106, var7=110;

// Fin des variables----------------------------------------------------------------

// Début Interruption---------------------------------------------------------------
void interrupt (){
   if (PIR1.SSP1IF == 1 ) // On check le FLAG de l'INT et si elle est autorisée
      {
          PIR1.SSP1IF = 0;        // Réarme le flag
          RegistreI2C = SSP1BUF;  // Lecture du buffer qui efface celui-ci
          
       if 
((RegistreI2C == 13) ||(RegistreI2C == 65) || (Index_Buffer>=4) ) // Si on recoit "CR" ou qu'on dépasse la taille du buffer
              {
                 Flag_I2C_OK = 1;  // On léve le drapeau pour indiqué que le mot est fini
                 Rx_I2C_Buffer[Index_Buffer]=0;  // terminateur de string
              }
             else
              
{
                 Rx_I2C_Buffer[Index_Buffer]= RegistreI2C; // On enregistre la lettre à l'emplacement de l'index dans le buffer
                 Index_Buffer ++ ;                    // On incremente l'index pour la lettre suivante
               }
       }


  
}
// Fin Interruption ----------------------------------------------------------------

//##################################################################################
//#########################      PROGRAMME PRINCIPAL       #########################
//##################################################################################
void main() {

    ANSELB = 0x00;            // Configure le PORTB en digital pour le LCD
    ANSELC = 0x00;            // PORTC en digital
    ANSELD = 0x00;            // PORTD en digital
    ANSELE = 0x00;            // PORTD en digital

    TRISB = 0x00;             // PORTB en sortie
    TRISC = 0b00011000;  // PORTC en sortie
    TRISD = 0xFF;             // PORTD en entrée
    TRISE = 0x00;             // PORTD en sortie


//----- config. interrutpion ------------------------------------------------------
    INTCON.GIE = 1;           // Activation Global des INT
    INTCON.PEIE = 1;          // Active l'INT sur periphérique
    PIE1.RC1IE = 1;           // Active l'INT sur reception EUSART
    PIR1.RC1IF = 0;           // bit=0 --> buffer vide
    PIE1.SSP1IE = 1;          // Active l'INT sur SSP
    PIR1.SSP1IF = 0;          // Flag de l'I2C
//---------------------------------------------------------------------------------

    UART1_Init(9600);          // Initialisation de l'UART
    delay_ms(100);            // Petite pause

    Lcd_Init();               // Initialisation du LCD
    Lcd_Cmd (_LCD_CLEAR);     // On efface l'écran
    Lcd_Cmd (_LCD_CURSOR_OFF);// On arrete le clignotement du curseur
    delay_ms(100);            // Petite pause

    SSPM1_bit = 0x06;
    SSP1ADD = 0x69;
    I2C1_Init(100000);


//#######################    BOUCLE INFINIE     ####################################
 while (1)
 {
 
    if 
(Flag_I2C_OK == 1)             // reception d'un mot dans le buffer
       {
          PORTE.B0 = 1 ;delay_ms(100);PORTE.B0 = 0 ; // clignote une led pour verification

          Lcd_Out (2, 7, "I2C=");
          Lcd_Out (2, 11, Rx_I2C_Buffer);   // On affiche le buffer sur le LCD
          delay_ms(2000);              // Petite pause
          Lcd_Out (2, 7,"         ");  // On l'efface

          Flag_I2C_OK = 0;            // on rearme notre drapeau
          Index_Buffer = 0;            // on raz l'index
        }
  }
}



J'ai un doute sur cette ligne . Code trouvé sur la toile

Code : Tout sélectionner

SSPM1_bit = 0x06;   // I2C slave mode 7 bits adresse  
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration liaison I2C entre deux PICs !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#15 Message par Jérémy » sam. 30 janv. 2016 09:25

Bonjour à tous,

Bon j'ai sortis l'analyseur logique avant de baisser les bras ...... .
Je pense avoir un probléme d'envoi car voici ce que j'ai sur la ligne quand j’appuie sur mon bouton "envoi"

Image

On voit 7 trames identiques ! je vous en ai mis qu'une pour zoomer . je ne comprends pas le read from slave 0x34 ? . lecture depuis l'esclave en 0x34 ???? oops
J’écris normalement et je ne lis pas, et en plus à l'adresse 0x69 et non 0x34.
de plus il n'y a pas le CR . j'en déduis que je n'envoie pas les bonnes choses, ou plutôt que ça envoie mal .

Je cherche des infos sur cette vitesse d'initialisation dont il parle dans l'aide mikroC .

Description Initializes I²C with desired clock (refer to device data sheet for correct values in respect with Fosc). Needs to be called before using other functions of I²C Library.


Peut etre que sur le PIC18Fj de l'écran il ne faut pas mettre 100 KHz ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration liaison I2C entre deux PICs !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#16 Message par Jérémy » sam. 30 janv. 2016 13:38

Bon j'ai résolu le problème du Read à la place du Write . il s'agit de l'adresse de l'esclave qui avait un "1" a la fin plutot qu'un "0" . Donc il comprends comme un read.

Je m'oriente vers une erreur d’émission plutôt ! donc de configuration du master. je cherche , je cherche ....

J e reviens surce que j'ai dit ; pëut être a cause de l'accusé de reception qui ne se fait pas en reception .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration liaison I2C entre deux PICs !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#17 Message par Jérémy » sam. 30 janv. 2016 14:56

Je jette l'éponge ca me saoule
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration liaison I2C entre deux PICs !
pic18f4580
Membre
Membre
Messages : 11
Enregistré en : mai 2016

#18 Message par pic18f4580 » mer. 11 mai 2016 19:46

Idem, je n'y arrive pas...

Configuration liaison I2C entre deux PICs !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#19 Message par Jérémy » ven. 13 mai 2016 22:13

Je reprendrais certainement bientôt, car c'est tout de même utile de savoir faire communiquer deux PICs en I2C !

Ca me saoule de ne pas avoir réussis ! Si tu as eu quelques pistes ou vues des erreurs n'hésite pas , à partager, ça pourrait toujours aider à trouver la solution
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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