TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: mldavid en 14 de Octubre de 2005, 13:25:00
-
Hola a todos, me estoy iniciando en la ardua tarea de programar pics en c y mi problema es el que al compilar el codigo descrito en la parte inferior me da un error:
Error[51] D:Documents and SettingsAdministradorEscritorioCCSvs_juego_luces.c 18 : A numeric expression must appear here
Utilizo el CCS version 3.203 y el codigo es:
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
#use delay (clock=4000000)
#build(reset=0x1, interrupt=0x5)
#ORG 0x0F00,0x0FFF {}
#use fast_io(c)
#use i2c(master, slow, sda=PIN_C4, scl=PIN_C3)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
///PROGRAMA
void main(void)
{
set_tris_c(0x00);
disable_interrupts(GLOBAL);
signed char i; //variable indice
char led2[40]={"Esto Funciona"};
output_high(PIN_C5);
i2c_start();
i2c_write(0xc6);
i2c_write(0);
i2c_write(12);
for (i=0;i<39;i++){
i2c_write(led2);
delay_ms(100);
}
do{
printf("hola mundo"
;
output_low(PIN_C5);
delay_ms(1000);
output_high(PIN_C5);
delay_ms(500);
}while(TRUE);
}
Espero que me puedan ayudar.
Gracias a todos.
-
primero la declaracion de variables... despues lo demas

.
..
...
void main(void)
{
unsigned int i; //variable indice
char led2[40]={"Esto Funciona"};
set_tris_c(0x00);
disable_interrupts(GLOBAL);
output_high(PIN_C5);
...
..
.
saludos
-
Lo primero que hay que declarar dentro de la función main son todas las variables que se van a usar dentro de ese ámbito.
es decir luego de las llaves de apertura { de la función main, definirlas.
y a continuación seguir con el código que se desee programar.
EJEMPLO:
void main(void)
{
int i=0; // declaro variable i
int bucle=0; // declaro variable bucle
set_tris_a(0xff); //defino todo el puerto A como entradas
set_tris_b(0x00); //defino todo el puerto B como salidas
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
// primero se deben declarar todas las variables sino el compilador da el error
// "a numeric expression must appear here"
// Luego continuamos con el código normalmente
do
{
//parpadeo de led en port b.0
for (i=1;i<10;++i)
{
output_high(PIN_B0); //led on
delay_ms(100);
output_low(PIN_B0); //led off
delay_ms(100);
}
}while (true);
}
-
Estimados amigos de todopic, necesito que me ayunden con el siguiente tema: estoy programando en CCS y he realizado el programa que vereis a continuacion. Mi problema es que al compilar el programa me aparecen los siguientes errores
>>> Warning 203 "C:\led\archivos acuario\ds1307.c" Line 58(1,1): Condition always TRUE
*** Error 51 "acualed.c" Line 19(1,5): A numeric expression must appear here
*** Error 79 "acualed.c" Line 129(0,1): Expect }
C:\led\archivos acuario\acualed.o ===> 2 Errors, 1 Warnings.
El error de la linea 79 no deberia aparecer porque he revisado la escritura de los corchetes y estan bien!! El error en el que necesito AYUDAAA es el de ***Error 51, no consigo quitarlo
#include "C:\led\archivos acuario\acualed.h"
#byte pb=0xF81
#bit t_ok=pb.0
#bit t_mas=pb.1
#bit t_mns=pb.2
#byte puerto_c=0xF82
#byte intcon=0xFF2
#byte intcon3=0xFF0
#bit intf=intcon.1
#bit intf1=intcon3.0
#bit intf2=intcon3.1
#include <LCD.c>
#include <ds1307.c>
#include <menu.c>
void main(void)<--- aqui me aparece el error 51 en la linea 19 !!AYUDA!!
{
unsigned int8 h1,h2,m1,m2,h,m;
unsigned int8 h3,h4,m3,m4,m5,m6,c,s,r;
unsigned int8 t=16;
unsigned int8 k=44;
unsigned int8 dn[]={15,15,14,14,30,30,28,28,60,60,56,56,120,120,112,112};
unsigned int8 nd[]={112,112,113,113,97,97,99,99,67,67,71,71,7,7,15,15};
set_tris_c(0x00);
output_c(0x00);
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
intf=0; intf1=0; intf2=0;
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
enable_interrupts(GLOBAL);
lcd_init();
menu_modo();
while(true)
{ //el resto de codigo.......
-
hospeck:
Copiá todo el código por favor así podemos ver todo y no se escapa nada que quizá te de el error.
Te sugiero otra opción que uso mucho es ir comentando el código con
/*
*/
Así voy descartando que zona del programa me puede estar causando el error.
Saludos.
Jukinch
-
ok, aqui esta el programa completo:
#include "C:\led\archivos acuario\acualed.h"
#byte pb=0xF81 //configuracion del puerto b para los botones
#bit t_ok=pb.0
#bit t_mas=pb.1
#bit t_mns=pb.2
#byte puerto_c=0xF82 //configuracion del puerto c para las salidas de luz
#byte intcon=0xFF2 //configuracion de las interrupciones exteriores
#byte intcon3=0xFF0
#bit intf=intcon.1
#bit intf1=intcon3.0
#bit intf2=intcon3.1
#include <LCD.c> //codigos que complementan el programa
#include <ds1307.c>
#include <menu.c>
void main(void)
{
unsigned int8 h1,h2,m1,m2,h,m; //declaracion de las variables a utilizar
unsigned int8 h3,h4,m3,m4,m5,m6,c,z,r;
unsigned int8 t=16;
unsigned int8 k=44;
unsigned int8 dn[]={15,15,14,14,30,30,28,28,60,60,56,56,120,120,112,112}; //declaracion de las matrices
unsigned int8 nd[]={112,112,113,113,97,97,99,99,67,67,71,71,7,7,15,15};
set_tris_c(0x00);
output_c(0x00);
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
intf=0; intf1=0; intf2=0;
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
enable_interrupts(GLOBAL);
lcd_init();
menu_modo();
while(true)
{
//leemos el reloj
leer_ds1307();
//leemos de la memoria los datos grabados de las alarmas
h1=read_eeprom(e_hora_dn_1);
m1=read_eeprom(e_mins_dn_1);
h2=read_eeprom(e_hora_nd_1);
m2=read_eeprom(e_mins_nd_1);
h3=read_eeprom(e_hora_3);
m3=read_eeprom(e_mins_3);
h4=read_eeprom(e_hora_4);
m4=read_eeprom(e_mins_4);
h=registros_ds1307[horas];
m=registros_ds1307[minutos];
//desactivamos las interrupciones durante la comparacion de alarmas
disable_interrupts(GLOBAL);
//comparamos y actualizamos las salidas de luz
if (((m1<k)&&(h==h1)&&(m<m1))||((m1>k)&&(h==h1)&&(m<m1))||((((m1<k)&&(h!=h1))||((m1>k)&&(h!=h1)&&(h!=h3)))&&((m2<k)&&(h==h2)&&(m>m2)&&(m>m4)))||
((((m1<k)&&(h!=h1))||((m1>k)&&(h!=h1)&&(h!=h3)))&&((m2<k)&&(h!=h2)&&(h>h2)&&(h<h1)))||((((m1<k)&&(h!=h1))||((m1>k)&&(h!=h1)&&(h!=h3)))&&((m2>k)&&(h!=h2)&&(h!=h4)&&(h>h2)&&(h<h1))))
{
puerto_c=112;break;
}
else if (((m1<k)&&(h==h1)&&(m>m1)&&(m<m3))||((m1>k)&&(h==h1)&&(m>m1))||((m1==m)&&(h1==h)))
{
c=m-m1;
for(r=c;r<16;r++)
{
puerto_c=nd[r];delay_ms(60000);
}
break;
}
else if ((m1>k)&&(h!=h1)&&(h=h3))
{
m5=60-m1+m;
if (m5>t)
{
puerto_c=15;break;
}
else
{
c=m5;
for(r=c;r<16;r++)
{
puerto_c=nd[r]; delay_ms(60000);
}
break;
}
}
else if (((((m1<k)&&(h!=h1))||((m1>k)&&(h!=h1)&&(h!=h3)))&&((m2<k)&&(h=h2)&&(m>m2)&&(m<m4)))||((((m1<k)&&(h!=h1))||((m1>k)&&(h!=h1)&&(h!=h3)))&&((m2>k)&&(h=h2)&&(m<m2)))||
((((m1<k)&&(h!=h1))||((m1>k)&&(h!=h1)&&(h!=h3)))&&((m==m2)&&(h==h2))))
{
c=m-m2;
for(z=c;z<16;z++)
{
puerto_c=dn[z];delay_ms(60000);
}
break;
}
else if ((((m1<k)&&(h!=h1))||((m1>k)&&(h!=h1)&&(h!=h3)))&&((m2>k)&&(h!=h2)&&(h=h4)))
{
m6=60-m2+m;
if(m6>t)
{
puerto_c=112;break;
}
else
{
c=m6;
for(z=c;z<16;z++)
{
puerto_c=dn[z];delay_ms(60000);
}
break;
}
}
else
{
puerto_c=15; break;
}
//reactivamos las interrupciones despues del la actualizacion de las salidas
enable_interrupts(GLOBAL);
//actualizamos la pantalla con el estado normal
lcd_gotoxy(1,1);
printf(lcd_putc,"HORA: %02u:%02u:%02u",registros_ds1307[horas],registros_ds1307[minutos],registros_ds1307[segundos]);
lcd_gotoxy(1,2);
printf(lcd_putc,"FECHA: %02u/%02u/%02u",registros_ds1307[dias],registros_ds1307[meses],registros_ds1307[anios]);
}
}
saludos!!
-
Hospeck:
el problema lo tenés fuera del programa principal.
Posiblemente dentro de la libreria que invocás:
#include "C:\led\archivos acuario\acualed.h"
el error te indica que es en la línea 51 pero de acualed.c (es decir el programa principal, pero del programa principal estás invocando otros trozos de código)
*** Error 51 "acualed.c" Line 19(1,5): A numeric expression must appear here
*** Error 79 "acualed.c" Line 129(0,1): Expect }
Copiá todo el código de la librería acualed.h y lo vemos.
-
el error esta en la linea 19 del programa: void main(void) y ya te he puesto el codigo completo del archivo acualed.c anteriormente, de todas formas te dejo aqui la informacion del archivo acualed.h:
#include <18F4520.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=4000000)
#use i2c(Master, SDA=PIN_A0, SCL=PIN_A1)
-
Hospeck:
La librería acualed.h está completa? El error te dice que está adentro del programa principal, pero podría estar en esa librería, ya que al invocarla con un include pasa a formar parte del código principal.
Si podés subí el archivo entero.
*** Error 51 "acualed.c" Line 19(1,5): A numeric expression must appear here
*** Error 79 "acualed.c" Line 129(0,1): Expect }
-
si es que eso es lo raro que mi codigo solo tiene 127 lineas!
-
Si querés hablamos por msn. te mandé una invitación.
Si esta es la librería acualed.h
#include <18F4520.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=4000000)
#use i2c(Master, SDA=PIN_A0, SCL=PIN_A1)
En la librería sólo hay 30 líneas de código. Y el compilador hace referencia a 129 líneas como mínimo, es decir que el error está en el programa principal, pero puede ser a causa de alguna librería que invocás.
Saludos.
Jukinch
-
del error 51 "a numeric expression must appear here" en la linea 19 como se puede resolver?
-
Quiero probar compilarlo en mi computadora y me faltan las librerías que invocás.
#include <LCD.c> //codigos que complementan el programa
#include <ds1307.c>
#include <menu.c>
Si podés subilas.
Saludos.
Jukinch
-
aqui te adjunto los archivos ds1307, lcd y menu!!
-
El error lo tenés en el archivo menu.c
mirá en esta función void minstemp(void)
le falta un } :( al final para cerrar el for. :-/
Agregá debajo de todo un } y listo.
Usé el truco: de comentar /*todo el codigo que creo que anda bien para dar por sentado que ahí no está el problema. y funciono :-/ */
void minstemp(void)
{
for(i=0;i!=255;i++)
{
delay_ms(20);
lcd_gotoxy(15,2);
printf(lcd_putc,"%02u",mins);
if(!t_ok)
{
delay_ms(300);
break;
}
else if(!t_mas)
{
i=0;
delay_ms(300);
mins++;
if(mins>59)
{
mins=0;
};
}
else if(!t_mns)
{
i=0;
delay_ms(300);
mins--;
if(mins==255)
{
mins=59;
}
}
}
}
-
jajajaj ya lo he compilado y no me salen errores, claro si es que no he mirado las lineas de comando del archivo menu!! muchas gracias, apartir de ahora andare con mas ojo!!
-
Como consejo te digo que ese error se da generalmente hacia arriba de la línea del código que te informa el compilador.
En este caso estaba en la invocación de la librería. Arriba de main.
Un sincero saludo desde Argentina, y espero que termines bien el proyecto de los peces. :-/
Jukinch
-
esto es increible lo he vuelto a compilar y ahora me sale el siguiente error:
*** Error 128 "ds1307.c" Line 81(0,4): A #DEVICE required before this line
C:\led\archivos acuario\ds1307.o ===> 1 Errors, 0 Warnings.
-
#DEVICE required before this line
parece como si estuvieras omitiendo esto que te resalto en negrita, ubicado en la libreria acualed.h:
#include <18F4520.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=4000000)
#use i2c(Master, SDA=PIN_A0, SCL=PIN_A1)
-
ya he solucionado lo del DEVICE, lo que he hecho ha sido modificar la cabecera del programa y al compilarlo ya obtengo 0 errores pero tambien me salen los siguientes warnings:
>>> Warning 203 "C:\led\ds1307.c" Line 58(1,1): Condition always TRUE
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (@delay_ms1)
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (lcd_send_nibble)
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (lcd_send_byte)
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (@I2C_WRITE_1)
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (menu_ajustar_rtc)
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (menu_ajuste_tempoDN_ND)
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (lcd_putc)
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (lcd_gotoxy)
>>> Warning 216 "acualed2.c" Line 143(2,3): Interrupts disabled during call to prevent re-entrancy: (@PRINTF_U_89)
Memory usage: ROM=18% RAM=7% - 9%
0 Errors, 10 Warnings.
-
hospeck:
No se como te llevás con el inglés. Lo que te dice el compilador no es un error. Sólo una advertencia.
Te dice que está deshabilitando las interrupciones durante el ingreso a cada una de las llamadas a la interrupción a que te hace referencia en los warnings para evitar re-entradas.
Evitá hacer códigos largos durante el código que llama la interrupción. Usá banderas (variables) para chequear el estado de lo que estás controlando y volvé a main para seguir con el código. De esta manera no tenés tanto tiempo al microcontrolador dentro de la interrupción y evitás una reentrada por interrupción.-
Saludos.
Jukinch