// Programa: Realiza procesos secundarios mientras el dispositivo está desconectado del HOST.
// Programador: Moyano Jonathan.
// 15/12/08
/********************************************************************************************/
#include <18F4550.h> // Definición de registros internos.
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL6,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: Desac tivamos 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
NOPBADEN: Deshabilitamos el módulo de conversión ADC del puerto B.
*/
#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
short estado_usb; // boolean global, se debe declarar antes de llamar a usb_cdc.h
#define USB_CON_SENSE_PIN PIN_B5 // Definiendo este pin , detectamos si el host está conectado o no por hardware.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.
// Declaramos las funciones utilizadas.
void estado_conexion_usb(short bandera);
void main() {
estado_usb=false;
usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB.
usb_init_cs(); // inicia el USB y sale. Va de la mano con usb_task().
while(true){
usb_task(); // configura el USB.
estado_conexion_usb(estado_usb); // Se fija en el estado de la conexión usb.
if(usb_cdc_connected()){ // Si está conectado entonces....
// Espera a detectar una transmisión de la PC (Set_Line_Coding).
if (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.
if(usb_cdc_getc()=='m'){ //¿lo que llegó fué el caracter m?
printf(usb_cdc_putc, "Llegó la letra m.\n\r"); // Envia una respuesta al HOST.
output_high(PIN_B7); // Indica que ha llegado un caracter.
delay_ms(1000); // Espera 1 seg.
output_low(PIN_B7); // Apaga el indicador de llegada de caracteres.
}
}
}
}
//*************** aquí se ejecutan otros procesos*********************//
// Estos procesos son independientes de la conexión por usb.
output_high(PIN_C2); // enciende el LED, conectado al pin RC2.
delay_ms(500); // Espera 500 mseg.
output_low(PIN_C2); // Apaga el LED, conectado al pin RC2.
delay_ms(500); // Espera 500 mseg.
}
}
//***********************************************
// Esta función, nos indica mediante 2 diodos LED conectados al
// puerto RB0 y RB3 respectivamente. El estado de conexión del puerto usb.
// Conectado: Enciende LED VERDE.
// Desconectado: Enciende LED ROJO.
//***********************************************
void estado_conexion_usb(short bandera){
if(bandera){
output_high(PIN_B3); // Enciende LED VERDE.
output_low(PIN_B0); // Apaga LED ROJO.
}else{
output_high(PIN_B0); // Enciende LED ROJO.
output_low(PIN_B3); // Apaga LED VERDE.
}
}