TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Thanathos en 04 de Diciembre de 2012, 19:59:52

Título: Problema PIC18F4550 USB CDC - PC
Publicado por: Thanathos en 04 de Diciembre de 2012, 19:59:52
Antes que nada muchas gracias por su atención, me encuentro desarrollando una comunicación USB CDC con PIC18F4550.

Simplemente se trata de leer una valor con el ADC y transmitirlo al Computador, dependiendo del valor recibido el computador me envia los valores '1', '2' ó '3' y con estos enciendo uno de tres led conectador al puerto B.

El código "base" se basa en el aporte de esta pagina http://picmania.garcia-cuervo.net/usb_3_cdctransfers.php , he hecho muchas veces comunicación USB sin contratiempo alguno, sien embargo esta vez consigo que los datos se transmitan del PIC al PC, pero al intentar trasmitir del PC al PIC este solo recibe el valor 0X0F.

Resumiendo:
 - El PIC si puede enviar al PC la variable "análoga".
 - Pero al enviar desde el PC a PIC siempre llega el valor 0X0F.

No sé si sea algún bug en la versión del compilador aunque he probado las Versiones 4.128, 4.110, 4.104 . y no he conseguido hacer que funcione.

Cabe anotar que ya utilice el buscador y nada :(, asi que cualquier sugerencia es muy bien recibida.

De antemano muchas gracias.


#include "18F4550.h"
#DEVICE ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#include ".\include\usb_cdc.h"

int8 conversion=0;
char recibe='a';
 
void main() {
   setup_adc(ADC_CLOCK_INTERNAL);             //configuro A/D
  setup_adc_ports(AN0_ANALOG);     
  set_adc_channel(0);
   
     output_low(PIN_B3);
  output_low(PIN_B4);
  output_low(PIN_B5);
 
 
  set_tris_a(0b11111111);
  set_tris_b(0b11000111);
 
  //set_tris_d(0b11110000);
 
 
    output_high(PIN_D2);                       // encendemos led en Rojo para indicar presencia de energia
  output_low(PIN_D3);

   
   delay_ms(300);
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}
   do
   {  usb_task();
      if (usb_enumerated())
      {    output_high(PIN_D3);                       // encendemos led en Verde para indicar coneccion
            conversion=read_adc();                           // iniciamos convercion
            delay_ms(10);
            if (usb_cdc_kbhit())                               //si el endpoint de salida contiene datos del host
            {     recibe=usb_cdc_getc();
                  if (recibe=='1')
                   {  output_low(PIN_B3);     //verde
                      output_low(PIN_B4);     //rojo
                      output_high(PIN_B5);    //amarillo
                   }
                  if (recibe=='2')
                   {  output_low(PIN_B3);    //verde
                      output_high(PIN_B4);   //rojo
                      output_low(PIN_B5);    //amarillo
                   }
                  if (recibe=='3')
                   {  output_high(PIN_B3);    //verde
                      output_low(PIN_B4);     //rojo
                      output_low(PIN_B5);     //amarillo
                   }
            }
            usb_cdc_putc(conversion);
      }
   } while (TRUE);
}
Título: Re: Problema PIC18F4550 USB CDC - PC
Publicado por: KALLITOS en 04 de Diciembre de 2012, 21:23:48
Hola, asi a simple vista creo ke el delay que estas usando puede que este molestando e la comunicacion usb, prueba haciebdo el codigo de otra manera, pero sin usar el delay_ms, prueba usando algun timer del micro para generar esa pausa.

saludos.
Título: Re: Problema PIC18F4550 USB CDC - PC
Publicado por: gera en 05 de Diciembre de 2012, 01:57:31
Hola! Como estas mandando el byte desde la PC? Seguro q no estas mandando un retorno de carro o salto de linea al final? Hace un putc de lo q recibis para ver bien como llegan los datos.
Saludos!