TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: vasconinicolas en 22 de Junio de 2008, 23:44:32
-
Hola maestros, tengo un error que me arroja el compilador CCS y que no figura en google lo cual me da a pensar.... les paso el codigo para ver si me pueden dar una mano.
Aclaro que si comento la linea #int_timer1 todo funca de 10 (obvio no andan las interrupciones pero al menos compila)
#include <16f877.h>
#fuses XT,NOWDT,NOPUT
#use delay(clock=20000000)
//VARIABLES GLOBALES/////////////////////////////////////////////////////////////////////////////////////////////
float pm, rm, diametro, seg=0, seg_paso, pasos_por_segundo_sidereo, inter;// seguimiento = 15.04108444;
char hemisferio, bandera=0;
int seguimiento=15, Vsaludo[]="skyNIC", Vsaludo2[]="0.4.1c",vlcd, cs[]="Config", cs2[]="Sistema?", Vinicio[]="Cargando", Vespejo[]="D.Maximo", Vreduccion[]="Reducc.",
Vmotor[]="Motor", Vhemisferio[]="Hemisf.", Vnorte[]="Norte", Vsur[]="Sur", Vfin[]="Fin", Vcm[]="cm";
int32 t1; // valor a cargar en tmr1 para que salte la interrupcion
int motor, unidad;
int16 vlcd_int;
#include "lcd.c" //funcion que maneja las subrutinas de muestreo de lcd
#include "_eeprom.c" //funcion que permite escribir numeros grandes en la eeprom
#include "lcd_nico.c"
#include "teclado.c" //funcion para el manejo del teclado
#include "menu_setup.c" //funcion donde configuro sistema segun el motor y la reducciona a utilizar
//PROGRAMA INICIAL////////////////////////////////////////////////////////////////////////////////////////////
///////////////INTERRUPCION
#int_timer1
void int_tm1()
{
bandera=1; //pongo bandera en 1
}
void inicio()
{
RA0_ANALOG; //portA como digital menos RA0
set_tris_c(0b00001111); //configuro puerto c como entradas de teclado y salidas de led y buzzer
set_tris_d(0b00000000); //configuro portd como salidas, para motor/es en el futuro
lcd_init(); //inicio lcd
vlcd=Vsaludo; //skyNIC
lcd_string();
vlcd=Vsaludo2; //v0.4.1
lcd_gotoxy(1,2); //muevo cursor a segunda linea
lcd_string();
delay_ms(500); //retardo
lcd_putc("\n" ); //limpia lcd
vlcd=Vinicio; //Calentamiento
lcd_string();
delay_ms(500);
output_high(PIN_C4); //seguimiento on
output_high(PIN_C5); //menu on
menu_setup(); // funcion para configurar tipo de motor, reduccion y memisferio ademas de realizar el calculo de tmt1
output_low(PIN_C4); //seguimiento on
output_low(PIN_C5); //menu on
}
//PROGRAMA PRINCIPAL////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // setup interrupts
enable_interrupts(INT_TIMER1); //activar interrupcion externa
enable_interrupts(GLOBAL); //todas las interrupciones desactivadas
inicio();
}
El error que larga el compilador es (en rojo abajo): Internal Error - Contact CCS PC_PR
Gracias mil.
-
Hola.
Pues con la configuracion que tienes al colocar la interrupcion el error no es del timer1, me parece extraño que uses dos librerias diferentes para manejar la LCD, con una es suficiente.
Habria que ver el codigo de las otras librerias que incluyes, el error podria venir de ahi.
Saludos
-
Hola MLO, en realidad una libreria es la clasica lcd.c para manejo del lcd y la otra es creada por mi en donde tengo algunas fuciones como estas:
//funciones para el manejo del lcd segun sea el momento del programa
void lcd_string(void) //funciona para string en primera linea
{
printf(lcd_putc,"%s",vlcd);
}
void lcd_int16(void)
{
lcd_gotoxy(1,2); //muevo cursor
printf(lcd_putc,"%Lu%s",vlcd_int,unidad); //imprimo segunda fila
}
Estas son funciones que no las pongo en el programa principal para que no se haga muy largo y dificil de visualizar...
Me dices de ver el codigo de que otra libreria por ejemplo? Te reitero que al comentar //#int_timer1 todo parece funcionar bien...
Gracias
-
Estoy deacuerdo con MLO, ya que al comentar las siguientes librerias
#include "_eeprom.c" //funcion que permite escribir numeros grandes en la eeprom
#include "lcd_nico.c"
#include "teclado.c" //funcion para el manejo del teclado
#include "menu_setup.c" //funcion donde configuro sistema segun el motor y la reducciona a utilizar
y las lineas
lcd_string();
menu_setup();
el programa compila sin problemas.
El error debe estar en alguna de estas funciones, si publicas las librerias tal vez te puedan ayudar.
un Saludo.
-
Gracias lucho, voy a revisar libreria por libreria (de las que hice yo) y les comento si encuentro el error, sino, pongo el codigo para molestarlos a ustedes.
saludos.
-
Saludos!
Generalmente CCS dice el archivo y el número de línea donde está el error.
Si el error estuviese en una de las librerías, el CCS te lo diría... a mí me ha pasado así y lo ha colocado:
"error en <archivo tal> <línea tal>: <descripción del error>"...
No creen ustedes?
Y si al pana le compila bien usando esas librerías y comentando el #INT_TIMER1, pues da razón más para creer que no son las librerías.
Lo que yo veo es que el timer nunca va a interrumpir, pues no existe ningún ciclo indefinido... por ninguna parte del código veo algo así como:
while(TRUE)
{
//código a hacer indefinidamente
}
o:
for(;;)
{
//código...
}
Sería cuestión de que colocaras los archivos con tus librerías y así otros tratemos de compilar tu código.
Ok saludos, nos leemos! :mrgreen:
-
Hola.
Pues es cierto Javier, interrumpira una vez si acaso, todo depende de cuanto tiempo tomen las otras funciones; pero esos casos no generan errores. Seria bueno que se posteara las librerias de la eeprom y la de menu_setup. A mi no me ha salido un error de esos hasta ahora, asi que me da curiosidad!!!!
Saludos
-
Ciertamente Miguel, eso de que no existe el ciclo indefinido el compilador no lo ve como error... a él le da igual... :D
A mí también me llama la atención ese "Internal Error - Contact CCS PC_PR"...
Esperemos entonces que vasco publique sus librerías y así podamos probar compilarlo nosotros.
Ok saludos, nos leemos! :mrgreen:
-
Hola masters,.... respecto al ciclo de la interrupcion del tmr1 aun no lo escribi porque se me planto en algo más basico que es el error que reporto tan solo por escribir #int_timer1 de todas maneras ahi va el codigo de menu_setup.c
//////////////////////////////////funcion para setup inicial de valores y parametros
void menu_setup(void)
{
///////////////////////////////////////////////////////////////////subrutina para cargar los valores desde eeprom a las variables de pm, rm, y hemisferio
rm=read_int32_eeprom(0); // leo la eeprom mediante la rutina de numeros grander y lo casigno a la variable, le doy 4 bytes de espacio por las dudas
pm=read_int32_eeprom(4); //leo la eeprom mediante la rutina de numeros grandes
hemisferio=read_eeprom(8); //leo variable hemisferio, 0 sur, 1 norte.
if (rm < 2277){
rm=2277; //cargo valor minimo en variable reduccion mecanica
write_int32_eeprom(0, rm);
}
if (pm < 180){
pm=180; //cargo valor minimo en variable pasos de motor
write_int32_eeprom(4, pm);
}
///////////////////////////////////////////////////////////////////////////subrutina para seteo de valores de pm, rm y hemisferio
lcd_putc("\f" ); //limpia lcd
vlcd=cs;
lcd_string(); //muestro "config"
lcd_gotoxy(1,2); //muevo cursor
vlcd=cs2;
lcd_string(); //muestro "sistema?"
teclado_menu_inicio(); //funcion para setear valores iniciales
////////////////////////////////////////// subrutina para calcular el valor de tmr1 y seg_paso que es el avance en segundos de arco por cada accion del motor
//calculos varios
seg_paso = ((360)/(pm*2)*(3600))/rm; //calculo cuantos segundos de arco recorre el eje RA en cada paso del motor
pasos_por_segundo_sidereo = seguimiento / seg_paso; //calculo cuantos pasos tengo que dar por segundo sidereo para seguir un astro
inter = 0.99726851 / pasos_por_segundo_sidereo; //calculo cada cuantos milisegundos tengo que dar el paso de seguimiento
//seteando el tmr1 para que produzca una interrupcion cada los milisegundos que indique inter
t1= 65536 - (inter * 20000000)/(4 * 8); // calculo el valor de tmr1
diametro = 11.5 / seg_paso; //calculo el diametro maximo de espejo utilizable en la montura. En pulgadas esta el valor resultante
/////////////////////
lcd_putc("\f" ); //limpia lcd
vlcd=Vespejo;
lcd_string();
unidad=Vcm; //cargo variable unidad con "cm"
vlcd_int=(int16)diametro; //muestro valor de diametro maximo en lcd
lcd_int16(); //muestro el valor diametro maximo en cm
//lcd_gotoxy(1,2); ///////////////////////para mostrar diametro con decimales por si nos sobra memoria
//printf(lcd_putc,"%4.2f%s",diametro,unidad); //imprimo segunda fila/
while(!input(PIN_C1)); //bucle, mientras no se apriete el boton OK la pantalla mostrará el valor de diametro maximo
delay_ms(50); //rebote
if(input(PIN_C1)) //vuelvo a preguntar
{
while(input(PIN_C1)); //espero a que suelte la tecla OK
}
}
La funcion de eeprom tiene el nombre modificado pero es la libreria "internal_eeprom.c" Si es necesario el codigo lo pongo pero sino podemos ahorrar espacio en este post..
Gracias
-
Hola.
Pues basandome mas en el error, no parece que fuera de compilacion ni de asignacion de variables. Porque no posteas el error completo?
Saludos
-
La version del compilador que tengo es la 3.181 y el ide es el PCW C Compiler v3.41
Pego una foto con el error. Si hay algún archivo tipo log para ver mas detalles avísame please para que lo busque..
Gracias
Y por si las dudas pego el proyecto completo (bueno, hasta donde pude avanzar), con librerias y proteus includo en el archivo rar
-
Viejo he compilado tu programa y no me ha dado errores.
Debe ser algún problema en tu compilador.
Sólo me dió 3 Warnings: 2 de variables no usadas, y 1 de que "el código no tiene efecto" en la línea donde tienes el "RA0_ANALOG"...
Ok saludos, nos leemos! :mrgreen:
-
Olvidé mencionarlo, yo uso el CCS 4.057 desde MPLAB.
Aquí está el output:
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "robertachov4.c" +DF +LN +T +A +M +Z +Y=9 +EA
>>> Warning 207 "robertachov4.c" Line 39(1,1): Code has no effect
>>> Warning 202 "robertachov4.c" Line 8(28,31): Variable never used: seg
>>> Warning 202 "robertachov4.c" Line 15(8,13): Variable never used: motor
Memory usage: ROM=42% RAM=39% - 45% 0 Errors, 3 Warnings.
Ok saludos, nos leemos! :mrgreen:
-
Hola.
A mi tampoco me dio ningun error, solo unos warnings (yo lo he compilado en el IDE del CCS PCMv4.073). Debe ser la version del compilador, si es que mandaste el proyecto que te genera el error claro esta :lol:.
(http://img370.imageshack.us/img370/8954/robertachozt6.jpg)
Saludos
-
Gracias MLO y Firepic, ahora me pondré en campaña de conseguir ese compilador. Y efectivamente como dicen, el programa tiene variables para las que aun no escribi codigo y codigo sin usar como el RA0_analog con el que sensaré la tensión de la batería.
Gracias por su ayuda. Podríamos decir que es un BUG de CCS v3.181 y v3.180?? (probé con los dos y lo mism)
Saludoss
-
Me baje el PCWHD 4.068, además de estar terriblemente mas bueno que el 3.181 a nivel gráfico me de la impresion que usa menos memoria en la compilacion del mismo programa... Sumado a que no me tiro el error!!!!!...
Un saludo para todos y gracias por dedicar tantas horas a este foro,,, es un manual en sí mismo.
By
-
Sorry, esto no se termina mas... ahora compila hermoso como les decia pero en el proteus el lcd solo muestra las variables numericas... no las string de texto..
Alguna idea?
N
pd: esto no funciona
int vlcd[]="hola"
printf(lcd_putc, "%s",vlcd); // No muestra nada, se queda el lcd em blanco..
-
Al fin, era un problema de tipo de variable... en lugar de int debía ser int16... lo raro es que en el compilador viejo me andaba... en fin
Chausss ta pronto
-
Felicitaciones vasconi, por haber resuelto tu problema! :-/
Pues si, a veces los compiladores nos hacen malas jugadas...
Ok saludos, nos leemos! :mrgreen:
-
Hola.
Felicitaciones vasconinicolas, pasate por la ayuda del CCS nuevo para que te familiarices con las nuevas "cosas" -bug's? :D- que tiene.
Saludos.