Lo que vamos a experimentar ahora es la detección del host por parte del PIC18F2550. En el ejemplo anterior vimos como detectar la conexión por software. Lo que se va a hacer en este ejemplo es que el PIC detecte la conexión del host.
Esta es la primera parte de la información sobre las librerías.
Como dije antes también vamos a ver que pasa con las librerías de control.
Viendo el código que utilizamos en los diferentes ejemplos hasta ahora propuestos, vemos que hay una librería:
La constante es el llamado al driver usb_cdc.h , pero esta a su vez llama a otras librerías.
Si observamos el código del ejemplo n°1, hay unas funciones de inicialización que hay que llamar para poder empezar a transmitir datos, una de ellas es:
Si nos metemos dentro de usb_task()
Como podemos ver esta función es muy importante para el desarrollo de la comunicación pic - host.
En esta función vemos hablar de un tal SENSE PIN que tiene que ser definido para que a través de este pin se detecte la conexión del host.
En la función usb_attached() se detallará la función del SENSE PIN. pero esto será en la 2° parte de la información.
Espero que les sirva.
Esta es la primera parte de la información sobre las librerías.
Como dije antes también vamos a ver que pasa con las librerías de control.
Viendo el código que utilizamos en los diferentes ejemplos hasta ahora propuestos, vemos que hay una librería:
Código:
// Ejercicio Nº1: Genera un COM virtual y se comunica bidireccionalmente con el a través del PIC18F2550.
#include <18F2550.h> // Definición de registros internos.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/
#use delay(clock=48000000) // Frecuencia máxima de trabajo.
#include "usb_cdc.h" // Descripción de funciones del USB. (Librería que tenemos que ver)
La constante es el llamado al driver usb_cdc.h , pero esta a su vez llama a otras librerías.
Código:
/////////////////////////////////////////////////////////////////////////////
//
// Lo que hace esta parte es seleccionar la librería de control según el dispositivo que se haya seleccionado.
// por ejemplo si se pone: #include <18F2550.h> va a enlazar la librería: <pic18_usb.h>
/////////////////////////////////////////////////////////////////////////////
#ifndef __USB_PIC_PERIF__
#define __USB_PIC_PERIF__ 1
#endif
#if __USB_PIC_PERIF__
#if defined(__PCM__)
#error CDC Modo bulck requerido! PIC16C7x5 solo puede comunicarse mediante HID (baja velocidad).
#else
#include <pic18_usb.h> // Configuración de hardware para los PIC18Fxx5x
#endif
#else
#include <usbn960x.c> // Configuración de hardware para los dispositivos National 960x
#endif
#include <usb_desc_cdc.h> // Configuración y descriptores USB.
#include <usb.c> // Tokens y handles usb.
Si observamos el código del ejemplo n°1, hay unas funciones de inicialización que hay que llamar para poder empezar a transmitir datos, una de ellas es:
Código:
usb_init(); // Inicializamos hardware USB del PIC18F2550.
Código:
si buscamos que hace esa función en pic18_usb.h tenemos:
void usb_init(void) {
usb_init_cs();
do {
usb_task();
} while (usb_state != USB_STATE_POWERED); // Llama a las funciones anteriormente descriptas siempre y
} // cuando el USB , este conectado.
Si nos metemos dentro de usb_task()
Código:
/*****************************************************************************
/* usb_task()
/*
/* Función: Mantiene un ojo puesto sobre el SENSE pin para saber si el cable usb está o no conectado.
/* Si está conectado inicializa el periferico si es requerido. Si no está conectado el cable desactiva el
/* puerto usb del PIC.
/* Nota: Si el SENSE pin no es definido en la programación del pic, el hardware usb se inicializa de forma
/* automática.
/*
/* Nota: Esta función también habilita las interrupciones si el hardware usb está conectado.
/*
/*
/*****************************************************************************/
void usb_task(void) {
if (usb_attached()) { // Si el pic está conectado al host........
Como podemos ver esta función es muy importante para el desarrollo de la comunicación pic - host.
En esta función vemos hablar de un tal SENSE PIN que tiene que ser definido para que a través de este pin se detecte la conexión del host.
En la función usb_attached() se detallará la función del SENSE PIN. pero esto será en la 2° parte de la información.
Espero que les sirva.