Autor Tema: interrupciones con pic18f4550 y USB-CDC  (Leído 6132 veces)

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

Desconectado mariomarst

  • PIC10
  • *
  • Mensajes: 4
interrupciones con pic18f4550 y USB-CDC
« en: 19 de Octubre de 2009, 02:44:18 »
hola que tal mi problema parece ser sencillo pero yo simplemente no logro hallar el problema, soy nuevo en esto del C para pics, entonces estoy usando el compilador C CCS y lo que he hecho es generar un CDC por medio del USB del PIC 18f4550 y asi crear un COM ( puerto serial ) esta parte me ha funcionado sin ningun problema, cuando conecto mi dispositivo este funciona correctamente, pero el problema es:    mi programa debe ir adquiriendo datos por el usb, y por medio de de las interrupciones externas del pic, INT, INT1 INT2 (RB0, RB1, RB2) hacer cierto manejo con mis variables pero cuando agrego el codigo de las interrupciones al programa la computadora ya no reconoce el dispositivo, lo quito y de nuevo funciona sin problemas, mi codigo es este:         si alguien tubiera una idea de que estoy haciendo mal se los agradeceria!!!!!!!!!!!

con interrupciones:                   ( no reconoce windows el dispositivo)

         #include <18F4550.h>
         #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN
         #use delay(clock=48000000)
         
         #include <usb_cdc.h>
         #include <usb_desc_cdc.h>
         
         //-Variables
                          int a = 0;
                          int b = 0;
                          int cont1 = 0;
                          char datausb;
         
                                 
         #int_EXT
         void  EXT_isr(void)
         {
         
         // Codigo de interrupcion 0

         }
         
         #int_EXT1
         void  EXT1_isr(void)
         {
         
          // Codigo de interrupcion 1         

         }
         
         #int_EXT2
         void  EXT2_isr(void)
         {
         
         // Codigo de interrupcion 2         

         }
                       
         void main() {
            usb_cdc_init();
            usb_init();                     
         
            set_tris_B(0x0F);                       
            Output_B(0x00);
                         
                        ext_int_edge(0,L_TO_H);
                        ext_int_edge(1,L_TO_H);
                        ext_int_edge(2,L_TO_H);
         
            while (!usb_cdc_connected()) {}
            while (true)
            {
           
                        enable_interrupts(INT_EXT);
                        enable_interrupts(INT_EXT1);
                        enable_interrupts(INT_EXT2);
                        enable_interrupts(GLOBAL);
                       
               usb_task();
               if(usb_enumerated())         
               {
                  if (usb_cdc_kbhit())         
                  {
                 
                     datausb = usb_cdc_getc();
                                         
                    //       Codigo de Manejo de Variables     
                   
                  }
               }
            }
         }


sin interrupciones:                             (si reconoce windows el dispositivo)

         #include <18F4550.h>
         #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN
         #use delay(clock=48000000)
         
         #include <usb_cdc.h>
         #include <usb_desc_cdc.h>
         
                          int a = 0;
                          int b = 0;
                          int cont1 = 0;
                          char datausb;

         void main() {
            usb_cdc_init();
            usb_init();                     
         
            set_tris_B(0x0F);                       
            Output_B(0x00);
         
            while (!usb_cdc_connected()) {}
            while (true)
            {
                       
               usb_task();
               if(usb_enumerated())         
               {
                  if (usb_cdc_kbhit())         
                  {
                      datausb = usb_cdc_getc();
                     
                      //     Codigo de programa     
                   
                  }
               }
            }
         }



Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: interrupciones con pic18f4550 y USB-CDC
« Respuesta #1 en: 19 de Octubre de 2009, 13:32:57 »
Hola, el manejo de USB por interrupciones es muy exigente en cuanto a tiempos y si agregas más interrupciones el pic apenas tendrá tiempo para atender a todos.

Una pregunta, configuraste las interrupciones en RB, pero ¿conectaste algo al puerto B? Si dejas abiertos los pines pueden desencadenarse múltiples interrupciones por ruido que obliguen al pic atenderlas y desatender la del USB.

Si desatiendes una interrupción USB, el host te desenumera e interrumpe toda conexión USB hasta que reconectes el dispositivo.

Sé limitado en cuanto a interrupciones cuando trabajes con USB.

Desconectado mariomarst

  • PIC10
  • *
  • Mensajes: 4
Re: interrupciones con pic18f4550 y USB-CDC
« Respuesta #2 en: 19 de Octubre de 2009, 13:50:34 »
pues realmente ahora estoy probando el pic en una placa Easypic4, asi que me imagino que por dejar los pines sin conexion no puede ser el problema, pero me queda la duda de lo que has dicho:

"Si dejas abiertos los pines pueden desencadenarse múltiples interrupciones por ruido que obliguen al pic atenderlas y desatender la del USB."

en este caso si atiendo una interrupcion siempre me va desatender el USB??

en otro caso ando con otra duda sobre como leer un pin normal del PIC por flanco?? eso tambien me podria servir pero no encuentro como hacer esto

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: interrupciones con pic18f4550 y USB-CDC
« Respuesta #3 en: 19 de Octubre de 2009, 14:27:36 »
Si configuras un pin para que detone una interrupción ante un cambio de estado y el pin está desconectado entonces el ruido electromagnético puede cambiar el estado del pin y por lo tanto llamar a una interrupción. Si ese ruido sucede en más pines que detonan interrupciones entonces el pic estará atendiendo una infinidad de interrupciones dejando poco tiempo para atender la más importante... la USB.

Los pines deben estar conectados a resistencias pullup o pulldown.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: interrupciones con pic18f4550 y USB-CDC
« Respuesta #4 en: 19 de Octubre de 2009, 14:42:50 »
Claro cuando estas cerca de una estación transformadora   :D :D O al tocar la placa con la mano, etc.  :mrgreen:

Saludos!
No contesto mensajes privados, las consultas en el foro