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 ---
- 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 ---
Modérateur : Jérémy
Programme I2C PIC
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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.
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.
Programme I2C PIC
Programme I2C PIC
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
ton init n'est que le sommet de l'iceberg !
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 :
tu pourrai essayer ce qui suit , en l'adaptant à la syntaxe XC8 !
ou encore plus simplement
Memo de l'etat SSP1STAT dans une variable
juste pour detecter un simple changement d'etat (sans traiter la trame)
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.
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;
}
}
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;
}
}
...
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.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 101 invités