Autor Tema: [SOLUCIONADO] Problema con MPLAB + CCS C en un programa  (Leído 8145 veces)

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

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
[SOLUCIONADO] Problema con MPLAB + CCS C en un programa
« en: 06 de Abril de 2012, 10:03:27 »
Hola a todos, pues tengo un problemilla con el MPLAB, resulta que estoy utilizando el compilador CCS C con el MPLAB y a la hora de compilar me da un error que no sé el motivo de que se produzca, si este mismo código lo compilo con el propio PIC C me lo hace perfecto y sin advertencias ni nada, he conseguido hacer que otros código funcionen con MPLAB + CCS C pero me han costado mucho y este no se qué pasa que no me lo hace.

cuelgo una imagen del error que me da



a ver si alguien me puede ayudar
« Última modificación: 07 de Abril de 2012, 06:05:31 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #1 en: 06 de Abril de 2012, 11:48:47 »
  Parecería que el error está mencionando que falta una línea con "#device" y el pic utilizado. No sé como es la sintaxis de CCS pero tal vez algo similar a esto...

Código: C
  1. #device  P16F876A
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #2 en: 06 de Abril de 2012, 12:18:36 »
que va, el mismo código en el ide del ccs va perecto y meclo compila sin errores, es que por eso no entiedno que puede estar mal
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #3 en: 06 de Abril de 2012, 12:50:24 »
Pues el problema te lo está dando en la línea 71 y tiene algo que ver con el LCD, por lo que se ve en el reporte de MPLAB.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #4 en: 06 de Abril de 2012, 14:07:59 »
Pues no creo, tiene que ser otra cosa, la librería no puede estar mal, es imposible.

 la librería LCD es la que viene con el CCS C y si compilo el código con PIC C me lo compila bien, tal y como está, ese mismo código con las mismas librerías, creo un proyecto nuevo en MPLAB con todas esas librerías y códigos y zas, me da ese error, he probado con la librería flex_lcd y me hace exactamente lo mismo, y repito con el IDE y compilador de PIC C, me compila perfecto y es más cargo el código en el pic y se ejecuta a las 1000 maravillas, es que no se qué pasa con el MPLAB que con el mismo compilador (CCS C) no me lo compila
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #5 en: 06 de Abril de 2012, 14:13:31 »
Pues cuelga el código completo y lo pruebo a compilar yo a ver si me da el mismo fallo.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #6 en: 06 de Abril de 2012, 14:20:17 »
vale

Código: [Seleccionar]

  //***********Parámetros de posprosesador************************************
      #include <16f876A.h>
      #device adc=10
      //#device ICD=true
       
      #FUSES xt,nowdt,noprotect
      #USE delay(clock=4000000)

      #define use_portb_lcd TRUE
      #include <LCD.C>
     
      #use standard_io (A)
      #use standard_io (B)
      #use standard_io (C)
   
      //#use RS232(baud=9600, XMIT=pin_C6, RCV=pin_C7, bits=8, parity=N)
      #use SPI(MASTER,FORCE_HW,MODE=0,BITS=16)
     
     

//****************************Definición de pines**********************************
      #define CS PIN_A5
     
//******************************Variables Globales***********************************

int16 temp=0,buffer=0;
int segundos=0,minutos=0;
long milisegundos=0; 
float temperatura_total=0.0;
int1 flag_cronometro=0;
int1 flag_max6675=0;
int1 flag_timer0=0;
int1 flag_limpiarlcd=0;
float temperatura;
int i;
float media[5];
 
   //----variables globales PID------------
 
 
  int16 control=0;
  float a,b,c;
  float temp_limit;
  float rT,eT,iT,dT,uT,iT0,eT0,yT;
  float max,mini;
//****************************Funciones***********************************************
void max6675();

//***************************Interrupciones de los timers**************************

