P18f4520, affichage du résultat en décimale via USART
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

P18f4520, affichage du résultat en décimale via USART



  1. #1
    invite20f901d9

    Question P18f4520, affichage du résultat en décimale via USART


    ------

    Bonjour,

    Je suis actuellement en BTS SE et je débute depuis peu à la programmation des Pic18 en C avec le logiciel Mplab.

    Je fais en ce moment un voltmètre à partir d'un Pic 18f4520, avec un potentiomètre, et qui affiche la valeur en Volt sur l'hyperterminal de windows.

    Jusque là tout se déroule comme prévu, sauf que la valeur affichée sur l'hyperterminal de windows est un entier alors que je souhaiterais plutôt la voir en décimale.

    J'ai tripoté mon code dans tout les sens. J'ai cherché un peu partout sur google en vain. C'est donc pourquoi je sollicite votre aide sur le forum.

    Tout m'a l'air pourtant bon, j'ai sûrement raté quelque chose...


    Voici le code en question :


    #include <p18f4520.h>
    #include <stdlib.h>
    #include <usart.h>
    #include <adc.h>
    #include <delays.h>




    char str_n[30];
    unsigned double valeur; // Déclaration de la variable en décimale qui m'affichera la valeur en Volt.


    void Send_CR_LF(void)
    {
    while (BusyUSART());
    WriteUSART( 0x0D );

    while (BusyUSART());
    WriteUSART( 0x0A );
    }


    void main (void) // Programme principale.
    {
    TRISCbits.TRISC6=0; //RX Définit la sortie RS232
    TRISCbits.TRISC7=1; //TX Définit l'entrée RS232


    OpenUSART( USART_TX_INT_ON & // Initialisation d'USART. "Ouverture" du MAX3232
    USART_RX_INT_ON &
    USART_ASYNCH_MODE &
    USART_EIGHT_BIT &
    USART_SINGLE_RX &
    USART_BRGH_HIGH, 25);


    OpenADC( ADC_RIGHT_JUST & // Initialisation du CAN
    ADC_4_TAD &
    ADC_FOSC_32, ADC_CH0 &
    ADC_VREFPLUS_VDD &
    ADC_VREFMINUS_VSS &
    ADC_INT_ON, ADC_1ANA);


    Delay10KTCYx(10);
    ConvertADC();

    while(BusyADC());
    valeur=ReadADC();
    valeur=valeur/204.6; // Pour que la valeur soit comprise entre 0 et 5V selon l'alpha du potard.

    itoa(valeur,str_n); // Conversion de la valeur en hexa

    putsUSART(str_n); // Envoi de l'hexa au PC (RS232)

    Send_CR_LF();
    Send_CR_LF();

    Delay10TCYx(1);
    }

    -----

  2. #2
    invite20f901d9

    Re : P18f4520, affichage du résultat en décimale via USART

    [EDIT] : Décimal...

  3. #3
    Seb.26

    Re : P18f4520, affichage du résultat en décimale via USART

    Remplace :
    Code:
    itoa(valeur,str_n); // Conversion de la valeur en hexa
    par :
    Code:
    sprintf(str_n, "%f", valeur);
    (ne pas oublier d'inclure "stdio.h")
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  4. #4
    invite20f901d9

    Re : P18f4520, affichage du résultat en décimale via USART

    Merci de ta réponse Seb.



    J'ai donc remplacé le itoa par le sprintf en ajoutant le fichier directeur. L'hyperterminal n'affiche plus de caractère, il ne fais que sauter des lignes.

    L'hyperterminal est configuré en : 9600bauds ; 8 bits de données ; aucune parité ; 1 bit d'arrêt ; et contrôle de flux sur matériel.

    J'ai consulté le fichier stdio et placé certaines fonctions à la place de sprintf, sans effet.

    Je pense qu'il y a une "dispute" entre le sprintf et le putsUSART lors de l'envoi non?




    Voici donc le code mis à jour :


    #include <p18f4520.h>
    #include <stdlib.h>
    #include <usart.h>
    #include <adc.h>
    #include <delays.h>

    #include "stdio.h"



    char str_n[30];
    unsigned double valeur; // Déclaration de la variable en décimale qui m'affichera la valeur en Volt.


    void Send_CR_LF(void)
    {
    while (BusyUSART());
    WriteUSART( 0x0D );

    while (BusyUSART());
    WriteUSART( 0x0A );
    }


    void main (void) // Programme principale.
    {
    TRISCbits.TRISC6=0; //RX Définit la sortie RS232
    TRISCbits.TRISC7=1; //TX Définit l'entrée RS232


    OpenUSART( USART_TX_INT_ON & // Initialisation d'USART. "Ouverture" du MAX3232
    USART_RX_INT_ON &
    USART_ASYNCH_MODE &
    USART_EIGHT_BIT &
    USART_SINGLE_RX &
    USART_BRGH_HIGH, 25);


    OpenADC( ADC_RIGHT_JUST & // Initialisation du CAN
    ADC_4_TAD &
    ADC_FOSC_32, ADC_CH0 &
    ADC_VREFPLUS_VDD &
    ADC_VREFMINUS_VSS &
    ADC_INT_ON, ADC_1ANA);


    Delay10KTCYx(10);
    ConvertADC();

    while(BusyADC());
    valeur=ReadADC();
    valeur=valeur/204.6; // Pour que la valeur soit comprise entre 0 et 5V selon l'alpha du potard.

    sprintf(str_n, "%f", valeur);

    putsUSART(str_n); // Envoi de l'hexa au PC (RS232)

    Send_CR_LF();
    Send_CR_LF();

    Delay10TCYx(1);
    }

  5. A voir en vidéo sur Futura
  6. #5
    Seb.26

    Re : P18f4520, affichage du résultat en décimale via USART

    Citation Envoyé par rolf34 Voir le message
    Je pense qu'il y a une "dispute" entre le sprintf et le putsUSART lors de l'envoi non?
    Le sprintf() n'envoie rien, ce n'est pas un printf() ... il mets en forme tes données dans la variable de destination ... En fait, je pense que ton compilo s'emmêle les pinceaux car valeur n'est pas un vrai float, donc essaye ceci (j'aurrais d'ailleur dû mettre comme dés le début !)

    Code:
    sprintf(str_n, "%f", ((float)valeur));
    PS: si tout ce que tu veux, c'est afficher ".00" après ton chiffre, tu peux aussi faire :

    Code:
    sprintf(str_n, "%d.00", valeur);


    Car de toute façon, tu n'aura jamais rien après la virgule : c'est un entier ...

    [Edit] J'ai aussi peut être mal compris ta question ... si tu as de l'hexa et que tu veux du decimal, fais :
    Code:
    itoa(valeur, str_n, 10);
    Attention : code non ANSI !

    Si ton compilo rale, fais :
    Code:
    sprintf(str_n, "%d", valeur);
    Dernière modification par Seb.26 ; 17/09/2010 à 15h10.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  7. #6
    umfred

    Re : P18f4520, affichage du résultat en décimale via USART

    l'hyperterminal affiche des caractères ascii, je veux dire par là que si on veut que l'hyperterminal affiche "3V", le PIC devra envoyer les octets hexa 0x33 et 0x56.
    la fonction itoa comme sont nom l'indique converti un entier en ascii (donc la valeur 3 devient le caractère '3' (code ascii 0x33)).
    Si tu veux afficher un décimal, il faut, à mon avis, récupérer dans une variable la partie décimal et dans une seconde la partie entière.

    Imaginons que tu veuilles afficher 2 décimales.
    Imaginons que le convertisseur te renvoie la valeur 508, soit 508/204.6=2.48V.

    je pense qu'il faudrait faire un truc comme suit:
    Code:
    int v_entier; // toujours déclarer les variables que l'on va utiliser 
    int v_decimal;
    float v_calcul;
    ...
    // lecture de l'ADC 
    v_entier=readADC(); //v_entier=508
    //calcul de la valeur
    v_calcul=(v_entier*1.0)/204.6; //*1.0 devrait forcer à faire l'opération en float
    //v_entier=508; v_calcul=2.4828.....
    v_entier=int(v_calcul); //on "transforme" le float en entier, on récupère ainsi la partie entière
    //v_entier=2; v_calcul=2.4828...
    v_calcul=v_calcul-(v_entier*1.0); // on retire la partie entière
    //v_entier=2;v_calcul=0.4828...
    v_decimal=int(v_calcul*100.0); // on récupère les décimales sous la forme d'un entier
    //v_entier=2;v_decimal=48
    itoa(v_entier,str_n); // conversion en ascii de la partie entière
    //str_n='2' (0x32)
    putsUSART(str_n); // Envoi de l'hexa au PC (RS232)
    putsUSART('.'); // envoi du point décimal
    itoa(v_decimal, str_n); // conversion des décimales (il faut peut être le faire en 2 fois, une fois pour les dizaines, et une fois pour les unités)
    //str_n='48' (0x34 0x38)
    putsUSART(str_n);
    ...

  8. #7
    invite20f901d9

    Re : P18f4520, affichage du résultat en décimale via USART

    Bonjour et merci de vos réponses,

    pardon de ne pas avoir répondu de suite.



    Seb. , j'ai essayé le dernier code que tu m'as donné mais j'ai obtenu des valeurs compris entre 15000 et 16000 (?).





    umfred, je suis entrain d'essayer ton code mais le compilo m'indique une erreur de syntaxe ici :

    v_entier=int(v_calcul); //on "transforme" le float en entier, on récupère ainsi la partie entière
    As-tu une idée d'où cela peut venir?



    Je continue de mon côté d'arranger le problème.


    Merci d'avance.

  9. #8
    invite20f901d9

    Re : P18f4520, affichage du résultat en décimale via USART

    J'ai trouvé le problème, la bonne syntaxe pour convertir un float en entier est :

    v_entier=(int)v_calcul; //on "transforme" le float en entier, on récupère ainsi la partie entière





    Cependant le compilo m'indique 1 erreur je n'ai pas réussi à comprendre pourquoi.


    Voila donc le code avec le problème :

    #include <p18f4520.h>
    #include <stdlib.h>
    #include <usart.h>
    #include <adc.h>
    #include <delays.h>

    #include "stdio.h"



    char str_n[30];
    int v_entier; // toujours déclarer les variables que l'on va utiliser
    int v_decimal;
    float v_calcul;


    void Send_CR_LF(void)
    {
    while (BusyUSART());
    WriteUSART( 0x0D );

    while (BusyUSART());
    WriteUSART( 0x0A );
    }


    void main (void) // Programme principale.
    {
    TRISCbits.TRISC6=0; //RX Définit la sortie RS232
    TRISCbits.TRISC7=1; //TX Définit l'entrée RS232


    OpenUSART( USART_TX_INT_ON & // Initialisation d'USART. "Ouverture" du MAX3232
    USART_RX_INT_ON &
    USART_ASYNCH_MODE &
    USART_EIGHT_BIT &
    USART_SINGLE_RX &
    USART_BRGH_HIGH, 25);


    OpenADC( ADC_RIGHT_JUST & // Initialisation du CAN
    ADC_4_TAD &
    ADC_FOSC_32, ADC_CH0 &
    ADC_VREFPLUS_VDD &
    ADC_VREFMINUS_VSS &
    ADC_INT_ON, ADC_1ANA);


    Delay10KTCYx(10);
    ConvertADC();

    while(BusyADC());

    v_entier=readADC(); //v_entier=508
    //calcul de la valeur
    v_calcul=(v_entier*1.0)/204.6; //*1.0 devrait forcer à faire l'opération en float
    //v_entier=508; v_calcul=2.4828.....
    v_entier=(int)v_calcul; //on "transforme" le float en entier, on récupère ainsi la partie entière
    //v_entier=2; v_calcul=2.4828...
    v_calcul=v_calcul-(v_entier*1.0); // on retire la partie entière
    //v_entier=2;v_calcul=0.4828...
    v_decimal=(int)v_calcul*100.0; // on récupère les décimales sous la forme d'un entier
    //v_entier=2;v_decimal=48
    itoa(v_entier,str_n); // conversion en ascii de la partie entière
    //str_n='2' (0x32)
    putsUSART(str_n); // Envoi de l'hexa au PC (RS232)
    putsUSART('.'); // envoi du point décimal
    itoa(v_decimal, str_n); // conversion des décimales (il faut peut être le faire en 2 fois, une fois pour les dizaines, et une fois pour les unités)
    //str_n='48' (0x34 0x38)
    putsUSART(str_n);



    Send_CR_LF();
    Send_CR_LF();

    Delay10TCYx(1);
    }




    j'ai essayé de remplacer
    putsUSART('.'); // envoi du point décimal

    par
    putsUSART("."); // envoi du point décimal
    sans effet.



    Si tu pourrais m'indiquer d'où vient le problème^^



    merci

  10. #9
    invite20f901d9

    Re : P18f4520, affichage du résultat en décimale via USART

    Erf, personne ne saurait par hasard ? Je ne suis toujours pas arrivé à régler ce problème.

  11. #10
    Seb.26

    Re : P18f4520, affichage du résultat en décimale via USART

    Bon, reprenons calmement ...

    1) tu veux envoyer dans ton hyperterminal la valeur de quelle variable ? (quel type !)

    2) tu veux "écrire" quoi ?



    Exemple :
    Code:
    char str_n[30];
    float toto = 5.4321;
    sprintf(str_n, "%.2f", toto);
    putsUSART(str_n);
    Va afficher "5.43" ...

    Et si ça, ça marche pas, ton compilo et/ou tes lib sont foireuses ... (ou je deviens fou )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  12. #11
    umfred

    Re : P18f4520, affichage du résultat en décimale via USART

    si l'erreur est sur le putsUSART("."); essai avec le code ascii du point:
    putsUSART(0x2E);

    a priori le sprintf de mplab C18 ne gère que la conversion d'entier (selon la doc en tout cas)

  13. #12
    invite20f901d9

    Re : P18f4520, affichage du résultat en décimale via USART

    Problème résolu



    Je voulais envoyer sur mon hyperterminal une valeur en Volt selon l'alpha du potard, par l'intermédiaire du CAN du Pic.

    Le problème c'est que l'hyperterminal affichait genre "0V" "1V" ou "5V" alors que je voulais un truc du genre : "0.002V" "3.562V" etc...

    C'était juste ça.




    Je suis allé voir un collègue hier et il m'a donné un fichier qui s'appelle "ftoa.c" à inclure dans le source files de Mplab, en plus de mon programme principale.

    Du coup j'ai changé le itoa en ftoa.




    Je poste mon code final pour les gens qui étaient dans le même cas que moi :

    Code:
    #include <p18f4520.h>
    #include <stdlib.h>
    #include <usart.h>
    #include <adc.h>
    #include <delays.h>
    
    
    
    
    char str_n[30];
    double valeur; // Déclaration de la variable en décimale qui m'affichera la valeur en Volt.
    
    
    void Send_CR_LF(void)
    {
    while (BusyUSART());	
    WriteUSART( 0x0D ); 
    
    while (BusyUSART());	
    WriteUSART( 0x0A ); 
    }
    
    
    void main (void) // Programme principale.
    {
    TRISCbits.TRISC6=0; //RX Définit la sortie RS232
    TRISCbits.TRISC7=1; //TX Définit l'entrée RS232
    
    
    OpenUSART( USART_TX_INT_ON & // Initialisation d'USART. "Ouverture" du MAX3232
    USART_RX_INT_ON & 
    USART_ASYNCH_MODE &
    USART_EIGHT_BIT & 
    USART_SINGLE_RX & 
    USART_BRGH_HIGH, 25); 
    
    
    OpenADC(	ADC_RIGHT_JUST &	 // Initialisation du CAN
    ADC_4_TAD & 
    ADC_FOSC_32, ADC_CH0 &
    ADC_VREFPLUS_VDD &
    ADC_VREFMINUS_VSS &	
    ADC_INT_ON, ADC_1ANA);
    
    
    Delay10KTCYx(10);
    ConvertADC();
    
    while(BusyADC());
    valeur=ReadADC(); 
    valeur=valeur/204.6; // Pour que la valeur soit comprise entre 0 et 5V selon l'alpha du potard.
    
    ftoa(valeur,str_n);
    
    putsUSART(str_n); // Envoi de l'hexa au PC (RS232)
    
    Send_CR_LF();
    Send_CR_LF();
    
    Delay10TCYx(1);
    }

    Le fichier ftoa.c se trouve facilement avec google.



    En tout cas merci quand même à vous deux d'avoir voulus m'aider, j'espère aussi apporter une solution aux gens qui ont le même problème que moi.

Discussions similaires

  1. [p18f4520] Réaliser une acquisition moyennée via CAN
    Par invite8d0b7120 dans le forum Électronique
    Réponses: 5
    Dernier message: 14/06/2010, 14h44
  2. Affichage résultat d'une Conversion A/N via RS232 (p18f4520 + C18)
    Par invite8d0b7120 dans le forum Électronique
    Réponses: 7
    Dernier message: 27/04/2010, 18h58
  3. P18f4520, affichage d'une valeur sur écran LCD picdem 2+
    Par invite8d0b7120 dans le forum Électronique
    Réponses: 3
    Dernier message: 21/04/2010, 16h57
  4. Affichage valeur décimale [picbasic pro]
    Par invitef05db304 dans le forum Électronique
    Réponses: 0
    Dernier message: 30/10/2006, 21h34
  5. affichage numérique décimale 100%
    Par invitea821b3a8 dans le forum Électronique
    Réponses: 11
    Dernier message: 21/10/2006, 08h20
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...