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

Comment couper un mot binaire de 16 bit en 2 sur le 16F876



  1. #1
    Coch08

    Comment couper un mot binaire de 16 bit en 2 sur le 16F876


    ------

    Bonjour

    Voila
    J'utilise un pic 16F876 pour realisé une convertion analogique numerique sur 10 bits et j'essais de transmetre cette donnée a un autre pic 16F876 via son port serie TX/RX

    Le probleme est que cette transmision serie s'effectue sur 8 Bits max

    donc je supose qu'il faudrais couper le mot résultant de ma conversion en 2*8bit.

    Sur mes premiers essais (une conversion analogique sur 8 bits), sa marche la communication entre les 2 pic ce fait bien

    Je programme en langage C

    VOici le code du 16F876 qui effectue la conversion et qui transmet :


    void main()
    {
    char value=0;
    setup_adc_ports(AN0);
    setup_adc(ADC_CLOCK_DIV_2);
    setup_spi(FALSE);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;

    // TODO: USER CODE!!
    while(TRUE){
    setup_adc_ports( ALL_ANALOG );
    setup_adc(ADC_CLOCK_INTERNAL );
    set_adc_channel( 0 );
    value = read_adc();
    setup_adc( ADC_OFF );
    putc(value);
    delay_ms(200);
    }

    }
    Code du 16f876 qui reçoit et qui affiche la conversion sur le port B ( a l aide de LED)
    void main()
    {
    char value=0;
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_spi(FALSE);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;

    // TODO: USER CODE!!
    while(TRUE){
    if(kbhit()){
    value = getc();
    }
    output_b(value);
    }
    }
    Ces 2 codes marche parfaitement mais quant je passe en 10 Bit en conversion rien ne marche et je ne voit pas comment faire

    Merci de votre aide

    -----

  2. Publicité
  3. #2
    Olfox

    Re : Comment couper un mot binaire de 16 bit en 2 sur le 16F876

    salut salut , je pence avoir une petite solution. Tu as bien raison il sagit de découper ton mot de 10 bit par une manipulation

  4. #3
    Olfox

    Re : Comment couper un mot binaire de 16 bit en 2 sur le 16F876

    Citation Envoyé par Olfox Voir le message
    salut salut , je pence avoir une petite solution. Tu as bien raison il sagit de découper ton mot de 10 bit par une manipulation
    desolé ce sont mes premier pas sur le forum j'ai mal negocier le post. donc je disais que la technique et d'envoyer les deux bit de poids fort et ensuite d'envoyer les deux bit de poid faible. A la reception, on met dans une variable les deux bit de poids fort ( il auront un poids de 256) puis dans une seconde variable les l'octet de poids faible. on aura donc le mot de deux octets reconstitué. Ex: a = 256*l'octet de poids fort(les deux bit) + octet de poids faible. Pour découper voici ma façon de procédé:

    //test

    int a=0b1011001100; // valeur analogik apres CAN
    char b=0;
    char c=0;
    main()
    {
    while(1)
    {
    c=a>>8; // on décale huit fois c= 10
    // puis on envoi c
    b=a|0b00000000; // on fait un mask pour ne récupérer
    // que les huit premier bit
    // puis on envoi b
    }
    }

    il existe surement une autre technique mais celle ci n'est pas très compliqué et rique fortement de fonctioner.

  5. #4
    freepicbasic

    Re : Comment couper un mot binaire de 16 bit en 2 sur le 16F876

    le mode ADC à 2 modes sur le pic16F876
    1 mode caler à droite.
    1 mode caler à gauche.
    Les 2 bits supplémentaires se trouvent sur un registre à part

    Comment le compilateur gère t il la fonction ?
    value = read_adc();

    De plus ,Ton type est char donc seulement 1 octet.
    Dans l'exemple de olfox son type est int !
    Vérifier aussi si int correspond bien à 16 bits.
    A+, pat

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

    Re : Comment couper un mot binaire de 16 bit en 2 sur le 16F876

    Bonsoir Coch08,

    Le résultat est sur 10 bits il faut lire 2 registres différents (car chaque registre fait au maximum 8 bits).
    En assembleur les regsitres s'appellent ADRESH (partie haute) et ADRESL (partie basse).
    Attention car on peut justifier à droite ou à gauche c-a-d.

    Cherches dans tes fonctions celles qui lit ces 2 registres de 8bits que tu peux envoyer l'un après l'autre.

    Une astuce si tu n'as besoin que de 8 bits est de justifier à gauche. ADRESH contient alors les 8 bits les plus significatifs et tu peux alors ignorer ADRESL ;=)

    a+

  8. #6
    Olfox

    Re : Comment couper un mot binaire de 16 bit en 2 sur le 16F876

    ha effectivement c'est une tres bonne idee, et surtout la plus logique, j'ai encore des pti progrer à faire .

    L'inteligence c'est de voir l'évidence

  9. Publicité
  10. #7
    umfred

    Re : Comment couper un mot binaire de 16 bit en 2 sur le 16F876

    Salut,
    tout d'abord effectivement, il faut que value soit sur 16bit.
    Ensuite, je pense qu'il faut déclarer 2 variables char (par exemple, val_ana_h pour le poids fort, et val_ana_l pour le poids faible).
    Si tu utilise CCS comme compilateur, il y a la fonction MAKE8() pour récupérer 8 bits d'une variable. (voir page 179 du manuel de CCS).
    Si tu utilise un autre compilateur, il doit y avoir une fonction similaire (il me semble que quelque fois, elles s'appellent HIGH() et LOW()).

    Mais tu peux peut-être aussi (tout simplement) utilisé la fonction printf() à la place de la fonction putc() sans rajouter de code.

  11. #8
    invite76a

    Re : Comment couper un mot binaire de 16 bit en 2 sur le 16F876

    Tu fais une union qui comprend
    - un "int" Valeur
    - une structure de 2 octets Valeur_high et Valeur_low

    Voir la syntaxe C

    th.

  12. #9
    Coch08

    Re : Comment couper un mot binaire de 16 bit en 2 sur le 16F876

    Merci de vos reponses
    Le probleme vien effectivement du INT
    Tous simplement le compilateur que j'utilise (CCS C) reconais un INT sur 8 bit et non 16
    Donc voici un code qui marche et qui resoud mon probleme

    Code du PIC qui effectu la conversion
    void main()
    {
    long value=0;
    char valueL=0,valueH=0;
    setup_adc_ports(AN0);
    setup_adc(ADC_CLOCK_DIV_2);
    setup_spi(FALSE);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;

    // TODO: USER CODE!!
    while(TRUE){
    setup_adc_ports( ALL_ANALOG );
    setup_adc(ADC_CLOCK_INTERNAL );
    set_adc_channel( 0 );
    value = read_adc();
    valueL=make8(value,0);
    //valueL= value&0xff;
    valueH=make8(value>>8,0);
    //valueH= ((value>>8)&0xff);
    setup_adc( ADC_OFF );
    putc(valueL);
    delay_ms(500);
    putc(valueH);
    delay_ms(500);
    }

    }
    Code du pic qui resoit le mot de 10 bit et qui l affiche sur 8 LED du port B
    void main()
    {
    char value=0;
    setup_adc_ports(AN0);
    setup_adc(ADC_OFF);
    setup_spi(FALSE);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;

    // TODO: USER CODE!!
    while(TRUE){
    if(kbhit()){
    value = getc();
    }
    output_b(value);
    }

    }

Discussions similaires

  1. Comment couper un fichier musical ?
    Par shokin dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 18/11/2013, 13h51
  2. Réponses: 4
    Dernier message: 22/09/2007, 07h55
  3. Toolbarre google : traducteur mot-à-mot, comment changer de langue ?
    Par shokin dans le forum Internet - Réseau - Sécurité générale
    Réponses: 4
    Dernier message: 18/01/2007, 00h39
  4. comment couper une alim 12v avec 0,2V ?
    Par TV Pathos dans le forum Électronique
    Réponses: 2
    Dernier message: 07/10/2006, 14h11
  5. comment placer un mot de passe sur un dossier??
    Par fiascototal dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 04/09/2005, 13h04
Découvrez nos comparatifs produits sur l'informatique et les technologies.