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

problemo avec UART Write text de taille > 256 octest
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3262
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » ven. 6 mai 2016 15:55

bonjour,

j'aurais pu poster mon probleme sur MikroC, mais c'est peut etre plus instructif ici
le malheur des uns faisant le bonheur des autres

Je travaille sur le module WIFI-click 3 et veut pouvoir definir une page web > 256 octets.
il y a la place pour ...
A un moment donné on envoi le contenu de la page web au module WIFI,
mais deja, rien qu'au niveau de l'UART je trouve une limitation ..
impossible d'envoyer 286 cars en 1 seule fois via la fonction mikroC
UART1_Write_Text..
debordement de variable quelque par => affolement du programme
alors que si je scinde en 2 l'envoi .. OK no problemo avec 2 demi pages.(taille 2x142)

OU SERAIT-DONC cette limite ?
je n'ai pas décomposé le listing ASM correspondant pour y chercher une reponse... si j'ecris en C, c'est pas pour me casser la tete en ASM.
et pourtant comme dirait Maî .. ASM quand tu nous tiens.. +1 on te tiens aussi.

voici le bout de code concerné :

Code : Tout sélectionner

#define Version "160506"
#define Projet  "WiFI3_Serveur_18F87J50_UART1_2_LCD_I2C2_Mai_2016.mcppi"
//#define Source "WiFI3_Serveur_UART2_UART1_LCD_I2C_HID_mikrobus1"
#define Source "test_envoi_page_HTML_"
// Tools  -> Options -> cocher Case sensitive
#define  Nom_Reseau_Wifi "ON_Air"
#define  Mot_de_Passe ""
#define With_UART

     //ac:Interliaisons_PIC_Wifi3
  
     
//ac:Pinout_18F87J50
     
      
//ac:datasheet

/* **************************************
PIC18FxxJxx Specifics
Shared Address SFRs
mikroC PRO for PIC does not provide auto setting of bit for acessing alternate register.
 This is new feature added to PIC18fxxJxx family and will be supported in future. 
 In several locations in the SFR bank, a single address is used to access two 
 different hardware registers. In these cases, a “legacy” register of the standard PIC18
 SFR set (such as OSCCON, T1CON, etc.) shares its address with an alternate register.
 These alternate registers are associated with enhanced configuration options for peripherals,
 or with new device features not included in the standard PIC18 SFR map.
 A complete list of shared register addresses and the registers associated with them
 is provided in datasheet.
************************************** 
*/


// .. PB Timer0"
// passe à FOSC 8MHz interne  au lieu de 48Mhz
// problemes liés à la taille RAM de buffer1 et buffer2 de 300
// si taille limitée à 256, l'interrupt timer0 repond bien
// par contre il faut veiller à ce que buffer2 ne deborde pas
// surtout avec la commande de decouverte reseau..
//
// int Send_Cde_Test_response(const char *cde,const char * answ)
// pour liste des reseaux dispo
//  Activation IT RXW UART1 pour cde directe modukle WIFI3
// modif UART2 à 19200 bauds
//carte clicker2 18F87J50 cramée en envoyant +12V sur VSYS bornier (5V)!
// mais encore operationelle si alimentée en 3,3V (hormis la partie 5V et chargeur de batterie)

/*

  Test configuration:
     MCU:             PIC18F87J50
     Dev.Board:       PICClicker2
     Oscillator:      HS-PLL 32.0000 MHz, 8.0000 MHz Crystal
     ext. modules:    wifi3 click board - 
                      UART2 + terminal VBRAY
     SW:              mikroC PRO 6.50 for PIC
  NOTES:
     - Place WiFi3 click board in the mikroBUS socket #1
     - Put power supply jumper (J5) on the EasyPIC7 board in 3.3V position.
     - Configure SSId, password and port to match your network settings.
     - Use UDP terminal tool to connect to the WiFi module and send data to it.
     */
     
