Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

test sprintl et sprintf sur 18F
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » lun. 21 sept. 2020 18:55

Bonsoir,

je n'avais pas , jusqu'à maintenant utilisé sprintl (lib mikroC)
preferant la fonction de conversion en string : LongToStr
moins gourmande en ressources..
:eek: Ne vla t-il pas que ça marche pâ !

l'un de vous peut-il tester celà ?.. :sifflotte: aurais-je encore buggué!
ecrit pour un 18F26K22 .. mais doit être semblable pour un autre 18F .

Code : Tout sélectionner



 
#define Version "2020_0921"
 // 64MHz

#define FOSC_INTERNE
#define PROCESSOR "18F26K22"
#define Directory "C:\\_MikroC\\_MesProjets_MikroC\\_BASE_18F26K22"
#define Source "Base_18F26K22_minimaliste_Test_sprintL"
#define Projet "Base_18F26K22_UART1_Minimaliste_test_sprintl_sprintf_2020.mcppi"
#define Power_Supply "5V"
#define FOSC1 "64MHz"
#define EEPROM "non"
#define LIBRARIES "adc_to_simili_float_str.mcl"
//"18F26K22_Test_lib_LCD_I2C1_Uart1_PCF8754_Inp_EEPROM.ihex"
#define Config "P18F26K22_Fosc_interne_16x4_64MHz.cfgsch"


//     ac:pinout

  //


/*
 PCF8574P-2  8 bits PORT I2C   DIP16
 Adresse   @= 40 + adresse<<1 => @ = 0x46
 1  A0=1
 2  A1=1
 3  A2=0
 4  P0
 5  P1
 6  P2
 7  P3
 8 VSS   GND
 9  P4
 10 P5
 11 P6
 12 P7
 13 /INT
 14 SCL I2C
 15 SDA I2C
 16 + VDD

*/


#define BAUD 19200  // UART1
#define CLS 12
#define CR 13
#define LF 10
#define TAB 9
#define BACK 8
#define Beep 7      // ou \a
#define Separator 0x20   // space
#define ON 1
#define OFF 0

const char chaine0[]=" Directory: "Directory"\r\n";
const char chaine1[]=" Projet : "Projet "\r\n";
const char chaine2[]=" Alim. = "Power_Supply"\r\n";
const char chaine3[]=" Config : "Config"\r\n";
const char chaine4[]=" FOSC interne "FOSC1"\r\n";
const char chaine5[]=" Source "Source" Version :"Version"\r\n" ;
const char chaine6[]=" Port Hard UART1 19200,N,8,1 (RC6=TX RC7=RX) \r\n";
const char chaine7[]=" Init RA0,1,2 as Analog Input \r\n";
const char chaine8[]=" Test fonction sprintl, sprintf,  Librairies MikroC \r\n";
const char chaine9[]=" \r\n";
const char chaine10[]="\r\n";

const unsigned char *RS_Str[]={chaine0,chaine1,chaine2,chaine3,chaine4,chaine5 ,chaine6,chaine7,chaine8,chaine9,chaine10};
const code char mesg0[]="                   ";

sbit Led_Rouge at LATA4_bit;
sbit Led_Rouge_Dir at TRISA.B4;

unsigned  char TEXTE[80]; // needed also by pointer txt !
unsigned char * txt;
unsigned char CRam1[64];
unsigned int i,j,k,l;
unsigned long L1;

#include "built_in.h"     // for  Hi  Lo ..etc

void Init_Hardware(void) ;
void CRLF1(void);
void UART1_Write_CText(const char *txt);

 void Init_Hardware()
{
  PORTB = 0xFF;
  TRISB = 0x83;    //  B0,B1 as input   ATTENTION B7 B6 for ICSP Pickit3
  ANSELB=0;
  INTCON2.RBPU=0;  // enable All pull up
  WPUB=0xFF;       // any pin pull up
  CM1CON0=0;
  CM2CON0=0;

  PORTA = 0;
  ANSELA=0;
  ANSELA.ANSA2=1;    //  analog input on Port A2   voir page 154
  TRISA = 0b00001111 ;   // PORTA is RA0,1= analog input  RA2=sortie DAC RA3,4,5=Digital output
  PORTA=0;
  Led_Rouge_Dir=0;
  Led_Rouge=OFF;

  PORTC = 0x00;          // RC0..RC5,RC7 = input RC6=Output
  ANSELC=0;
  TRISC = 0x00;    //
  // CM1CON0=0;       // disable comparators

  TRISC.TRISC3 = 0;  // SCL I2C
  TRISC.TRISC4 = 1;  // SDA I2C
  TRISC.TRISC7 = 1;  // RX - UART1
  TRISC.TRISC6 = 0;  // TX - UART1

  SLRCON=0; // standard rate for PORTA,B,C,D,E
 }

 void CRLF1()
{
 UART1_Write(CR);
 UART1_Write(LF);
}
void Print( char *txt)
 {
   while (*txt)
      UART1_Write(*txt++);
}

