je n'avais pas , jusqu'à maintenant utilisé sprintl (lib mikroC)
preferant la fonction de conversion en string : LongToStr
moins gourmande en ressources..
l'un de vous peut-il tester celà ?..
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
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


au final, sprintl .. à eviter !