Bonjour tout le monde,
Me revoià à soliciter votre aide.
J'ai un projet à réaliser en ce moment, et je suis face à un paradoxe.
Mon problême est très simple je dois commander des cervo moteurs.
Pour sa j'ai un PIC16F877 qui fonctionne en Maitre et qui vient commander un PIC16F690 qui lui ne commande que les cervo moteur et il es en esclave.
J'utilise une routine I²C qui fonctionne bien sur la plaque test avec des esclaves I²C.
Hors la le problême c'est que quand jenvoie la commande en I²C les moteurs ne tourne pas dans le bon sens donc j'en déduit que la valeur envoyé est erroné
Cependant le cahier des charges m'interdit de bidouillé les programme des cervo moteur ar cela sort du cadre de l'étude de mon projet et à était d'ailleurs confié à quelqu'un d'autres.
Tout ce que je peux vous donner, c'est ma routine I²C pour voir si toute fois il n'y a pas d'erreurs et puis la séquence d'envoie des donnée pour envoyéune commande
Je ne vous demande pas de résoudre mon problème, je veux trouver par moi même mais si quelqu'un pouvais me mettre sur la voix sa serai sympa
Ci joint
La routine I²C
La commandes des moteurs/****************************** ****************************** ******************************/
#define STAT_RW SSPSTAT.2
/****************************** ****************************** ******************************/
void I2C_Init(void) //Initialisation du Bus I²C
{
TRISC.3 = 1; // SCL et SDA pins en entrée
TRISC.4 = 1;
SSPSTAT = 0b10000000; //SMP[7] Bit permattant d'activer les filtre
//pour le fréquence 0 = aucun filtre
//donc fréquence à 100KHZ.
//CKE[6] Bit permettant d'assuré la compatibilité des
//niveaux (1 = SMBUS ; 0 = I²C)
SSPCON = 0b00111000; // SSPEN[5] : Module I²C en service
// CKP[4] : Horloge SCL en service
// SSPM[3..0]: Mode Maître
SSPCON2 = 0x00; //Mise à zero de tout les flags
SSPADD = 49; // Fréquence de l'horloge à 100 KHz
}
/****************************** ****************************** ******************************/
void Idle_I2C( void ) //Procèdure d'attente
{
// while ( ACKEN );
// while ( RCEN );
// while ( RSEN );
// while ( SEN );
// while ( PEN);
while ((SSPCON2 & 0x1F) || STAT_RW ); //IDLE = 0 et pas d'écriture
}
/****************************** ****************************** ******************************/
void data_sent(char data) //Procèdure d'envoie d'une donnée ou d'une adresse
{
Idle_I2C();
WCOL = 0; //Detection de collision
do
{
SSPBUF = data; //Lance la transmission de l'adresse
// while(ACKSTAT); //Attent que l'esclave envoie la confirmation de reception
}while ( WCOL || ACKSTAT );
CKP = 1;
}
/****************************** ****************************** ******************************/
void data_read()
{
} //A voir
/****************************** ****************************** ******************************/
void I2C_start( void ) //Procèdure de start du bus I²C
{
Idle_I2C();
SEN=1;
}
/****************************** ****************************** ******************************/
void I2C_RepStart() //Procèdure de Repeat Start
{
Idle_I2C();
RSEN=1;
}
/****************************** ****************************** ******************************/
void I2C_stop() //Procèdure de Stop du bus I²C
{
Idle_I2C();
PEN=1;
}
/****************************** ****************************** ******************************/
En vous remerciant d'avancevoid avance_robot ( void )
{
I2C_start();
data_sent(0x7E);
data_sent(0x00);
I2C_stop();
}
void recul_robot ( void )
{
I2C_start();
data_sent(0x7E);
data_sent(0x01);
I2C_stop();
}
void gauche_robot ( void )
{
I2C_start();
data_sent(0x7E);
data_sent(0x02);
I2C_stop();
}
void droite_robot ( void )
{
I2C_start();
data_sent(0x7E);
data_sent(0x03);
I2C_stop();
}
void arret_robot ( void )
{
I2C_start();
data_sent(0x7E);
data_sent(0xAA);
I2C_stop();
}
Cordialement
Paulochon
-----