///////////////////////////////////////////////////////////////////////////////
/// PROGRAMA v2.0 ///
///////////////////////////////////////////////////////////////////////////////
#INCLUDE <18F4550.h>
///////////////////////////////////////////////////////////////////////////////
/// CONFIGURACION DEL PIC ///
///////////////////////////////////////////////////////////////////////////////
#DEVICE ADC=10 // 10 bits de conversion
#FUSES HSPLL // Oscilador de cristal: >4MHz (20MHz)
#FUSES NOWDT // Watch Dog Timer deshabilitado
#FUSES NOPROTECT // Proteccion contra la lectura de la memoria
// FLASH deshabilitada
#FUSES NOLVP // Programacion en baja tension deshabilitado
#FUSES NODEBUG // Modo DEBUG para ICD deshabilitado
#FUSES USBDIV // Clock del modulo USB: PLL/2 (48MHz)
#FUSES PLL5 // Divisor de PLL: 1 (4MHz)
#FUSES CPUDIV1 // Clock del procesador: PLL/2 (48MHz)
#FUSES VREGEN // Regulador interno de 3.3v habilitado
#FUSES NOPBADEN // Configura el puerto B como E/S digitales
#FUSES MCLR // Pin Master Clear habilitado
#USE delay (clock=48MHZ) // Frecuencia del oscilador: 48MHz
#INCLUDE <usb_cdc.h> // Libreria de funciones para USB-CDC
int16 Canal1,Canal2,Canal3,canal4; // Variable de lectura del ADC
float v1,v2,v3,v4,muestra=5; // Variable de tension de y de
// cantidad de lecturas por canal
int i; // Variable contador
char dato; // Variable de dato recibido
///////////////////////////////////////////////////////////////////////////////
/// FIRMWARE ///
///////////////////////////////////////////////////////////////////////////////
void main() { // Menu principal
// Configuracion conversor AD
setup_adc_ports(AN0_TO_AN3); // Canal AN0 analogico
setup_adc(ADC_CLOCK_DIV_64); // Fuente de reloj para la conversion
// Inicializacion puerto USB-CDC
usb_cdc_init(); // Inicializa puerto virtual COM
usb_init(); // Inicializa el hardware USB
usb_wait_for_enumeration(); // Espera hasta que sea enumerado
while(!usb_cdc_connected()){
}
do{ // Blucle infinito
usb_task(); //
if (usb_enumerated()){ // ¿El dispositivo esta enumerado?
if (usb_cdc_kbhit()){
dato=usb_cdc_getc();
if (dato=='A'){
v1=0;
v2=0;
v3=0;
v4=0;
// Lectura de v1
for (i=1; i<=muestra; i++){
set_adc_channel(0); // Habilita canal 0
delay_us(20); // Retardo de tiempo de 20us
Canal1=read_adc(); // Canal 1 igual a lectura en AN0
v1=v1+5.0*Canal1/1023.0; // Calculo para v1
}
v1=v1/muestra; // Promedio de v1
// Lectura de v2
for (i=1; i<=muestra; i++){
set_adc_channel(1); // Habilita canal 1
delay_us(20); // Retardo de tiempo de 20us
Canal2=read_adc(); // Canal 1 igual a lectura en AN1
v2=v2+5.0*Canal2/1023.0; // Calculo para v2
}
v2=v2/muestra; // Promedio de v2
// Lectura de v3
for (i=1; i<=muestra; i++){
set_adc_channel(2); // Habilita canal 2
delay_us(20); // Retardo de tiempo de 20us
Canal3=read_adc(); // Canal 1 igual a lectura en AN2
v3=v3+5.0*Canal3/1023.0; // Calculo para v3
}
v3=v3/muestra; // Promedio de v3
// Lectura de v4
for (i=1; i<=muestra; i++){
set_adc_channel(3); // Habilita canal 3
delay_us(20); // Retardo de tiempo de 20us
Canal4=read_adc(); // Canal 1 igual a lectura en AN3
v4=v4+5.0*Canal4/1023.0; // Calculo para v4
}
v4=v4/muestra; // Promedio de v4
// Transmision de datos
printf(usb_cdc_putc,"%2.2f%2.2f%2.2f%2.2f",v1,v2,v3,v4);
}
else if (dato=='B'){
printf(usb_cdc_putc,"B");
}
}
}
}while(TRUE);