Autor Tema: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC  (Leído 2238 veces)

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

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Tengo un PIC conectado a unos sensores y quiero que, en caso de que se conecte por USB a un ordenador y se abra una sesión de hyperterminal, el PIC presente un mensaje de presentación.

No sé cómo detectar en el PIC que el hyperterminal está listo para comunicarse con el PIC.

He leído algo sobre una señal DTR pero prefiero consultar antes de liarme más.

Estoy usando C18.

Gracias.
« Última modificación: 13 de Febrero de 2013, 12:08:17 por jfmateos2 »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #1 en: 13 de Febrero de 2013, 12:25:59 »
Hola

Lo que habria que detectar es cuando se conecta al puerto ... y mientras esperas la numeracion (que se da cuando se abre el hyperterminal) se podrian leer los sensores. En el momento de abrir el hyperterminal se sale del ciclo de espera de numeracion y se pasaria al mensaje que mencionas ...

Saludos
El papel lo aguanta todo

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #2 en: 13 de Febrero de 2013, 18:00:52 »
Gracias MLO.

Más concretamente, la clave está en el archivo usb_functions_cdc.c, en la variable control_signal_bitmap.DTE_PRESENT.

He creado en main.c una variable llamada mostrarBienvenida a la que asigno inicialmente el valor 0.

Luego, en usb_functions_cdc.c defino esa misma variable como extern (extern unsigned char mostrarBienvenida;), y en la línea 341 pongo el siguiente código:

Código: [Seleccionar]
            if(control_signal_bitmap.DTE_PRESENT == 1)
            {
mostrarBienvenida = 1;
}

De modo que en el main.c ya sólo me queda hacer:

Código: [Seleccionar]
if(mostrarBienvenida == 1){
mostrarBienvenida = 0;
putUSBUSART(bienvenida,sizeof(bienvenida));
}

La pista la he cogido de aquí: http://www.microchip.com/forums/m529368-print.aspx

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #3 en: 14 de Febrero de 2013, 02:19:33 »
¿Y sabes cómo detectar si se desconecta el usb?
Yo choqué una vez con ese problema y la única forma de resolverlo fue sensando si llegaban 5V por el cable USB, pero no fui capaz de hacerlo por software.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #4 en: 14 de Febrero de 2013, 03:24:32 »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #5 en: 14 de Febrero de 2013, 07:07:49 »
Me parece que ese bit no existe en los 18F, pero lo chequearé.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #6 en: 14 de Febrero de 2013, 10:15:04 »
En USB_CDC.h del CCS esta esta estructura declarada:

Citar
struct  {
   int1 dte_present; //1=DTE present, 0=DTE not present
   int1 active;      //1=activate carrier, 0=deactivate carrier
   unsigned int reserved:6;
} usb_cdc_carrier;
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #7 en: 14 de Febrero de 2013, 18:25:12 »
Pues he metido esto en el bucle principal de mi programa y compila bien, pero el led verde no se enciende nunca:

Código: C
  1. if (usb_cdc_carrier.dte_present)
  2.          output_high(verde_anodo);
  3.         else
  4.          output_low(verde_anodo);

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #8 en: 14 de Febrero de 2013, 19:03:52 »
Y antes activas el Carrier ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #10 en: 14 de Febrero de 2013, 19:51:59 »
Hola

Y luego la deteccion no se hace con un divisor de tension? creo que en el archivo del CCS estaba el valor de las resistencias (100k si no estoy mal) ... recuerdo que en una de las versiones se podia detectar si se conectaba el hyperterminal tambien .... voy a buscarlo que ha de estar "refundido" por ahi ..

Saludos
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #11 en: 15 de Febrero de 2013, 02:42:08 »
Sí, detectando la presencia de los 5V es sencillo saber si está enchufado o no, pero me sorprende que no se pueda conseguir por software.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #12 en: 16 de Febrero de 2013, 01:26:41 »
Hola maestro Noc ... por que dices que no se puede?? a mi me funciona con la funcion input_state() ...

Saludos
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Detectar en el PIC que el ordenador está listo para comunicarse por USB CDC
« Respuesta #13 en: 16 de Febrero de 2013, 02:12:35 »
¿Usando USB CDC en un PIC18F?, a ver si a ser la versión de CCS, ¿cuál estás usando?


 

anything