#int_TIMER1
 
   void cronometro(){ //implemetamos un cronómetro en el timer1
     set_timer1(64500);

      if(++milisegundos > 999){ //Decrementamos milisegundos hasta que sea mayor que 999
         milisegundos = 0;              //cargamos milisegundos con el valor 999 para un proximo conteo
         flag_cronometro=1;
           } 
         if((milisegundos==200)||(milisegundos==400)||(milisegundos==600)||(milisegundos==800)||(segundos == 999)){
             flag_max6675=1;
          }
            if(milisegundos==500){
               flag_limpiarlcd=1;
            }
      }
     
#int_TIMER0
   void timer0_isr(){
     flag_timer0=1;  //Bandera que marca el tiempo para el PID
   }
     
   
//****************************Inicialización**************************************


//******************************Subprogramas************************************
void limpiarlcd(){
      lcd_putc('\f');
  }
 
void inicio(){
    int g;
    set_pwm1_duty(0);
    for(g=0;g<5;g++){
       lcd_gotoxy(3,1);printf(lcd_putc,"Iniciando");
       lcd_gotoxy(4,2);printf(lcd_putc,"Sistema");
       max6675();
       delay_ms(300);
       lcd_putc('\f');
       delay_ms(300);
    }
}
     
void max6675(){ //leemos el dato de temperatura desde el max6675
        int h=0;
     
       
        int cadena1,cadena2;  //delacramos las bariables donde se guardaran el dato que viene del max6675
                                       //el dato viene en dos paquetes separados de 8 bits, por eso se guardan en dos cadenas                             
        output_low(CS);               //Se activa la señal de bit_select(CS) a 0 para que el max se active
        cadena1 = spi_read(0);  //Lee el primer byte que viene del max6675
        cadena2 = spi_read(0);  //Lee el segundo byte, con eso ya tenemos los 16bits de la lectura del max7765
        output_high(CS);              //Se pone a 1 la señal de bit_select(CS) para que el max tome otra lectura
                 
       // buffer = ((cadena1 * 256) + cadena2);  //Se unen las dos cadenas de 1 byte que viene del max6675 y se
                                                         //guardan en una variable int16 llamada buffer de 16 bits
           buffer = cadena2; // Cargo Byte LB
*((char *)&buffer+1)=cadena1; // Cargo Byte HB.  y los uno los dos en una palabra de 16 bits que se llama buffer   

       if(bit_test(buffer,2)==1){   // Si el bit D2 es igual a 1
       
              lcd_putc('\f');  //Limpiamos la pantalla LCD
              lcd_gotoxy(5,1); //Posición del LCD para imprimir el siguiente comando
              printf(lcd_putc,"Termopar"); //Se muestra en pantalla que el termopar está desconectado
              lcd_gotoxy(3,2);
              printf(lcd_putc,"Desconectado"); //Se muestra en pantalla, en la posición 3,2
             }
             
  temp = (buffer & 0b0111111111111000)>>3;    //Seleccionamos los bits que nos interesan haciendole lo que se llama
                                                           //Una máscara, se le hace un AND al dato con un numero en binario, los unos significan los bits que queremos utilizar y los 0 los que desechamos
                                                            //Luego le haqcemos un >>3 que significa que rodamos los 1 a la derecha 3 posiciones para eliminar los 0 del final
  temperatura = (temp * 0.25);                  //la resolucion de los 12 bit es de 0,25ºC por bit, 12 bits en decimal equivalen a 4095,  para que de los 1023,75 ºC se multiplica 4095 * 0,25 = 1023,75ºC
         
/*  media[i]=temperatura;  //cargamos el array con las medidas tomadas por el max6675
  i++;             //incrementamos la varibale i en cada bucle
  if(i==5){        //hasta que el buffer no esté lleno, no se hace la media
     temperatura_total=((media[0]+media[1]+media[2]+media[3]+media[4])/5);
  }
    if(i==6){          //si i llega a 5, ponemos i a 0 para una nueva medida
     // for(h=0;h<6;h++){
      //    media[h]=0; //cargamos el array con 0
          i=0;//ponemos a 0 la i para una nueva carga del array
               
             // }
            }    */ 
  }         

  void PID(){
    yT=temperatura;
     rT=temp_limit;               //Temperatura límite o setpoint
     eT=rT-yT;                   //Calculo del error     
     iT=b*eT+iT0;               //Cálculo del termino itegral
     dT=c*(eT-eT0);             //Cálculo del termino derivativo
     uT=iT+a*eT+dT;             //Cálculo de la señal PID
     //******Anti-Windup***************
     
     if(uT>max){
        uT=max;
        }
        else{
           if(uT<mini){
              uT=mini;
              }
        }
      //****fin anti-windup***************     
        control=uT;
        set_pwm1_duty(control);   //Transferencia de uT al actuador
        iT0=iT;
        eT0=eT;
       
        }
     
       
 
       
 