void CPrint(const char *txt)
 {
   while (*txt)
      UART1_Write(*txt++);
}


void main()
 {

  OSCTUNE=0;
  OSCCON = 0b01110000  ; //0x70 ;     //Oscillateur à 16Mhz si usage PLL
  OSCTUNE.PLLEN=1    ;   // 1= avec PLL => 32Mhz    0 =sans PLL => 8Mhz
  OSCCON2=0;
  while (OSCCON.HFIOFS==0); // wait stable oscillator

  Init_Hardware() ;
  Led_Rouge=ON;
  
  UART1_Init
(19200);  // Initalize USART (38400,8,N,1)
  Delay_ms(100);
  UART1_Write(CLS);   // Erase screen terminal  :it is an option on Vbray Terminal!
  CRLF1();
  Delay_ms(500);
  j=0;
  l=0;
  txt=&TEXTE[0];
  // presentation
  for (i=0;i<11;i++)
  {
    CPrint(RS_Str[i]);
    Delay_ms(100);
    }
  Led_Rouge=OFF;


  for(i=0;i<80;i++) TEXTE[i]=0;
  txt=&TEXTE[0];
  CRLF1();
  
  CPrint
( " Tests sur unsigned long L1 \r\n");
  L1=123456;
  CPrint( " 1) L1=123456  ..avec LongToStr ");
  txt=&TEXTE[0];
  LongToStr(L1,txt);
  Print(txt);
  CRLF1();

   CPrint( " 2) L1=123456 ..avec sprintL %8d : ");
   TEXTE[0]=0;
   txt=&TEXTE[0];
   L1=123456;
   sprintl(txt, "%8d",L1);
   Print(txt);
   CRLF1();
  
   CPrint
( " 3) L1=123456 ..avec sprintL %8u : ");
   TEXTE[0]=0;
   txt=&TEXTE[0];
   L1=123456;
   sprintl(txt, "%8u",L1);
   Print(txt);
   CRLF1(); 
   
   CPrint
( "\r\n sprintf ne peut pas gerer les entiers long !!!!");
   CPrint( "\r\n sprintf ne peut pas gerer  les octets !!!!\r\n sinon utiliser un cast  : (int)byte\r\n");
   
    CRLF1
();
  
   CPrint
( " Tests sur unsigned int 16 bits K \r\n");
   k=65535;
   CPrint( " 1) K=65535  ..avec sprintF %8d : ");
   TEXTE[0]=0;
   txt=&TEXTE[0];
   sprintf(txt, "%8d",k);
   Print(txt);
   CRLF1();
  
   k
=65535;
   CPrint( " 2) K=65535  ..avec sprintF %8u : ");
   TEXTE[0]=0;
   txt=&TEXTE[0];
   sprintf(txt, "%8u",k);
   Print(txt);
   CRLF1();

  while(1);
 }
 
