Autor Tema: Problema con espacio de memoria para creacion de variables tipo vector  (Leído 3020 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cramorales

  • PIC10
  • *
  • Mensajes: 6
Señores, Buenas las tengan.....

Soy nuevo en este foro y acudi a el porque necesito una colaboración por parte suya, conozco que aqui hay muchos expertos y he buscado el tema, pero no he encontrado mucho.

Estoy haciend un proyecto con micrcocontrolador PIC16F877A y estoy programando en C, utilizando MPLAB con el compilador HT-PIC. El proyecto consiste en tomar muestras de tres corrientes trifásicas en los secundarios de unos TC's y muestras de tres tensiones trifásicas en los secundarios de TP's, luego de tomar las muestras (8 por cada ciclo) se calcula el valor RMS discreto de las señales y se compara con unos valores mínimos determinados, en el caso de que los valores sean menores a los especificados se genera un mensaje de alarma que va a un modem GPRS para enviarlo a un celular. Bien el problema que tengo actualmente es que cuando intento compilar el programa MPLAB me da los siguientes mensajes de error:

Error[000]   : Can't find 0xA7 words for psect rbss_0 in segment BANK0
Error[000]   : Can't find 0x32 words for psect rdata_0 in segment BANK0
Error[000]   : Can't find 0x5 words for psect temp in segment COMBANK
Error[000]   : Can't find 0x2 words (0x2 withtotal) for psect code_ptr in segment BANK0
BUILD FAILED: Wed Apr 29 14:06:55 2009

Busque en la ayuda en ingles de HT-PIC y lo que entendí es que no se encuentra el espacio especificado en memoria para los terminos que están en negrita en el BANK0.

De igual manera voy a anexar a continuación la declaración de variables del programa para hacerles la pregunta:

/************************Inicialización**********************************************/

#include<pic.h>      /* Libreria para reconocer funciones de microcontrolador PIC*/
#include "delay.h"  /* Libreria para funciones de retardo de tiempo*/

static volatile bit   led1 @ (unsigned)&PORTB*8+1;   /*"led1" es la variable del led indicador de alarma*/
static volatile bit   led2 @ (unsigned)&PORTB*8+2;   /*"led2" es la variable del led indicador de operación*/

/*******Inicializacion de comunicacion serial************/

#define InitUSART() \
    BRGH=1;    \
    SPBRG=25;  \
    SPEN = 1;  \
    SYNC = 0;  \
    TX9 = 0;   \
    RX9 = 0;   \
    CREN = 1;  \
    TXEN = 1;  \
    RCIE=0;
      
short int i1[9],i2[9], i3[9], v1[9], v2[9], v3[9];  /*ix es el vector que almacenará las 8 muestras tomadas a la señal alterna de corriente en un ciclo*/
char i,h;                              /*vx es el vector que almacenará las 8 muestras tomadas a la señal alterna de tensión en un ciclo*/
unsigned long cont1=0, cont2=0, cont3=0, cont4=0, cont5=0, cont6=0, even1=0, even2=0, even3=0; /*acumuladores para hallar el valor RMS de las señales y para contar los segundos que se mantiene la irregularidad*/         
short int rmsi1, rmsi2, rmsi3, rmsv1, rmsv2, rmsv3; /*variables para hallar el valor rms de la señal muestreada*/                     
char mens1[]="AT+CMGF=1";   /*Mensaje de configuración para el Modem*/
char mens2[]="AT+CMGS=\"3118235452\""; /*numero de telefono al que llamara el modem*/
char mens3[]="Problema de medida"; /*Mensaje que enviará el modem al número especificado*/
char mens4[3];   /*vector que almacenará la palabra ok*/

/************************************************************************************/

Como pueden observar he creado 6 vectores con 9 espacios cada uno con variable de tipo int, luego creé 9 variables de tipo long para hacer los cálculos internos con las muestras y hallar el valor rms de cada una de las tensiones y corrientes. Es necesario crear tal cantidad de variables por lo que manejo corrientes trifásicas y tensiones trifásicas, la inquietud que me agobia es si las variables son mucho para la memoria del PIC16F877A o si solamente es que este computador en el que estoy compilando no tiene la capacidad para hacerlo ya que es windows 2000 con muy poca memoria y no he tenido la posibilidad de compilarlo en otro computador.

Por favor necesito su ayuda en esto, cualquier mensaje que pueda sacarme de la duda sería excelente, en el caso de que la memoria del PIC16F877A no de la capacidad para todas esas variables me recomiendan otro microcontrolador o bien me explican como distribuir las variables en diferentes bancos.

Muchas Gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #1 en: 29 de Abril de 2009, 16:33:04 »
HiTech si es para PIC16??
El papel lo aguanta todo

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #2 en: 29 de Abril de 2009, 16:46:24 »
Hola

¿En qué parte del código le indicas que es un 16f877a?

En esta sección:

Código: [Seleccionar]
char mens1[]="AT+CMGF=1";   /*Mensaje de configuración para el Modem*/
char mens2[]="AT+CMGS=\"3118235452\""; /*numero de telefono al que llamara el modem*/
char mens3[]="Problema de medida"; /*Mensaje que enviará el modem al número especificado*/
char mens4[3];   /*vector que almacenará la palabra ok*/

Estás pidiendo 52bytes de ram. Mejor decláralas como constantes para que sean almacenadas en memoria de programa.

El PIC16F877A tiene 368 bytes de ram de uso general, pero seccionada en 4 bancos. Checa la hoja de características y haz una aproximación de si los arreglos que necesitas podrán caber sin partirlos.

Desconectado cramorales

  • PIC10
  • *
  • Mensajes: 6
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #3 en: 29 de Abril de 2009, 17:53:56 »
No indico nunca que es un 16F877A, la libreria pic.h ya tiene todo eso incluido, nunca ha sido necesario especificarlo.

Por otro lado, no se como distribuir los vectores en los diferentes bancos, yo se que son 4 pero eso es lo que me gustaria que me colaboraran, en el datasheet aparece como hacer eso pero en assembler y pues ya saben que manejar C es muy diferente.

Y la verdad no te entiendo como hacer para declararlas como constantes, pienso que es necesario declarar el vector inicializado porque al final voy a enviar a un modem por comunicacion serial todos los caracteres que inicializo en los vectores, por lo que con una función for puedo recorrer el vector y enviar caracter por caracter en vez de enviar dato por dato haciendo una función larguísima sin utilizar los vectores inicializados.

Desconectado cramorales

  • PIC10
  • *
  • Mensajes: 6
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #4 en: 29 de Abril de 2009, 17:57:33 »
Es mas voy a enviar el programa completo para que lo analicen y vean porque inicializo así.

Código: C++
  1.  
/********************************************************
Programa de prueba para circuito de alarma de detección de
irregularidad por cortocircuitado de terminales primarios de
Transformadores de corriente de Media Tensión.

Creado por Cristian Morales Vasquez
Estudiante en Prácticas
Medida Especial-Magdalena
Electricaribe S.A. E.S.P.
2009
*********************************************************/



/************************Inicialización**********************************************/

#include<pic.h>      /* Libreria para reconocer funciones de microcontrolador PIC*/
#include "delay.h"  /* Libreria para funciones de retardo de tiempo*/



static volatile bit   led1 @ (unsigned)&PORTB*8+1;   /*"led1" es la variable del led indicador de alarma*/
static volatile bit   led2 @ (unsigned)&PORTB*8+2;   /*"led2" es la variable del led indicador de operación*/

/*******Inicializacion de comunicacion serial************/

#define InitUSART() \
    BRGH=1;    \
    SPBRG=25;  \
    SPEN = 1;  \
    SYNC = 0;  \
    TX9 = 0;   \
    RX9 = 0;   \
    CREN = 1;  \
    TXEN = 1;  \
    RCIE=0;
      
short int i1[9],i2[9], i3[9], v1[9], v2[9], v3[9];  /*ix es el vector que almacenará las 8 muestras tomadas a la señal alterna de corriente en un ciclo*/
char i,h;                              /*vx es el vector que almacenará las 8 muestras tomadas a la señal alterna de tensión en un ciclo*/
unsigned long cont1=0, cont2=0, cont3=0, cont4=0, cont5=0, cont6=0, even1=0, even2=0, even3=0; /*acumuladores para hallar el valor RMS de las señales y para contar los segundos que se mantiene la irregularidad*/         
short int rmsi1, rmsi2, rmsi3, rmsv1, rmsv2, rmsv3; /*variables para hallar el valor rms de la señal muestreada*/                     
char mens1[]="AT+CMGF=1";   /*Mensaje de configuración para el Modem*/
char mens2[]="AT+CMGS=\"3118235452\""; /*numero de telefono al que llamara el modem*/
char mens3[]="Problema de medida"; /*Mensaje que enviará el modem al número especificado*/
char mens4[3];   /*vector que almacenará la palabra ok*/

/************************************************************************************/


void Init_adc()         /*Inicializacion modulo ADC*/
{
   ADCON1 = 0b10001000;   /*Se configuran los terminales AN3 como +Vref y AN2 como -Vref*/
    ADCON0 = 0b10000001;   /*Inicialización, se modifica mas adelante*/
}

/**********Funcion para el muestreo de señales******************/
//***canal especifica el canal a utilizar
//***despl especifica el # de bits para el muestreo
// 0 corresponde a 10bit de muestreo
// 1 corresponde a 9bit de muestreo
// 2 corresponde a 8bit de muestreo

int adc(unsigned char canal,unsigned char despl)   /*Configuración del ADC*/
{
   int temp;
   ADCON0 &= 0b11000111;
   canal= canal << 3 ;     
    ADCON0 |=canal;   
    DelayUs(50);
   ADGO=1;            //START ADC
      while(ADGO) continue ;              //adc oK
     temp=((ADRESH<<8)+ADRESL);
   temp=temp>>despl;
   return temp;
}

/***********Programa Principal*****************/

void main(void)
{
   TRISA=0x2F;   /*Canales de entrada RA0, RA1, RA5 y Tensiones de referencia RA2 y RA3*/
   TRISB=0x0;   /*RB1 y RB2 seran las salidas de led1 y led2*/
   TRISC=0x80;   /*RC7 como RX y RC6 como TX para comunicación serial*/
   TRISD=0x0;   /*+Vref será +5V y -Vref será de -5V*/
   TRISE=0x7;   /*Canales de entrada RE0, RE1 y RE2*/
   PORTB=0;   /*Todas las salidas a 0V*/
   PORTC=0;
   PORTD=0;
   led2=0;
   led1=0;
   /*Los canales de entrada RA0, RA1 y RA5 se toman como entradas de señales de los TC's*/
   /*Los canales de entrada RE0, RE1 y RE2 se toman como entradas de señales de los TP's*/

   do{
      
   /********Muestreo de señales de tensión y de corriente cada 2.083mS-->480Hz*********/
      for (i=0;i<=9;i++){
         i1=adc(0,0);
         i2=adc(1,0);
         i3=adc(4,0);
         v1=adc(5,0);
         v2=adc(6,0);
         v3=adc(7,0);
         delayMs(2);
         DelayUs(83);
      }
   /********Fin del muestreo**********************************************************/

   /********Calculo del valor RMS de las señales muestreadas almacenadas*************/
      for (i=0;i<=9;i++){
         cont1=((i1)^2)+cont1;
         cont2=((i2)^2)+cont2;
         cont3=((i3)^2)+cont3;   
         cont4=((v1)^2)+cont4;
         cont5=((v2)^2)+cont5;
         cont6=((v3)^2)+cont6;
      }

      rmsi1=(cont1/8)^(1/2);
      rmsi2=(cont2/8)^(1/2);
      rmsi3=(cont3/8)^(1/2);
      rmsv1=(cont4/8)^(1/2);
      rmsv2=(cont5/8)^(1/2);
      rmsv3=(cont6/8)^(1/2);

   /***************************************************************************************/

   /*******Establecimiento de la condición de irregularidad, tensión en sec. de TC's muy baja > 10 días******/
      if((rmsv1>=529&&rmsv2>=529)||(rmsv2>=529&&rmsv3>=529)||(rmsv3>=529&&rmsv1>=529)){
         if(rmsi1<=512)even1++;
         else if(rmsi2<=512)even2++;
         else if(rmsi3<=512)even3++;
      }

      i=0;

   /*****************************************************************************************/

   /**********Envío de mensaje al celular****************************************************/
      if(even1>=864000||even2>=864000||even3>=864000){
         led1=1;
         do{
            while(!TXIF);       // Check to empty transmit
            TXREG=mens1;
            i++;
            if(mens1!='\0'){
               while(!TXIF);       // Check to empty transmit
               TXREG=0xD;         /*TXREG=13 envia enter*/
               while(!RCIF);       // Wait while receive
                   mens4[0]=RCREG;        // Read data
               while(!RCIF);
               mens4[1]=RCREG;
               if((mens4[0]!='O')&&(mens4[1]!='K'))i=0;
            }
         }while(mens1!='\0');
         i=0;
         do{
            while(!TXIF);       // Check to empty transmit
            TXREG=mens2;
            i++;
            if(mens2!='\0'){
               while(!TXIF);       // Check to empty transmit
               TXREG=0xD;         /*TXREG=13 envia enter*/
               while(!RCIF);       // Wait while receive
               if(RCREG!='>')i=0;
            }
         }while(mens2!='\0');
         i=0;
         do{
            while(!TXIF);       // Check to empty transmit
            TXREG=mens3;
            i++;
            if(mens3!='\0'){
               while(!TXIF);       // Check to empty transmit
               TXREG=0x1A;         /*envia el mensaje*/   
               for(h=0;h<=10;h++)while(!RCIF);       // Wait while receive      
               while(!RCIF);       // Wait while receive
                   mens4[0]=RCREG;        // Read data
               while(!RCIF);
               mens4[1]=RCREG;
               if((mens4[0]!='O')&&(mens4[1]!='K'))i=0;
            }
         }while(mens3!='\0');
         even1=0;
         even2=0;
         even3=0;
      }
   /****************Fin del mensaje**********************************/
   
   /****************Encendido y apagado de Led's y retardo de tiempo para cumplir 1S****************/
      if(led2==0) led2=1;
      else led2=0;

      for(i=0;i<=4;i++)delayMs(250);
      
      delayMs(150);
   }while(1);
}

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #5 en: 29 de Abril de 2009, 18:00:23 »
Todos los pic16 tienen diferentes cantidades de ram. Hay unos que ni siquiera tienen banco 2 y 3, por eso debe haber una forma de declarar en el compilador qué modelo de pic usas para que el compilador sepa exactamente dónde colocar variables.

La distribución de los arreglos la hace de forma automática el compilador solo si hay memoria suficiente para acomodarlos. Pero en casos en los que declaras cadenas de caracteres largas, definitivamente no cabrán. Todo cabe en un jarrito sabiéndolo acomodar, pero primero hay que conocer el tamaño del jarrito  :mrgreen:

En el compilador CCS para meter cadenas constantes en rom solo se pone const:

Código: [Seleccionar]
const char cadena="Estoy ahorrando RAM";
Investiga en el manual de tu compilador si const funciona como en CCS.

Acabo de ver que subiste tu programa, pero quedó mal publicado.

Desconectado cramorales

  • PIC10
  • *
  • Mensajes: 6
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #6 en: 29 de Abril de 2009, 18:20:09 »
Listo, listo, me ha sido de gran ayuda eso de const, si, lo agregue antes de char y me ha reducido los errores, ahora solo restan 2:

Error[000]   : Can't find 0xA7 words for psect rbss_0 in segment BANK0
Error[000]   : Can't find 0x5 words for psect temp in segment COMBANK
BUILD FAILED: Wed Apr 29 16:15:27 2009

Con respecto a lo de la declaración del PIC16F877A, ya te entendí, en el MPLAB cuando se crea un nuevo proyecto lo primero que se pregunta es que tipo de microprocesador es, con su referencia completa, por lo que el programa ya sabe que es el PIC16F877A porque yo lo seleccioné.

Código: C
  1. /********************************************************
  2. Programa de prueba para circuito de alarma de detección de
  3. irregularidad por cortocircuitado de terminales primarios de
  4. Transformadores de corriente de Media Tensión.
  5.  
  6. Creado por Cristian Morales Vasquez
  7. Estudiante en Prácticas
  8. Medida Especial-Magdalena
  9. Electricaribe S.A. E.S.P.
  10. 2009
  11. *********************************************************/
  12.  
  13.  
  14.  
  15. /************************Inicialización**********************************************/
  16.  
  17. #include<pic.h>         /* Libreria para reconocer funciones de microcontrolador PIC*/
  18. #include "delay.h"  /* Libreria para funciones de retardo de tiempo*/
  19.  
  20.  
  21.  
  22. static volatile bit     led1 @ (unsigned)&PORTB*8+1;    /*"led1" es la variable del led indicador de alarma*/
  23. static volatile bit     led2 @ (unsigned)&PORTB*8+2;    /*"led2" es la variable del led indicador de operación*/
  24.  
  25. /*******Inicializacion de comunicacion serial************/
  26.  
  27. #define InitUSART() \
  28.     BRGH=1;    \
  29.     SPBRG=25;  \
  30.     SPEN = 1;  \
  31.     SYNC = 0;  \
  32.     TX9 = 0;   \
  33.     RX9 = 0;   \
  34.     CREN = 1;  \
  35.     TXEN = 1;  \
  36.     RCIE=0;
  37.                
  38. short int i1[9],i2[9], i3[9], v1[9], v2[9], v3[9];  /*ix es el vector que almacenará las 8 muestras tomadas a la señal alterna de corriente en un ciclo*/
  39. char i,h;                                                                               /*vx es el vector que almacenará las 8 muestras tomadas a la señal alterna de tensión en un ciclo*/
  40. unsigned long cont1=0, cont2=0, cont3=0, cont4=0, cont5=0, cont6=0, even1=0, even2=0, even3=0; /*acumuladores para hallar el valor RMS de las señales y para contar los segundos que se mantiene la irregularidad*/                   
  41. short int rmsi1, rmsi2, rmsi3, rmsv1, rmsv2, rmsv3; /*variables para hallar el valor rms de la señal muestreada*/                                                 
  42. const char mens1[]="AT+CMGF=1"; /*Mensaje de configuración para el Modem*/
  43. const char mens2[]="AT+CMGS=\"3118235452\""; /*numero de telefono al que llamara el modem*/
  44. const char mens3[]="Problema de medida"; /*Mensaje que enviará el modem al número especificado*/
  45. char mens4[3];  /*vector que almacenará la palabra ok*/
  46.  
  47. /************************************************************************************/
  48.  
  49.  
  50. void Init_adc()                 /*Inicializacion modulo ADC*/
  51. {
  52.         ADCON1 = 0b10001000;    /*Se configuran los terminales AN3 como +Vref y AN2 como -Vref*/
  53.     ADCON0 = 0b10000001;        /*Inicialización, se modifica mas adelante*/
  54. }
  55.  
  56. /**********Funcion para el muestreo de señales******************/
  57. //***canal especifica el canal a utilizar
  58. //***despl especifica el # de bits para el muestreo
  59. // 0 corresponde a 10bit de muestreo
  60. // 1 corresponde a 9bit de muestreo
  61. // 2 corresponde a 8bit de muestreo
  62.  
  63. int adc(unsigned char canal,unsigned char despl)        /*Configuración del ADC*/
  64. {
  65.         int temp;
  66.         ADCON0 &= 0b11000111;
  67.         canal= canal << 3 ;    
  68.     ADCON0 |=canal;  
  69.     DelayUs(50);
  70.         ADGO=1;                         //START ADC
  71.         while(ADGO) continue ;                  //adc oK
  72.         temp=((ADRESH<<8)+ADRESL);
  73.         temp=temp>>despl;
  74.         return temp;
  75. }
  76.  
  77. /***********Programa Principal*****************/
  78.  
  79. void main(void)
  80. {
  81.         TRISA=0x2F;     /*Canales de entrada RA0, RA1, RA5 y Tensiones de referencia RA2 y RA3*/
  82.         TRISB=0x0;      /*RB1 y RB2 seran las salidas de led1 y led2*/
  83.         TRISC=0x80;     /*RC7 como RX y RC6 como TX para comunicación serial*/
  84.         TRISD=0x0;      /*+Vref será +5V y -Vref será de -5V*/
  85.         TRISE=0x7;      /*Canales de entrada RE0, RE1 y RE2*/
  86.         PORTB=0;        /*Todas las salidas a 0V*/
  87.         PORTC=0;
  88.         PORTD=0;
  89.         led2=0;
  90.         led1=0;
  91.         /*Los canales de entrada RA0, RA1 y RA5 se toman como entradas de señales de los TC's*/
  92.         /*Los canales de entrada RE0, RE1 y RE2 se toman como entradas de señales de los TP's*/
  93.  
  94.         do{
  95.                
  96.         /********Muestreo de señales de tensión y de corriente cada 2.083mS-->480Hz*********/
  97.                 for (i=0;i<=9;i++){
  98.                         i1[i]=adc(0,0);
  99.                         i2[i]=adc(1,0);
  100.                         i3[i]=adc(4,0);
  101.                         v1[i]=adc(5,0);
  102.                         v2[i]=adc(6,0);
  103.                         v3[i]=adc(7,0);
  104.                         delayMs(2);
  105.                         DelayUs(83);
  106.                 }
  107.         /********Fin del muestreo**********************************************************/
  108.  
  109.         /********Calculo del valor RMS de las señales muestreadas almacenadas*************/
  110.                 for (i=0;i<=9;i++){
  111.                         cont1=((i1[i])^2)+cont1;
  112.                         cont2=((i2[i])^2)+cont2;
  113.                         cont3=((i3[i])^2)+cont3;       
  114.                         cont4=((v1[i])^2)+cont4;
  115.                         cont5=((v2[i])^2)+cont5;
  116.                         cont6=((v3[i])^2)+cont6;
  117.                 }
  118.  
  119.                 rmsi1=(cont1/8)^(1/2);
  120.                 rmsi2=(cont2/8)^(1/2);
  121.                 rmsi3=(cont3/8)^(1/2);
  122.                 rmsv1=(cont4/8)^(1/2);
  123.                 rmsv2=(cont5/8)^(1/2);
  124.                 rmsv3=(cont6/8)^(1/2);
  125.  
  126.         /***************************************************************************************/
  127.  
  128.         /*******Establecimiento de la condición de irregularidad, tensión en sec. de TC's muy baja > 10 días******/
  129.                 if((rmsv1>=529&&rmsv2>=529)||(rmsv2>=529&&rmsv3>=529)||(rmsv3>=529&&rmsv1>=529)){
  130.                         if(rmsi1<=512)even1++;
  131.                         else if(rmsi2<=512)even2++;
  132.                         else if(rmsi3<=512)even3++;
  133.                 }
  134.  
  135.                 i=0;
  136.  
  137.         /*****************************************************************************************/
  138.  
  139.         /**********Envío de mensaje al celular****************************************************/
  140.                 if(even1>=864000||even2>=864000||even3>=864000){
  141.                         led1=1;
  142.                         do{
  143.                                 while(!TXIF);       // Check to empty transmit
  144.                                 TXREG=mens1[i];
  145.                                 i++;
  146.                                 if(mens1[i]!='\0'){
  147.                                         while(!TXIF);       // Check to empty transmit
  148.                                         TXREG=0xD;                      /*TXREG=13 envia enter*/
  149.                                         while(!RCIF);       // Wait while receive
  150.                                 mens4[0]=RCREG;        // Read data
  151.                                         while(!RCIF);
  152.                                         mens4[1]=RCREG;
  153.                                         if((mens4[0]!='O')&&(mens4[1]!='K'))i=0;
  154.                                 }
  155.                         }while(mens1[i]!='\0');
  156.                         i=0;
  157.                         do{
  158.                                 while(!TXIF);       // Check to empty transmit
  159.                                 TXREG=mens2[i];
  160.                                 i++;
  161.                                 if(mens2[i]!='\0'){
  162.                                         while(!TXIF);       // Check to empty transmit
  163.                                         TXREG=0xD;                      /*TXREG=13 envia enter*/
  164.                                         while(!RCIF);       // Wait while receive
  165.                                         if(RCREG!='>')i=0;
  166.                                 }
  167.                         }while(mens2[i]!='\0');
  168.                         i=0;
  169.                         do{
  170.                                 while(!TXIF);       // Check to empty transmit
  171.                                 TXREG=mens3[i];
  172.                                 i++;
  173.                                 if(mens3[i]!='\0'){
  174.                                         while(!TXIF);       // Check to empty transmit
  175.                                         TXREG=0x1A;                     /*envia el mensaje*/   
  176.                                         for(h=0;h<=10;h++)while(!RCIF);       // Wait while receive            
  177.                                         while(!RCIF);       // Wait while receive
  178.                                 mens4[0]=RCREG;        // Read data
  179.                                         while(!RCIF);
  180.                                         mens4[1]=RCREG;
  181.                                         if((mens4[0]!='O')&&(mens4[1]!='K'))i=0;
  182.                                 }
  183.                         }while(mens3[i]!='\0');
  184.                         even1=0;
  185.                         even2=0;
  186.                         even3=0;
  187.                 }
  188.         /****************Fin del mensaje**********************************/
  189.        
  190.         /****************Encendido y apagado de Led's y retardo de tiempo para cumplir 1S****************/
  191.                 if(led2==0) led2=1;
  192.                 else led2=0;
  193.  
  194.                 for(i=0;i<=4;i++)delayMs(250);
  195.                
  196.                 delayMs(150);
  197.         }while(1);
  198. }

Publico nuevamente el codigo del programa.

Desconectado cramorales

  • PIC10
  • *
  • Mensajes: 6
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #7 en: 29 de Abril de 2009, 18:34:24 »
Ahora, los errores que están apareciendo pienso que son por las variables declaradas como long y los vectores int con 9 posiciones cada uno, en este caso me gustaría saber como hacer para eliminar dichos errores, un consejo parecido al que proporcionó migsantiago que eliminó otros errores que estaban apareciendo.

Les agradezco mucho.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #8 en: 29 de Abril de 2009, 18:39:05 »
Una pregunta, ¿qué tamaño en bits tienen los int en tu compilador?

Verifica si realmente ocuparás todos los bits de tus variables. Podrías ahorrar más ram declarando variables con menos bits.

Desconectado cramorales

  • PIC10
  • *
  • Mensajes: 6
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #9 en: 29 de Abril de 2009, 18:47:56 »
Bueno, en este compilador los int tienen de tamaño 16bits, igual, me estoy asegurando de que tengan este tamaño al declararlos short int, ya que de esta manera son 16 bits.

La verdad estoy desperdiciando 6 bits, porque el muestreo si lo puedes ver lo hago con 10 bits y no los puedo almacenar en variables char porque las char solo tienen 8 bits, por lo que tengo que utilizar variables int que tienen 16 bits de espacio con lo que puedo utilzar los 10 bits que necesito.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con espacio de memoria para creacion de variables tipo vector
« Respuesta #10 en: 29 de Abril de 2009, 19:29:23 »
¿Y realmente te hacen falta esos 2 bits más de resolución? Haciendo el muestreo a 8 bits ahorrarías casi la mitad de ram.


 

anything