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

Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?



  1. #1
    Electronic2012

    Post Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?


    ------

    Bonjour,

    Actuellement étudiant en électronique, je souhaite comprendre comment fonctionne le programme ci-dessous, qui interagit avec un PIC16F876 et une boussole HMC6352 grâce au bus I2C et des datasheet du PIC16F876 et du HMC6352 :

    lien de datasheet : PIC16F876: http://ww1.microchip.com/downloads/e...doc/30292c.pdf
    HMC6352: http://www.sparkfun.com/datasheets/C...ts/HMC6352.pdf

    Programme de teste de la boussole HMC6352:



    // test de la boussole

    #include <16F876a.h>
    #device icd=true
    #device adc=10 // A/D sur 10 bits
    #FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
    #use delay(clock=20000000)
    #use i2c(Master,Slow,sda=PIN_C4,scl =PIN_C3)


    void main()
    {
    int8 ack=100;

    unsigned int8 data1, data2;
    unsigned int16 direction;

    setup_timer_2(T2_DIV_BY_1, 255, 1); // timer 2 pour la frequence MLI
    setup_ccp2(CCP_PWM); //ccp1 en pwm



    // on réveille le capteur
    i2c_start();
    ack=i2c_write(0x42); // adresse boussole écriture
    ack=i2c_write(0x57); // commande W : WAKE
    i2c_stop();

    delay_us(200); //attente apres WAKE

    // ecriture dans l'octet Operational Mode Control
    i2c_start();
    ack=i2c_write(0x42);
    ack=i2c_write('G');
    ack=i2c_write(0x74);
    ack=i2c_write(0x52); // Rate:10hz, Set/Reset=on, Continuous Mode
    i2c_stop();

    delay_us(140);

    // ecriture dans l'octet Output Data Mode
    i2c_start();
    ack=i2c_write(0x42);
    ack=i2c_write('G');
    ack=i2c_write(0x4e);
    ack=i2c_write(0x00); // heading mode
    i2c_stop();

    delay_us(140);

    // une commande A : peut être pas nécessaire car Continous Mode
    i2c_start();
    ack=i2c_write(0x42);
    ack=i2c_write('A');
    i2c_stop();

    delay_ms(1000); // tempo nécessaire au capteur (surement trop long)

    do
    {
    // lecture de la boussole (pas besoin de cde 'A' car Continuous Mode)
    i2c_start();
    ack=i2c_write(0x43);
    data1=i2c_read();
    data2=i2c_read(0); // il faut un NACK et pas un ACK!
    i2c_stop();

    direction =((int16)data2 | ((int16)data1 << 8)); // de 0 à 3599
    direction=(direction/4)+50; // de 50 à 949

    set_pwm2_duty(direction); // rapport cyclique sur 10 bits
    delay_ms(100);
    }while(1);
    }


    MERCI d'avance d'avoir prêter attention a mon message, en attendant vos réponses.

    -----

  2. Publicité
  3. #2
    invite03481543

    Re : Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?

    Code:
    // test de la boussole
    
    #include <16F876a.h>  // declaratifs propre au PIC16F876A
    #device icd=true  // In Cicrcuit Debugger actif
    #device adc=10 // module A/D sur 10 bits  // ADC en mode 10 bits actif
    #FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT // bits de config
    #use delay(clock=20000000)  // frequence 20MHz => Tclk=4*Tosc => Tclk=200ns
    #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3) // I2C mode maitre, 100KHz, sda sur pin C4, SCL sur pin C3
    
    
    void main()
    {
    int8 ack=100; // variable locale ack de type entier representee sur 8 bits
    
    unsigned int8 data1, data2; //idem
    unsigned int16 direction; // variable de type entier sur 16 bits
    
    setup_timer_2(T2_DIV_BY_1, 255, 1); // timer 2 pour la frequence MLI
    setup_ccp2(CCP_PWM); //ccp1 en pwm
    
    
    
    // on réveille le capteur 
    i2c_start();  // demarrage de l'I2C
    ack=i2c_write(0x42); // adresse boussole écriture, on adresse le circuit (curieuse maniere de faire...)
    ack=i2c_write(0x57); // commande W : WAKE on envoie la commande WAKE
    i2c_stop(); // on arrete la comm I2C
    
    delay_us(200); //attente apres WAKE
    
    // ecriture dans l'octet Operational Mode Control 
    i2c_start();
    ack=i2c_write(0x42); 
    ack=i2c_write('G'); 
    ack=i2c_write(0x74); 
    ack=i2c_write(0x52); // Rate:10hz, Set/Reset=on, Continuous Mode
    i2c_stop(); 
    
    delay_us(140);
    
    // ecriture dans l'octet Output Data Mode
    i2c_start(); 
    ack=i2c_write(0x42); 
    ack=i2c_write('G'); 
    ack=i2c_write(0x4e); 
    ack=i2c_write(0x00); // heading mode
    i2c_stop();
    
    delay_us(140);
    
    // une commande A : peut être pas nécessaire car Continous Mode
    i2c_start(); 
    ack=i2c_write(0x42); 
    ack=i2c_write('A'); 
    i2c_stop();
    
    delay_ms(1000); // tempo nécessaire au capteur (surement trop long) 
    
    do
    { 
    // lecture de la boussole (pas besoin de cde 'A' car Continuous Mode)
    i2c_start();
    ack=i2c_write(0x43); // doit etre propre au compilateur, ecriture tres curieuse...
    data1=i2c_read(); // On stocke dans data1
    data2=i2c_read(0); // il faut un NACK et pas un ACK!
    i2c_stop();
    
    direction =((int16)data2 | ((int16)data1 << 8)); // de 0 à 3599
    direction=(direction/4)+50; // de 50 à 949 // traitement de la variable direction
    
    set_pwm2_duty(direction); // rapport cyclique sur 10 bits
    delay_ms(100);
    }while(1);
    }
    Dernière modification par HULK28 ; 01/05/2012 à 14h08.

  4. #3
    invite03481543

    Re : Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?

    Tu ne precises pas le compilateur en question mais il ne doit pas etre terrible.
    La variable ack n'est jamais testee, du coup je ne pense pas que ce programme tourne, a moins que le compilateur traite cette variable tout seul, ce qui prouve que c'est vraiment de la daube.

  5. #4
    Electronic2012

    Re : Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?

    RE,

    Je veux juste savoir comment fonctionne le programme, comment il interagit, j'utilise MPLAB pour le PIC16F876.

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

    Re : Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?

    C'est ce que je te dis plus haut, ce programme est nul, donc rien a comprendre du tout.

  8. #6
    Electronic2012

    Re : Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?

    Bonjour,
    Est ce que quelqu'un peut me faire un relevé d'une pariode d'un quartz de 4MHz sur un oscilloscope et m'envoyer l'image au plus tard Mardi 22 mai. C'est très important car je dois présenter un projet dès Mercredi.
    Sinon, envoyez moi un lien vers un oscillogramme d'une simulation d'un quartz de 4MHz.

    Je vous remercie d'avance.

  9. Publicité
  10. #7
    PIXEL

    Re : Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?

    tu ne peut pas faire ça au labo de ton école ??

  11. #8
    Electronic2012

    Re : Comment fonctionne le syteme HMC6352 et PIC16F876 avec un I2C ?

    RE,
    Justement je dois simuler le quartz, mais la carte conçu ne fonctionnant pas, je dois avoir un relevé. De plus je ne peux pas accéder au labo.

Discussions similaires

  1. Comment fonctionne sleep() avec CCS
    Par CoHarry dans le forum Électronique
    Réponses: 0
    Dernier message: 21/08/2011, 08h33
  2. Mon code pour le module I2C ne fonctionne pas
    Par schneiderj dans le forum Électronique
    Réponses: 1
    Dernier message: 05/04/2008, 20h18
  3. comment relier un pic16f876 a un lcd module 162f
    Par mat7-6 dans le forum Électronique
    Réponses: 4
    Dernier message: 16/01/2008, 20h52
  4. PIC16F876 en I2C
    Par janialbe dans le forum Électronique
    Réponses: 3
    Dernier message: 16/09/2007, 15h38
  5. Comment Utilise Un Pic16f876 En Convertisseur Dc/dc
    Par john_deph dans le forum Électronique
    Réponses: 3
    Dernier message: 15/10/2005, 23h50
Découvrez nos comparatifs produits sur l'informatique et les technologies.