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

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

#11 Message par paulfjujo » jeu. 29 juin 2017 20:40 lien vers la Data-Sheet : Cliquez ici

tu ne montres pas tout ton code ...
dans mes tests: 16F1847 Maitre et 16F1847 Esclave
voir le post :
viewtopic.php?f=10&t=243

l'esclave attend le status de fin

Code : Tout sélectionner

 
    if 
(ucI2CRegistersStatus[1] == _I2C_STATUS_END)
          {
          
          UART1_Write_CText
("Lect.reg.MAITRE-> #0,#1 Ecr.somme->#2 ");
          ucI2CRegisters[2] = ucI2CRegisters[0] + ucI2CRegisters[1];
          ByteToStr( ucI2CRegisters[2],CRam1);
          UART1_Write_Text(CRam1);


cet etat est issus du registre I2C1 SSP1STAT
qui va prendre des valeurs successive en fonction de l'encours d''echange entre le maitre et l'esclave.
Aide toi, le ciel ou FantasPic t'aidera

Programme I2C PIC
ditame
Débutant
Débutant
Messages : 32
Enregistré en : avril 2017

#12 Message par ditame » ven. 30 juin 2017 10:19 lien vers la Data-Sheet : Cliquez ici

Bonjour, J'ai pourtant partagé tout mon code. J'avais déjà regardé le liens que tu as mis mais il reconnait pas les registres que tu utilises.

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

#13 Message par paulfjujo » ven. 30 juin 2017 15:15 lien vers la Data-Sheet : Cliquez ici

ton init n'est que le sommet de l'iceberg !

Code : Tout sélectionner


void I2C_Slave_Init
() {

  RA5PPS = 0b10001;
  RA4PPS = 0b10000;
  
  SSP1STAT
=0b11000100;
  SSP1CON1=0b10100110;
  SSP1CON2=0b10000000;
  SSP1CON3=0b00000000;
  SSP1ADD=0b00010100;
  
}


il faut aussi tout le code contenu dans
PIC16F_I2C_SlaveFunctions_170602.c
qui definit justement les fonctions d'echange entre Maitre et esclave


extrait particulier où on voit que c'est l'etat de SSP1STAT qui definit où en est l'etat de l'echange :

Code : Tout sélectionner


void ManageI2C1Bus
()
{
    if (SSP1STAT.R_NOT_W == _I2C_WRITE) //The W/R bit (0) indicate a write
    {
        // This indicates that the master wants to write some data
        // (address or data) to the slave
        if (SSP1STAT.D_NOT_A == _I2C_ADDRESS) //The last received byte was an address
        {
            // State 1: I2C write operation, last byte was an address byte
            // SSPSTAT bits: S=1, D/A=0, R/W=0, BF=1
            cI2CAddress = SSP1BUF;
            SSP1STAT.BF = 0;                    // Reset flag Buffer-Full
        }
        else //The last received byte was data
        {
            // State 2: I2C write operation, last byte was a data byte
            // SSPSTAT bits: S=1, D/A=1, R/W=1, BF=1
            cI2CData = SSP1BUF;                    // Read data from SSPBUF
            //SSPSTAT.BF = 0;                    // Reset flag Buffer-Full
            ParseI2CInput(cI2CData);
        }
    }
  .. etc ....


tu pourrai essayer ce qui suit , en l'adaptant à la syntaxe XC8 !

Code : Tout sélectionner


 while
(1)
  {
     New_Step();
    step_moteur(180);

     if (SSP1STAT.D_NOT_A == _I2C_ADDRESS) //The last received byte was an address
        {
            // State 1: I2C write operation, last byte was an address byte
            // SSPSTAT bits: S=1, D/A=0, R/W=0, BF=1
            cI2CAddress = SSP1BUF;
            SSP1STAT.BF = 0;                    // Reset flag Buffer-Full
            real_steps_counter_256+=2500;
        }
   }




idea !
ou encore plus simplement
Memo de l'etat SSP1STAT dans une variable
juste pour detecter un simple changement d'etat (sans traiter la trame)

Code : Tout sélectionner



unsigned char Old_SSP1STAT
;
  
...........  
  SSP1STAT
=0;
  Old_SSP1STAT=0;
  
  while
(1)
  {
       
    New_Step
();
    step_moteur(180);
     if (SSP1STAT!=Old_SSP1STAT)
        {
        SSP1STAT=0;
     old_SSPSTAT=0;         
      real_steps_counter_256
+=2500;
        }
   }
  ...
           


Attention!!
un autre point important à verfier :
la definition de l'adresse de l'esclave
Attention :
dans le monde Arduino , l'adresse I2C est sur 7 bits
dans le monde PIC l'adresse est sur 8 bits , incluant le bit 0 R/W

exemple, dans mon cas adresse PIC16F1847
definition de l'adresse :

#define _I2C_CHIP_ADDRESS 0x40 //the address I2C sur 8 bits

avec
cI2CAddress = _I2C_CHIP_ADDRESS;
//cI2CAddress = cI2CAddress << 1; //Move address to left one bit
//cI2CAddress.F0 = 0; // This is a write from the master perspective
SSP1ADD = cI2CAddress;
ou plus simplement:
SSP1ADD =_I2C_CHIP_ADDRESS;


nota: proposition non testé, car je n'ai pas ton type de PIC sous la main, ni d'ARduino
ni de Proteus simulator.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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