29 sept 2010

Correccion del error de lectura no constante by HERRERA

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.

Comparte el codigo con nosotros:

#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;
}
}
}
}

17 comentarios:

  1. Adrian.
    Gracias por esta valiosa informacion.
    Te mandamos un cordial saludos desde La UT de Hermosillo Sonora.

    ResponderEliminar
  2. Saludos.
    Gracias 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

    ResponderEliminar
  3. Hola
    He estado probando el código y compila bien pero cuando conecto la tarjeta, el PC no la reconoce.

    ResponderEliminar
  4. Cómo lo solucionaste Andrés??

    ResponderEliminar
  5. Hola Andrés, cómo solucionaste ese problema? Ahora tengo el mismo...
    Gracias.

    Germán.

    ResponderEliminar
  6. 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.
    Gracias.

    Germán.

    ResponderEliminar
  7. 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?

    ResponderEliminar
  8. para ke les funcione perfecto a 8 bits y actualizacion de muestreo del canal analogo hagan lo siguiente borren esta lineas:

    #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...

    ResponderEliminar
  9. 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??,

    ResponderEliminar
  10. Adrian 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.

    ResponderEliminar
  11. necesito ayuda no me grafica en tiempo real que modifico?

    ResponderEliminar
  12. Saludos.. 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 :)

    ResponderEliminar
  13. Atuda con el ciclo While ya que solo lo ejecuta una sola vez gracias.

    ResponderEliminar
  14. Alguien 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

    ResponderEliminar
  15. hola que ta. Que pasa con el while porque no funciona. Saludos

    ResponderEliminar
  16. Solo cambia el numero de bytes a enviar por un 1 y se resuelve tu problema. Saludos

    ResponderEliminar
  17. usb_put_packet(1,adc,1,USB_DTS_TOGGLE)

    ResponderEliminar

Comenten