//MicroBus Socket #1
//--- left ---------
//RA0     AN    STAT
//RD2     RST   POWERKEY
//---- right -------
//RG3     PWM   RI    PWD
//RB3     INT   CTS   GIO15
//RG2     RX   TXD
//RG1     TX   RXD
//
// nota: PIC 18F87J50 Clicker2
// Pins reservés , non utilisables
// RJ5  Stat
// partie Alim carte
// RF6 Vsense
// RE2 input  Test presence alim USB
// RE5 Sensel
// RE6   Fault
//
// RD4  affecté à LD1  LED tirée au Gnd   1= Allumée
// RE4 affecté à LD2   LED tirée au Gnd   1= Allumée
// RD7 affecté à T2  BP1   tiré au +Vcc  1= BP Ouvert
// RH3 affecté à T3  BP2   tiré au +Vcc  1= BP Ouvert
//  LCD éx16 car sur I2C2
// RD6  SCL I2C2  --> LCD2119 pin 3  fil vert
// RD5  SDA I2C2  --> LCD2119 pin4   fil jaune
//  +3,3V ----------  LCD2119 pin2   fil rouge
//  Gnd   ----------  LCD2119 pin1   fil Noir

//#include "WiFI3_click_UART2_.h"

#define Lo(param) ((char *)&param)[0]
#define Hi(param) ((char *)&param)[1]

 //-- commandes terminal VT220
#define CLS 12     // effacement de page sur Terminal VBRAY
#define CR 13
#define VT 10
#define LF 10
#define TAB 9
#define Bell 7



unsigned  char WebPage[768];
unsigned const char WebHead[]=
"<html>\
<head>\
<meta http-equiv=\"Content-Type\"\
content=\"text/html; charset=iso-8859-1\">\
<meta http-equiv=\"refresh\" content=\"10\">\
<title>WIFI3-Click</title>\
</head>\
<body>\
<h2><br>"
;
unsigned char WebVar0[]="Temper. Ext :<br> 10.54 °C<br>";
unsigned char WebVar1[]="Temper. Amb :<br> 17.63 °C<br>";
unsigned char WebVar2[]="BP1 = x<br>";
unsigned char WebVar3[]="BP2 = x<br>";
unsigned char WebVar4[]="Idx = xxx<br>";
unsigned const char WebTail[]= "</h2></body></html>" ;

#define Byte unsigned Char
#define Word unsigned int

#define MAXLEN1 255
 unsigned char buffer1[MAXLEN1];

static char msg[128];
static char TEXTE[256];
char CRam1[80];
char *txt;
unsigned char  *p;
unsigned char Web_Status='0';
Word PageLen;

unsigned int Index1=0;
unsigned int i1=0;
unsigned int UART1_DataReady=0;
unsigned char c1=0;
unsigned char cx;

unsigned int i,j,k;
unsigned int Flag_Timer0;
unsigned int Cpt0;
int Vbray;
int Max_Timer0=2;
unsigned int Flag_Timer1;
unsigned int Cpt1;



unsigned int EAx,EA0,EA1,EA2;
float Degres1,Degres2;

char received_data[16], ip_address[16];
unsigned char tmp;
unsigned int Step;
unsigned char IPD=0;


 // module connections  click#1
sbit CH_PD  at LATA0_bit;      // resert pin
sbit GPIO15 at LATD2_bit;
sbit CH_PD_Direction  at LATA0_bit;
sbit GPIO15_Direction at LATD2_bit;

// LEDs on PIC18F87J50  Clicker2
sbit LD1 at LATD4_bit;
sbit LD2 at LATE4_bit;
sbit LD1_Direction at TRISD4_bit;
sbit LD2_Direction at TRISE4_bit;

// BPs on PIC18F87J50 Clicker2
sbit BP1 at RD7_bit;
sbit BP2 at RH3_bit;
sbit BP1_Direction at TRISD7_bit;
sbit BP2_Direction at TRISH3_bit;

void strConstRamCpy(char *dest, const char *source);
void Init_ADC(void);
void CRLF1(void) ;
void UART1_Write_CText(const char *txt);
void RAZ_UART1(void);

void Float2Ascii (float x, unsigned char *str,char precision);


