TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom 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
(http://img43.imageshack.us/img43/6582/capturamplab.jpg) (http://imageshack.us/photo/my-images/43/capturamplab.jpg/)
a ver si alguien me puede ayudar
-
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...
-
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
-
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.
-
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
-
Pues cuelga el código completo y lo pruebo a compilar yo a ver si me da el mismo fallo.
-
vale
//***********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);
}
}
-
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.
-
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:
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"
-
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?
-
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!
-
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 ((:-))
-
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!
-
pero si en la carpeta del proyeto, ¿no?
-
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!
-
Pues gracias de nuevo, no sabía nada de esto que me comentas, un saludo