TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Alexandra en 29 de Mayo de 2009, 19:01:24

Título: PicUSB sin Reset
Publicado por: Alexandra en 29 de Mayo de 2009, 19:01:24
Hola, estoy implementado un pequeño prototipo tomando como referencia la aplicacion del PicUSB del amigo J1M, mi problema es el siguiente.

Tengo una aplicacion que esta corriendo en la PC y que me permite conectarme con el PIC18F4550 para intercambiar datos, cuando conecto por primera ves todo funciona muy bien pero cuando cierro la aplicacion y lo vuelvo a abrir, necesariemente tengo que resetear el pic para que funcione correctamente la aplicacion, hay alguna manera de que el pic automaticamente se reconecte o resetee nuevamente sin tener la necesidad de resetearlo manualmente?

Dentro del codigo de J1M encontre este parrafo, acaso esto esta relacionado con mi problema?

Citar
If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
Título: Re: PicUSB sin Reset
Publicado por: J1M en 29 de Mayo de 2009, 21:34:44
Exacto Alexandra, tienes que habilitar ese pin para detectar cuando se ha conectado/desconectado el usb, para ello se utiliza la funcion usb_task(); Ella se encarga sola de gestionar eso, simplemente tendrías que llamarla dentro de tu while(true).

saludos.
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 29 de Mayo de 2009, 22:09:16
Hola J1M,  :-/  :-/  :-/  gracias por responder, si te entendi tendria que colocar nuevamente usb_task() como se aprecia???

Citar
void main(void) {

   int8 recibe[3];                  //declaramos variables
   int8 envia[1];

   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   usb_init();                      //inicializamos el USB

   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host

   LED_OFF(LEDR);
   LED_ON(LEDV);                    //encendemos led verde

   while (TRUE)
   {
      usb_task();  

      if(usb_enumerated())          //si el PicUSB está configurado
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe

            if (modo == 0) // Modo_Suma
            {
               resultado = param1 + param2;  //hacemos la suma

               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC
            }

            if (modo == 1) // Modo_Led
            {
               if (param1 == 0) {LED_OFF(LEDV); LED_OFF(LEDR);} //apagamos los leds
               if (param1 == 1) {LED_ON(LEDV); LED_OFF(LEDR);} //encendemos led verde
               if (param1 == 2) {LED_OFF(LEDV); LED_ON(LEDR);} //encendemos led rojo
            }
         }
      }
   }
}
Título: Re: PicUSB sin Reset
Publicado por: gera en 30 de Mayo de 2009, 12:37:37
yo creo q mas bien seria un
Código: [Seleccionar]
while(!usb_task());eso va a hacer q hasta q no conecte el usb, se quede estancado en ese bucle, y cuando lo conecte sigue corriendo.
suerte!!
Título: Re: PicUSB sin Reset
Publicado por: J1M en 30 de Mayo de 2009, 21:30:31
Si Alexandra, si lo pones como dices vas a otorgar la libertar en el while(true) de que se hagan otras 'tareas'.

Gera, si lo pone como dices, quizá en su caso no tendría problemas, pero en uno más general, bloquearía al PIC en esa instrucción. Lo ideal es plantearlo como una 'tarea'.
Título: Re: PicUSB sin Reset
Publicado por: gera en 30 de Mayo de 2009, 22:59:14
Claro, todo depende de la aplicacion. Si tu programa requiere si o si q uses el usb, no tiene sentido q continue si no esta conectado. Ahora, si tu aplicacion ademas hace otras cosas, hay q hacer como dijo J1M, poner una tarea q chequee el estado del mismo cada cierto periodo.
Saludos!!
Título: Re: PicUSB sin Reset
Publicado por: PalitroqueZ en 31 de Mayo de 2009, 00:15:12
Alexandra lee a partir de este post:

http://www.todopic.com.ar/foros/index.php?topic=15208.msg103242#msg103242

tal vez te pueda servir en algo.

Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 01 de Junio de 2009, 18:52:58
Hola PalitroqueZ, tomando tus ejemplos y la de J1M he modificado mi codigo pero la PC no lo reconoce el puerto USB,  :mrgreen: podrias darle una mirada a mi codigo, por que yo no encuentro el error.

Código: [Seleccionar]
#include <18F4550.h>
#DEVICE ADC=8
//Configurado para trabajar con 20MHz
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48MHZ)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    1                 //size to allocate for the rx endpoint 1 buffer

