Comunicación USB «Transmisión», Pic C Compiler

En esta sección aprenderás a realizar una comunicación USB mediante la computadora y el microcontrolador PIC, el objetivo es enviar los valores de dos señales analógicas a la computadora para visualizar los datos y la gráfica de las señales.

Comunicación USB

La comunicación USB (Universal Serial Bus) funciona mediante un protocolo estandarizado que permite la transferencia de datos y la conexión de dispositivos electrónicos. El protocolo USB se basa en la estructura de «maestro-esclavo», donde un dispositivo actúa como el maestro (anfitrión) y controla uno o más dispositivos esclavos (dispositivos USB).

Microchip ofrece una variedad de microcontroladores PIC con capacidades USB integradas, lo que permite que estos dispositivos se comuniquen con una computadora o funcionen como dispositivos USB en sí mismos.

Monitor serial

Para realizar la comunicación entre el microcontrolador y la computadora, se utiliza un monitor serial para enviar, recibir y graficar los datos.

Descarga en un archivo .zip, lo extraes en la computadora y abres la aplicación QTseralMonitor.

Circuito de conexión

Procedimiento

Inicialmente en el archivo .h se define el oscilador del microcontrolador, y se habilita la velocidad de la comunicación USB.


#use delay(clock=48MHz,crystal=20MHz,USB_FULL)

Se establece la corriente de funcionamiento necesaria para que el microcontrolador se conecte mediante USB.


#define USB_CONFIG_BUS_POWER 500 //500ma corriente de entrada

Para la comunicación USB se utiliza la siguiente librería.


#include "usb_cdc.h"

Se inicializa la comunicación USB.


   usb_init();

Para enviar datos por el puerto USB, se utiliza la función «printf()» para generar una cadena de caracteres y utilizando la función «usb_cdc_putc» se enviara la cadena de caracteres por el puerto USB.


printf(usb_cdc_putc,"datos\r\n");

Para este ejemplo se enviaran los datos que corresponden a los valores de dos señales analógicas de entrada conectados a los pines AN0 y AN1.

Se habilita la conversión analógico-digital.


   setup_adc(ADC_CLOCK_INTERNAL); 

Para obtener el valor de los pines analógicos se habilita la lectura del canal analógico con «set_adc_channel()» y después se realiza la lectura del valor con «read_adc()», para finalmente guardarlo en la variable asignada.


void enviar()
{
   int16  pot1;
   int16  pot2;
   
   set_adc_channel (0);//Lectura Vout del potenciometro en PIN AN0
   delay_us(10);
   pot1 = read_adc();// lectura del valor  

   set_adc_channel (1);//Lectura Vout del potenciometro en PIN AN1
   delay_us(10);
   pot2 = read_adc();// lectura del valor  
   .
   .
   .

Para enviar los valores de las señales analógicas se utiliza la función print(usb_cdc_putc,» «).


   printf(usb_cdc_putc,"%04lu,%04lu\r\n",pot1,pot2);

Finalmente en la función «main()» se coloca una sentencia «if()» donde se utiliza la función «usb_enumerated()» que devuelve «TRUE» mientras la computadora tenga asignado un puerto COM al microcontrolador, finalmente se ejecuta la subrutina «enviar()» para enviar los datos cada 10ms.


      if(usb_enumerated()) //esta asignado a un puerto COM?
      {
         enviar();
         delay_ms(10);
      }

Código completo


#FUSES NOMCLR

#define USB_CONFIG_BUS_POWER 500 //500ma corriente de entrada

#include "usb_cdc.h"

void enviar()
{
   int16  pot1;
   int16  pot2;
   
   set_adc_channel (0);//Lectura Vout del potenciometro en PIN AN0
   delay_us(10);
   pot1 = read_adc();// lectura del valor
   
   set_adc_channel (1);//Lectura Vout del potenciometro en PIN AN1
   delay_us(10);
   pot2 = read_adc();// lectura del valor
   
   printf(usb_cdc_putc,"%04lu,%04lu\r\n",pot1,pot2);
}

void main()
{
   usb_init(); 

   setup_adc(ADC_CLOCK_INTERNAL);

   while(TRUE)
   {
      if(usb_enumerated()) //esta asignado a un puerto COM?
      {
         enviar();
         delay_ms(10);
      }
   }
}
Scroll al inicio