TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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?
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)
//
/////////////////////////////////////////////////////////////////////////////
-
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.
-
Hola J1M, :-/ :-/ :-/ gracias por responder, si te entendi tendria que colocar nuevamente usb_task() como se aprecia???
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
}
}
}
}
}
-
yo creo q mas bien seria un
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!!
-
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'.
-
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!!
-
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.
-
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.
#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);
}
}
}
-
si el cristal es de 20MHz, entonces sustituye XTPLL por HSPLL
-
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
-
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.
-
No puede ser por que cuando comento USB_CON_SENSE_PIN PIN_E3 y usb_task() todo funciona OK
-
Alexandra, una pregunta: ¿estas segura que RE2 está como entrada digital?
-
Hola Palitroquez, :( no es suficiente con la configurcaion del fuse NOMCLR,? o tambien tengo que usar el set_tris_e(0x08)?
-
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
-
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.
-
he revisado tu código y no he encontrado problemas, la verdad no se que pueda estar ocurriendo allí :(
-
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
-
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
-
Prueba con 'usb_init' en vez de 'usb_init_cs', haber si sale del bucle y te lo inicia.
un saludo.
-
Sigue igual, :( no me reconoce al USB...
-
yo creo q mas bien seria un
Código:
while(!usb_task());
Gera por que cuando compilo este sentencia el CCS me da error?
-
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,
-
Hola PalitroquiZ, dime llegaste a probar mi codigo?
...
el código que subiste no llegué a probarlo :(
-
:g) please...
-
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!
-
Hola J1M, este es el diagrama los condesandores de desacoplo, el cristal y sus condesadores estan sobreentendidos.
Y este es mi codigo:
/********************************************************************************/
/* 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);
}
}
}
-
Gera este es el error:
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
-
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??
-
J1M, cuando comento
#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.
-
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 ¿ ?
-
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 .....