#define USB_CON_SENSE_PIN PIN_E3

#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h>       //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>         //handles usb setup tokens and get descriptor reports

void main(void) {

   int buffer_tx[1];                  //declaramos variables

   setup_adc_ports(AN0|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   set_adc_channel(0);
   delay_us(10);

   usb_init_cs();                      
  
   while (TRUE)
   {
     usb_task();
      if(usb_enumerated())          //si el PicUSB está configurado
      {
       buffer_tx[0] = read_adc();
       delay_us(100);
       usb_put_packet(1, buffer_tx, 1, USB_DTS_TOGGLE);
          
        }
    }
 }
Título: Re: PicUSB sin Reset
Publicado por: PalitroqueZ en 01 de Junio de 2009, 21:37:46
si el cristal es de 20MHz, entonces sustituye XTPLL por HSPLL

Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 02 de Junio de 2009, 10:52:56
Hola PalitroqueZ, ya hice el cambio pero  :? el problema es el mismo, el windows a cada momento lanza su mensaje de que no reconoce el dispositivo USB
Título: Re: PicUSB sin Reset
Publicado por: jonathanPIC888 en 02 de Junio de 2009, 13:22:25
Puede ser que en una de esas el problema sea de montaje del circuito, problemas del sistema operativo (me ha pasado) o también que hayas conectado los cables del USB al revés.
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 02 de Junio de 2009, 13:48:21
No puede ser por que cuando comento USB_CON_SENSE_PIN PIN_E3 y usb_task() todo funciona OK

Título: Re: PicUSB sin Reset
Publicado por: PalitroqueZ en 03 de Junio de 2009, 23:06:30
Alexandra, una pregunta: ¿estas segura que RE2 está como entrada digital?

Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 04 de Junio de 2009, 10:59:01
Hola Palitroquez,  :( no es suficiente con la configurcaion del fuse NOMCLR,? o tambien tengo que usar el set_tris_e(0x08)?
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 04 de Junio de 2009, 11:38:42
Hola Palitroquez, he hecho la prueba configurandolo como tu dices es decir set el pin E3 como entrada y todo sigue igula, la Pc no reconoce el USB, por favor podrias  :mrgreen: ayudarme por que ya me estoy estresando con esto... :x
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 11 de Junio de 2009, 10:39:24
PalitroqueZ,  :-/  :-/  :-/ mil disculpas por mi insistencia pero ya no se aquien mas recurrir para solucionar este problema, por favor podrias darte un tiempito y probar mi codigo a ver si me puedes dar algun consejo de como corregir esto.
Título: Re: PicUSB sin Reset
Publicado por: PalitroqueZ en 14 de Junio de 2009, 19:16:41
he revisado tu código y no he encontrado problemas, la verdad no se que pueda estar ocurriendo allí  :(

Título: Re: PicUSB sin Reset
Publicado por: washi_w_z_r en 15 de Junio de 2009, 13:10:10
Hola Alexnadra , vi tu cod , dos dudas que tengo: si usas un cristal de 20Mhz entonces deberias usar PLL5 y no PLL1, ademas declaras #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8), uhmmm estoy confundido esta declaracion se hace para la trasmicion USB_CDC uhmm lineas abajo tu declaras Endpoint que se usa para transmicion USB_BULK  :-/  ,  saludos
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 15 de Junio de 2009, 18:42:57
Hola PalitroquiZ, dime llegaste a probar  mi codigo?

washi_w_z_r , el PLL5 ya ha sido corregido, con respecto al #use rs232 es para tener disponible el puerto serie del pic
Título: Re: PicUSB sin Reset
Publicado por: J1M en 15 de Junio de 2009, 19:00:22
Prueba con 'usb_init' en vez de 'usb_init_cs', haber si sale del bucle y te lo inicia.

un saludo.
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 16 de Junio de 2009, 14:39:56
Sigue igual,   :( no me reconoce al USB...
Título: Re: PicUSB sin Reset
Publicado por: Alejandro en 16 de Junio de 2009, 16:19:49
Citar
yo creo q mas bien seria un

Código:
while(!usb_task());

Gera por que cuando compilo este sentencia el CCS me da error?
Título: Re: PicUSB sin Reset
Publicado por: J1M en 17 de Junio de 2009, 08:07:35
No lo tengo claro, pero creo que podrías tener el fallo en el hardware ... pon por aquí el esquema electrónico y los valores de los componentes que estás usando.

un saludo,
Título: Re: PicUSB sin Reset
Publicado por: PalitroqueZ en 18 de Junio de 2009, 21:08:33
Hola PalitroquiZ, dime llegaste a probar  mi codigo?

...

el código que subiste no llegué a probarlo  :(

Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 19 de Junio de 2009, 12:28:55
 :g)  please...
Título: Re: PicUSB sin Reset
Publicado por: gera en 19 de Junio de 2009, 13:03:07
Citar
yo creo q mas bien seria un

Código:
while(!usb_task());

Gera por que cuando compilo este sentencia el CCS me da error?

Q error te da? Quizas sea q en CCS no es valido terminar un while con punto y coma... proba while(!usb_task()){}
saludos!
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 19 de Junio de 2009, 13:30:30
Hola J1M, este es el diagrama los condesandores de desacoplo, el cristal y sus condesadores estan sobreentendidos.
Y este es mi codigo:

Código: [Seleccionar]
/********************************************************************************/
/*                            PicUSB.c                            */
/********************************************************************************/
#include <18F4550.h>
#DEVICE ADC=8
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48MHZ)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    1                 //size to allocate for the rx endpoint 1 buffer

#define USB_CON_SENSE_PIN PIN_B3

#include <pic18_usb.h>      //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h>       //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>   

void main(void) {

   int buffer_tx[1];                  //declaramos variables
   set_tris_b(0x08);

   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_2);
   set_adc_channel(0);
   delay_us(10);

   usb_init_cs();   
                   
   
   while (TRUE)
   {
     
     usb_task();
      if(usb_enumerated())          //si el PicUSB está configurado
      {
buffer_tx[0] = read_adc();
        delay_us(10);
        usb_put_packet(1, buffer_tx, 1, USB_DTS_TOGGLE);
           
        }
    }
 }
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 19 de Junio de 2009, 13:33:27
Gera este es el error:
Citar
Executing: "D:\Archivos de programa\Microchip\PICC\Ccsc.exe" +FH "Test Sense2.c" +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 51 "Test Sense2.c" Line 48(20,21): A numeric expression must appear here
      1 Errors,  0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Fri Jun 19 11:32:09 2009
Título: Re: PicUSB sin Reset
Publicado por: J1M en 19 de Junio de 2009, 13:44:04
Si C1 es electrolítico, has comprobado que está bien polarizado?

Me imagino que las soldaduras son limpias y no tienes ninguna fría verdad??
Título: Re: PicUSB sin Reset
Publicado por: Alexandra en 19 de Junio de 2009, 13:58:01
J1M, cuando comento
Código: [Seleccionar]
#define USB_CON_SENSE_PIN PIN_B3
, todo funciona muy bien claro que cuando reinicio la aplicacion de la PC tambien tengo que resetear el Pic, esto me indica que el hardare del pic esta OK.
Título: Re: PicUSB sin Reset
Publicado por: Alejandro en 19 de Junio de 2009, 21:47:14
Citar
Executing: "D:\Archivos de programa\Microchip\PICC\Ccsc.exe" +FH "Test Sense2.c" +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 51 "Test Sense2.c" Line 48(20,21): A numeric expression must appear here
      1 Errors,  0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Fri Jun 19 11:32:09 2009

Es el mismo error ¿ ?
Título: Re: PicUSB sin Reset
Publicado por: rodrigo_control2009 en 24 de Julio de 2009, 18:53:39
Que tipo de  comunicación implementa ???  no es  CDC 
el arch  usb_cdc.c   ya  incluye pic18_usb.h   usb.c   

pq no  usa  usb_cdc_init ();  esta función configura  el puerto 

void usb_cdc_init(void) {
   usb_cdc_line_coding.dwDTERrate=9600;
   usb_cdc_line_coding.bCharFormat=0;
   usb_cdc_line_coding.bParityType=0;
   usb_cdc_line_coding.bDataBits=8;
   (int8)usb_cdc_carrier=0;
   usb_cdc_got_set_line_coding=FALSE;
   usb_cdc_break=0;
   usb_cdc_put_buffer_nextin=0;
   usb_cdc_get_buffer_status.got=0;
   usb_cdc_put_buffer_free=TRUE;
}

void usb_init(void) {
   usb_init_cs();

   do {
      usb_task();
   } while (usb_state != USB_STATE_POWERED);
}

En que  va  su problema .... el PC   no  reconoce  su  disposiivo .....