// interrupt handler
void Interrupts() iv 0x0008 ics ICS_AUTO
{
      //UART1
  if((RC1IF_bit==1) && (RC1IE_bit==1))
  {
      c1 = RCREG1;
     //TXREG1='*';
     if(OERR1_bit)
      {
       CREN1_bit = 0;
       CREN1_bit = 1;
       OERR2_bit = 0;
      }
     if(FERR1_bit)
     {
       c1 = RCREG1;
     }

     if ((c1==13) || (i1>MAXLEN1))    //|| (c1==10))
      {
      UART1_DataReady=1;
      buffer1[i1]=0;
      Index1=i1;
      i1=0;
      c1=0;
     }
     else
     
{
        if (c1>0)
        {
           buffer1[i1]=c1;
           Index1=i1;
           i1++;
        }
      }

   }
}


void Float2Ascii (float x, unsigned char *str,char precision)
{
 /* converts a floating point number to an ascii string */
 /* x is stored into str, which should be at least 30 chars long */
 int ie, i, k, ndig;
 double y;
 ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
 ie = 0;
 /* if x negative, write minus and reverse */
 if ( x < 0)
 {
   *str++ = '-';
   x = -x;
 }
 /* put x in range 1 <= x < 10 */
 if (> 0.0) while (< 1.0)
 {
   x *= 10.0;                // a la place de =*
   ie--;
 }
 while (>= 10.0)
 {
   x = x/10.0;
   ie++;
 }
 // in f format, number of digits is related to size
 ndig += ie;                                // a la place de =+
 //round. x is between 1 and 10 and ndig will be printed to
 // right of decimal point so rounding is ...
 for (= i = 1; i < ndig; i++)
 y = y/10.;
 x += y/2.;
 if (>= 10.0) {= 1.0; ie++;}
 if (ie<0)
 {
   *str++ = '0'; *str++ = '.';
   if (ndig < 0) ie = ie-ndig;
   for (= -1; i > ie; i--)  *str++ = '0';
 }
 for (i=0; i < ndig; i++)
 {
   k = x;
   *str++ = k + '0';
   if (==  ie ) *str++ = '.';
   x -= (y=k);
   x *= 10.0;
  }
 *str = '\0';
}


// --- Copie le texte depuis ROM vers RAM
void strConstRamCpy(char *dest, const char *source) 
{
  while(*source) *dest++ = *source++ ;
  *dest = 0 ;    // terminateur
}


 void Init_ADC()
 {
  //config lecture ADC 10 bits
  ADCON0.VCFG1=0;  // - AVss=Gnd;
  ADCON0.VCFG0=0;  // +Avdd;
  ADCON0.CHS3=0;  // channel1
  ADCON0.CHS2=0;
  ADCON0.CHS1=0;
  ADCON0.CHS0=1;
  ADCON0.ADON=1;      // ADC enabled

  ADCON1.ADFM=1;     // right justified
  ADCON1.ADCAL=0;
  ADCON1.ACQT2=1;
  ADCON1.ACQT1=1;
  ADCON1.ACQT0=0;    // 110=> 16 TAD
  ADCON1.ADCS1=1;
  ADCON1.ADCS2=1;
  ADCON1.ADCS0=0;    // 110 => Fosc/64
 }


void UART1_Write_CText(const char *txt1)
 {
   while (*txt1)
      UART1_Write(*txt1++);
}

void CRLF1()
{
 UART1_Write(CR);
  UART1_Write(LF);
 }
 
 void RAZ_UART1
()
{
     RC1IE_bit=;
      for (Index1=0;Index1<MAXLEN1;Index1++) buffer1[Index1]=0;
      Index1=0;
      i1=0;
      UART1_DataReady=0; 
      c1
=0;
      RC1IE_bit=;
}


