TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: rivale en 15 de Enero de 2012, 16:01:27
-
Hola a todos, estoy haciendo un programa para comunicar la pc con mi PIC via usb-cdc y todo ha funcionado bien, hasta que intento usar la interrupcion por usb, les comento cuando pongo estas lineas me compila bien
#int_usb
void usb_data();
sin embargo cuando intento completar la funcion:
#int_usb
void usb_data()
{
}
me marca el siguiente error al compilar:
Duplicate interruption function
alguna idea de porque pasa esto, tambien si intento poner mas lineas dentro de la funcion de interrupcion me marca el mismo error.
lo que quiero es que al recibir el dato brinque a la interrupcion para no tener que estar preguntando por datos dentro de la funcion principal
-
se ve que hay otro usb_data por ahi (en el stack del usb por ejemplo) y por eso te salta ese error.
-
gracias merlinz, entonces solo con cambiar el nombre de la funcion quedaria?, voy a probar
-
yam probe cambiando el nombre de la funcion pero me sigue mandando el mismo error, me dice que la funcion de interrupcion esta duplicada no se porque :?
-
pues no logro hacer funcionar la interrupcion, ahora estoy con otro problema, si logro enviar datos a la pc, pero cuando envio de la pc al pic, este siempre me lee el mismo dato, solo estoy haciendo un echo, pero no me funciona. pongo mi codigo
#include <18F4550.h>
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=115200,xmit=pin_c6,rcv=pin_c7)//configuracion del puerto rs232 envia por pin_c6 y recibe por pin_c7
#include "usb_cdc.h"
char datos_usb=0,rs232_dat=0;
void config()
{
setup_adc_ports(no_analogs);
delay_ms(300);
//enable_interrupts(int_usb);
//enable_interrupts(global);
usb_cdc_init();
usb_init();
}
void main()
{
config();
//while(!usb_cdc_connected());//espera mientras no esta conectado
while(true)
{
usb_task();//habilita periférico usb e interrupciones
if(usb_enumerated())
{
if(usb_cdc_kbhit())
{
datos_usb=usb_cdc_getc();
printf(usb_cdc_putc,"Recibi el dato:--%c",datos_usb);//imprimo datos por el usb;
usb_cdc_putc('--');
}
}
}
}
si imprime bien todo exepto el valor que le envio desde la pc, me parece qe es un error del ccs, alguno le ha pasado algo similar?
-
Me respondo yo solo, por si alguien tiene el mismo problema despues, ya logre corregir el error de la lectura de, en efecto era un problema con los drivers del ccs, simplemente los substitui por los que tengo de una version anterior y funciono
ahora sigo con el problema de la interrupcion que no se porque no la puedo poner :?
-
hola rivale, nunca habia intentado usar la int_usb pero mira lo que encontré en el
foro de ccs (http://www.ccsinfo.com/forum/viewtopic.php?p=90560)
-
gracias jhozate, en efecto la interrupcion existe en la libreria de pic18_usb.h en la linea 1013
#int_usb
void usb_isr() {
if (usb_state==USB_STATE_DETACHED) return; //should never happen, though
if (UIR) {
debug_usb(debug_putc,"\r\n\n[%X] ",UIR);
if (UIR_ACTV && UIE_ACTV) {usb_isr_activity();} //activity detected. (only enable after sleep)
if (UCON_SUSPND) return;
if (UIR_UERR && UIE_UERR) {usb_isr_uerr();} //error has been detected
if (UIR_URST && UIE_URST) {usb_isr_rst();} //usb reset has been detected
if (UIR_IDLE && UIE_IDLE) {usb_isr_uidle();} //idle time, we can go to sleep
if (UIR_SOF && UIE_SOF) {usb_isr_sof();}
if (UIR_STALL && UIE_STALL) {usb_isr_stall();} //a stall handshake was sent
if (UIR_TRN && UIE_TRN) {
usb_isr_tok_dne();
UIR_TRN=0; // clear the token done interrupt., 0x190.3
} //a token has been detected (majority of isrs)
}
}
tendria que quitarla de aca y ponerla en mi archivo .c