/*
-------------------------------------------------------------

<FF>
 Directory: C:\_MikroC\_MesProjets_MikroC\_BASE_18F26K22
 Projet : Base_18F26K22_UART1_Minimaliste_test_sprinl_sprinf_2020.mcppi
 Alim. = 5V
 Config : P18F26K22_Fosc_interne_16x4_64MHz.cfgsch
 FOSC interne 64MHz
 Source Base_18F26K22_minimaliste_Test_sprintL Version :2020_0921
 Port Hard UART1 19200,N,8,1 (RC6=TX RC7=RX)
 Init RA0,1,2 as Analog Input
 Test fonction sprintl, sprintf,  Librairies MikroC




le projet mikroC

Base_18F26K22_UART1_Minimaliste_test_sprintl_sprintf_2020.zip


qui donne ce resultat
INCORRECT pour le long L1 !


Directory: C:\_MikroC\_MesProjets_MikroC\_BASE_18F26K22
Projet : Base_18F26K22_UART1_Minimaliste_test_sprinl_sprinf_2020.mcppi
Alim. = 5V
Config : P18F26K22_Fosc_interne_16x4_64MHz.cfgsch
FOSC interne 64MHz
Source Base_18F26K22_minimaliste_Test_sprintL Version :2020_0921
Port Hard UART1 19200,N,8,1 (RC6=TX RC7=RX)
Init RA0,1,2 as Analog Input
Test fonction sprintl, sprintf, Librairies MikroC



Tests sur unsigned long L1
1) L1=123456 ..avec LongToStr 123456
2) L1=123456 ..avec sprintL %8d : -7616
3) L1=123456 ..avec sprintL %8u : 57920

sprintf ne peut pas gerer les entiers long !!!!
sprintf ne peut pas gerer les octets !!!!
sinon utiliser un cast : (int)byte

Tests sur unsigned int 16 bits K
1) K=65535 ..avec sprintF %8d : -1
2) K=65535 ..avec sprintF %8u : 65535

Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

test sprintl et sprintf sur 18F
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » lun. 21 sept. 2020 20:38

Bonsoir, pour les long int il faut ajouter un préfixe "%8ld" ou "%8lu".
Le compilateur aurait dû t'envoyer un warning.

test sprintl et sprintf sur 18F
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » lun. 21 sept. 2020 20:42

Bonsoir Satinas,

je viens tout juste de le decouvrir malgré ce post

https://forum.mikroe.com/viewtopic.php? ... tl#p214675
aCkO
Posts: 1119
Joined: 14 Feb 2011, 05:07
Location: Bar, Montenegro
Contact: Contact aCkO
Re: sprintl help...
Report Quote
#5 Unread post by aCkO » 24 May 2013, 21:51
You cannot use sprintl on unsigned long. Use LongWordToStr from Conversions library.
Regards


OK , ça marche sur long signé ou pas !

Code : Tout sélectionner



  CPrint
( " Tests sur unsigned long L1 \r\n");
  L1=123456;
  CPrint( " 1) L1=123456  ..avec LongToStr ");
  txt=&TEXTE[0];
  LongToStr(L1,txt);
  Print(txt);
  CRLF1();

   CPrint( " 2) L1=123456 ..avec sprintL %8Ld : ");
   TEXTE[0]=0;
   txt=&TEXTE[0];
   L1=123456;
   sprintl(txt, "%8Ld",L1);
   Print(txt);
   CRLF1();
  
   CPrint
( " 3) L1=123456 ..avec sprintL %8Lu : ");
   TEXTE[0]=0;
   txt=&TEXTE[0];
   L1=123456;
   sprintl(txt, "%8Lu",L1);
   Print(txt);
   CRLF1(); 
   
   CPrint
( "\r\n sprintf ne peut pas gerer  les entiers long !!!!");
   CPrint( "\r\n sprintf ne peut pas gerer les octets !!!!\r\n sinon utiliser un cast  : (int)byte\r\n");
   CPrint( "\r\n malgré l'usage de sprintl dédié aux entiers longs, il FAUT AUSSI specifier L pour le format \r\n");

    CRLF1();
  
   CPrint
( " Tests sur unsigned int 16 bits K \r\n");
   k=65535;
   CPrint( " 1) K=65535  ..avec sprintF %8d : ");
   TEXTE[0]=0;
   txt=&TEXTE[0];
   sprintf(txt, "%8d",k);
   Print(txt);
   CRLF1();
  
   k
=65535;
   CPrint( " 2) K=65535  ..avec sprintF %8u : ");
   TEXTE[0]=0;
   txt=&TEXTE[0];
   sprintf(txt, "%8u",k);
   Print(txt);
   CRLF1();
 


Tests sur unsigned long L1
1) L1=123456 ..avec LongToStr 123456
2) L1=123456 ..avec sprintL %8Ld : 123456
3) L1=123456 ..avec sprintL %8Lu : 123456

sprintf ne peut pas gerer les entiers long !!!!
sprintf ne peut pas gerer les octets !!!!
sinon utiliser un cast : (int)byte

malgré l'usage de sprintl dédié aux entiers longs, :furieux: il FAUT AUSSI specifier L pour le format

Tests sur unsigned int 16 bits K
1) K=65535 ..avec sprintF %8d : -1
2) K=65535 ..avec sprintF %8u : 65535


:!!: au final, sprintl .. à eviter !
Aide toi, le ciel ou FantasPic t'aidera

test sprintl et sprintf sur 18F
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#4 Message par satinas » lun. 21 sept. 2020 20:51

Encore une fonction qui sert à rien, à part compliquer les choses.

test sprintl et sprintf sur 18F
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#5 Message par venom » lun. 21 sept. 2020 21:18

Roooo la la.

Déjà que l'électronique est pas facile, mais là ils mettent (volontairement) des barons dans les roues non ???

Paulfjujo va devenir debugger officiel chez mikroc non :-D
dehors!!






@++
Mon site web
Mon discord : venom#4888


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 33 invités