//******************************Función Principal*********************************
   
void main(){
     setup_spi(SPI_MASTER | SPI_L_TO_H); //   Configuramos el SPI por hardware del micro, sin esto no rula   
     
     setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
     set_timer0(56);
     enable_interrupts(INT_TIMER0);
     
     setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);  //Configuración del timer1 para el cronómetro
     set_timer1(64500);  //cargamos el valor del timer1 para que salte a 1 mls
     enable_interrupts(INT_TIMER1);
    // setup_timer_2(T2_DIV_BY_16,255,1);  //configuración del timer_2 para la señal PWM
     setup_timer_2(T2_DIV_BY_4,249,1);
     setup_ccp1(CCP_PWM);               //Activamos el CCP ósea PWM por hardware
     
     
     enable_interrupts(global);
     
     lcd_init();
     inicio();
     
     //-----------------Control PWM----------------------------------------       
     mini=0.0;   // límite mímimo de control de la PWM
     max=1000.0; // límite máxima de control de la PWM
     //-----------------Parámetros PID---------------------------------------- 
     iT0=0.0;
     eT0=0.0;
     a=1.0;        //Parámetro para el termino proporcional
     b=0.006215;    //parametro para el termino integral
     c=10.000;    //parametro para el termino derivativo
     temp_limit=100.00;   //set point 100ºC     
   //---------------------------------------------------------------
     
         
  while(TRUE){   
 
     
     if(flag_cronometro){
        flag_cronometro=0;
       if(++segundos > 59){
          segundos = 0;
        if(++minutos > 59){
           minutos = 0;
               }
             }
           }
           if(flag_max6675){
              flag_max6675=0;
              max6675();
           }
             if(flag_timer0){
               flag_timer0=0;
               PID();
             }
              if(flag_limpiarlcd){
                 flag_limpiarlcd=0;
                 limpiarlcd();
              }           
                lcd_gotoxy(1,1);printf(lcd_putc,"Temp=%f C",temperatura);   
                lcd_gotoxy(1,2);printf(lcd_putc,"%02u:%02u",minutos,segundos);
                lcd_gotoxy(6,2);printf(lcd_putc,"  PWM=%Lu",control);
        }         
    }
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #7 en: 06 de Abril de 2012, 15:02:43 »
  Como bien comenta samshiel_pic, el error lo está arrojando sobre la línea 7 del archivo lcd.c (aunque la librería esté bien).

  Indica que falta un "#device".

  Tal vez se deba a que el MPLAB está pasando incorrectamente el pic a utilizar, y más allá que con el propio IDE de CCS compile, creo que no se pierde nada con poner el "#device 16f877a" o como se utilice dicha línea. Conviene consultarlo en el manual, e incluso ver a que se refiere el error 128.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado samshiel_pic

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 777
    • Electrónica·Ingenia
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #8 en: 06 de Abril de 2012, 15:15:42 »
Bueno pues yo lo he compilado en MPLAB con el compilador CCS y lo ha hecho sin problemas, solo da warnings de variables que no se usan en el programa.
Te adjunto lo que reporta MPLAB al compilar:

