programmation pic18 alternative a SprintF
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

programmation pic18 alternative a SprintF



  1. #1
    inviteac751535

    programmation pic18 alternative a SprintF


    ------

    bonjour,

    Je suis sur un projet qui implique plusieurs fois l'utilisation de SPRINTF de STDIO pour l'affichage de l'heure et de la temperature (format temperature mini et maxi).
    Cependant l'utilisation de SPRINTF est beaucoup trop difficile a mettre en place( avec STDIO _H_USER etc...).

    ma question est donc: y a t il une alternative a SPRINTF dans la bibliotheque standard?
    j'utilise Sprintf pour appliquer a une chaine de caracteres l'heure, une temperature....

    Merci

    -----

  2. #2
    fdamien12

    Re : programmation pic18 alternative a SprintF

    Salut,
    tu as l'air de bien galérer avec cette fonction.

    Si réellement tu n'arrives pas à la faire fonctionner, pourquoi ne recodes-tu pas une fonction maison ?

  3. #3
    Jack
    Modérateur

    Re : programmation pic18 alternative a SprintF

    Tu peux regarder du côté des fonctions de conversion comme atof, atoi, itoa, fcvt, etc.

    A+

  4. #4
    inviteac751535

    Re : programmation pic18 alternative a SprintF

    Bonjour,

    j'ai lu que la fonction Sprintf et Printf (en gros toutes les fonctions de STDIO.h) etaient programme via le Stdout sur le port serie.
    Et que pour l'utiliser il fallait faire ceci:
    Code:
     
    stdout = _H_USER ; // dans le main
    int _user_putc(char c) // fonction a rajouter dans lr programme
    {
    putcXLCD(c) ;
    }
    Je comprends bien le principe pour un affichage directe genre printf("hello"° ou printf("%d",int i)... mais pas pour le sprintf qui lui sert a l'implantation dans un buffer sprintf(buffer,"%d",i).

    ce n'est pas clair pour moi et pour vous?

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

    Re : programmation pic18 alternative a SprintF

    j'ai lu que la fonction Sprintf et Printf (en gros toutes les fonctions de STDIO.h) etaient programme via le Stdout sur le port serie.
    Où as-tu lu ceci? EN tout cas en C standard ce n'est pas vrai.

    ce n'est pas clair pour moi et pour vous?
    C'est très clair. Les fonctions de la famille printf génèrent une chaine qui peut être envoyée vers la sortie standard stdout (printf), un flux (fprintf), une chaine (sprintf).

    Pour respecter la norme, la logique voudrait que la sortie soit considérée comme un flux (port série, LAN, etc.) et du coup fprintf serait la solution universelle. Mais chaque compilateur peut gérer ça à sa façon, par exemple en redirigeant la sortie standard (stdout) vers le port série comme ça a l'air d'être le cas dans ton code. Il n'y a pas de mystère, comme le comportement n'est pas standard il faut lire attentivement la doc du compilateur.

    A+
    Dernière modification par Jack ; 20/02/2012 à 09h41.

  7. #6
    inviteac751535

    Re : programmation pic18 alternative a SprintF

    tout a fait d'accord jack
    voici donc un exemple de mon code qui respecte cette norme mais ne fonctionne pas.
    Code:
    char temp1 [15] = "";//variable affichage temperature
    char temp2 [15] = "";//variable affichage temperature
    
    	
    //*******************************************************************
    //					Fonction Main									*
    //*******************************************************************
    
    void main (void)
    {
    ADCON0=0;
    ADCON1=0x0f;
    //initialisation hardware
    
    stdout= _H_USER;
    //initialisation logicielle
    LcdInit();
    
    
    while(1) //boucle infinie du programme vide car uniquement interruptions
    {
    //sondes DS18B20
    	Sonde_Reset();
    	Sonde_Write(0xcc);
    	Sonde_Write(0x44);	
    	Delay10KTCYx(80); 
    	Sonde_Reset();
    	Sonde_Write(0xcc);
    	Sonde_Write(0xbe);
    	Sonde_Readbyte(sondeT,0);//1er octet 
    	Delay10TCYx(10);
    	Sonde_Readbyte(sondeT,1);//2eme octet
    	Delay10TCYx(10);
    	//Temp_String (temp1,sondeT[0],sondeT[1]);//conversion temperature en chaine de caractere pour affichage sondeT[0],sondeT[1]
    	sprintf(temp1,(const far rom char*)"coucou");//erreur---------------------<<<<
    	sprintf(temp2,(const far rom char*)"coucou2");
    	SetDDRamAddr(0x80);//debut 1ere ligne
    	putsXLCD(temp1);//affichage ner fonctionne pas
    	while( BusyXLCD() );
    	SetDDRamAddr(0xC0);//debut seconde ligne
    	putsXLCD(temp2);//affichage ne fonctionne pas
    	fprintf(_H_USER,(const far rom char*)"coucou2_hello");//essai avec fprintf ne fonctionne pas
    	while( BusyXLCD() );
    }//fin de la boucle
    
    }//fin du main
    
    //*******************************************************************
    //						fonction pour stdio							*
    //*******************************************************************
    
    int user_putc (char c)
    {
    putcXLCD(c);
    }
    
    
    //*******************************************************************
    //					Fonctions d'Initialisation						*
    //*******************************************************************
    
    void LcdInit(void) // initalisation du LCD sur PORTD (D0-D6)
    {
    PORTD=0x00; 
    TRISD=0x00;    
    LATD=0x00;
    
    OpenXLCD( FOUR_BIT & LINES_5X7 );
    while( BusyXLCD() );
    WriteCmdXLCD( FOUR_BIT & LINES_5X7 );
    while( BusyXLCD() );
    WriteCmdXLCD( DON & BLINK_OFF);
    while( BusyXLCD() );
    }

  8. #7
    Jack
    Modérateur

    Re : programmation pic18 alternative a SprintF

    Si tu précisais ce qui ne fonctionne pas, ce serait plus facile pour trouver une solution ...

    A+

  9. #8
    Jack
    Modérateur

    Re : programmation pic18 alternative a SprintF

    Désolé, je n'avais pas vu le commentaire.

    Quel est le message d'erreur exactement?

    A+

  10. #9
    Jack
    Modérateur

    Re : programmation pic18 alternative a SprintF

    De plus, je ne vois pas l'intérêt de ton sprintf: tu veux transformer une chaine de caractères en ... chaine de caractères. Quel est l'intérêt?

    A+

  11. #10
    inviteac751535

    Re : programmation pic18 alternative a SprintF

    jack,

    en fait c'est peine perdue en ce qui me concerne pour le sprintf...dommage.
    j'ai donc ecrit une routine rapide de conversion ascii en rajoutant 48 pour le '0' ascii.

    En revanche je compte reouvrir un Topic car j'ai un probleme sur mon DS18B20.
    Sur la simulation et en comptabilisant les cycles avec mon quartz 4Mhz je devrai avoir 1us a chaque cycle.
    Or je me suis rendu compte que mon timing etait trop long.En gros 3 fois trop long pour tout.
    Cycle de reset 500us , je l'ai a 1.5ms...15us devienne 45us et surtout les 60us d'ecriture (0xCC,0x44,0xBE) sont de 190us pour 60us a l'origine.
    J'ai remplace mon quartz, mes condensateurs...peut etre est le pic.
    Je me disais peut tre un prescaler mais j'en doute (surtout de 3 pour 1)...bizarre.
    Donc tant que mes timings seront faux adieux la temperature.

    C'est pas facile de galerer des journees mais c'est quand meme hyper riches en apprentissage.

    merci

  12. #11
    Jack
    Modérateur

    Re : programmation pic18 alternative a SprintF

    en fait c'est peine perdue en ce qui me concerne pour le sprintf...dommage.
    Pourquoi?

    j'ai donc ecrit une routine rapide de conversion ascii en rajoutant 48 pour le '0' ascii.
    Je ne vois pas de quoi tu parles. Pourquoi tu t'intéresse à ce '0' en particulier?

    A+

  13. #12
    inviteac751535

    Re : programmation pic18 alternative a SprintF

    un exemple: j'ai partager le resultat obtenu par ma sonde en une partie decimales et une partie virgule.
    exemple 15,50. ca nous fait 15 et 50.
    Pour l'ecrire je fais (15/10)+'0'ascii en decimal = 1+48=49 decimal. pour le1
    puis 15-(15/10)=5+'0'=5+48=53.
    pour la virgule identique (50/10)+'0'=5+48=53
    puis 50-(50/10)=0+'0'=48+0.
    donc 15.50 s'ecrit donc buf[]={49,53,'.',53,48). voila pourquoi le caractere '0' soit 48 ou 0x30 est important car les autres suivent.

  14. #13
    Jack
    Modérateur

    Re : programmation pic18 alternative a SprintF

    Attention, si tu ne mets par de 0 après le dernier code ASCII (48 dans ton exemple), buf ne pourra pas être considéré comme une chaine de caractères au sens du langage C.

    A+

Discussions similaires

  1. probleme fonction "sprintf" sur pic18 et 18f4550
    Par inviteac751535 dans le forum Électronique
    Réponses: 4
    Dernier message: 19/02/2012, 17h47
  2. Programmation microcontrôleur PIC18
    Par invite73838812 dans le forum Électronique
    Réponses: 12
    Dernier message: 27/08/2010, 13h21
  3. [Programmation]Différence Compilateur C C18/IAR PIC18
    Par jorg1n dans le forum Électronique
    Réponses: 3
    Dernier message: 01/04/2008, 08h38
  4. probleme avec la fonction sprintf sur pic18
    Par modelvincent dans le forum Électronique
    Réponses: 3
    Dernier message: 22/05/2007, 17h17
  5. programmation PIC18
    Par invite69ee2a36 dans le forum Électronique
    Réponses: 1
    Dernier message: 22/03/2007, 16h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.