Gracias al amigo SUPER_HERRERA se logro corregir el error de lectura que tenia todos
los compañeros de este blog.. Espero y les sea de mucha ayuda.
#include 18F4550.h
#DEVICE ADC=8
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#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 3 //size to allocate for the rx endpoint 1 buffer
#include //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include //Configuración del USB y los descriptores para este dispositivo
#include //handles usb setup tokens and get descriptor reports
#define LOADER_END 0x7FF
#define LOADER_SIZE 0x6FF
#build(reset=LOADER_END+1, interrupt=LOADER_END+9)
#org 0, LOADER_END {} // nothing will replace the bootloader memory space
// END OF bootloader definition
//Asignacion de variables
#define LEDV PIN_D0
#define LEDR PIN_D1
#define LED_ON output_high
#define LED_OFF output_low
#define modo recibe[0]
#define param recibe[1]
#define Temperatura envia[0]
void main(void)
{
int8 recibe[2];
int8 adc[1];
set_tris_d(0x00); //Configuracion para el puerto D como salida
output_d(0x00); //Limpiamos el puerto D
setup_adc_ports(AN0|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
set_adc_channel(0);
delay_us(10);
LED_ON(LEDV); //Apagamos el led Rojo
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
delay_ms(50);
LED_OFF(LEDV); //encendemos led verde
while (TRUE)
{
if(usb_enumerated()) //Si el PicUSB está configurado
{
salto:
if (usb_kbhit(1)) //Si el endpoint de salida contiene datos del host
{
usb_get_packet(1, recibe, 2); //Cachamos el paquete de tamaño 2bytes del EP1 y almacenamos en recibe
if (modo==1)//modo salida digital d1,d2,d3,d4,d5,d6,d7,d8
{
output_d(param); //El dato param recibido lo mandamos al puerto o registro d
}
else if(modo==2)//modo analogico temperatura
{
adc[0] = read_adc();
delay_us(10);
if(usb_put_packet(1,adc,1,USB_DTS_TOGGLE)); //enviamos el paquete de tamaño 1byte del EP1 al PC
{ output_toggle(PIN_D0); }
delay_ms(32);
goto salto;
}
else if(modo==4)//Todo al mismo tiempo
{
adc[0] = read_adc();
delay_us(10);
usb_put_packet(1,adc,1,USB_DTS_TOGGLE);
output_d(param);
delay_ms(32);
}
else
goto salto;
}
}
}
}
Adrian.
ResponderEliminarGracias por esta valiosa informacion.
Te mandamos un cordial saludos desde La UT de Hermosillo Sonora.
Saludos.
ResponderEliminarGracias por la correccion, detectamos que si eliminas la multiplicacion y conversiones y lees el dato desde el puerto analogico te arroja una lectura hasta 127 y no hasta 255 como un ADC de 8 bits, funciona muy bien pero como 7 bits.
gracias
Hola
ResponderEliminarHe estado probando el código y compila bien pero cuando conecto la tarjeta, el PC no la reconoce.
Cómo lo solucionaste Andrés??
ResponderEliminarHola Andrés, cómo solucionaste ese problema? Ahora tengo el mismo...
ResponderEliminarGracias.
Germán.
Cómo lo solucionaste al final Andrés?? Yo tengo el mismo problema y necesitaría solucionarlo cuanto antes para poder entregar mi proyecto final de carrera.
ResponderEliminarGracias.
Germán.
Buenas, mirando el codigo de Herrera veo que lo q hace es poner un delay de 32 mSeg eso afecta la velocidad de muestreo 31.25 muestras por segundo...... Igualmente lo probe y tampoco evita q se cuelgue la lectura y no sea continua a la vista. Lo extraño es q funciona en algunas PC's sin delay de maravillas y en otras sucede lo q comento... Alguien a tenido el inconveniente?
ResponderEliminarpara ke les funcione perfecto a 8 bits y actualizacion de muestreo del canal analogo hagan lo siguiente borren esta lineas:
ResponderEliminar#define LOADER_END 0x7FF
#define LOADER_SIZE 0x6FF
#build(reset=LOADER_END+1, interrupt=LOADER_END+9)
#org 0, LOADER_END {} // nothing will replace the bootloader memory space
// END OF bootloader definition
y para ke funcione a 8 bits y no a 7 cambien la linea:
setup_adc(ADC_CLOCK_DIV_2);
por esta
setup_adc(ADC_CLOCK_INTERNAL);
compilen y listo...
Hola soy nuevo en el tema de programar pic, acabo de leer su aporte y es muy bueno, veo la correciòn que le hicieron al codigo, tengo pensado implementar esta tarjeta de adquisiciòn para aprender, el codigo que muestra arriba lo he copiado en el compilador ccs y me muestra varios errores, en los tokens y en la configaracion del usb asi como en el tipo de pic debo sustituir estas lineas por las tres del inicio en caso de usar el pic 18f4550??,
ResponderEliminarAdrian quisiera hacer una consulta estudie el codigo, los cambios hechos en la mchpusb.inf pero resulta que tu driver viene con una libreria mchpubs.dll pero otros driver el de Microchip viene sin la libreria dll solo viene el mchpubs.inf el cat y el mchpubs.sys, ademas el driver que da microchip el mchpubs.inf es muy diferente al driver que tu proporcionas. el driver que proporcionas da el icono de Labview en la tarjeta de adquisicion de datos, quisiera saber como lo lograste y si es dependiendo del analisis que hice antes de la consulta.
ResponderEliminarnecesito ayuda no me grafica en tiempo real que modifico?
ResponderEliminarSaludos.. despues de mucho batallar encontre la solucion a la lectura no continua. La tarjeta se tiene que desconectar y conectar nuevamente para actualizar la lectura en labview, esto es por que windows (7 en mi caso) deshabilita la comunicacion de la tarjeta para ahorrar energia, por lo tanto hay que desactivar esto. Vayan a administrador de dispositivos, encuentren la tarjeta PicUsb y le dan click derecho y propiedades-Administracion de energia y ahi desactivan la casilla que permite que el equipo apague el dispositivo. Hasta luego espero les funcione :)
ResponderEliminarAtuda con el ciclo While ya que solo lo ejecuta una sola vez gracias.
ResponderEliminarAlguien puede ayudarme con e ciclo while ya que solo lo ejecuta una sola vez el hardware y tengo que darle reset al PIC para ejecute otra accion
ResponderEliminarhola que ta. Que pasa con el while porque no funciona. Saludos
ResponderEliminarSolo cambia el numero de bytes a enviar por un 1 y se resuelve tu problema. Saludos
ResponderEliminarusb_put_packet(1,adc,1,USB_DTS_TOGGLE)
ResponderEliminar