void Hardware_Init(void)
 {
  TRISG=0xFF;
  TRISA=0xFF;
  TRISB=0xFF ;
  TRISC=0xFF;
  TRISD=0xFD;
  TRISE=0xFF;   //  all input
  TRISH=0xFF;   //  all input
  //ADSHR_bit = 1;  // plante si lecture ADC
  //REGISTER 21-3: ANCON0: A/D PORT CONFIGURATION REGISTER 2
  ANCON0=0xFF ; // 0= analog   1= digital
  ANCON0.F4=1; // PCFG4_bit=1; // RA4 digital
  ANCON0.F3=1; // PCFG3_bit=1; // RA3 digital
  ANCON0.F2=0; // PCFG2_bit=0; // RA2 Analog inp
  ANCON0.F1=0; // PCFG1_bit=0; // RA1 Analog inp
  ANCON0.F0=1; // PCFG0_bit=1; // RA0 digital
// REGISTER 21-4: ANCON1: A/D PORT CONFIGURATION REGISTER 1
  ANCON1=0xFF; // No analog on AN15--AN10
 // 2 BP poussoir clicker2
  BP1_Direction = 1;      // Set direction for buttons
  BP2_Direction = 1;     // RH3
  // 2 Leds sur cliker2
  LD1_Direction = 0;     // Set direction for LEDs
  LD2_Direction = 0;
  LD1 = 0;                // turn off LEDs
  LD2 = 0;
  //
  CH_PD_Direction=0;
  GPIO15_Direction=0;
  }
  



