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

MPLAB (C) Conversion d'une variable décimal en héxadécimal




  1. #1
    JS7777

    MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Bonjour,

    J'ai un projet scolaire avec un PIC16F1459, je suis sous MPLAB IDE.

    En gros le code ci-dessous permet d'envoyer des données envers un écran LCD de chez 4D System. Elle modifie la valeur d'un objet de l'écran.

    La communication vers l'écran est une communication UART avec une trame spécifique, la trame doit être envoyé en hexadécimal.

    Code:
    #include <16F1459.h>
    
    #fuses INTRC_IO,NOWDT,NOPROTECT,
    #use delay(clock=16000000)
    #use rs232(baud=9600, xmit=PIN_B7,rcv=PIN_B5)
    
    //------DECLARATION FONCTION------//
    void checksum(); 
    //--------------------------------//
    
    
    int aff[6];
    int i = 0;
    int check;
    int msb;
    int lsb;
    int temp = 30;
    
    #define BP PIN_C6
    
    
    void main (void)
    {
    
    setup_oscillator(OSC_16MHZ);
    
    // Tableau pour la trame
    aff[0] = 0x01; 
    aff[1] = 0x0F;
    aff[2] = 0x00;
    aff[3] = msb; //Donnée msb
    aff[4] = lsb; //Donnée lsb
    aff[5] = check;	//Checksum
    
    
    
    
    
    while (1)
    {
    
    
    
    if (input(BP)) // Test si bouton poussor enfoncé
    {
    msb = 0x19;
    lsb = 0x8F;
    checksum();
    
    for(i=0; i<6; i++)
    {
    	putchar(aff[i]); // Envoi de la trame hexadécimal
    }
    
    
    
    delay_ms(200);
    
    }
    }
    
    
    
    void checksum(void) {
    
    check = aff[0]^aff[1]^aff[2]^aff[3]^aff[4];
    
    }

    Dans mon projet un module de température sera ajouté, la valeur que j'obtiens est en DÉCIMAL.
    Ici je simule cette valeur par la variable temp = 30;

    Là ou j'arrive pas c'est de convertir cette valeur en hexadécimal sur 16bit > LSB ET MSB

    Donc pour 30 j'aimerai obtenir 0x1E ou pour une valeur en décimal comme 30.01 > 0x0BB9


    Voilà si quelqu'un aurait une idée comment faire je serai reconnaissant.

    Cdt

    -----

    Dernière modification par JS7777 ; 10/04/2019 à 13h56.
    Ce que les entreprises jettent : Du matériel neuf

  2. Publicité
  3. #2
    jiherve

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Bonsoir
    n'y a t'il pas une librairie comportant la fonction dechex ou dectohex ?
    autrement la conversion décimal vers hex est triviale il y a moult de code dispo sur le net.
    exemple :https://www.quora.com/How-can-I-conv...-in-C-language
    JR
    l'électronique c'est pas du vaudou!

  4. #3
    Jack

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Je ne comprends pas cette histoire de traduction en hexadécimal.
    Les valeurs doivent elles être traduite en texte? je n'en ai pas l'impression.

    Donc quel est le problème à envoyer ta trame comme tu le fais dans ta boucle? On s'en fout de la base. La base c'est juste une histoire de représentation, la valeur restant la même quelle que soit la base.


  5. #4
    Jack

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Ou alors je n'ai pas compris: tu veux convertir un valeur 16 bits en 2 octets? Dans ce cas:
    Code:
    short val = 1234;  // = 0x4d2
    unsigned char lsb, msb;
    lsb = val & 0x00ff; // = 0xd2
    msb = val >> 8;  // = 0x04
    Dernière modification par Jack ; 10/04/2019 à 19h51.

  6. #5
    JS7777

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Merci pour vos réponses

    Donc quel est le problème à envoyer ta trame comme tu le fais dans ta boucle? On s'en fout de la base. La base c'est juste une histoire de représentation, la valeur restant la même quelle que soit la base.
    J'envoi la trame en UART avec putch();

    Dans le code j'utilise une boucle for pour envoyer la trame : aff[1], aff[2] etc...

    Il faut que j'envoi en hexadécimal comme cela pour afficher 1234 sur mon écran

    putch(0x04);
    putch(0xd2);

    ou pour 30

    putch(0x00);
    putch(0x1E);

    j'obtiens la température en décimal donc ici la variable temp pour simuler, ici temp = 30;

    En envoyant putch(temp);

    J'obtiens pas la valeur 30 sur mon écran.

    Du coup il faut que je l'envoi de cette forme 0x d'ou pourquoi je cherchait un moyen de convertir cette valeur de température décimal en hex


    Merci d'avance
    Dernière modification par JS7777 ; 13/04/2019 à 15h58.

  7. A voir en vidéo sur Futura
  8. #6
    Jack

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Je t'ai donné la solution pourtant dans ma réponse précédente. Que te manque-t-il désormais?

  9. #7
    JS7777

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Je vais tester, je redis ça

    Merci.

  10. Publicité
  11. #8
    carcan

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Hello !

    ton code, on dirait du CCS ...

    putc() ou putchar() n'envoie qu'un seul caractère (=1 octet).
    Pour envoyer une trame, utilise printf :
    - printf ("%d",temp) pour de l'entier (int)
    - printf ("%1.1f",temp) pour du float, avec 1 chiffre après la virgule
    - printf ("Temperature:%1.1f degrés",temp) pour une trame mise en forme pour de l'affichage

    A+
    Laurent

  12. #9
    paulfjujo

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    bonjour,



    putch ressemble beaucoup à une commande d'envoi de charactere à un LCD classique
    mais je suppose qu'il s'agit d' un "equipement "..vu que ta trame a un petit air de modbus ...

    si c'est bien du modbus
    à verfier si tu doit envoyer en ASCII ( modbus ascii) ou en binaire Modbus RTU

    Code:
    void Octet2Hex_Ascii(unsigned char number)
    {
     char high,low;
     // high nibble
     high = ((number & 0xF0) >> 4) + 48; // + '0'
     if (high > '9') high =high + 7;
     // low  nibble
     low = (number & 0x0F);
     low=low + 48;          // +'0' low nibble
     if (low > '9')                       // '9'= 57u
      low += 7;                         // > '9'
     // sur terminal PC
      UART1_Write(high);  UART1_Write(low); UART1_Write('h');
    // avec LCD
     // Lcd_Chr_Cp(high) ;Lcd_Chr_Cp(low); Lcd_Chr_Cp('h');
     }
     
    
    void Octet2Hex(unsigned char number)
    {
     char high,low;
     // high nibble
     high = (number >> 4)<<4 ;
     low = number -(high) ;
     high=high+low;
      // sur LCD
     // PutChar(High);
     // affichage test sur terminal
      ByteToStr(high,CRam1);
      UART1_Write_Text(CRam1);
      CRLF1();
    
     }
    
    //test
      c1=30 ;  
      Octet2Hex_Ascii(c1);CRLF1();
      Octet2Hex(c1);
      c1=254;
      Octet2Hex_Ascii(c1);CRLF1();
      Octet2Hex(c1);
      c1=81;
      Octet2Hex_Ascii(c1);CRLF1();
      Octet2Hex(c1);
    
    resultat sur terminal
    
    1Eh
     30
    FEh
    254
    51h
     81
    Dernière modification par paulfjujo ; 16/04/2019 à 10h41.

  13. #10
    JS7777

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Merci pour vos réponses !

    Hello !

    ton code, on dirait du CCS ...

    putc() ou putchar() n'envoie qu'un seul caractère (=1 octet).
    Pour envoyer une trame, utilise printf :
    - printf ("%d",temp) pour de l'entier (int)
    - printf ("%1.1f",temp) pour du float, avec 1 chiffre après la virgule
    - printf ("Temperature:%1.1f degrés",temp) pour une trame mise en forme pour de l'affichage

    A+
    Laurent

    Oui en effet c'est du ccs, je ne peut utiliser la fonction printf car elle envoie en "char".


    putch ressemble beaucoup à une commande d'envoi de charactere à un LCD classique
    mais je suppose qu'il s'agit d' un "equipement "..vu que ta trame a un petit air de modbus ...

    si c'est bien du modbus
    à verfier si tu doit envoyer en ASCII ( modbus ascii) ou en binaire Modbus RTU

    je ne pense pas que c'est du modbus mais je vais tester ce code.

    Doc de l'écran de la trame page 25 : https://www.4dsystems.com.au/downloa...001_R_1_01.pdf



    Code:
    short val = 1234;  // = 0x4d2
    unsigned char lsb, msb;
    lsb = val & 0x00ff; // = 0xd2
    msb = val >> 8;  // = 0x04
    Ce code marche bien merci bien mais j'aurai besoin quelques explications concernant le décalage car je ne comprend pas, merci bien

  14. #11
    Jack

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    Citation Envoyé par JS7777 Voir le message
    Ce code marche bien merci bien mais j'aurai besoin quelques explications concernant le décalage car je ne comprend pas, merci bien
    Il faut que les 8 bits de l'octet de poids fort passent dans l'octet de poids faible. Il faut donc le décaler de 8 bits vers la droite.

  15. #12
    JS7777

    Re : MPLAB (C) Conversion d'une variable décimal en héxadécimal

    D'accord, merci bien pour l'explication.

Sur le même thème :

Discussions similaires

  1. Conversion hexadécimal en décimal programme en C
    Par phlauw dans le forum Électronique
    Réponses: 7
    Dernier message: 13/01/2013, 13h46
  2. Conversion hexadécimal en décimal programme en C
    Par phlauw dans le forum Électronique
    Réponses: 1
    Dernier message: 12/01/2013, 20h59
  3. Conversion decimal vers hexadécimal
    Par MAXWELL27 dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 27/02/2011, 19h36
  4. convertion (decimal-hexadecimal)
    Par TaRiKq dans le forum Électronique
    Réponses: 1
    Dernier message: 29/02/2008, 21h57