Citar
Clean: Deleting intermediary and output files.
Clean: Deleted file "BORRAR.ESYM".
Clean Warning: File "E:\SamshielDesigns\Projects SamshielDesigns\BLOG\Proyectos CCS PIC16F88\BORRAR.o" doesn't exist.
Clean: Deleted file "BORRAR.ERR".
Clean: Done.
Executing: "C:\Archivos de programa\PICC4.124\Ccsc.exe" +FM "BORRAR.C" +DF +LN +T +A +M +Z +Y=9 +EA
>>> Warning 202 "BORRAR.c" Line 31(7,24): Variable never used:   temperatura_total
>>> Warning 202 "BORRAR.c" Line 37(5,6): Variable never used:   i
>>> Warning 202 "BORRAR.c" Line 38(7,12): Variable never used:   media
>>> Warning 202 "BORRAR.c" Line 98(13,14): Variable never used:   h
      Memory usage:   ROM=33%      RAM=30% - 37%
      0 Errors,  4 Warnings.
Loaded E:\SamshielDesigns\Projects SamshielDesigns\BLOG\Proyectos CCS PIC16F88\BORRAR.cof.
BUILD SUCCEEDED: Fri Apr 06 20:10:32 2012

Debe ser problema del plugin de CCS para MPLAB o de la misma versión de MPLAB. Yo normalmente siempre configuro el PIC con el que voy a trabajar en MPLAB, abriendo un nuevo proyecto y seleccionando el PIC, en este caso el PIC16F876A, y después añado el archivo "xxx.c"

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #9 en: 06 de Abril de 2012, 19:32:06 »
Si, esas variables están paradas a la espera de más cosillas, he estado haciendo pruebas con el código y parece que camina bien.

Ahora el problema que tengo es este.
el plugin me lo baje directamente de la página oficial de CCS  y he probado todo el sistema en dos pc y los dos me dan el mismo resultado.
Yo hago los proyectos de la misma manera que describes tú, y añado todos los archivos al proyecto, es más hay momentos en que algún proyecto si me ha funcionado pero solo si en la misma carpeta del proyecto incluyo todos los drivers y librerías a usar, pero en michas ocasiones me pasa esto, mas veces mal que bien.

Ahora mismo estoy utilizando MPLAB v8,76 y el PIC-C compiler v4.107

¿de que manera puedo solucionarlo?
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #10 en: 07 de Abril de 2012, 01:05:11 »
Hola Thulsa Doom, debes eliminar de la ventana 'Workspace' (la ventanita de arriba a la izquierda) en Source Files, el archivo 'LCD.C'.  Así te deberá compilar igual que con el PIC C.

Saludos!

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: Problema con MPLAB + CCS C en un programa
« Respuesta #11 en: 07 de Abril de 2012, 06:04:31 »
Pues tienes razón, la he eliminado y ahora lo hace perfecto, es extraño porque en otros proyectos me ha exigido que pusiera esa librería en la carpeta del proyecto.
Gracias por la ayuda, era tan simple como eso  ((:-))
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: [SOLUCIONADO] Problema con MPLAB + CCS C en un programa
« Respuesta #12 en: 07 de Abril de 2012, 09:29:49 »
Para el caso de CCS en Mplab, los archivos que figuran en el programa principal como #include <archivo.x>, no se deben poner en la ventana de proyecto en 'Source Files'.

Saludos!

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: [SOLUCIONADO] Problema con MPLAB + CCS C en un programa
« Respuesta #13 en: 07 de Abril de 2012, 10:45:10 »
pero si en la carpeta del proyeto,  ¿no?
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: [SOLUCIONADO] Problema con MPLAB + CCS C en un programa
« Respuesta #14 en: 07 de Abril de 2012, 19:58:48 »
Hola Thulsa Doom. No necesariamente deben ir en la carpeta del proyecto.  Por ejemplo si pones: #include <LCD.C>, al estar <LCD.C> encerrado entre <> el compilador buscará en el path por defecto de sus librerías (en este caso ../PICC/Drivers).  Si es el caso de una librería propia o modificada, la puedes poner como #include "LCD.C" encerrada entre comillas "" y allí el compilador si buscará localmente en la carpeta del proyecto.  De todos modos en la ventana de proyecto del Mplab no se debe declarar en ninguno de los dos casos.

Saludos!


 

anything