#include <18F2550.h> //pic utilizado en este caso el 18f2550
#DEVICE ADC=8 //Bits del modulo convertidor analógico
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN //Fuses utilizados para este proyecto
/*
HSPLL: utilizamos un cristal HS de alta velocidad,
en conjunto con el PLL para generar los 48Mhz.
MCLR: Utilizamos reset por Hadware.
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 de relog a 48MHz
#define USB_HID_DEVICE FALSE //Desactivamos el modulo HID ya que trabajaremos en modo Bulk
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //Habilitamos el modo TX en Bulk
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //Habilitamos el modo RX en Bulk
#define USB_EP1_TX_SIZE 4 //Tamaño del TX para nuestro Bulk
#define USB_EP1_RX_SIZE 8 //Tamaño del RX para nuestro Bulk
#Define CH0 PIN_C0 //Asignación del canal 0 para el PWM
#Define CH1 PIN_C6 //Asignación del canal 1 para el PWM
#Define CH2 PIN_C7 //Asignación del canal 2 para el PWM
#Define CH3 PIN_B0 //Asignación del canal 3 para el PWM
#Define CH4 PIN_B1 //Asignación del canal 4 para el PWM
#Define CH5 PIN_B2 //Asignación del canal 5 para el PWM
#Define CH6 PIN_B3 //Asignación del canal 6 para el PWM
#Define CH7 PIN_B4 //Asignación del canal 7 para el PWM
#include <pic18_usb.h> //Mandamos llamar a la librería para poder controlar este pic
#include "daqDescriptor.h" /*Mandamos llamar la librería para que esta informe a la computadora
sobre el vendedor y producto esta librería es llamada como
descriptores y es la que conecta a la pc con el pic*/
#include "PWM.h" //Mandamos llamar la libreria del PWM por software
#include <usb.c> //Mandamos llamar la librería de las funciones del modulo USB
#use fast_io(b)
#use fast_io(c)
int8 datoRX[8], datoTX[4]; //Variables del programa
int8 count=0;
void main( void ) //Programa principal
{
PWM_init(80); //Numero de conteo del timer para esta librería en base a la frecuencia
setup_port_a(AN0_TO_AN2); //Configuramos las entradas análogas
setup_adc(ADC_CLOCK_INTERNAL); //Con una señal de reloj interna
set_tris_a(0xFF); //Puerto A de la siguiente manera(11111111) 1=entradas, 0=salidas
set_tris_b(0xE0); //Puerto B de la siguiente manera(11100000) " "
set_tris_c(0x00); //Puerto C de la siguiente manera(00000000) " "
output_a(0); output_b(0); output_c(0); //Reseteamos el puerto A,B,C
write_duty0(255); //Reseteamos las salidas PWM
write_duty1(255);
write_duty2(255);
write_duty3(255);
write_duty4(255);
write_duty5(255);
write_duty6(255);
write_duty7(255);
usb_init(); //Iniciamos el modulo USB
usb_task();
output_low(PIN_A3); //Led indicador de estado
usb_wait_for_enumeration(); //Espera a que el USB sea enumerado por la PC
output_high(PIN_A3); //Led indicador de estado
delay_ms(100); //Milipausa para estabilidad
While(TRUE) //Bucle infinito para envió y recepción de datos al buffer
{
if(usb_enumerated()) //Si el dispositivo a sido enumerado
{
if (usb_kbhit(1)) //Si llegan nuevos caracteres en el buffer de recepcion
{
usb_get_packet(1,datoRX,8); //Leer buffer de ingreso
write_duty0(datoRX[0]); //El valor del write duty x es igual a el dato que llega del vector datoRX[x]
write_duty1(datoRX[1]);
write_duty2(datoRX[2]);
write_duty3(datoRX[3]);
write_duty4(datoRX[4]);
write_duty5(datoRX[5]);
write_duty6(datoRX[6]);
write_duty7(datoRX[7]);
}
for(count=0;count<=2;count++) //Ciclo for para enviar datos de entradas analogicas
{
set_adc_channel(count); //Lee los valores de ADC según sea el contador
delay_us(80); //Micro pausa para estabilidad en la lectura
datoTX[count]=read_adc(); /*Igualamos nuestro buffer de salida a la lectura
adc mediante el vector que indique nuestro for*/
}
usb_put_packet(1,datoTX,4,USB_DTS_TOGGLE); /*Enviamos nuestro paquete de datos almacenados en nuestros
vectores a la PC*/
}
}
}