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.
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);
}
}
}