void main
() 
{
// internal FOSC=8Mhz
  OSCTUNE=0;
  OSCTUNE.PLLEN = 1;
  OSCCON.IDLEN=0;
  OSCCON.IRCF2=1;  // 8Mhz
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=1;
  //11 = Postscaled internal clock (INTRC/INTOSC derived)
  // periferc idem as FOSC
  OSCCON.SCS1=1;
  OSCCON.SCS0=1;
  while(OSCCON.OSTS==0);
  
  Hardware_Init
();
  
  ADC_Init
();

  Delay_ms(250);
  // Initialize variables
  k=0;
  tmp = 0;
  Vbray=0;

  i = 0;
  UART1_Init(19200);
  UART1_Write(CLS);
  Delay_ms(500);
  CRLF1();
  UART1_Write_CText("Projet : "Projet"\r\n");
  UART1_Write_CText(Source"_"Version"c\r\n");
  UART1_Write_CText("FOSC interne 8Mhz  USB at 48MHz\r\n");
  UART1_Write_CText("Uart1 19200 bds =  Espion/debugging \r\n");
  UART1_Write_CText("TEST envoi page HTML > 256 cars\r\n");
  UART1_Write_CText("Page Web 768 cars maxi\r\n");

  CRLF1();
  RAZ_UART1();
  txt=&TEXTE[0];

  CRLF1();

         UART1_Write_CText("\r\n TEST PAGE HTML \r\n");
            // refresh Datas
          EA1=ADC_Read(1);
          Degres1=(float)EA1*330/1024;      // 10mV par degres C
          sprintf(txt,"% 2.2f",Degres1);
          memcpy(WebVar0+17,txt,5);

          EA2=ADC_Read(2);
          Degres2=(float)EA2*330/1024;      // 10mV par degres C
          sprintf(txt,"% 2.2f",Degres2);
          memcpy(WebVar1+17,txt,5);

          WebVar2[6]=BP1+48;
          WebVar3[6]=BP2+48;

          // build WebPage
          strConstRamCpy(WebPage,WebHead);
            k=strlen(WebPage);
     WordToStr(k,CRam1);
     UART1_Write_CText("1_ ");UART1_Write_Text(CRam1);CRLF1();
            
          strcat
(WebPage+k,WebVar0);
            k=strlen(WebPage);
     WordToStr(k,CRam1);
     UART1_Write_CText("2_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(WebPage+k,WebVar1);
            k=strlen(WebPage);
     WordToStr(k,CRam1);
     UART1_Write_CText("3_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(WebPage+k,WebVar2);
            k=strlen(WebPage);
       WordToStr(k,CRam1);
     UART1_Write_CText("4_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(WebPage+k,WebVar3);
            k=strlen(WebPage);
          WordToStr(k,CRam1);
     UART1_Write_CText("5_ ");UART1_Write_Text(CRam1);CRLF1();
          strcat(WebPage+k,WebVar4);
            k=strlen(WebPage);
          WordToStr(k,CRam1);
     UART1_Write_CText("6_ ");UART1_Write_Text(CRam1);CRLF1();
          strConstRamCpy(WebPage+k,WebTail);

         IPD=48;
         strConstRamCpy(msg,"AT+CIPSEND=x,");
         msg[11]= IPD;
         k=strlen(msg);
         PageLen=strlen(WebPage);
         WordToStr(PageLen,CRam1);
         strcat(msg+k,Ltrim(CRam1));

        UART1_Write_CText("Envoi msg : ");
        UART1_Write_Text(msg);CRLF1();
        
        UART1_Write_CText
("\r\n\r\nVersion avec 2 envoi separé de 2 demi  WebPage =OK  \r\n");
        for (i=0;i<PageLen/2;i++)   UART1_Write(WebPage[i]);
        for (i=PageLen/2;i<PageLen;i++)   UART1_Write(WebPage[i]);
        CRLF1();
        UART1_Write_CText("\r\n\r\nFin du test #1 \r\n");
          // L=284 //OK si envoi en 2 passes
        UART1_Write_CText("\r\n\r\nVersion avec 1 seul envoi de Webpage complet = problemo \r\n");
        UART1_Write_Text(WebPage);
        CRLF1();
         // problemo
        //   L=258 cars ?????   au lieu de 284  si envoi en 1 seule foisfor (i=0;i<PageLen/2,i++)   UART1_Write(WebPage[i
       UART1_Write_CText("\r\n\r\nFin du test #2 \r\n");
   while(1);

   }



et les 2 resultats correspondants : envoi en 2 fois ou envoi en 1 fois => plantage
TEST PAGE HTML
1_ 170
2_ 200
3_ 230
4_ 241
5_ 252
6_ 265
Envoi msg : AT+CIPSEND=0,284
Version avec 2 envoi separé de 2 demi WebPage =OK
<html><head><meta http-equiv="Content-Type"content="text/html; charset=iso-8859-1"><meta http-equiv="refresh" content="10"><title>WIFI3-
Click</title></head><body><h2><br>Temper. Ext :<br> 55.74 °C<br>Temper. Amb :<br> 168.3 °C<br>BP1 = 1<br>BP2 = 1<br>Idx = xxx<br></h2></body></html>
Fin du test #1 Taille texte=286 - CRLF => 284 cars ..OK


Version avec 1 seul envoi de Webpage complet = problemo
<html><head><meta http-equiv="Content-Type"content="text/html; charset=iso-8859-1"><meta http-equiv="refresh" content="10">
<title>WIFI3-Click</title></head><body><h2><br>Temper. Ext :<br> 55.74 °C<br>Temper. Amb :<br> 168.3 °C<br>BP1 = 1<br>BP2 =
1<br>Idx <html><head><meta http-equiv="Content-Type"content="text/html; charset=iso-8859-1"><meta http-equiv="refresh"
content="10"><title>WIFI3-Click</title></head><body><h2><br>Temper. Ext :<br> 55.74 °C<br>Temper. Amb :<br> 168.3 °C<br>BP1 =
1<br>BP2 = 1<br>Idx <html><head><meta http-equiv="Content-Type"content="text/html; charset=iso-8859-1"><meta http-equiv="refresh"
content="10"><title>WIFI3-Click</title></head><body><h2><br>Temper. Ext :<br> 55.74 °C<br>Temper. Amb :<br> 168.3 °C<br>BP1 = 1
<br>BP2 = 1<br>Idx <html><head><meta http-equiv="Content-
Aide toi, le ciel ou FantasPic t'aidera

problemo avec UART Write text de taille > 256 octest
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » ven. 6 mai 2016 16:09

Bonjour Paul,

Toujours aussi impressionnant tes programmes !

Sinon le tout premier truc qui me chagrine, même si je-doute que ce soit cela : c'est (taille 2x142) ??? La moitie de 286 c'est 143 ?
as tu essayé en envoyant deux fois 143 ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

problemo avec UART Write text de taille > 256 octest
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3262
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » ven. 6 mai 2016 16:34

Jérémy a écrit :Sinon le tout premier truc qui me chagrine, même si je-doute que ce soit cela : c'est (taille 2x142) ??? La moitie de 286 c'est 143 ?
?

:idea: Oui, tout à fait Thierry !

mais en fait ma page web fait 284 octets + CR +LF =286
et j'envoi 2x142 + CRLF
de plus il n'y a pas de probleme avec ces envois de taille < 256
c'est lorsque j'envoi 284 octest + CRLF

J'ai d'ailleurs remarqué aussi que les fonction strpbrk posaient probleme lors de recherche dans une chaine de caractere depassant 256 octets
MikroC ne daigne pas repondre sur ce point là ..

je me demande si les pointeurs de chaine de car ne sont pas limités à une byte non signé..
ou alors , encore ce probleme de franchissement de Page avec les PIC

il y avait une notion de "far pointer" en TurboC..
Des idées ? suggestions ? doc à lire ?
Aide toi, le ciel ou FantasPic t'aidera

problemo avec UART Write text de taille > 256 octest
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#4 Message par Guest » ven. 6 mai 2016 19:28

bonjour paul

AMHA tu nais pas loin de la vérité débordement variable de 0 a255 :wink:

problemo avec UART Write text de taille > 256 octest
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#5 Message par Guest » sam. 7 mai 2016 08:04

bonjour

Bon j'ai fait, pour toi le contrôle en ASM ça passe ,tout droit sous xc8 avec un tableau char ,de 280 cases et un pointeur (int *p ) sur le tableau sous 18F donc amha revoir si tu peux :
void UART1_Write_CText(const char *txt1)

A+

problemo avec UART Write text de taille > 256 octest
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3262
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » sam. 7 mai 2016 16:41

bonjour,

et merci Maî de te pencher sur mon probleme,
mais je n'ai pas bien saisi ta réponse

void UART1_Write_CText(const char *txt1)?

j'utilise plutot UART1_Write_Text qui est une fonction (non modifiée) issue de la bibliotheque UART MikroC
car je cumule mes morceaux de donnees dans la table en ram :
unsigned char WebPage[768];

si je met un pointeur entier int *p;
il est sensé pointer sur des entiers et plus sur des caracteres (ou byte)
et je ne recupererait qu'un char sur 2 ,puisque le déplacement pointeur se fait sur un pas de integer .
le code ci dessou le montre...

Code : Tout sélectionner


unsigned  char WebPage
[768];
int *Pint;
...
 for (i=0;i<768;i++) WebPage[i]=(unsigned char)i;
  CRLF1();
  Pint=&WebPage[32];
  for (i=32;i<97;i++)  UART1_Write(*Pint++);
  CRLF1();

resultat sur terminal:
16:23:34.546> Init de la Page Web 768 cars maxi
16
:23:34.546> 
16
:23:34.609>  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž 



Je me suis replongé dans TurbO C2.00 (annees 70-80) ou j'avais utilisé à foison
les far pointeurs, malloc et compagnie..
en fait j'avais completement zappé qu'avec ce PIC évolué (18F87J50, )
il y malloc comme librairie mikroC ..
il me reste donc à l'essayer

Code : Tout sélectionner

void *Malloc(unsigned long Size); 


ça ne dit pas non plus , quel est le range du pointeur ainsi crée..
on pourrait supposer que c'est un pointeur long ,pour pouvoir balayer l'espace ainsi alloué..
je m'en vais le verifier..

A suivre ..
Aide toi, le ciel ou FantasPic t'aidera

problemo avec UART Write text de taille > 256 octest
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#7 Message par Guest » sam. 7 mai 2016 17:23

Regarde la decompli
Capture 1.png


Texte est un tableau de 280 cases située en RAM a la position 0XE68 dans un pointeur sur 16bits LIG COL qui sont des variables locaux ICI il les récupérés ,donc un int, XC8 fait cela tout seul (la RAM fait plus de 256 octets)donc normale int , c'est la routine d’écriture d'un LCD et cela roule sur les 280 cases, ou alors c'est moi qui n'est pas bien compris.(il est vrai que je suis un peu a l'aise avec ma RAM

mais tu as raison je me suis tres mal exprimer plus haut mille excuses :wink:et même un peu planté. Je penche pour un problemo microC ou un problème gestion OUI de RAM car je supposes que ton appli en est gourmande ?????

Tient tu en es a combien en % de RAM ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

problemo avec UART Write text de taille > 256 octest
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3262
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#8 Message par paulfjujo » dim. 8 mai 2016 16:31

bonjour,

18F87J50 clicker2 board
Total RAM : 3883 bytes
Used RAM (bytes): 1946 (50%) Free RAM (bytes): 1937 (50%)
HEAP RAM (bytes): 1152 HEAP RAM (bytes): 1152
Used ROM (bytes): 24186 (18%) Free ROM (bytes): 106878 (82%)




J'ai isolé mon probleme dans un fichier plus court..
projet ci joint en zip.
18F87J50_UART1_Malloc_strstr_Tests.zip

L'usage de malloc n'apporte rien ...
d'ailleurs je ne comprend pas pourquoi il faut déclarer au prealable un tableau à la taille voulue ?
pour ensuite utiliser malloc ...
en turboC .. c'etait bien l'allocation memoire qui definissait la table de taille voulue..face au pointeur idoine.

Bref, le probleme avec UART1_Write_Text .. reste entier .
plantage systematique au dessus de 256 car..
contre mesure immediate:
refaire une nouvelle procedure UART1_Write_String ... Là , c'est ok

resultat sur terminal

Projet : 18F87J50_UART1_Malloc_strstr_Tests.mcppi
WiFI3_Serveur_UART2_UART1_LCD_I2C_Malloc_Test__160508c
FOSC interne 8Mhz USB at 48MHz
Uart1 19200 bds = Espion/debugging
Uart2 19200 bds = MCU <--> ESP dialogue
TEST malloc
Activation MemManager pour reserver 3 tables : 320 +320+512 =1152 bytes
Edit Project : cocher et mettre 1152 dans Heap Largest bloc memoire HEAP dispo : 1152
Malloc Pointeur WebPage : OK
Malloc Pointeur buffer1 : OK
Malloc Pointeur buffer2 : OK
RAZ Page Web

TEST PAGE HTML
1_ 170
2_ 200
3_ 230
4_ 241
5_ 252
6_ 265
Envoi msg : AT+CIPSEND=0,284
Envoi WebPage via new fonction UART1_Write_String
<html><head><meta http-equiv="Content-Type"content="text/html; charset=iso-8859-1"><meta http-equiv="refresh" content="10"><title>WIFI3-
Click</title></head><body><h2><br>Temper. Ext :<br> 38.34 °C<br>Temper. Amb :<br> 70.93 °C<br>BP1 = 1<br>BP2 = 1<br>Cpt = xxx<br></h2></body></html>
Test recherche de string dans webpage avec strstr :
Pointeur WebPage = 76A
trouvé Ext : 38.34 °C Pointeur Ext : 0000081C 2076
trouvé BP1 = 1 Pointeur BP1 : 00000850 2128
trouvé BP2 = 1 Pointeur BP2 : 0000085B 2139


j'ai vu aussi que la fonction strpbrk fait aussi n'importe qoui si la taille depasse 256 bytes..
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

problemo avec UART Write text de taille > 256 octest
HULK28
Avatar de l’utilisateur
Amateur
Amateur
Messages : 106
Enregistré en : août 2015
Localisation : IdF

#9 Message par HULK28 » dim. 8 mai 2016 16:43

Salut Paul.

Il y a bien longtemps que j'ai renoncé aux fonctions MikroC toutes faites, certaines sont une catastrophes comme pour le bus CAN par exemple.
Elles sont peu robustes, ça permet de faire un peu de démo tout au plus, ensuite mieux vaut s'en passer.
A l'époque je me suis confronté aux mêmes maux que toi sur l'UART, du coup j'ai totalement réécrit ces fonctions, aujourd'hui je n'utilise plus des fonctions dont je ne connais pas le contenu et les manipulations faites, c'est trop casse gueule.

Je suis par contre très content du compilateur que j'utilise depuis 8 ans maintenant.
Si ça t'intéresse je peux t'envoyer quelques sources pour ton problème.
@+

PS: j'ai aussi utilisé turboC, ça nous rajeunit pas....
"Pour la carotte, le lapin est la parfaite incarnation du mal" -Robert Shecley-

problemo avec UART Write text de taille > 256 octest
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#10 Message par Guest » dim. 8 mai 2016 17:52

Ce n'est pas une question de RAM ,reste MICROC, fait la fonction "écriture", en ASM tu sais faire ,ou même déjà faite :wink:


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités