TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: javier en 21 de Enero de 2012, 22:01:38
-
Hola,
Estoy arrancando con usb y ya empeze con dolor de cabezas, el envio de datos del pic --> pc anda bien, pero cuanco testeo comunicacioon pc--> pic siempre recibo el valor decimal 11 , me base en el ejemplo posteado en http://picmania.garcia-cuervo.net/usb_3_cdctransfers.php , como vi que no me andaba la recepcion, achique el programa y agrege un pin uart (PIN_D7)pasa sacar los datos y ver que estoy recibiendo...aca posteo el codigo, me fije en otros posts y no encuentro que estoy haciendo mal, descarto problemas de hardware porque anda el envio de datos, alguna idea?
Saludos,
Javier
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_D7, rcv=PIN_A4,STREAM=PUER_PC)
#include ".\include\usb_cdc.h"
#DEFINE LED PIN_E2
void main() {
BYTE i, j, address, value;
output_high(LED);
delay_ms(500);
output_low(LED);
delay_ms(500);
fprintf(PUER_PC,"%S\n\r","TEST COMM 232");
delay_ms(300);
usb_cdc_init();
usb_init();
while(!usb_cdc_connected()) {}
do {
usb_task();
if (usb_enumerated()) {
printf(usb_cdc_putc,"\r\n\n Ingresar Valor:\r\n"); // manda datos pic --> pc
value =usb_cdc_getc(); // recibe datos pc --> pic
fprintf(PUER_PC," valor =%u\n\r", value ); //mando lo que recibo para chequear(siempre recibe "11"!!)
}
} while (TRUE);
}
-
yo tuve ese mismo problema y fue por el ccs, que version tienes?, yo cambie los archivos de usb por unos que tenia de un ccs version 4.08
-
estoy con la version 4.114 .. con que version tuviste problemas?reemplazaste usb_cdc.h ?
-
Bueno...andubo cuando lo compile con la version 3.249 (trate reemplazando el archivo usb.h en 4.114 pero tira error al compilar),
ahora me encuentro con 2 nuevos problemas que no se como resolver..
1-No anda en windows 7,solo xp, ni llego a la parte de instalar el driver(.inf) porque no lo detecta como dispositivo usb - creo que hay que modificar el archivo usb_desc_cdc.h que en el ejemplo fueron modificados por redpic para que ande en xp
2-En xp anda pero note que cuando se enchufa en diferentes puertos usb de la misma computadora, el serial com que se genera cambia de numero -pasa de serial com5 a com4 y a com6, supongo que el mismo problema se genera en windows 7
Si hay alguien me puede dar una mano, agredezo muchisimo la ayuda...
Saludos,
Javier
-
Hola, checa este link y prueba con los archivos que subi ahi: http://www.todopic.com.ar/foros/index.php?topic=33531.0 (http://www.todopic.com.ar/foros/index.php?topic=33531.0)
en cuanto al nombre del puerto es normal, cada puerto usb te va a asignar un com diferente
-
Rivale sos un maestro!salio andando en windows 7,muchisimas gracias!! en cuanto al numero de puerto com asignado, sabes si hay alguna manera de que siempre tome el mismo numero? yo pensaba un numero alto(como 25) para qu no tenga conflicto con otros puertos com. El tema es que del lado de la pc estoy programando con VB6, que ya tiene un monton de problemas con el control MSComm porque no detecta cuando el cable pasa de estar enchufado a desenchufado, eso ya lo resolvi pero me obliga a conectar y desconectar el puerto continuamente para testear el estado..si a eso le sume que no se en que puerto esta se complica mas...alguna idea si lo que quiero hacer es posible?, en el ejemplo de redpic dice que abre el puerto com 5 pero no encuento en los archivos donde esta eso determinado
Saludos y gracias por adelantado!
Javier
-
siempre que conectes tu micro a un puerto usb tendra siempre el mismo com, pero el numero del puerto se lo asigna la computadora, no el micro, pero no deberias tener problemas ya que la pc se encarga de enumerarlos y no se pueden repetir 2 puertos com.
-
no recuerdo como es en windows7, pero en xp se dirige a panel de control y en administrador de dispositivos buscar en la pestaña puertos COM, eliges el del pic, click derecho/propiedades. En la pestaña "configuracion del puerto" das click al boton "opciones avanzadas" y ahi encuentras como asignar otro numero a ese COM.
Pero como dice rivale, despues de que tu pic es reconocido y todo funciona bien, siempre se asigna el mismo nombre.
-
Muchas gracias por las respuestas Jhozate y rivale, ya resolvi el problema del lado de la computadora, aca posteo la solucion, el problema es que cuando el usuario instale el programa y enchufe el harware no se sabe que numero de puerto va a aprecer entonces del lado de vb6 no se sabe con que numero de puerto comunicarse...el otro problema es que por mas que uno escanee para ver que puerto existe puede ser que haya varios y hay que identificar el numero de puerto que tiene conectado el hardware. Por otro lado el vb6 tiene el problema que una vez que el puerto comm esta creado cuando se desenchufa el cable, no lo detecta(esta condicion se sigue dando :MSComm1.PortOpen = True) asi que hay que abrir y cerrar el puerto continuamente para "ver" si esta conectado o no. Aca resolvi todo con estas dos rutinas, la primer rutina "ver_en_que_puerto" testea los puertos desde el 1 al 9, cuando encuentra el harware(hardware responde con un cararter), empieza a abrir y cerrar el puerto cada 500ms rutina "TimerUsb_Timer", si se desconecta el cable, vuelve a la rutina "ver_en_que_puerto" y vuelve a hacer lo mismo, la subrutina testeo_communic manda un caracter al hardware y espera que el hardware responda con otro caracter.Espero les sea util.
Saludos,
Javier
Private Sub ver_en_que_puerto()
On Error Resume Next
StatusBar1.Visible = True
For indice_puerto = 1 To 9
MSComm1.CommPort = indice_puerto
MSComm1.PortOpen = True
resp = testeo_communic
If resp = True Then 'responde hardware!!!
puerto_detectado = True
TimerUsb.Interval = 500 'epiezo a abrir y cerrar este puerto(indice_puerto) constantemente
TimerUsb.Enabled = True
Exit Sub
Else
MSComm1.PortOpen = False
Err.Clear
End If
Next indice_puerto
StatusBar1.Panels(1).text = "Desconectado"
TimerUsb.Interval = 500 'epiezo a chequear ese puerto constantemente
TimerUsb.Enabled = True
End Sub
Private Sub TimerUsb_Timer()
On Error GoTo problema
DoEvents
TimerUsb.Enabled = False
If puerto_detectado = True Then
If MSComm1.PortOpen = True Then
DoEvents
StatusBar1.Panels(1).text = "Conectado com N:" & indice_puerto & ""
'Debug.Print "Conectado"
MSComm1.PortOpen = False
TimerUsb.Enabled = True
conectado_usb = True
Exit Sub
Else
DoEvents
MSComm1.PortOpen = True
TimerUsb.Enabled = True
conectado_usb = True
Exit Sub
End If
Else
ver_en_que_puerto
TimerUsb.Enabled = True
Exit Sub
End If
problema:
'Debug.Print Err.Number & ": " & Err.Description
Select Case Err.Number
Case 8002 'Número de puerto no válido
DoEvents
StatusBar1.Panels(1).text = "Desconectado"
Case 8005 'el puerto ya está abierto
DoEvents
StatusBar1.Panels(1).text = "Puerto no abierto"
Case 8012 '8012 el dispositivo no está abierto
DoEvents
StatusBar1.Panels(1).text = "Desconectado"
Case 8015
DoEvents
StatusBar1.Panels(1).text = "Desconectado"
End Select
conectado_usb = False
puerto_detectado = False
TimerUsb.Enabled = True
Exit Sub
-
Gracias por compartir tus resultados, me gusto la forma en que identificas en que puerto esta conectado el software, lo hare en mis siguientes interfaces para evitar pedirle al usuario que escoja el puerto.
Saludos
-
Gracias Rivale, indispensable poner On Error Resume Next en la primera rutina porque abre puertos que no existen. Funciona perfecto lo deje todo un dia testeado, cambiando de puertos usb y la aplicacion de vb6 siempre encuentra el hardware cuando los puertos com van cambiando.
Ahora el problema que tengo es con el compilador, el usb anda con la version la verson 3.249 pero no con 4.114 que estaba usando, el tema es que tengo que trabajar con pics(18f4550 me queda chico)que esta version vieja no soporta....hay hay hay...
Saludos,
Javier
-
busca los drivers de la version 4.08 o alguna similar, ya que la 4.114 me dio problemas al leer datos