Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Problême Communication PIC Maitre Esclave



  1. #1
    Paulochon

    Problême Communication PIC Maitre Esclave


    ------

    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

    /****************************** ****************************** ******************************/
    #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;
    }
    /****************************** ****************************** ******************************/
    La commandes des moteurs

    void 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();
    }
    En vous remerciant d'avance
    Cordialement
    Paulochon

    -----
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  2. Publicité
  3. #2
    invite03481543

    Re : Problême Communication PIC Maitre Esclave

    Citation Envoyé par Paulochon Voir le message
    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.
    C'est servo pas cervo.

    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é
    Si JPL passe par là il va surement t'indiquer de regarder sa signature:

    On ne dit pas "j'ai tord" mais "j'ai tort". Or là j'ai raison... (et non hors là... un modérateur lassé).
    Sinon on va quand même regarder ton problème.

  4. #3
    invite03481543

    Re : Problême Communication PIC Maitre Esclave

    Quelle est la fréquence de ton quartz, 20MHz?

  5. #4
    Paulochon

    Re : Problême Communication PIC Maitre Esclave

    La fréquence de mon Quartz est 20Mhz

    Le problème qui se pose c'est le suivant

    Ma routine fonctionne très bien quand je communique avec un esclave PCF8574A de chez Philips, c'est avec cela d'ailleurs que j'ai fais ma routine.
    Cependant des que je passe sur l'esclave PIC16F690 il 'a pas l'aire de resevoir la bonne donnée car il fais tourné mes moteurs dans le mauvais sens alors que pourtant il ne devrait pas.
    Je trouve sa intriguant car j'ai l'impression qu'il y a un bit de donnée qui traine qui ne devrait pas être là voila.
    Je continu à chercher
    Merci d'anvance pour votre aide

    Cordialement
    Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

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

    Re : Problême Communication PIC Maitre Esclave

    bonjour,
    je ne comprends pas bien la question car un servo ça se positionne en fonction d'une commande d'impulsion .
    si le bras du servo est à droite de la position recherchée il va se deplacer à vers la gauche jusqu'a la position (fonction de la largeur des impultions ) et inversement .
    On ne commade pas un sens de deplacement mais une position sur un servo?
    cordialement
    Alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

  8. #6
    invite03481543

    Re : Problême Communication PIC Maitre Esclave

    data_sent(0x7E);

    est l'adresse de ton PIC esclave en écriture, donc tu dois avoir:

    data_sent(0x7F);

    Lorsque tu lis l'information au niveau du PIC esclave dans le buffer de réception.
    Si tu fais une manipulation avec les bits par masque par exemple il est possible que tu es le LSB inversé si tu laisses 7E au lieu de 7F.

    Il faudrait voir comment est traité la donnée reçu au niveau du µC esclave.
    @+

  9. Publicité
  10. #7
    Paulochon

    Re : Problême Communication PIC Maitre Esclave

    Bonjour tout le monde

    je vous done ci-dessous le code du PIC esclave qui permet de manipuler les moteur

    #pragma chip PIC16F690

    #include "int16CXX.H"

    //////////////////////////////////////////////////////////////////
    // Configuration Word //
    //////////////////////////////////////////////////////////////////

    //#pragma config=0b00000011011100
    //_config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
    #pragma config=0b00000011110001

    #pragma origin 4 // adresse du vecteur d'interruption

    void traitement_commande(char CDE_SERVO);
    char CDE_SERVO;
    char ADD_I2C;
    char TMP1H,TMP1L,TMP2H,TMP2L;

    interrupt timer(void)
    { int_save_registers // sauvegarde de W, STATUS (and PCLATH)

    GIE=0; //désactive les interruptions

    if(!SSPSTAT.2 && SSPSTAT.0) //RW=0 et BF=1
    CDE_SERVO=SSPBUF;
    //else if(SSPSTAT.2 && !SSPSTAT.0) //RW=1 et BF=0
    // {
    // ADD_I2C=SSPBUF;
    // SSPBUF=0x55;
    // SSPCON.4=1; //CKP=1
    // }
    //else
    // {}
    traitement_commande(CDE_SERVO) ;
    PIR1.3=0; //remet le flag SSPIF à 0

    int_restore_registers // restauration W, STATUS (and PCLATH)
    }


    void main(void)
    {
    WDTCON=0b00001011; // Watchdog =1 1/32
    OPTION_REG=0b00001111; //1/256

    TRISC=0b00000000; // port C en sortie

    INTCON=0b11000000; // activation de l'interruption I2C
    PIE1=0b00001000;
    PIE2=0b00000000;

    ANSEL=0x00; // Inhibe le convertisseur A/D LSB
    ANSELH=0x00; // Inhibe le convertisseur A/D MSB

    IOCA=0b00000000;
    // OSCCON=0b01100001; //= 4 Mhz (0b01110001 = 8 Mhz)
    OSCCON=0b00000000;
    OSCTUNE=0b00000000; //réglage de la fréquence +-12%

    TRISB.4=1; //SDA en mode slave configuré en entrée
    TRISB.6=1; //SCL en mode slave configuré en entrée

    SSPCON=0b00111001; // PB Microchip
    SSPMSK=0b11111111; // masque d'addresse

    SSPCON=0b00110110;
    SSPMSK=0b11111111;

    SSPADD=0b01111110; //@=126 ou 127
    SSPSTAT=0b00110000; // Initialisation SSPSTAT
    SSPBUF=0b00000000;

    T1CON =0b00000000; //prescaler=1
    TMR1H = 0x00;
    TMR1L = 0x00;
    // TMP1H=0xFA;
    // TMP1L=0x20;
    // TMP2H=0xFA;
    // TMP2L=0x23;
    TMP1H=0xFC;
    TMP1L=0x17;
    TMP2H=0xF8;
    TMP2L=0x2F;


    CDE_SERVO=0x00;
    PORTC.0=1;

    while (1) //boucle infinie
    {
    GIE=0; // pas d'interruptions possible
    T1CON.0=1;
    PORTC.5=1;
    PORTC.4=0;
    TMR1H = TMP1H;
    TMR1L = TMP1L;
    while(PIR1.0==0);
    PIR1.0=0;
    PORTC.5=0;
    PORTC.4=1;
    TMR1H = TMP2H;
    TMR1L = TMP2L;
    while(PIR1.0==0);
    PIR1.0=0;
    PORTC.5=0;
    PORTC.4=0;
    TMR1H = 0xC1;
    TMR1L = 0x80;
    GIE=1;
    while(PIR1.0==0);
    PIR1.0=0;
    }
    }

    void traitement_commande(char CDE_SERVO)
    {
    clrwdt();
    switch (CDE_SERVO)
    {
    case 0x00: //marche avant 2 x 2ms
    TMP1H=0xF8;
    TMP1L=0x2F;
    TMP2H=0xF8;
    TMP2L=0x2F;
    break;
    case 0x01: //marche arriere 2 x 1ms
    TMP1H=0xFC;
    TMP1L=0x17;
    TMP2H=0xFC;
    TMP2L=0x17;
    break;
    case 0x02: //rotation rapide sens + 1 x 1ms + 1 x 2ms
    TMP1H=0xFC;
    TMP1L=0x17;
    TMP2H=0xF8;
    TMP2L=0x2F;
    break;
    case 0x03: //rotation rapide sens - 1 x 2ms + 1 x 1ms
    TMP1H=0xF8;
    TMP1L=0x2F;
    TMP2H=0xFC;
    TMP2L=0x17;
    break;
    case 0x04: //rotation lente sens + 1 x 1ms + 1 x 1.5ms
    TMP1H=0xFC;
    TMP1L=0x17;
    TMP2H=0xFA;
    TMP2L=0x23;
    break;
    case 0x05: //rotation lente sens - 1 x 2ms + 1 x 1.5ms
    TMP1H=0xF8;
    TMP1L=0x2F;
    TMP2H=0xFA;
    TMP2L=0x23;
    break;
    case 0x06: //rotation lente sens + 1 x 1.5ms + 1 x 1ms
    TMP1H=0xFA;
    TMP1L=0x23;
    TMP2H=0xFC;
    TMP2L=0x17;
    break;
    case 0x07: //rotation lente sens - 1 x 1.5ms + 1 x 2ms
    TMP1H=0xFA;
    TMP1L=0x23;
    TMP2H=0xF8;
    TMP2L=0x2F;
    break;
    case 0xFF: //test marche avant mi vitesse 1 x 1.25 ms + 1 x 1.75 ms
    TMP1H=0xFA;
    TMP1L=0x00;
    TMP2H=0xFA;
    TMP2L=0x43;
    break;
    default: //arret 2 x 1.5ms
    TMP1H=0xFA;
    TMP1L=0x20;
    TMP2H=0xFA;
    TMP2L=0x23;
    break;
    }
    }
    je ne suis pas l'auteur de ce programme car cela sort du cadre de mon
    projet. Je ne dispose que de cela pour pouvoir comprendre le problème qui se pose.

    Cordialement
    Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

Discussions similaires

  1. bascule D MAITRE ESCLAVE
    Par skyjet169 dans le forum Électronique
    Réponses: 1
    Dernier message: 01/05/2008, 11h19
  2. bascule maitre esclave !!!
    Par moho1 dans le forum Électronique
    Réponses: 9
    Dernier message: 08/03/2008, 11h54
  3. Communication RS485 half et full duplex et gestion maitre esclave
    Par bertouf42 dans le forum Électronique
    Réponses: 19
    Dernier message: 06/03/2008, 09h34
  4. PIC18F452 - Maître-esclave I2c
    Par lianoos dans le forum Électronique
    Réponses: 17
    Dernier message: 06/02/2007, 21h18
  5. maitre/esclave
    Par weeman dans le forum Matériel - Hardware
    Réponses: 10
    Dernier message: 28/03/2004, 15h49
Découvrez nos comparatifs produits sur l'informatique et les technologies.