Aide Communication Série MSB du LSB
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Aide Communication Série MSB du LSB



  1. #1
    Juline05

    Aide Communication Série MSB du LSB


    ------

    Bonjour à tous,

    Je réalises actuellement un petit bout de code pour contrôler en SPI un synthétiseur de fréquence via un PIC16f.

    Je dois envoyer 40bits :
    - 8 bits pour le caractère 'G'.
    - 32 bits pour la fréquence avec le LSB envoyé en premier (le PIC transmet le MSB en premier).

    Sachant que le registre SSPBUF est constitué d'un octet, il me faut envoyer le caractère 'D', puis les 8 derniers bits...

    Pouvez vous m'aider à corriger ma fonction qui doit avoir des problèmes de type de données et valider la fonctionnalité :
    Code:
    void Creer_Freq (unsigned long Freq_MHz)
    {
        unsigned long N_Div = Freq_MHz / (1/2);       
        unsigned char Set_Freq = 'G';
        
        SPI1_Write(Set_Freq);
        
        unsigned long n = 0x000F;
        unsigned char Little_End[4];
        for (int i=0;i<4;i++)
        {
            Little_End[i] = N_Div & n;
            SPI_Write(Little_End[i]);
            n = n << 8;
        }
    }
    Merci d'avance.

    -----

  2. #2
    Juline05

    Re : Aide Communication Série MSB du LSB

    Quelqu'un pour me donner son avis ?

  3. #3
    Jack
    Modérateur

    Re : Aide Communication Série MSB du LSB

    Sachant que le registre SSPBUF est constitué d'un octet, il me faut envoyer le caractère 'D', puis les 8 derniers bits...
    Pas très clair tout çà. Pourquoi le caractère 'D'. Que représentent ces 8 derniers bits? Il n'y a pas moyen d'avoir des infos sur le contenu des trames?

  4. #4
    Juline05

    Re : Aide Communication Série MSB du LSB

    Le synthétiseur de fréquence doit être programmé de la manière suivante :
    - dans mon cas (le caractère G et non D), doit être envoyé au synthétiseur pour lui signifier qu'on va lui envoyer le rapport de division N (N = Freq/Pas). -> 8bits
    - Puis les informations du rapport de division. -> 32bits

    Ex : N=1500 (dec) donne 5DC (hex)
    Pour une transmission sur 32 bits en Little Endian, on aura : DC 05 00 00
    Il nous faudra donc envoyer le caractère G (47 en hex)+ rapport de division = 47 DC 05 00 00
    La fonction que j'écris doit donc envoyer chaque octet comme défini ci-dessus.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Aide Communication Série MSB du LSB

    Ok, c'est plus clair.
    Quelques remarques sur la fonction:
    unsigned long N_Div = Freq_MHz / (1/2);
    tu prends des risques car il s'agit d'entiers et 1/2 va être égal à 0 du coup. Pourquoi ne pas multiplier par 2 au lieu de diviser par 1/2?

    unsigned char Set_Freq = 'G';
    SPI1_Write(Set_Freq);
    Autant écrire SPI1_Write('G');

    unsigned char Little_End[4];
    Pourquoi utiliser un tableau? Ca serait plus simple ainsi:
    Code:
        for (int i=0;i<4;i++)
        {
            SPI_Write(N_Div % 256);  // LSB de N_Div
            N_Div = N_Div / 256; // ou bien N_Div = N_Div >> 8;
        }
    Dernière modification par Jack ; 17/01/2018 à 11h14.

  7. #6
    Juline05

    Re : Aide Communication Série MSB du LSB

    Effectivement, ce n'est pas très logique (je vais mettre des commentaires, pour expliquer pourquoi *2 ...).
    Par contre je ne comprend pas pourquoi réaliser une comparaison bit à bit avec la valeur décimale 256. Est ce que le code ci-dessous peut convenir :
    Code:
    void Creer_Freq (unsigned long Freq_MHz)
    {
        unsigned long N_Div = Freq_MHz * 2;       
            
        SPI1_Write('G');
        
        unsigned long n = 0x000F;
        for (int i=0;i<4;i++)
        {
            SPI_Write(N_Div % n);
            n = n << 8;
        }
    }

  8. #7
    Jack
    Modérateur

    Re : Aide Communication Série MSB du LSB

    Par contre je ne comprend pas pourquoi réaliser une comparaison bit à bit avec la valeur décimale 256
    Quelle comparaison bit à bit? Le reste de la division par 256 va donner l'octet de poids faible recherché.

    n = n << 8;
    Non, car si tu ne vas bien garder que les 8 bits qui t'intéressent, il ne seront pas à la bonne place (0x00001200 est différent de 0x00000012 par exemple)

Discussions similaires

  1. [Outils/Fab/Comp] communication serie
    Par kanzali dans le forum Électronique
    Réponses: 1
    Dernier message: 22/08/2017, 11h20
  2. Communication série rs232
    Par tinoch dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 10/03/2015, 16h11
  3. Aide communication serie ( option DTR)
    Par DADYCOKE dans le forum Électronique
    Réponses: 20
    Dernier message: 26/03/2013, 09h39
  4. Communication PIC <-> PC port série
    Par Toufinet dans le forum Électronique
    Réponses: 7
    Dernier message: 27/05/2010, 16h13
  5. Communication serie Pic<->Pc
    Par MicroPuce dans le forum Électronique
    Réponses: 14
    Dernier message: 11/06/2004, 19h06